Python:使用3D bool索引3D数组并返回相同大小的3D数组...优雅

时间:2017-01-31 00:05:05

标签: python arrays numpy 3d

我有一个3D图像扫描(形状:335x306x306,总元素:31368060),我想用相同大小的3D布尔掩码来掩盖它,以返回相同的蒙版图像尺寸。

当我简单地用掩码索引数组时:

masked_image = image_pix[mask]

我得到一个图像像素值的一维数组,其中掩码= 1按标准行主(C风格)顺序排序(如here所述)。由于屏蔽,它只有6953600个元素。

那么,如果我没有索引,如何将这个1D阵列重新塑造成3D阵列呢?我意识到我可以使用掩码本身的索引来迭代地使用掩码值填充3D数组,但我希望有一个更优雅(和计算效率)的解决方案,它不依赖于循环。 / p>

2 个答案:

答案 0 :(得分:1)

使用np.ma.MaskedArray

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

这很容易......