我可以使用np.savez存儲字典嗎? 結果令人驚訝(至少對我來說),而且我找不到一種方法可以通過密鑰將數據還給我。用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維數組中的字典,讓我無法通過密鑰獲取我的數據。或者我錯過了什麼?
所以我的問題是:
- 這裏會發生什麼?如果我仍然可以通過密鑰訪問我的數據,如何?
- 什麼是最好的方式來存儲這種類型的數據? (以str作爲鍵和其他詞典作爲值的字典)
謝謝!
感謝unutbu,這很清楚。雖然在腳本中以這種方式實際存儲和恢復數據似乎過於複雜,但我仍然有興趣瞭解您/他人如何存儲此類數據。泡菜也許? – louic
我認爲首先要考慮的是如果你真的需要一個字典的字典。這真的是最好的數據結構嗎?一個缺點是它打破了你的numpy陣列。無論何時您想對每個數組執行操作,小型或許多NumPy數組都需要Python循環。當你可以在一個大的numpy數組上執行NumPy操作時,你可以從NumPy中獲得更好的性能,因爲這會將更多工作推入快速的底層C/Fortran函數中,而減少到相對較慢的Python循環。 – unutbu
您可能需要調查[Pandas](http://pandas.pydata.org)DataFrames。您可以使用帶有多索引的DataFrame來替換字典密鑰的兩個級別。您可以將DataFrame存儲爲高性能壓縮格式,如hdf5。 – unutbu