给定样品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阵列(3,2,3,3(?我的数据集是形状(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]]]]
'''
但是应用a[~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(形数组,所以也许我需要蒙版的方法?
在第一个轴以外的轴上使用 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]]]])