我有一个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])
我该如何解决这个问题?
答案 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 array。 ndimage.measurements.center_of_mass
函数需要一个常规的NumPy数组;也就是说,ndarray
的一个实例。理论上,由于内存映射数组的类型为memmap
,而memmap
是ndarray
的子类,因此您的原始代码应该可以正常工作;实际上它失败了(正如你所发现的),解决方法是将内存映射数组显式转换为普通的NumPy数组。您的代码不起作用的事实表示违反Liskov substitution principle,并且表示NumPy或SciPy中的错误(很可能是前者)。
查看ndimage
源代码,我跟踪行为的差异,直到对于内存映射数组x
,x.sum()
的结果是另一个(零维) )对于常规NumPy ndarray
x
,x.sum()
的结果是标量(例如numpy.float64
的实例)。这个NumPy bug report看起来很相关。