屏蔽 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)
回答你的其他问题
- 为什么以这种方式屏蔽 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)]
我有一个巨大的 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)
回答你的其他问题
- 为什么以这种方式屏蔽 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)]