2015-11-23 50 views
1

我想迭代兩個二維數組。但是,迭代器以某種方式跳過了行中的每個替代元素。 'bimg'和'dist'size是20x12。但是,對於每一行,它遍歷0,2,4 ...列,而不是0,1,2,3,4,......Python numpy nditer跳過替代元素

代碼片段:

it = np.nditer([bimg, dist], 
       op_flags=[['readonly'],['readonly']], 
       flags = ['multi_index', 'multi_index']) 
rows, cols = bimg.shape 
print "bimg dimensions: ", bimg.shape 
print "dist dimensions: ", dist.shape 
for cur_b, cur_d in it: 
    print "MULTI_IDX = ", it.multi_index 

輸出:

bimg dimensions: (20L, 12L) 
dist dimensions: (20L, 12L) 
MULTI_IDX = (0, 0) 
MULTI_IDX = (0, 2) 
MULTI_IDX = (0, 4) 
MULTI_IDX = (0, 6) 
MULTI_IDX = (0, 8) 
MULTI_IDX = (0, 10) 
MULTI_IDX = (1, 0) 
MULTI_IDX = (1, 2) 

要理解這個問題,如果我在Python提示符創建數組,並嘗試迭代它正常工作:

正常工作代碼:

x = np.array(np.arange(240)) 
x = x.reshape(20,12) 
y = np.array(np.arange(240)) 
y = y + 100 
y = y.reshape(20,12) 
it = np.nditer([x,y], 
       op_flags = [['readonly'],['readonly']], 
       flags= ['multi_index', 'multi_index']) 
for a, b in it: 
    print it.multi_index    

輸出:

MULTI_INDEX = (0, 0) 
MULTI_INDEX = (0, 1) 
MULTI_INDEX = (0, 2) 
MULTI_INDEX = (0, 3) 
MULTI_INDEX = (0, 4) 
MULTI_INDEX = (0, 5) 

回答

1

我看不出區別。當我定義時:

bimg = x 
dist = y 

我對兩個剪輯都得到相同的迭代。

flags只需要'multi_index'一次。它適用於整個迭代,op_flags每個陣列:

flags= ['multi_index'] 

雖然文檔描述nditerefficient multi-dimensional iterator object,它似乎並沒有多大幫助與Python代碼的速度。在C或Cython中簡化了迭代多個數組的整個過程。

下面是生成multi_index的另一種方法。其實它沒有那麼不同。內部ndindex構造所需形狀的虛擬陣列,並返回一個可迭代的。看看它的代碼。

for i, j in np.ndindex(bimg.shape): 
    print i,j 

根據教程Iterating over Array頁面,使用multi_index正確的方法是用c風格的迭代:

while not it.finished: 
    print it.multi_index 
    it.iternext() 

我不知道爲什麼。什麼是bimgdistdtypes

+1

感謝您指出'雖然沒有完成'。事實上,我早些時候使用它,但隨後將其更改爲'for',但忘記刪除it.iternext()。所以,這會導致迭代跳躍。 – Tanmay