在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])

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

经验分享 程序员 微信小程序 职场和发展