我想从2d蒙版创建一个3d蒙版。假设我有一个2d掩码,如:
mask2d = np.array([[ True, True ,False],
[ True , True, False],
[ True , True ,False]])
mask3d = np.zeros((3,3,3),dtype=bool)
所需的输出应如下所示:
mask3d = [[[ True True False]
[ True True False]
[ True True False]]
[[ True True False]
[ True True False]
[ True True False]]
[[ True True False]
[ True True False]
[ True True False]]]
现在我想在每个z切片中创建一个带有2d数组掩码的3d数组掩码。无论3d阵列在z方向有多大,它都可以工作我该怎么做?
修改
好的,现在我试着找出哪种方法更快。我知道我可以用timepit,但我不会理解为什么在第一种方法中他循环10000次而在第二种方法中1000次:
mask3d=np.zeros((3,3,3),dtype=bool)
def makemask():
b = np.zeros(mask3d,dtype=bool)
b[:]=mask2d
%timeit for x in range(100): np.repeat(mask[np.newaxis,:], 4, 0)
%timeit for x in range(100): makemask()
答案 0 :(得分:2)
您可以使用np.repeat
:
np.repeat([mask2d],3, axis=0)
请注意[]
周围mask2d
使mask2d
3D,否则结果仍然是2D数组。
答案 1 :(得分:0)
你可以使用vanilla Python进行这样的乘法运算:
>>> a=[[1,2,3],[4,5,6]]
>>> [a]*2
[[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]
或者,如果问题是关于连接多个掩码(可能这是真实的问题):
>>> b=[[10,11,12],[13,14,15]]
>>> [a,b]
[[[1,2,3],[4,5,6]],[[10,11,12],[13,14,15]]
(这也适用于bools,只是更容易跟随数字)
答案 2 :(得分:0)
Numpy dstack 对此很有效,d 代表深度,意味着数组在深度维度(第三个)中堆叠: 假设您有一个大小为 (539, 779) 的 2D 蒙版并且想要第三维
print(mask.shape) # result: (539, 779)
mask = np.dstack((mask, mask, mask))
print(mask.shape) # result: (539, 779, 3)
如果您出于任何原因想要,例如(539, 779, 5), 就做 mask = np.dstack((mask, mask, mask, mask, mask))