2017-02-24 44 views
1

我有兩個陣列inputlabel。每個陣列的大小爲3x2x2x2,表示2x2x2矩陣的3元素。數組label有一些 元素(=2在我的波紋管代碼中)具有零值。我想刪除/刪除它們到label陣列。我也想刪除數組input中對應於label數組中已刪除索引的元素。我怎麼能在Python中做到這一點?由於如何刪除3D矩陣中的零元素?

import numpy as np 
input=np.arange(3*2*2*2).reshape(3,2,2,2) 
label=np.arange(3*2*2*2).reshape(3,2,2,2) 
# Assign value 
label[0]=0 
label[2]=0 
print input 
print label 
#Delete element 
for i in range(label.shape[0]): 
    if(np.sum(label[i])==0): 
     print i 
     #del label[i, :, :, :] 
#Expected result: non-zero element are label[1] and input[1] 
+0

我不認爲numpy數組是您的目的最好的一種數據結構。 'numpy.ndarray'對象是在存儲在內存塊中用於隨機訪問的統一類型和大小對象的意義上對「數組」進行建模的,而不是任意插入或刪除。你可以做的是維護「特殊」位置的單獨索引,並在稍後使用時跳過它們。 –

回答

1

一個有遮蔽的方法 -

mask = ~(label == 0).all(axis=(1,2,3)) # or (label != 0).any(axis=(1,2,3)) 
new_label = label[mask] 
new_input = input[mask] 

我輸出這些label[mask]input[mask]作爲新的輸出數組,只是爲了顯示/表明這些陣列是新的陣列,而不是意見納入輸入數組。嚴格地說,從陣列中刪除元素是不可能的,但是可以重新分配。與尋找那些指數沿第一軸,然後使用np.delete

label = label[mask] 
input = input[mask] 

另一種方式 - - 因此,我們可以做重新分配部件,像這樣

idx = np.flatnonzero((label == 0).all((1,2,3))) 
new_label = np.delete(label, idx, axis=0) 
new_input = np.delete(input, idx, axis=0) 

再次,我們實際上並沒有刪除元素,但只是創建新的副本,可以重新分配,如前所述。

+0

完美的解決方案。什麼是「全部(1,2,3)」? – user3051460

+0

爲什麼不使用'label = label [mask]'而不是'new_label'。不安全? – user3051460

+0

@ user3051460看看編輯是否有意義 – Divakar