Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列遍历numpy数组_Python_Numpy - Fatal编程技术网

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:)!