给出像这样的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)中较大的一个,我需要返回非零(mn,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)形状的阵列,所以我可能需要采用蒙面方法吗?
答案 0 :(得分:2)
在除第一轴以外的轴上使用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]]]])