python中ROI的质心
我有一个Nifti ROI文件,是一个192 x 192 x 12的数组,希望能够找到整个物体的重心以及12个切片中的每一个。我正在使用python中ROI的质心,python,numpy,scipy,roi,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' obj
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])
我该如何解决这个问题 您可以通过替换该行来修复它:
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\u数据
是一个小数字。ndimage.measurements.center\u of \u mass
函数需要一个规则的NumPy数组;即,ndarray
的一个实例。理论上,由于内存映射数组的类型为memmap
,并且memmap
是ndarray
的子类,因此您的原始代码应该可以工作;实际上它失败了(正如您所发现的),解决方法是显式地将内存映射数组转换为普通的NumPy数组。您的代码不工作这一事实表示违反了,并表明NumPy或SciPy中存在错误(很可能是前者)
查看
ndimage
源代码,我跟踪了行为上的差异,发现对于内存映射数组x
,x.sum()的结果是另一个(零维)数组,而对于常规NumPyndarray
x
,x.sum()的结果是标量(例如,numpy.float64
的一个实例)。这个numpy看起来很相关。什么是print(type(roi_idata))
show?class'numpy.core.memmap.memmap'我不知道这意味着什么。numpy.memmap
是numpy.ndarray
的一个子类,它允许内存映射数组(也就是说,对象的行为类似于常规NumPy数组,但其数据存储在磁盘上而不是RAM中)。看起来您已经发现center\u of u mass
不适用于memmap
实例。请尝试将roi\u数据
转换为常规ndarray
首先:CM=ndimage.measurements.center\u of u mass(numpy.array(roi\u data))
这可能也值得一份NumPy/SciPy错误报告。仅为了补充信息:Nifti是一种标准的神经成像格式。用python读取它有一些怪癖:用于执行此操作的标准库,nibabel
,将memmap
返回到作为批量写入磁盘的数据上,通常是以f-连续顺序进行的。然而标准nifti格式也可以采用.nii.gz
的形式,在这种情况下,在调用get_data
时,所有数据都会读入内存,因为gzip似乎不可查找。因此,根据像文件名这样简单的内容,此数据类型是否会变成memmap。对其或np.array调用.copy()
(…)
如您所愿……很好,修复了它!非常感谢您对发生的事情所作的有益解释!