在Numpy和Nibabel中更改数据类型

时间:2017-06-06 18:46:20

标签: numpy

我尝试使用Nibabel将numpy数组转换为Nifti文件格式。当Nibabel调用数据类型时,我的一些Numpy数组应该为dtype('uint8') arr.get_data_dtype()

import { NavigationActions } from 'react-navigation';


     handlePress(){
        firebaseRef.auth().signInWithEmailAndPassword(this.state.email, this.state.password).then(function(firebaseUser){
          //Success, move to homepage.
          const resetAction = NavigationActions.reset({
          index: 0,
          actions: [
            NavigationActions.navigate({ routeName: 'Home'})
          ]
        })
        this.props.navigation.dispatch.(resetAction);
        }).catch(function(error){
          //Failed to log in, print error.
        }); 
       }

有谁知道如何转换和保存Numpy数组'数据类型?

3 个答案:

答案 0 :(得分:4)

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

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

请注意,由于数据转换,您可能会失去精确度(请参阅astype文档)

要在之后保存,您可能希望查看?np.save?np.savetxt(或检查库pickle,以保存比numpy数组更多的常规对象。

如果要更改my_image.nii.gz中保存的nifti图像的数据类型 你必须去:

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图像,则可以执行以下操作:

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 。其他选择可能无法生成可以使用此软件打开的图像。

答案 1 :(得分:1)

好像你也可以这样做

ErrHandlers:

答案 2 :(得分:0)

您可以使用 nilearn 来获得整洁的解决方案。下面是一个例子,如果你想把 nifti 图像的数据类型更改为 int16:

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)