【问题标题】:Remove 2d slice from 3d numpy array从 3d numpy 数组中删除 2d 切片
【发布时间】:2019-10-07 18:57:53
【问题描述】:

我需要从 3D numpy 立方体中删除最后一个数组。我有:

a = np.array(
[[[1,2,3],
 [4,5,6],
 [7,8,9]],

[[9,8,7],
 [6,5,4],
 [3,2,1]],

[[0,0,0],
 [0,0,0],
 [0,0,0]],

[[0,0,0],
 [0,0,0],
 [0,0,0]]])

如何使用np.delete 删除具有零子数组的数组,例如立方体底部的数组?

(我不能简单地删除所有零值,因为顶部的数据中会有零)

【问题讨论】:

  • 发布的解决方案是否对您有用?对解决方案有何反馈?

标签: python numpy multidimensional-array cube


【解决方案1】:

对于 3D 立方体,您可以对照最后两个轴检查 all

a = np.asarray(a)
a[~(a==0).all((2,1))]

array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]]])

【讨论】:

  • 如果专门寻找零,甚至可以使用a[a.any((2, 1))],因为0 被认为等同于False。虽然加速可以忽略不计,但会使代码的可读性降低。
【解决方案2】:

这是删除尾随全零切片的一种方法,正如问题中提到的,我们希望将全零切片保留在顶部的数据中 -

a[:-(a==0).all((1,2))[::-1].argmin()]

示例运行 -

In [80]: a
Out[80]: 
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])

In [81]: a[:-(a==0).all((1,2))[::-1].argmin()]
Out[81]: 
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]]])

【讨论】:

    【解决方案3】:

    如果您已经知道它们在哪里,最简单的做法就是将它们切掉:

    a[:-2]
    

    结果:

    array([[[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]],
    
           [[9, 8, 7],
            [6, 5, 4],
            [3, 2, 1]]])
    

    【讨论】:

      【解决方案4】:

      希望这会有所帮助,

      a_new=[] #Create a empty list
      for item in a:
              if not (np.count_nonzero(item) == 0): #check if inner matrix is empty or not
                  a_new.append(item) #appending to inner matrix to the list
      
      a_new=np.array(a_new) #creating numpy matrix with removed zero elements
      

      输出:

      array([[[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]],
      
             [[9, 8, 7],
              [6, 5, 4],
              [3, 2, 1]]])
      

      【讨论】:

        【解决方案5】:

        使用任何并选择:)

        a=np.array([[[1,2,3],
         [4,5,6],
         [7,8,9]],
        
        [[9,8,7],
         [6,5,4],
         [3,2,1]],
        
        [[0,0,0],
         [0,0,0],
         [0,0,0]],
        
        [[0,0,0],
         [0,0,0],
         [0,0,0]]])
        a[a.any(axis=2).any(axis=1)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-01
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多