我可以使用np.savez存储字典吗?结果令人惊讶(至少对我而言),而且我找不到找到通过密钥取回数据的方法。
In [1]: a = {'0': {'A': array([1,2,3]), 'B': array([4,5,6])}} In [2]: a Out[2]: {'0': {'A': array([1, 2, 3]), 'B': array([4, 5, 6])}} In [3]: np.savez('model.npz', **a) In [4]: a = np.load('model.npz') In [5]: a Out[5]: <numpy.lib.npyio.NpzFile at 0x7fc9f8acaad0> In [6]: a['0'] Out[6]: array({'B': array([4, 5, 6]), 'A': array([1, 2, 3])}, dtype=object) In [7]: a['0']['B'] --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-16-c916b98771c9> in <module>() ----> 1 a['0']['B'] ValueError: field named B not found In [8]: dict(a['0']) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-d06b11e8a048> in <module>() ----> 1 dict(a['0']) TypeError: iteration over a 0-d array
我不完全了解发生了什么。看来我的数据变成了0维数组内的字典,使我无法按键取回数据。还是我错过了什么?
所以我的问题是:
谢谢!
可以恢复数据:
In [41]: a = {'0': {'A': array([1,2,3]), 'B': array([4,5,6])}} In [42]: np.savez('/tmp/model.npz', **a) In [43]: a = np.load('/tmp/model.npz')
注意,dtype是’object’。
In [44]: a['0'] Out[44]: array({'A': array([1, 2, 3]), 'B': array([4, 5, 6])}, dtype=object)
而且数组中只有一项。该项目是Python字典!
In [45]: a['0'].size Out[45]: 1
您可以使用item()方法来检索值(注意:这 不是items()字典的 方法,也不是NpzFile 类固有的任何numpy.ndarray.item()方法,而是 将数组中的值复制到标准Python标量的方法。在objectdtype数组中,任何值Python标量保存在数组(甚至是字典)的单元格中:
item()
items()
NpzFile
numpy.ndarray.item()
object
In [46]: a['0'].item() Out[46]: {'A': array([1, 2, 3]), 'B': array([4, 5, 6])} In [47]: a['0'].item()['A'] Out[47]: array([1, 2, 3]) In [48]: a['0'].item()['B'] Out[48]: array([4, 5, 6])
还原a为辞令:
a
In [84]: a = np.load('/tmp/model.npz') In [85]: a = {key:a[key].item() for key in a} In [86]: a['0']['A'] Out[86]: array([1, 2, 3])