如何将 NumPy 布尔数组用于 remove/filter 行另一个 NumPy 数组?

How can a NumPy array of booleans be used to remove/filter rows of another NumPy array?

我有一个这样的 NumPy 数组:

array([[ True],
       [ True],
       [ True],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False],
       [False]], dtype=bool)

我想像这样使用这个数组来过滤另一个数组的行:

array([[-0.45556594,  0.46623859],
       [-1.80758847, -0.08109728],
       [-0.9792373 , -0.15958186],
       [ 4.58101272, -0.02224513],
       [-1.64387422, -0.03813   ],
       [-1.8175146 , -0.07419429],
       [-1.15527867, -0.1074057 ],
       [-1.48261467, -0.00875623],
       [ 2.23701103,  0.67834847],
       [ 1.45440669, -0.62921477],
       [-1.13694557,  0.07002631],
       [ 1.0645533 ,  0.21917462],
       [-0.03102173,  0.18059074],
       [-1.16885461, -0.06968157],
       [-0.51789417, -0.05855351],
       [ 4.23881128, -0.30072904],
       [-1.37940507, -0.06478938]])

应用过滤器将产生以下数组,只有前三行:

array([[-0.45556594,  0.46623859],
       [-1.80758847, -0.08109728],
       [-0.9792373 , -0.15958186]])

如何做到这一点?当我尝试执行类似 B[A] 的操作时,其中 A 是过滤器数组,而 B 是另一个过滤器数组,我只得到第一列。

您正在尝试 select 整行,因此您需要一个一维数组来 select。如评论中所述,您可以使用 numpy.ravel() 来理顺您的 bool 数组并将其应用于 b 并使用:

b[a.ravel()]

您还可以显式 select a 的第一列并将其应用到 b,方法是:

b[a[:, 0]])

测试代码:

a = np.array(
    [[ True],
     [ True],
     [ True],
     [False],
     [False],
     [False]], dtype=bool)

b = np.array(
    [[-0.45556594,  0.46623859],
     [-1.80758847, -0.08109728],
     [-0.9792373 , -0.15958186],
     [ 4.58101272, -0.02224513],
     [-1.64387422, -0.03813   ],
     [-1.37940507, -0.06478938]])

print(b[a.ravel()])
print(b[a[:, 0]])

结果:

[[-0.45556594  0.46623859]
 [-1.80758847 -0.08109728]
 [-0.9792373  -0.15958186]]

[[-0.45556594  0.46623859]
 [-1.80758847 -0.08109728]
 [-0.9792373  -0.15958186]]

您还可以使用 np.where 查找符合条件的行索引:

b[np.where(a)[0]]