我正在使用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])
答案 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)
您应该查看ravel
,nditer
和ndindex
。
# 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]]