Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中ROI的质心_Python_Numpy_Scipy_Roi - Fatal编程技术网

python中ROI的质心

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

我有一个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])

我该如何解决这个问题

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

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()的结果是另一个(零维)数组,而对于常规NumPy
ndarray
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()
(…)
如您所愿……很好,修复了它!非常感谢您对发生的事情所作的有益解释!