遍历多维数组

3

我有一个3D numpy数组需要遍历。如果很重要的话,这是一种.nii文件类型(用于存储MRI脑数据的文件),我使用nipy模块加载这些图像,然后可以将其处理为numpy数组来进行图像处理。我想取出并遍历体素,并仅包括值小于2的体素。以下是我的尝试:

import nipy

import numpy   

img = nipy.load_image('image.nii.gz')

img_manip = img.get_data()

result = numpy.zeros(shape = img_manip.shape, dtype = img_manip.dtype) 

for matrix in img_manip:

    for row in matrix:

        for item in row:

            if item < 2:

                result += img_manip

这似乎可以工作,但速度极慢,现在仍在运行。我想知道这种方法是否正确?我应该使用np.empty吗?我不确定,因为我对python还很陌生。
编辑:顺便提一下,img_manip的形状大约是(368, 170, 32),数据类型为float64。
(抱歉我不知道如何使代码看起来"pythonic"!)

дҪ зҡ„д»Јз Ғжү§иЎҢдәҶзұ»дјјдәҺresult = (img_manip < 2).sum() * img_manipиҝҷж ·зҡ„ж“ҚдҪңпјҢдёҺimg_manip[img_manip > 2] = 0дёҚеҗҢгҖӮ - jfs
2个回答

3

我再次找到了解决问题的方法!哈哈,好吧,它可能不是完美的,但它能够完成任务。如果有更优雅的方法,请分享!顺便说一句,这不是我的解决方案,实际上我向nipy邮件列表提出了问题,他们很乐意帮助我。总之,他们建议我利用numpy的索引系统。所以你可以这样说:

img_manip[img_manip > 2] = 0
result = 15000 * img_manip #This is optional, just makes it into a nicer range for my purposes

现在对于那些感兴趣的人来说,如果你想回到.nii格式,你可以使用nifti包,详见这里,然后你只需执行以下操作:
new_img = nifti.NiftiImage(result)

请保存你的输出结果!

编辑:你也可以使用nibabel(并且你可能应该使用它,因为它得到了支持/进一步开发),方法如下:

new_img = nib.NiftiImage(result)

你好Norman,我喜欢你的问题。我刚开始处理MR数据。现在我正在迭代一个DICOM文件,其中有15000个片段,实际上是43个实际片段的不同维度。我能问一下你使用什么软件以及为什么使用nifti吗?到目前为止,我只使用了具有pydicom模块的ptyhon。我也可能会看看nipy。 - Leo
嗨Leo。我使用nifti,因为FSL的输出是nifti格式的。我使用Amira、itksnap和FSLview进行可视化。我个人还没有尝试过Dicom图像,不过nibabel和pydicom可以搭配使用。如果你想让我尝试一个任务,我会非常乐意!哦,我一直在研究另一个很酷的软件叫做Slicer,它也可以很好地与Python集成。 - faskiat
啊,我也会导入nibabel!Slicer听起来也很方便。我还在熟悉处理如此大型数据集的各个方面。我不会进行3D重建,所以我可能不会使用FSL。我刚刚在我的系统上安装了NeuroDebian,因为我们的管理员还在忙着给我获取MatLab密钥,但我对此(以及Python)感到非常兴奋。如果您想交流想法或经验,请随时给我发电子邮件!我已在我的个人资料中填写了我的电子邮件地址,因此应该是可见的。 - Leo

1

以下是使用 nibabelnumpy 可能解决原问题的方法:

import nibabel as nib
import numpy as np
img = nib.load('image.nii.gz')
data = nib.get_data()
data[data>2] = np.nan  # If you really don't want to look at these...
nib.Nifti1Image(data, img.get_affine()).to_filename('new_image.nii.gz')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接