假设您有一个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维尺寸的实现方法
任何人都知道该怎么做?
答案 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
。