【问题标题】:How to delete zero elements in a 3D matrix?如何删除 3D 矩阵中的零元素?
【发布时间】:2017-07-15 04:56:01
【问题描述】:

我有两个数组 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]

【问题讨论】:

  • 我不认为 numpy 数组是最适合您的数据结构。 numpy.ndarray 对象是在“数组”上建模的,即存储在内存块中的统一类型和大小的对象用于随机访问,而不是任意插入或删除。您可以做的是为“特殊”位置维护单独的索引,并在以后使用时跳过它们。

标签: python arrays python-2.7 numpy


【解决方案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)

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

【讨论】:

  • 完美解决方案。 all(1,2,3) 是什么?
  • 为什么不使用label = label[mask],而不是new_label。不安全吗?
  • 太棒了。我投票给它作为我的解决方案。只是一个扩展的问题。如果我的标签是label=np.arange(2*3*4*2*2*2).reshape(2,3,4,2,2,2)。而且我还想删除上面的零元素。我怎样才能获得掩码方程?谢谢
  • @user3051460 将.all(axis=(1,2,3)) 编辑为.all(axis=(1,2,3,4,5)) 基本上采用除第一个轴之外的所有轴。
  • 抱歉回复晚了。我想我没有给你完整的信息。当我创建label=np.arange(2*3*4*2*2*2).reshape(2,3,4,2,2,2) 时,这意味着创建2x2x2 补丁。我想删除整个值为零的补丁2x2x2.all(axis=(1,2,3,4,5)) 在这种情况下可能不起作用。我猜是mask = ~(label == 0).all((3,4,5))。因此完整的代码可能是input=np.arange(2*3*4*2*2*2).reshape(2,3,4,2,2,2) label=np.arange(2*3*4*2*2*2).reshape(2,3,4,2,2,2) label[0,0,0]=0 label[0,0,1]=0 mask = ~(label == 0).all((3,4,5)) label = label[mask] inout = input[mask]。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多