Numpy从3d阵列中删除行和列

时间:2019-01-06 18:54:00

标签: python numpy

假设您有一个5x5x5的numpy数组

    a = np.ones((5,5,5))
    a[:,3,:] = 0
    a[:,:,3] = 0

(我知道这很丑)

这将返回

    [[[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]]

我要做的是删除所有轴上只有0的所有行和列,并返回一个只有1s的新4x4x4数组。

我可以使用二维数组进行此操作

a = np.delete(a,np.where(~a.any(axis=0))[0], axis=1)
a = a[~np.all(a == 0, axis=1)]

但是无法弄清楚3维尺寸的实现方法

任何人都知道该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以分别找到第二轴和第三轴的所有零项的行索引,然后使用np.delete将其删除:

In [25]: mask = (a == 0)

In [26]: sec = np.where(mask.all(1))[1]

In [27]: third = np.where(mask.all(2))[1]

In [28]: new = np.delete(np.delete(a, sec[1], 1), third, 2)

请注意,如果您打算创建一个新数组,可以将结果重新分配给a