4

我正在处理来自 netcdf 文件的数据,带有多维变量,读入 numpy 数组。我需要扫描所有维度的所有值(numpy 中的轴)并更改一些值。但是,我事先不知道任何给定变量的维度。在运行时,我当然可以获取 numpy 数组的 ndim 和形状。如何在不事先知道维度数或形状的情况下对所有值进行循环编程?如果我知道一个变量正好是二维的,我会做

shp=myarray.shape
for i in range(shp[0]):
  for j in range(shp[1]):
    do_something(myarray[i][j])
4

4 回答 4

3

您可以使用flatnumpy 数组的属性,它返回所有值的生成器(无论形状如何)。

例如:

>>> A = np.array([[1,2,3],[4,5,6]])
>>> for x in A.flat:
...     print x
1
2
3
4
5
6

您还可以按照返回的顺序设置值,例如:

>>> A.flat[:] = [x / 2 if x % 2 == 0 else x for x in A.flat]
>>> A
array([[1,  1,  3],
       [2,  5,  3]])

我不确定以flat任何方式保证返回元素的顺序(因为它遍历内存中的元素,因此根据您的数组约定,您可能会始终保持相同,除非您真的故意这样做,但要小心......)

这适用于任何维度。

** - 编辑 - **

为了澄清我所说的“订单不保证”的意思,返回的元素的顺序flat不会改变,但我认为依靠它来处理类似的事情是不明智的row1 = A.flat[:N],尽管它在大多数情况下都会起作用。

于 2013-10-30T18:31:19.577 回答
3

你应该调查ravel,nditerndindex

# For the simple case
for value in np.nditer(a):
    do_something_with(value)

# This is similar to above
for value in a.ravel():
    do_something_with(value)

# Or if you need the index
for idx in np.ndindex(a.shape):
    a[idx] = do_something_with(a[idx])

在不相关的注释中,numpy 数组被索引a[i, j]而不是a[i][j]. 在 pythona[i, j]中相当于使用元组进行索引,即a[(i, j)].

于 2013-10-30T18:32:04.113 回答
1

这可能是最简单的递归:

a = numpy.array(range(30)).reshape(5, 3, 2)

def recursive_do_something(array):
    if len(array.shape) == 1:
        for obj in array:
            do_something(obj)
    else:
        for subarray in array:
            recursive_do_something(subarray)

recursive_do_something(a)

如果您想要索引:

a = numpy.array(range(30)).reshape(5, 3, 2)

def do_something(x, indices):
    print(indices, x)

def recursive_do_something(array, indices=None):
    indices = indices or []
    if len(array.shape) == 1:
        for obj in array:
            do_something(obj, indices)
    else:
        for i, subarray in enumerate(array):
            recursive_do_something(subarray, indices + [i])

recursive_do_something(a)
于 2013-10-30T18:20:44.507 回答
0

查看 Python 的 itertools 模块。

这将允许您按照以下方式做一些事情

for lengths in product(shp[0], shp[1], ...):
    do_something(myarray[lengths[0]][lengths[1]]
于 2013-10-30T18:25:15.230 回答