首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代多维数组

迭代多维数组
EN

Stack Overflow用户
提问于 2013-06-21 00:25:22
回答 2查看 974关注 0票数 3

我有一个想要遍历的3Dnumpy数组。如果很重要,这是一个.nii文件类型(用于存储核磁共振脑部数据的文件),我使用nipy模块加载这些图像,然后可以将其作为numpy数组处理以进行图像处理。我想要对体素进行遍历,并且只包含值< 2的体素。

代码语言:javascript
复制
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"!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-21 03:50:37

我又找到了解决我的问题的办法!哈哈,好吧,它可能不是完美的,但它确实起到了作用。如果有人有更优雅的方法,请分享!顺便说一句,这不是我的解决方案,我实际上询问了漂亮的邮件列表,他们很高兴地帮助了我。不管怎样,他们建议我利用numpy的索引系统。所以你会说:

代码语言:javascript
复制
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,然后你可以简单地做

代码语言:javascript
复制
new_img = nifti.NiftiImage(result)

并保存您的输出!

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

代码语言:javascript
复制
new_img = nib.NiftiImage(result)
票数 3
EN

Stack Overflow用户

发布于 2014-05-01 19:29:43

以下是使用nibabelnumpy的原始问题的潜在解决方案:

代码语言:javascript
复制
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')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17218841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档