Arrays 掩蔽3D NumPy阵列-->;返回5D数组
我有一个巨大的3d NumPy数组和一个形状相同的掩码数组,里面填充了1或0。让我们以此为例: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
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)
回答你的另一个问题
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)
回答你的另一个问题
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)]