Python:从2d蒙版创建一个3d蒙版

时间:2018-03-22 13:40:46

标签: python arrays numpy

我想从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()

3 个答案:

答案 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))