当ndim事先不知道时处理多维数组

时间:2013-10-30 17:58:39

标签: python arrays numpy

我正在使用netcdf文件中的数据,使用多维变量,读入numpy数组。我需要扫描所有维度中的所有值(numpy中的轴)并更改一些值。但是,我事先并不知道任何给定变量的维度。在运行时,我当然可以获得numpy数组的ndims和形状。 如何在不知道尺寸或形状数量的情况下通过所有值编程循环?如果我知道变量恰好是2维,我会做

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

4 个答案:

答案 0 :(得分:3)

你可以使用numpy数组的flat属性,它会在所有值上返回一个生成器(无论形状如何)。

例如:

>>> 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以何种方式返回元素的顺序(因为它在内存中迭代元素,因此根据您的数组约定,您可能< / em>让它始终保持不变,除非你真的是故意这样做,但要小心......)

这适用于任何方面。

** - 编辑 - **

为了澄清'命令不保证'的含义,flat返回的元素顺序不会改变,但我认为对row1 = A.flat[:N]之类的事物依赖它是不明智的,虽然它大部分时间都可以使用。

答案 1 :(得分:3)

您应该查看ravelnditerndindex

# 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_somting_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]。在python中a[i, j]相当于使用元组进行索引,即a[(i, j)]

答案 2 :(得分: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)

答案 3 :(得分:0)

查看Python的itertools模块。

这将允许您按照

的方式执行某些操作
for lengths in product(shp[0], shp[1], ...):
    do_something(myarray[lengths[0]][lengths[1]]