我有两个数组input
和label
。每个数组的大小为 3x2x2x2
,表示 2x2x2
矩阵的 3
个元素。数组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]
最佳答案
一种屏蔽方法 -
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]
输出为新的输出数组,只是为了显示/指示这些数组是新数组而不是 View 输入数组。严格来说,从数组中删除元素是不可能的,只能重新分配。因此,我们可以进行重新分配部分,就像这样 -
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)
再说一遍,我们实际上并不是在删除元素,而只是创建新的副本,可以按照之前的讨论重新分配这些副本。
关于python - 如何删除 3D 矩阵中的零元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42437285/