2016-11-15 165 views
2

在numpy中,我有一個3d數組,我會ike刪除一些2d子數組。想想看這樣的:從numpy的3d數組中刪除2d子數組

r = range(27) 
arr = np.reshape(r, (3,3,3)) 

del = [[0,1,2],[0,0,2]] 
flatSeam = np.ravel_multi_index(del, arr.shape) 
arr = np.delete(arr, flatSeam) 

所以在最後我想有形狀(3,2,3)沒有從原來的數組中的元素00, 10, 22的數組。我的問題是我沒有使用ravel_multi_index,因爲我的索引是2d,數組形狀是3d,所以計算了錯誤的索引(上面的代碼也不會執行,因爲索引數組和形狀必須相同尺寸)。

你有什麼想法,我可以做到這一點?

+0

因此,'del'的第一行將會一直存在是範圍(arr.shape [1])',就像你有'[0,1,2],'在這裏? – Divakar

+0

'del'的第一行應該是'range(arr.shape [0])'。所以第一行是行索引,第二行是列索引。 – Cilenco

+0

啊,這是有道理的。 – Divakar

回答

2

下面是一個使用advanced-indexing的方法 -

# arr: Input array, rm_idx : 2-row list/array of indices to be removed 
m,n,p = arr.shape 
mask = np.asarray(rm_idx[1])[:,None] != np.arange(n) 
out = arr[np.arange(m)[:,None],np.where(mask)[1].reshape(m,-1)] 

或者,boolean-indexing -

out = arr.reshape(-1,p)[mask.ravel()].reshape(m,-1,p) 

少一點內存密集型的做法,我們儘量避免創建2Dmask -

vmask = ~np.in1d(np.arange(m*n),rm_idx[1] + n*np.arange(m)) 
out = arr.reshape(-1,p)[vmask].reshape(m,-1,p) 
+0

謝謝!命名空間來自'rm_idx'?哦,對不起,這是我的「del」陣列吧? – Cilenco

+1

@Cilenco'rm_idx'將會是你的'del'。我使用了一個不同的變量名,因爲Python中有'del'運算符,所以可能會導致衝突。 – Divakar

+0

啊好吧好點!但有了這個,我得到以下錯誤:'TypeError:列表索引必須是整數或切片,而不是元組'在掩碼行 – Cilenco