以列方式迭代numpy数组

时间:2016-02-19 19:24:58

标签: python numpy

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

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

4 个答案:

答案 0 :(得分:3)

为了完整性,您不必在迭代元素之前转置矩阵。使用np.nditer,您可以指定如何遍历矩阵的顺序。默认值通常是row-major或C-like顺序。您可以覆盖此行为并选择您想要的列主要或 FORTRAN 类似的顺序。只需指定其他参数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

答案 1 :(得分:2)

你可以调换它吗?

>>> 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])]

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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 不是这种情况下最好的迭代工具。它在编译(cython)解决方案时非常有用,但在纯Python编码中则不行。

查看一些常规迭代策略:

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

您发表评论:index

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 是什么意思?

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

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

In [847]: for i,v in enumerate(x):print i,v 0 [1 3] 1 [2 4] 是获取值和索引的一种很好的Python方法:

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

请注意,大多数这些迭代方法只是将您的数组视为列表列表。他们没有利用数组的性质,与使用整个int main() { DayOfYear someDay; someDay.output(); return 0; } 的方法相比,它们会很慢。