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」に見せる方法がわかりません!)

4

2 に答える 2

3

私は再び私の問題の解決策を見つけました!ははは、OKなので、完璧ではないかもしれませんが、仕事はします. 誰かがそれを行うよりエレガントな方法を持っている場合は、共有してください! ところで、これは私の解決策ではありません。実際に 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)
于 2013-06-20T19:50:36.903 に答える