迭代通过多维数组

时间:2013-06-20 16:25:22

标签: python python-2.7 numpy

我想要迭代的3D numpy数组。如果它很重要,这是一个.nii文件类型(用于存储MRI脑数据的文件),我使用nipy模块加载这些图像,然后可以将其作为numpy数组处理以进行图像处理。我想拍摄并通过体素并且仅包括具有值

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

这个SEEMS可以工作,但它非常慢,就像现在还在运行一样。我只是想知道,这是正确的方法吗?我应该使用np.empty吗?我不确定我在python中仍然很棒。

编辑:只是一个FYI,img_manip的形状类似于(368,170,32),数据类型是float64

(抱歉,我不知道如何使代码看起来像“pythonic”!)

2 个答案:

答案 0 :(得分:3)

我再次找到了解决问题的方法!哈哈,好吧所以它可能不是完美的但它能完成这项工作。如果有人有更优雅的方式,请分享! BTW这不是我的解决方案,我实际上问了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包,参见here,然后你就可以了。

new_img = nifti.NiftiImage(result)

保存输出!

编辑:你也可以使用nibabel(你可能应该因为它得到了进一步的支持/开发):

new_img = nib.NiftiImage(result)

答案 1 :(得分: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')