Python 使用遮罩沿numpy 4D阵列移除所有零的空元素

Python 使用遮罩沿numpy 4D阵列移除所有零的空元素,python,numpy,null,Python,Numpy,Null,给定一个示例numpy数组,如下所示: a = np.array([[[[0,0,0], [0,0,0], [0,0,0]], [[0,0,0], [0,0,0], [0,0,0]]], [[[0,1,2], [1,1,1], [1,1,1]], [[1,1,1], [1,2,2], [1,1,1]]], [[[0,1,2], [1,1,1], [1,1,1]],

给定一个示例numpy数组,如下所示:

a = np.array([[[[0,0,0], [0,0,0], [0,0,0]],
               [[0,0,0], [0,0,0], [0,0,0]]],
              [[[0,1,2], [1,1,1], [1,1,1]],
               [[1,1,1], [1,2,2], [1,1,1]]],
              [[[0,1,2], [1,1,1], [1,1,1]],
               [[1,1,1], [1,2,2], [1,1,1]]],
              [[[0,1,2], [1,1,1], [1,1,1]],
               [[1,1,1], [1,2,2], [1,1,1]]]])
#a.shape = (4, 2, 3, 3)
考虑到第一个元素都是零,如何让它返回形状为(3,2,3,3)的numpy数组?我的数据集是一个更大的形状(m,x,y,z)数组,我需要返回非零(m-n,x,y,z)数组,其中n是(x,y,z)形状的数组,其中都是零

到目前为止,我试过:

mask = np.equal(a, np.zeros(shape=(2,3,3)))

'''
Returns:
        [[[[ True  True  True]
   [ True  True  True]
   [ True  True  True]]

  [[ True  True  True]
   [ True  True  True]
   [ True  True  True]]]


 [[[ True False False]
   [False False False]
   [False False False]]

  [[False False False]
   [False False False]
   [False False False]]]


 [[[ True False False]
   [False False False]
   [False False False]]

  [[False False False]
   [False False False]
   [False False False]]]


 [[[ True False False]
   [False False False]
   [False False False]]

  [[False False False]
   [False False False]
   [False False False]]]]
'''
但是应用
一个[~mask]
会给我一个平坦的数组:

[1 2 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 2 1
 1 1 1 1 1 1 1 1 1 2 2 1 1 1] (51,)
我需要的是这样的东西:

np.array([[[[0,1,2], [1,1,1], [1,1,1]],
           [[1,1,1], [1,2,2], [1,1,1]]],
          [[[0,1,2], [1,1,1], [1,1,1]],
           [[1,1,1], [1,2,2], [1,1,1]]],
          [[[0,1,2], [1,1,1], [1,1,1]],
           [[1,1,1], [1,2,2], [1,1,1]]]])

好处:我需要将此应用于单独的/镜像(m、x、y、z)形状的数组,因此可能需要一种屏蔽方法?

使用
所有轴(第一个轴除外)来创建用于索引的布尔数组:

a[~(a == 0).all(axis=(1,2,3))]

#array([[[[0, 1, 2],
#         [1, 1, 1],
#         [1, 1, 1]],

#        [[1, 1, 1],
#         [1, 2, 2],
#         [1, 1, 1]]],


#       [[[0, 1, 2],
#         [1, 1, 1],
#         [1, 1, 1]],

#        [[1, 1, 1],
#         [1, 2, 2],
#         [1, 1, 1]]],


#       [[[0, 1, 2],
#         [1, 1, 1],
#         [1, 1, 1]],

#        [[1, 1, 1],
#         [1, 2, 2],
#         [1, 1, 1]]]])

在轴(第一个轴除外)上使用
all
,创建用于索引的布尔数组:

a[~(a == 0).all(axis=(1,2,3))]

#array([[[[0, 1, 2],
#         [1, 1, 1],
#         [1, 1, 1]],

#        [[1, 1, 1],
#         [1, 2, 2],
#         [1, 1, 1]]],


#       [[[0, 1, 2],
#         [1, 1, 1],
#         [1, 1, 1]],

#        [[1, 1, 1],
#         [1, 2, 2],
#         [1, 1, 1]]],


#       [[[0, 1, 2],
#         [1, 1, 1],
#         [1, 1, 1]],

#        [[1, 1, 1],
#         [1, 2, 2],
#         [1, 1, 1]]]])

问题是,如果有两个子列表,我们只为一个子列表移除一个元素,那么这两个子列表不再包含相同数量的元素,这是numpy的要求。问题是,如果有两个子列表,我们只为一个子列表移除一个元素,然后两个子列表不再包含相同数量的元素,这是numpy的一个要求。啊,太好了,这正是我想要的!但我还需要生成一个掩码,将其应用于同一维度的另一个单独数组(请参见更新的问题)。将答案标记为已接受!啊,太好了,这正是我想要的!但我还需要生成一个掩码,将其应用于同一维度的另一个单独数组(请参见更新的问题)。将答案标记为已接受!