屏蔽 3D NumPy 数组 --> returns 5D 数组

Masking a 3D NumPy array --> returns 5D array

我有一个巨大的 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_arr,其中的值来自 arr,其中 mask == 1. new_arr 中的所有其他值应为 -2。 (不是 0

但是,这样做:

new_arr = arr[mask]

生成 (4, 4, 4, 4, 4) 形数组。

所以,我有很多 2 个问题:1:) 如何获得我想要的结果和 2.) 为什么以这种方式屏蔽 3d NumPy 数组会导致 5d 数组。

我相信你只需要np.where:

out = np.where(mask, arr, -2)

回答你的其他问题

  1. 为什么以这种方式屏蔽 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)]