在MRI图像分析过程中,我想“掩盖”时间序列图像作为预处理的一部分。时间序列图像是4D(第四维度是拍摄图像的时间-x,y,z,t)。由于我的蒙版是3D阵列(x,y,z),我想为所有时间序列图像复制3D,这样我就可以屏蔽4D阵列而不会出现任何不同大小的问题。 numpy.ma
无法播放我的想法,我总是得到尺寸差异的错误。那么将3d数组复制到4d数组有效吗?如果不这样做,你认为我能以另一种有效的方式行事吗?
答案 0 :(得分:1)
如果没有更详细的信息,很难回答你的问题。但听起来你正面临着这样的问题:
>>> a = numpy.arange(2 * 3 * 4 * 5).reshape(2, 3, 4, 5)
>>> mask = a[0,...] > 29
>>> numpy.ma.MaskedArray(a, mask)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/
Versions/2.7/lib/python2.7/site-packages/numpy/ma/core.py",
line 2706, in __new__
raise MaskError, msg % (nd, nm)
numpy.ma.core.MaskError: Mask and data not compatible: data size is 120,
mask size is 60.
一个简单的解决方案(如果这确实是您的问题)将使用concatenate
沿时间维度展开掩码。因此,例如,如果第一个轴是您的时间维度,则可以执行此操作(其中reps
等于您要重复掩码的次数;在这种情况下,2
):< / p>
>>> numpy.ma.MaskedArray(a, numpy.concatenate([mask] * reps, axis=0))
masked_array(data =
[[[[0 1 2 3 4]
[5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[20 21 22 23 24]
[25 26 27 28 29]
[-- -- -- -- --]
[-- -- -- -- --]]
[[-- -- -- -- --]
[-- -- -- -- --]
[-- -- -- -- --]
[-- -- -- -- --]]]
[[[60 61 62 63 64]
[65 66 67 68 69]
[70 71 72 73 74]
[75 76 77 78 79]]
[[80 81 82 83 84]
[85 86 87 88 89]
[-- -- -- -- --]
[-- -- -- -- --]]
[[-- -- -- -- --]
[-- -- -- -- --]
[-- -- -- -- --]
[-- -- -- -- --]]]],
mask =
[[[[False False False False False]
[False False False False False]
[False False False False False]
[False False False False False]]
[[False False False False False]
[False False False False False]
[ True True True True True]
[ True True True True True]]
[[ True True True True True]
[ True True True True True]
[ True True True True True]
[ True True True True True]]]
[[[False False False False False]
[False False False False False]
[False False False False False]
[False False False False False]]
[[False False False False False]
[False False False False False]
[ True True True True True]
[ True True True True True]]
[[ True True True True True]
[ True True True True True]
[ True True True True True]
[ True True True True True]]]],
fill_value = 999999)