删除numpy数组的空维度

a_p*_*ida 3 python numpy python-3.x

我有一个形状(X,Y,Z)的numpy数组。我想检查每个 Z 维度并快速删除非零维度。

详细解释:

我想检查 array[:,:,0] 是否有任何条目非零。

如果是,忽略并检查数组[:,:,1]。

否则,如果否,则删除维度数组[:,:,0]

Tls*_*ris 5

我不确定你想要什么,但这希望指向正确的方向。

1 月 1 日编辑:
受到 @J.Warren 使用 np.squeeze 的启发,我认为 np.compress 可能更合适。

这会在一行中进行压缩

np.compress((a!=0).sum(axis=(0,1)), a, axis=2) # 
Run Code Online (Sandbox Code Playgroud)

解释一下np.compress中的第一个参数

(a!=0).sum(axis=(0, 1)) # sum across both the 0th and 1st axes. 
Out[37]: array([1, 1, 0, 0, 2])  # Keep the slices where the array !=0
Run Code Online (Sandbox Code Playgroud)

我的第一个答案可能不再相关

import numpy as np

a=np.random.randint(2, size=(3,4,5))*np.random.randint(2, size=(3,4,5))*np.random.randint(2, size=(3,4,5))
# Make a an array of mainly zeroes.
a
Out[31]:
array([[[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 1],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0]],

       [[0, 1, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0]],

       [[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 1],
        [0, 0, 0, 0, 0],
        [1, 0, 0, 0, 0]]])

res=np.zeros(a.shape[2], dtype=np.bool)
for ix in range(a.shape[2]):
    res[ix] = (a[...,ix]!=0).any()

res
Out[34]: array([ True,  True, False, False,  True], dtype=bool)
# res is a boolean array of which slices of 'a' contain nonzero data

a[...,res]
# use this array to index a
# The output contains the nonzero slices
Out[35]:
array([[[0, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [1, 0, 0]]])
Run Code Online (Sandbox Code Playgroud)


J.W*_*ren 5

也不是 100% 确定你的追求,但我认为你想要

np.squeeze(array, axis=2)
Run Code Online (Sandbox Code Playgroud)

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.squeeze.html

  • 不需要为空尺寸提供轴。它会自动找到它。还有两种使用方法:`np.squeeze(your_array)` 或 `your_array.squeeze()` (2认同)