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