[英]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.