我有一个数组甲。我有另一个数组,我称之为switch。数组开关是一个布尔值数组(和np.nan对应于A中np.nan 3 x 3数组的位置),该数组确定选择A中的哪个3 x 3数组进行操作。
例:
switch = np.array([ True, False, False, False, np.nan])
a = np.array([[[ 0., 0., 0.],
[ 9., 0., 0.],
[ 3., 15., 0.]],
[[ 0., 0., 0.],
[ 9., 0., 0.],
[ 3., 15., 0.]],
[[ 0., 27., 0.],
[ 0., 0., 0.],
[12., 18., 0.]],
[[ 0., 0., 6.],
[12., 0., 27.],
[ 0., 0., 0.]],
[[ np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan],
[ np.nan, np.nan, np.nan]]])
根据以上示例,最终选择的数组应为:
np.array([[[ 0., 0., 0.],
[ 9., 0., 0.],
[ 3., 15., 0.]],
[[ np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan],
[ np.nan, np.nan, np.nan]],
[[ np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan],
[ np.nan, np.nan, np.nan]],
[[ np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan],
[ np.nan, np.nan, np.nan]],
[[ np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan],
[ np.nan, np.nan, np.nan]]])
我可以通过使用for循环并使用if / else控制语句遍历A中的每个3 x 3数组来做到这一点,但我想知道是否有办法使用numpy中的内置功能来做到这一点。For循环和if / else语句可能比数组操作慢得多。我一直修修补补,但到目前为止还没有能够找到一个最佳numpy的解决方案。
我可以重组阵列开关,但是阵列A无法更改结构/形状。
您可以使用np.where
:
out = np.where(switch[:,None,None], a, np.nan)
或使用遮罩:
out = a.copy()
out[switch!=True] = np.nan
输出:
array([[[ 0., 0., 0.],
[ 9., 0., 0.],
[ 3., 15., 0.]],
[[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]],
[[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]],
[[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]],
[[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句