Python 按列遍历numpy数组
Python 按列遍历numpy数组,python,numpy,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 我的最佳选择是在进行迭代之前转置数组吗?您可以转置它吗 >>> x = np.array([[1,3
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
我的最佳选择是在进行迭代之前转置数组吗?您可以转置它吗
>>> 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
您的注释:我需要根据数组中每个单元格的索引将值填充到数组中
你所说的索引是什么意思
带索引的粗略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
的方法相比速度较慢。为了完整性,在迭代元素之前不必转置矩阵。使用np.nditer
可以指定迭代矩阵的顺序。默认的顺序通常是行主顺序或类似C的顺序。您可以重写此行为,并选择列主键,或者选择您想要的类似FORTRAN的顺序。使用np.nditer
时,只需指定一个附加参数order
,并将此标志设置为'F'
:
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
您可以在此处阅读有关如何控制迭代顺序的更多信息:“是我的最佳选择…转置…?”也许您可以解释一下上下文-为什么要迭代所有列?根据答案,转置可能合理,也可能不需要迭代。@AmiTavory我需要根据数组中每个单元格的索引将值填充到数组中。解释起来有点复杂,但我想进行列式迭代,而不是行式迭代,以匹配R中存在的类似函数,默认情况下,矩阵上的迭代是按列式进行的。没关系。这是常有的事。我将删除我的评论。任何试图使用
nditer
的人都必须使用doc
页面。但是,如果你想提高速度(与常规数组迭代相比),就要一直研究到最后。@hpaulj:)!