在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])
最后,如果有大佬知道加[()]的原理是什么的话,麻烦告知一下,谢谢。
