Python 基于另一个数组中的值对numpy数组的选择索引执行操作
我有一个数组A。我有另一个数组,我称之为开关。Arrayswitch是一个布尔值数组(和np.nan,对应于A中np.nan 3 x 3数组的位置),用于确定为操作选择A中的哪个3 x 3数组 例如:Python 基于另一个数组中的值对numpy数组的选择索引执行操作,python,arrays,numpy,Python,Arrays,Numpy,我有一个数组A。我有另一个数组,我称之为开关。Arrayswitch是一个布尔值数组(和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.]], [
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。其中
:
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]]])
如果使用适当的布尔掩码,这将容易得多。Numpy允许布尔索引,但在数组中放置一个
nan
会将其变成一个float
对于这个特定的例子,NaNs取哪个值并不重要,所以您可以这样做
switch = switch.astype(bool)
result = np.full_like(a, np.nan)
result[switch] = a[switch]
相关:你到底试过什么?Numpy支持直接布尔索引第一种方法不起作用,但第二种方法起作用。有没有想过为什么第一个不起作用?我知道nan不是一个合适的布尔掩码,但我的数据就是这样到达的。它在我的numpy 1.19.2系统上工作。可能显式使用
switch==True
而不是switch
帮助。