簡體   English   中英

我如何遍歷numpy 3d數組

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

ndindexmulti_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, 3n1, n2, 3為數組B (形狀為n1 * n2, 3 ),然后遍歷B 請注意, B只是A的視圖。 AB在內存中共享相同的數據塊,但是它們具有不同的數組頭信息,這些信息記錄了它們的形狀,更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM