Arrays 掩蔽3D NumPy阵列-->;返回5D数组

Arrays 掩蔽3D NumPy阵列-->;返回5D数组,arrays,python-3.x,numpy,mask,Arrays,Python 3.x,Numpy,Mask,我有一个巨大的3d NumPy数组和一个形状相同的掩码数组,里面填充了1或0。让我们以此为例: arr = np.random.randint(1, 100, size=(4, 4, 4)) mask = np.zeros(shape=(4,4,4), dtype='int') mask[0,2:3,:] = 1 我的目标是获得一个相同形状的数组(在本例中为(4,4,4)),我们将其命名为new\u arr,其值来自arr,其中mask==1。new\u arr中的所有其他值应为-2。(不是0

我有一个巨大的3d NumPy数组和一个形状相同的掩码数组,里面填充了1或0。让我们以此为例:

arr = np.random.randint(1, 100, size=(4, 4, 4))
mask = np.zeros(shape=(4,4,4), dtype='int')
mask[0,2:3,:] = 1
我的目标是获得一个相同形状的数组(在本例中为(4,4,4)),我们将其命名为
new\u arr
,其值来自
arr
,其中
mask==1
new\u arr
中的所有其他值应为
-2
。(不是
0

然而,这样做:

new_arr = arr[mask]
结果形成(4,4,4,4,4)形阵列


所以,我有两个问题:1:)我如何得到我想要的结果,2。)为什么用这种方式屏蔽一个3d NumPy数组会得到一个5d数组。

我相信你只需要np。其中:

out = np.where(mask, arr, -2)
回答你的另一个问题

  • 为什么以这种方式掩蔽3d NumPy阵列会产生5d阵列
  • 其思想是
    mask
    具有数据类型
    int
    。因此,
    arr[mask]
    实际上是作为切片而不是掩蔽工作的。因此
    mask
    中的
    0
    将导致
    arr[0]
    ,即
    (4,4)
    。然后对
    mask
    中的所有值执行该操作,得到一个与
    mask
    维度相同的数组,其每个值都是
    (4,4)
    数组

    修复代码的另一种方法是:

    out = np.full(arr.shape, -2)
    out[mask.astype(bool)] = arr[mask.astype(bool)]
    

    我相信您只需要np。其中:

    out = np.where(mask, arr, -2)
    
    回答你的另一个问题

  • 为什么以这种方式掩蔽3d NumPy阵列会产生5d阵列
  • 其思想是
    mask
    具有数据类型
    int
    。因此,
    arr[mask]
    实际上是作为切片而不是掩蔽工作的。因此
    mask
    中的
    0
    将导致
    arr[0]
    ,即
    (4,4)
    。然后对
    mask
    中的所有值执行该操作,得到一个与
    mask
    维度相同的数组,其每个值都是
    (4,4)
    数组

    修复代码的另一种方法是:

    out = np.full(arr.shape, -2)
    out[mask.astype(bool)] = arr[mask.astype(bool)]