簡體   English   中英

迭代通過多維數組

[英]Iterating through a multidimensional array

我有一個想要迭代的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

這個SEEMS可以工作,但它非常慢,就像現在還在運行一樣。 我只是想知道,這是正確的方法嗎? 我應該使用np.empty嗎? 我不確定我在python中仍然很棒。

編輯:只是一個FYI,img_manip的形狀類似於(368,170,32),數據類型是float64

(抱歉,我不知道如何讓代碼看起來像“pythonic”!)

我再次找到了解決問題的方法! 哈哈,好吧所以它可能不是完美的但它能完成這項工作。 如果有人有更優雅的方式,請分享! 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包,看看這里 ,然后你就可以了

new_img = nifti.NiftiImage(result)

並保存您的輸出!

編輯:你也可以使用nibabel(你可能應該因為它得到進一步的支持/開發):

new_img = nib.NiftiImage(result)

這是使用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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM