我尝试使用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数组'数据类型?
答案 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.float32
,np.float64
,np.uint16
,np.uint8
,np.int16
,np.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)