如何使用NumPy布尔数组来删除/过滤另一个NumPy数组的行?

时间:2017-05-23 18:14:06

标签: python arrays numpy mask

我有一个像这样的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是另一个,我只得到第一列。

2 个答案:

答案 0 :(得分:1)

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

b[a.ravel()]

您还可以明确选择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]]

答案 1 :(得分:0)

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

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