在python中利用numpy.savez和numpy.load保存和加载数据

简单记录一下学习过程

numpy保存和加载数组(array)

保存和加载数组数据比较方便,不需要加任何参数

import numpy as np
array1 = np.array([4, 5, 6])
np.savez('test_array.npz', array_name=array1)  # 保存的文件名,array_name是随便起的,相当于字典的key

data = np.load('test_array.npz')  # 加载
array1 = data['array_name']  # 引用保存好的数组,他的格式默认是numpy.array
print(array1[1])  # 打印结果为5

numpy保存和加载列表list(集合set)

python的列表和集合在保存和加载时操作都是一样的

import numpy as np
list1 = [4, 5, 6]  # 当list所有元素都不是iter时,和array的保存、加载的操作一摸一样
np.savez('test_list1.npz', list1_name=list1)
data = np.load('test_list1.npz')
list1 = data['list1_name']  # 数据格式依旧是numpy.array
print(list1[1])

list2 = [4, 5, 6, [1, 2, 3]]  # 但当列表中含有iter时,即这里的iter为列表[1, 2, 3],保存和加载的操作就有所不同了
np.savez('test_list2.npz', list2_name=list2)
data = np.load('test_list2.npz', allow_pickle=True)  # 这里需要更改allow_pickle=True,不然会报错
list2 = data['list2_name']  # 数据格式依旧是numpy.array,想变成List格式的话直接list(data['list2_name'])即可
print(list2[1])

numpy保存和加载字典(dict)

字典在保存时与前面三个相同,但是加载时却不同

import numpy as np
a = np.ones(10)
dict1 = {'name': 'hundred', 'id': 100}
np.savez('test_dict1', dict1=dict1)  # 保存时加不加.npz后缀都行
data = np.load('test_dict1.npz', allow_pickle=True)
dict1 = data['dict1']
print(dict1['name'])

这时回报错,IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices,因此此时加载的数据格式是numpy.array,还不能当字典用,因此试试看能不能直接dict(),强制装换成字典

import numpy as np
a = np.ones(10)
dict1 = {'name': 'hundred', 'id': 100}
np.savez('test_dict1', dict1=dict1)  # 保存时加不加.npz后缀都行
data = np.load('test_dict1.npz', allow_pickle=True)
dict1 = dict(data['dict1'])
print(dict1['name'])

但此时却报错说迭代超过一个0维数组,因此不能dict()强制转换。
在这里插入图片描述

解决方法

在data[‘dict1’]后面加个[()],就可以正常当字典用了

import numpy as np
a = np.ones(10)
dict1 = {'name': 'hundred', 'id': 100}
np.savez('test_dict1', dict1=dict1)  # 保存时加不加.npz后缀都行
data = np.load('test_dict1.npz', allow_pickle=True)
dict1 = data['dict1'][()]
print(dict1['name'])

最后,如果有大佬知道加[()]的原理是什么的话,麻烦告知一下,谢谢。

你可能感兴趣的:(python,numpy)