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

标签 python arrays python-2.7 numpy

我有两个数组inputlabel。每个数组的大小为 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/

相关文章:

php $_POST 数组并更新 MySQL

python - 使用 matplotlib.pyplot 从 csv 中绘制数据

python - 最简单的位图切换按钮

python - 如何使用 python 将列添加到现有的 excel 文件?

python - Pandas groupby : get best zscore for counts() of each group

python - npm 错误!吉普 错误!堆栈错误: Could not find any Visual Studio installation to use

python - 计算数组中选定差异的有效方法

ruby - 在 Ruby 中创建和迭代二维数组

python - 我尝试在 Python 2 中使用 Twilio 发送短信

python - 如何根据字典中的键/值增加 Python Pandas DataFrame