我有一个ROIs的Nifti文件,它是一个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])我该如何解决这个问题?
发布于 2014-08-19 03:31:42
您可以通过替换以下行来修复它:
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看起来很相关。
https://stackoverflow.com/questions/25369982
复制相似问题