首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改Numpy和Nibabel中的数据类型

更改Numpy和Nibabel中的数据类型
EN

Stack Overflow用户
提问于 2017-06-06 18:46:20
回答 4查看 4.9K关注 0票数 4

我正在尝试使用Nibabel将numpy数组转换为Nifti文件格式。我的一些Numpy数组有dtype('<i8'),当Nibabel调用数据类型时,它应该是dtype('uint8')

代码语言:javascript
复制
arr.get_data_dtype()

有人知道如何转换和保存Numpy数组的数据类型吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-08-09 11:29:57

标题问题与案文中的问题略有不同。所以..。

如果要将numpy数组arr的数据类型更改为np.int8,则需要查找arr.astype(np.int8)

请注意,由于数据转换,您可能会丢失精度(请参阅错误类型文档)

为了以后保存它,您可能希望看到?np.save?np.savetxt (或者检查库pickle,以保存比numpy数组更多的普通对象)。

如果要更改保存在my_image.nii.gz中的nifti映像的数据类型,则必须选择:

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

最后,如果您有一个numpy数组my_arr,并且希望将它保存到具有给定数据类型np.my_dtype的nifti映像中,那么您可以这样做:

代码语言:javascript
复制
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。其他选择可能无法生成可以使用此软件打开的图像。

票数 10
EN

Stack Overflow用户

发布于 2018-04-18 15:12:34

似乎你也可以

代码语言:javascript
复制
import nibabel

img = nibabel.load(filename)
img.set_data_dtype(dtype)
img.to_filename(new_filename)
票数 0
EN

Stack Overflow用户

发布于 2021-04-26 01:14:27

你可以用尼尔学来解决问题。下面是一个示例,如果您想将nifti图像的数据类型更改为int16:

代码语言:javascript
复制
from nilearn import image
import numpy as np

vol = image.load_img(input_file)
vol = image.new_img_like(vol, np.int16(vol.get_fdata()))
vol.to_filename(output_file)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44397617

复制
相关文章

相似问题

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