我正在尝试使用 Nibabel 将 numpy 数组转换为 Nifti 文件格式。我的一些 Numpy 数组在 Nibabel 调用数据类型dtype('<i8')时应该出现dtype('uint8')。
arr.get_data_dtype()
Run Code Online (Sandbox Code Playgroud)
有谁知道如何转换和保存 Numpy 数组的数据类型?
标题的问题与正文中的问题略有不同。所以...
如果要将 numpy 数组的数据类型更改arr为np.int8,您正在寻找arr.astype(np.int8).
请注意,您可能会因数据转换而失去精度(请参阅astype文档)
要在之后保存它,您可能想要查看?np.save和?np.savetxt(或检查库pickle,以保存比 numpy 数组更通用的对象)。
如果要更改保存在其中的 nifti 图像的数据类型,my_image.nii.gz
则必须执行以下操作:
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')
Run Code Online (Sandbox Code Playgroud)
最后,如果您有一个 numpy 数组my_arr并且想要将它保存到具有给定数据类型的 nifti 图像中np.my_dtype,您可以执行以下操作:
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')
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
注意:如果您使用 ITKsnap,您可能需要使用np.float32, np.float64, np.uint16, np.uint8, np.int16, np.int8。其他选择可能无法生成可以使用此软件打开的图像。