如何删除3D矩阵中的零元素?

时间:2017-02-24 11:17:23

标签: python arrays python-2.7 numpy

我有两个数组inputlabel。每个数组的大小为3x2x2x2,表示3矩阵的2x2x2个元素。数组label有一些 元素(我的波纹管代码中的=2)值为零。我想删除/删除它们到label数组。我还想删除数组input中与label数组中已删除索引相对应的元素。我怎么能在python中做到这一点?感谢

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]

1 个答案:

答案 0 :(得分: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]作为新的输出数组,只是为了显示/指示这些数组是新数组而不是输入数组的视图。严格来说,删除数组中的元素是不可能的,但重新分配。所以,我们可以像这样重新分配部分 -

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

沿第一轴找到这些索引,然后使用np.delete -

的另一种方法
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)

同样,我们实际上并没有删除元素,只是创建了新的副本,可以像之前讨论的那样重新分配。