在进行MRI图像分析的过程中,我想“屏蔽”时间序列图像作为预处理的一部分。时间序列图像是4D(第4维是拍摄图像的时间-x,y,z,t)。由于我的遮罩是3D阵列(x,y,z),因此我想为所有时间序列图像复制3D,这样我就可以遮罩4D阵列而不会遇到大小不同的问题。 numpy.ma无法广播我的想法,并且我总是会收到大小差异的错误。那么将3d阵列复制到4d阵列是否有效?您认为我可以不这样做而执行另一种有效的方法吗?

最佳答案

如果没有更多细节,很难回答您的问题。但这听起来像您正在面对这样的问题:

>>> 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):

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

关于python - 将3d阵列附加到4d阵列中,第4维是3D阵列的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21336669/

10-10 13:20