[英]How can I iterate through numpy 3d array
所以我有一個數組:
array([[[27, 27, 28],
[27, 14, 28]],
[[14, 5, 4],
[ 5, 6, 14]]])
我如何遍歷它,並在每次迭代中獲得[a,b,c]值,我嘗試這樣:
for v in np.nditer(a):
print(v)
但它只是打印
27
27
28
27
14
28
14
5
4
5
6
我需要:
[27 27 28]
[27 14 28]...
b = a.reshape(-1, 3)
for triplet in b:
...
顯然,您想迭代數組的前2個維度,返回第3個(作為1d數組)。
In [242]: y = np.array([[[27, 27, 28],
...: [27, 14, 28]],
...:
...: [[14, 5, 4],
...: [ 5, 6, 14]]])
雙循環很好,重塑為(4,2)並進行迭代。
通常不需要或不需要nditer
作為迭代機制(其文檔需要更強的免責聲明)。 這實際上是針對C級代碼的。 在Python級別的代碼中並沒有太多使用。 np.ndindex
函數是一個例外,在這種情況下該函數很有用:
In [244]: for ij in np.ndindex(y.shape[:2]):
...: print(ij, y[ij])
...:
(0, 0) [27 27 28]
(0, 1) [27 14 28]
(1, 0) [14 5 4]
(1, 1) [ 5 6 14]
ndindex
在multi_index
模式下對指定形狀的臨時數組使用nditer
。
盡可能嘗試不迭代地工作。 采用這些技巧中的任何一種,迭代都是相對較慢的。
你可以做一些丑陋的事情
for i in range(len(your_array)):
for j in range(len(your_array[i])):
print(your_array[i][j])
將其視為在數組中具有數組。 因此,在數組v中,您具有數組a ,該數組又包含三元組b
import numpy as np
na = np.array
v=na([[[27, 27, 28], [27, 14, 28]], [[14, 5, 4],[ 5, 6, 14]]])
for a in v:
for b in a:
print b
輸出:
[27 27 28]
[27 14 28]
[14 5 4]
[ 5 6 14]
另外,您可以執行以下操作,
v2 = [b for a in v for b in a]
現在,您所有的三胞胎都存儲在v2中
[array([27, 27, 28]),
array([27, 14, 28]),
array([14, 5, 4]),
array([ 5, 6, 14])]
..您可以像訪問一維數組一樣訪問它們,例如
print v2[0]
給..
array([27, 27, 28])
另一個選擇(對於包含n個元組的數組的任意維有用):
a_flat = a.ravel()
n = 3
m = len(a_flat)/n
[a_flat[i:i+n] for i in range(m)]
或一行(較慢):
[a.ravel()[i:i+n] for i in range(len(a.ravel())/n)]
或在循環中進一步使用:
for i in range(len(a.ravel())/n):
print a.ravel()[i:i+n]
將數組A
(形狀為n1, n2, 3
) n1, n2, 3
為數組B
(形狀為n1 * n2, 3
),然后遍歷B
請注意, B
只是A
的視圖。 A
和B
在內存中共享相同的數據塊,但是它們具有不同的數組頭信息,這些信息記錄了它們的形狀,更改B
的值也將更改A
的值。 下面的代碼:
a = np.array([[[27, 27, 28],[27, 14, 28]],
[[14, 5, 4],[ 5, 6, 14]]])
b = a.reshape((-1, 3))
for last_d in b:
a, b, c = last_d
# do something with last_d or a, b, c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.