2017-04-16 57 views
1

我有32×32個灰度級圖像的堆疊在多維數組masks如下:如何從多維數組中刪除總和值等於0的元素?

(2560, 1, 32, 32) 

一些這些圖像中的包含非零值,如果我總結它們的值。

我想從多維數組中刪除其值總和等於零的元素。

這是我如何接近:

for idx in range(masks.shape[0]): 
    if np.sum(masks[idx]) == 0: 
     masks = np.delete(masks, idx) 

第一次迭代之後,其中一個零和元素被發現,從形狀masks變化

(2560, 1, 32, 32)

(2621439,)

爲什麼會發生這種情況,我該如何解決?我想要的只是減少第一維度,例如

(2120, 1, 32, 32)

+0

檢查'np.delete'文檔。如果你沒有指定'axis','delete'將在扁平數組上運行。嘗試'掩碼= np.delete(掩碼,idx,軸= 0)'。 –

+0

刪除所有零元素後你打算看到什麼? –

+0

@RobertValencia有點像'(2120,1,32,32)' – pepe

回答

2

你得到一個一個維數組,因爲你沒有爲np.delete提供參數,根據文檔:

如果axis是無,obj應用到平面數組。

而且它不是通過一個數組一個好主意,循環,同時刪除元素,這使得它很難保持,因爲對象的大小指數的軌跡正在發生變化:

對於您的情況:

masks = masks[masks.sum(axis=(1,2,3)) != 0] 

應該刪除軸的所有值之和爲1,2,3爲零的數組。

+0

這使用布爾索引;它不會修改原始數組,但會返回一個新數組,如果您希望它被覆蓋,則可以將結果指定回「掩碼」。 – Psidom

+0

這有效 - 我應該在OP中提到的一個問題是,我正在使用此數組中已刪除圖像的索引*還刪除另一個形狀相同的陣列上的相應圖像 - 任何建議? – pepe

+0

如果其他形狀相同的數組是* arr *,那麼類似地,您可以使用'arr [masks.sum(axis =(1,2,3))!= 0]'來根據* mask中的和來刪除相應的元素*。 – Psidom