我可以使用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维数组中的字典,让我无法通过密钥获取数据。或者我错过了什么?
所以我的问题是:
谢谢!
答案 0 :(得分:13)
可以恢复数据:
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
固有的任何内容
class,但是numpy.ndarray.item()
method
将数组中的值复制到标准Python scalars。在object
dtype数组中,数组单元格中的任何值(甚至是字典)都是Python标量:
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
恢复为dicts的词典:
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])
答案 1 :(得分:1)
基于这个答案:recover dict from 0-d numpy array
之后
a = {'key': 'val'}
scipy.savez('file.npz', a=a) # note the use of a keyword for ease later
你可以使用
get = scipy.load('file.npz')
a = get['a'][()] # this is crazy maybe, but true
print a['key']
它也可以在不使用关键字参数的情况下工作,但我认为这也值得分享。