Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于另一个数组中的值对numpy数组的选择索引执行操作_Python_Arrays_Numpy - Fatal编程技术网

Python 基于另一个数组中的值对numpy数组的选择索引执行操作

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.]], [

我有一个数组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.]],

       [[ 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
帮助。