删除数组中与布尔掩码对应的所有元素

E. *_*mus 4 python arrays numpy slice multidimensional-array

我有一个作为二维 numpy 数组(布尔数组)存在的布尔掩码

array([[ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  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, False, False, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

我还有一个单独的二维 numpy 值数组,其尺寸与布尔掩码(值数组)相同

array([[ 19.189 ,  23.2535,  23.1555,  23.4655,  22.6795,  20.3295,  19.7005],
       [ 20.688 ,  20.537 ,  23.8465,  21.2265,  24.5805,  25.842 ,  23.198 ],
       [ 22.418 ,  21.0115,  21.0355,  20.217 ,  24.1275,  24.4595,  21.981 ],
       [ 21.156 ,  18.6195,  23.299 ,  22.5535,  23.2305,  28.749 ,  21.0245],
       [ 21.7495,  19.614 ,  20.3025,  21.706 ,  22.853 ,  19.623 ,  16.7415],
       [ 20.9715,  21.9505,  21.1895,  21.471 ,  21.0445,  21.096 ,  19.3295],
       [ 24.3815,  26.2095,  25.3595,  22.9985,  21.586 ,  23.796 ,  20.375 ]])
Run Code Online (Sandbox Code Playgroud)

我想做的是从值数组中删除布尔区域中相同位置 equals 的所有元素False。是否有捷径可寻?

此示例所需的输出是:

array([[ 19.189 ,  23.2535,  23.1555,  23.4655,  22.6795,  20.3295,  19.7005],
       [ 20.688 ,  20.537 ,  23.8465,  21.2265,  24.5805,  25.842 ,  23.198 ],
       [ 22.418 ,  21.0115,  21.0355,  20.217 ,  24.1275,  24.4595,  21.981 ],
       [ 21.156 ,  18.6195,  23.299 ,  22.5535,  23.2305,  28.749 ,  21.0245]])
Run Code Online (Sandbox Code Playgroud)

在此特定示例中,所有False值都存在于布尔数组的末尾,但情况并非总是如此,它们可以随机分布。因此,我需要一种从值数组中删除任何元素的方法,其中相应的掩码值等于False布尔数组中的值

MSe*_*ert 5

对于大多数目的,您可以简单地创建一个MaskedArray行为就像这些被“删除”一样,它还允许从列/行“删除”单个元素,同时保持维度相同:

import numpy as np
arr = np.array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005],
                [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ],
                [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ],
                [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245],
                [ 21.7495, 19.614 , 20.3025, 21.706 , 22.853 , 19.623 , 16.7415],
                [ 20.9715, 21.9505, 21.1895, 21.471 , 21.0445, 21.096 , 19.3295],
                [ 24.3815, 26.2095, 25.3595, 22.9985, 21.586 , 23.796 , 20.375 ]])
mask = np.array([[ True,  True,  True,  True,  True,  True,  True],
                 [ True,  True,  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, False, False, False, False]])
marr = np.ma.MaskedArray(arr, mask=~mask)
marr
Run Code Online (Sandbox Code Playgroud)

给出:

masked_array(data =
 [[19.189 23.2535 23.1555 23.4655 22.6795 20.3295 19.7005]
 [20.688 20.537 23.8465 21.2265 24.5805 25.842 23.198]
 [22.418 21.0115 21.0355 20.217 24.1275 24.4595 21.981]
 [21.156 18.6195 23.299 22.5535 23.2305 28.749 21.0245]
 [-- -- -- -- -- -- --]
 [-- -- -- -- -- -- --]
 [-- -- -- -- -- -- --]],
             mask =
 [[False False False False False False False]
 [False False False False False False False]
 [False False False False False False False]
 [False False False False False False False]
 [ True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True]],
       fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,也可以使用以下命令压缩包含至少一个屏蔽元素的所有行np.ma.compress_rows

>>> np.ma.compress_rows(marr)
array([[ 19.189 ,  23.2535,  23.1555,  23.4655,  22.6795,  20.3295,  19.7005],
       [ 20.688 ,  20.537 ,  23.8465,  21.2265,  24.5805,  25.842 ,  23.198 ],
       [ 22.418 ,  21.0115,  21.0355,  20.217 ,  24.1275,  24.4595,  21.981 ],
       [ 21.156 ,  18.6195,  23.299 ,  22.5535,  23.2305,  28.749 ,  21.0245]])
Run Code Online (Sandbox Code Playgroud)