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布尔数组中的值
对于大多数目的,您可以简单地创建一个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)