python中ROI的质量中心

时间:2014-08-18 18:41:42

标签: python numpy scipy roi

我有一个Nifti的ROI文件,它是一个192 x 192 x 12阵列,并希望能够找到整个物体的质量中心以及12个切片中的每一个。我正在使用

cm = join(dname, 'cardiac_roi.nii')
roi_img = nib.load(cm)
roi_data = roi_img.get_data()
CM = ndimage.measurements.center_of_mass(roi_data)

我收到错误:

TypeError: 'numpy.float64' object is not iterable

同样的事情发生在我也只尝试一片

CM = ndimage.measurements.center_of_mass(roi_data[:,:,1])

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以通过替换以下行来修复它:

CM = ndimage.measurements.center_of_mass(roi_data)

行:

import numpy  # Unnecessary if you've already done this.
CM = ndimage.measurements.center_of_mass(numpy.array(roi_data))

说明:根据您的评论,roi_data是NumPy memory-mapped arrayndimage.measurements.center_of_mass函数需要一个常规的NumPy数组;也就是说,ndarray的一个实例。理论上,由于内存映射数组的类型为memmap,而memmapndarray的子类,因此您的原始代码应该可以正常工作;实际上它失败了(正如你所发现的),解决方法是将内存映射数组显式转换为普通的NumPy数组。您的代码不起作用的事实表示违反Liskov substitution principle,并且表示NumPy或SciPy中的错误(很可能是前者)。

查看ndimage源代码,我跟踪行为的差异,直到对于内存映射数组xx.sum()的结果是另一个(零维) )对于常规NumPy ndarray xx.sum()的结果是标量(例如numpy.float64的实例)。这个NumPy bug report看起来很相关。