繁体   English   中英

逐列遍历numpy数组

[英]Iterate over numpy array columnwise

np.nditer自动np.nditer迭代数组的元素。 有没有一种方法可以按列迭代数组的元素?

x = np.array([[1,3],[2,4]])

for i in np.nditer(x):
    print i

# 1
# 3
# 2
# 4

我想要的是:

for i in Columnwise Iteration(x):
    print i
# 1
# 2
# 3
# 4

我最好的选择只是在进行迭代之前转置数组吗?

为了完整起见,在遍历元素之前不必一定要转置矩阵。 使用np.nditer您可以指定遍历矩阵的顺序 默认值通常是行优先或类似C的顺序。 您可以覆盖此行为,然后选择所需的列大顺序或类FORTRAN顺序。 使用np.nditer时,只需指定其他参数order并将此标志设置为'F' np.nditer

In [16]: x = np.array([[1,3],[2,4]])

In [17]: for i in np.nditer(x,order='F'):
   ....:     print i
   ....:     
1
2
3
4

您可以在此处阅读有关如何控制迭代顺序的更多信息: http : //docs.scipy.org/doc/numpy-1.10.0/reference/arrays.nditer.html#controlling-iteration-order

你可以换位吗?

>>> x = np.array([[1,3],[2,4]])
>>> [y for y in x.T]
[array([1, 2]), array([3, 4])]

或不太优雅:

>>> [np.array([x[j,i] for j in range(x.shape[0])]) for i in range(x.shape[1])]
[array([1, 2]), array([3, 4])]

您可以使用形状并对每列进行切片

>>> [x[:, i] for i in range(x.shape[1])]
[array([1, 2]), array([3, 4])]

对于这种情况, nditer并不是最佳的迭代工具。 在朝着编译的(cython)解决方案努力时很有用,但在纯Python编码中却没有。

查看一些常规的迭代策略:

In [832]: x=np.array([[1,3],[2,4]])

In [833]: x
Out[833]: 
array([[1, 3],
       [2, 4]])

In [834]: for i in x:print i   # print each row
[1 3]
[2 4]

In [835]: for i in x.T:print i   # print each column
[1 2]
[3 4]

In [836]: for i in x.ravel():print i   # print values in order
1
3
2
4

In [837]: for i in x.T.ravel():print i  # print values in column order
1
2
3
4

您评论: I need to fill values into an array based on the index of each cell in the array

index是什么意思?

带有索引的粗略2d迭代:

In [838]: for i in range(2):
   .....:     for j in range(2):
   .....:         print (i,j),x[i,j]
(0, 0) 1
(0, 1) 3
(1, 0) 2
(1, 1) 4

ndindex使用nditer生成相似的索引

In [841]: for i,j in np.ndindex(x.shape):
   .....:     print (i,j),x[i,j]
   .....:     
(0, 0) 1
(0, 1) 3
(1, 0) 2
(1, 1) 4

enumerate是获取值和索引的一种很好的Python方法:

In [847]: for i,v in enumerate(x):print i,v
0 [1 3]
1 [2 4]

或者您可以使用meshgrid生成所有索引,作为数组

In [843]: I,J=np.meshgrid(range(2),range(2))

In [844]: I
Out[844]: 
array([[0, 1],
       [0, 1]])

In [845]: J
Out[845]: 
array([[0, 0],
       [1, 1]])

In [846]: x[I,J]
Out[846]: 
array([[1, 2],
       [3, 4]])

请注意,大多数这些迭代方法只是将您的数组视为列表列表。 它们没有利用数组的本性,与使用整个x方法相比,速度较慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM