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

标签 python arrays numpy 3d

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

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

masked_image = image_pix[mask]

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

如果我没有索引,如何将这个 1D 数组重新整形回 3D 数组?我意识到我可以使用掩码本身的索引来用掩码值迭代地填充 3D 数组,但我希望有一个更优雅(且计算效率更高)的解决方案,不依赖于 for 循环。

最佳答案

使用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)

关于Python:用 3D bool 索引 3D 数组并返回相同大小的 3D 数组......优雅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947604/

相关文章:

python - Python 中将唯一列表改造为另一种类型的列表

python - 使用 SVD 进行降维,指定要保持的能量

java - 如何在Java中创建一个循环数组,只打印数组的次数?

php - 从返回语句获取浏览器中的数据

python - 沿 Numpy 阵列轴的质心标准偏差

python - numpy 数组的每一行的特定列组的总和

python - 类属性的类型提示

Python SUDS - 无法生成正确的 SOAP 请求

python - 语法 ndarray[ :, list[i]] 在 python 中意味着什么?

c - 如何将结构的内容保存到 C 文件中?