在使用numpy保存和加载数据的时候分别遇到了allow_pickle=False报错和字典数据加载后如何使用的问题,总结梳理如下。
普通数据的保存
numpy的保存和加载分别是以下两个函数:
- numpy.save
- numpy.load
使用方法较为简单,save会将数据保存为.npy 的文件。具体可直接看下面字典数据的例子。
可以进一步参见这篇文章,里面讲了非结构化数据保存以及 numpy.savez 的使用方法。
其他保存数据函数可参见文章 numpy数据存储(save、savetxt、savez)的区别
这里需要说明的是有时候直接使用load会报错:ValueError: Object arrays cannot be loaded when allow_pickle=False
这是由于numpy版本造成的,如果卸载新版本,重装 pip install numpy==1.16.2 的话是可以解决问题的,但这样未免有些麻烦,而且之后可能会有其他冲突。正确的解决方式为直接在 load 的参数列表中加上 allow_pickle=True,见下面字典数据的例子。具体可参考
字典数据保存与加载
字典数据的保存没有特殊之处,主要在于加载与使用。
如果直接用 np.load 来加载的话得到的数据类型是 ndarray,但却是0维数组,而且用字典的索引方式是会直接报错。
import numpy as np
a = {'alpha':1,'beta':'b','gamma':[2,3]}
np.save('test',a) #在当前目录生成test.npy文件
b = np.load('test.npy',allow_pickle=True)
print(type(b)) #<class 'numpy.ndarray'>
print(b.shape) #()
print(b.ndim) #0
print(b['alpha']) #报错
正确的使用方法是在加载的数据后加上 item() 则得到当时保存的字典,接下来的操作就与普通字典无异。
c = b.item()
print(c) #{'alpha': 1, 'beta': 'b', 'gamma': [2, 3]}
print(type(c)) #<class 'dict'>
print(c.items()) #dict_items([('alpha', 1), ('beta', 'b'), ('gamma', [2, 3])])
print(c.keys()) #dict_keys(['alpha', 'beta', 'gamma'])
print(c.values()) #dict_values([1, 'b', [2, 3]])
print(c.get('alpha')) #1,使用索引与get函数效果相同
print(c['alpha']) #1
字典的常用操作
字典的创建可以直接使用花括号,也可以使用 dict() 函数。
dict1 = {'a':1,'2020':[1,2,3],100:('hello','world')}
dict1
dict1.items() #获取字典中所有键/值对元素,并一一封装在元组中
dict1.keys() #获取字典中所有键
dict1.values() #获取字典中所有值
dict1[100] #输出键为100的字典元素值
输出结果为
{'a': 1, '2020': [1, 2, 3], 100: ('hello', 'world')}
dict_items([('a', 1), ('2020', [1, 2, 3]), (100, ('hello', 'world'))])
dict_keys(['a', '2020', 100])
dict_values([1, [1, 2, 3], ('hello', 'world')])
('hello', 'world')