2017-06-06 36 views
1

Nibabelを使用してnumpy配列をNiftiファイル形式に変換しようとしています。 Numpy配列の中にはdtype('<i8')があり、Nibabelがデータ型を呼び出すときにはdtype('uint8')になるはずです。NumpyとNibabelでデータ型を変更

arr.get_data_dtype() 

Numpyアレイのデータ型を変換して保存する方法を知っている人はいますか?

+0

'' hpaulj

+0

元の配列のデータ型はint64ですが、Nibabelにロードすると 'に変更されます。arr = nib.Nifti1Image(np_arr、np.eye(4))' – Char

+1

'np.ones(3、 ' hpaulj

答えて

2

タイトルの質問は本文の質問と多少異なります。あなたはnp.int8にnumpyの配列arrのデータ型を変更したい場合はそう...


は、あなたがarr.astype(np.int8)を探しています。あなたはキャストによるデータの精度を失う可能性が

マインドは、あなたが見たいと思っても、後でそれを保存するには

を(astypeマニュアルを参照してください)?np.save?np.savetxt(または、ライブラリpickleをチェックするnumpyのより多くの一般的なオブジェクトを保存しますアレイ)。


あなたがのために行く必要がmy_image.nii.gz に保存されてnifti画像のデータ型に変更する場合:あなたがnumpyの配列my_arrを持っている場合、最後に

import nibabel as nib 
import numpy as np 

image = nib.load('my_image.nii.gz') 

# to be extra sure of not overwriting data: 
new_data = np.copy(image.get_data()) 
hd = image.header 

# in case you want to remove nan: 
new_data = np.nan_to_num(new_data) 

# update data type: 
new_dtype = np.int8 # for example to cast to int8. 
new_data = new_data.astype(new_dtype) 
image.set_data_dtype(new_dtype) 

# if nifty1 
if hd['sizeof_hdr'] == 348: 
    new_image = nib.Nifti1Image(new_data, image.affine, header=hd) 
# if nifty2 
elif hd['sizeof_hdr'] == 540: 
    new_image = nib.Nifti2Image(new_data, image.affine, header=hd) 
else: 
    raise IOError('Input image header problem') 

nib.save(new_image, 'my_image_new_datatype.nii.gz') 

とあなたを指定されたデータタイプnp.my_dtypeを使用してそれをniftiイメージに保存するには、次のようにします。

import nibabel as nib 
import numpy as np 

new_image = nib.Nifti1Image(my_arr, np.eye(4)) 
new_image.set_data_dtype(np.my_dtype) 

nib.save(new_image, 'my_arr.nii.gz') 

希望すると助かります!


注:ITKsnapを使用している場合は、np.float32np.float64np.uint16np.uint8np.int16np.int8を使用することもできます。他の選択肢では、このソフトウェアで開くことができる画像が生成されないことがあります。

関連する問題