从3D Numpy数组中删除2D切片

时间:2019-10-07 18:57:53

标签: python numpy multidimensional-array cube

我需要从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删除具有零个子数组的数组(例如在多维数据集的底部)?

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

5 个答案:

答案 0 :(得分:4)

对于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]]])

答案 1 :(得分: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]]])

答案 2 :(得分:1)

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

a[:-2]

结果:

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

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

答案 3 :(得分:0)

希望这会有所帮助,

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]]])

答案 4 :(得分:0)

使用任意并选择:)

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)]