python - 使用 Numpy 索引 3D 数组并保持非零轴的优雅方法

标签 python numpy indexing

假设我有以下 3D 数组:

L=np.arange(18).reshape((2,3,3))
L[:,:,1] = 0; L[:,[0,1],:] = 0

In []: L
Out[]: 
array([[[ 0,  0,  0],
        [ 0,  0,  0],
        [ 6,  0,  8]],

       [[ 0,  0,  0],
        [ 0,  0,  0],
        [15,  0,  17]]])

L[0,:] 中的零列总是L[1,:] 中相应的零列匹配。

我现在想删除中间的,其中沿轴的总和等于 0(忽略 为零。我目前笨拙的方法是

l=np.nonzero(L.sum(axis=1))[1]

In []: L[:,:,l[:len(l)/2]]
Out[]: 
array([[[ 0,  0],
        [ 0,  0],
        [ 6,  8]],

       [[ 0,  0],
        [ 0,  0],
        [15, 17]]])

执行此操作的迂回方式是什么?

最佳答案

我们可以沿着前两个轴寻找所有的零,并用它来屏蔽掉第三个轴上的那些 -

L[:,:,~(L==0).all(axis=(0,1))]

或者,使用 any() 替换 ~all() -

L[:,:,(L!=0).any(axis=(0,1))]

我们可以使用省略号 ... 来替换 :,: 并跳过 arg axis 来给我们一个紧凑的版本-

L[...,~(L==0).all((0,1))]
L[...,(L!=0).any((0,1))]

有关省略号如何用于 NumPy 数组的更多信息,here .


对于问题的总和部分,它会是类似的-

L[...,L.sum((0,1))!=0]

关于python - 使用 Numpy 索引 3D 数组并保持非零轴的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46007971/

相关文章:

python - MongoDB 聚合 - $lookup + $unwind 之后的 $group

python - 使用角点绘制平滑轮廓

python - 如何将 '?' 转换为 NaN

python - 为什么 NumPy.exp 显示的结果与 C 中的 exp 不同

python - 在 scipy.optimize.curve_fit 中应用 "tighter"边界

索引 API 403 权限被拒绝。无法验证 URL 所有权

python - 抓取表的困难(Python,BeautifulSoup)

python 相当于 MATLAB 的 'replace unimportable cells with...'

php - 这些 Mysql 外键是否也分配了索引

indexing - 为什么fk在某些DBMS中会自动生成索引?