将3d数组附加到4d数组中,第4维是3D数组的数量

时间:2014-01-24 15:42:25

标签: python arrays image-processing numpy

在MRI图像分析过程中,我想“掩盖”时间序列图像作为预处理的一部分。时间序列图像是4D(第四维度是拍摄图像的时间-x,y,z,t)。由于我的蒙版是3D阵列(x,y,z),我想为所有时间序列图像复制3D,这样我就可以屏蔽4D阵列而不会出现任何不同大小的问题。 numpy.ma无法播放我的想法,我总是得到尺寸差异的错误。那么将3d数组复制到4d数组有效吗?如果不这样做,你认为我能以另一种有效的方式行事吗?

1 个答案:

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