我有一个3D图像扫描(形状:335x306x306
,总元素:31368060
),我想用相同大小的3D布尔掩码来掩盖它,以返回相同的蒙版图像尺寸。
当我简单地用掩码索引数组时:
masked_image = image_pix[mask]
我得到一个图像像素值的一维数组,其中掩码= 1按标准行主(C风格)顺序排序(如here所述)。由于屏蔽,它只有6953600个元素。
那么,如果我没有索引,如何将这个1D阵列重新塑造成3D阵列呢?我意识到我可以使用掩码本身的索引来迭代地使用掩码值填充3D数组,但我希望有一个更优雅(和计算效率)的解决方案,它不依赖于循环。 / p>
答案 0 :(得分:1)
marr = np.ma.array(image_pix, mask=mask)
"正常"使用[mask]
建立索引会删除所有屏蔽值,因此没有可以再次将其重新整形为3D的标点(因为它丢失了项目),因此无法实现。
然而MaskedArray
保持其形状:
>>> import numpy as np
>>> arr = np.random.randint(0, 10, 16).reshape(4, 4)
>>> marr = np.ma.array(arr, mask=arr>6)
>>> marr.shape
(4, 4)
>>> marr
masked_array(data =
[[3 -- 0 1]
[4 -- 6 --]
[2 -- 6 0]
[4 5 0 0]],
mask =
[[False True False False]
[False True False True]
[False True False False]
[False False False False]],
fill_value = 999999)
答案 1 :(得分:1)
我只是想了一会儿,并意识到我可以通过逻辑索引来实现这一目标。
masked_image = image_pix # define the masked image as the full image
masked_image[mask==0] = 0 # define the pixels where mask == 0 as 0
这很容易......