簡體   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