2013-04-08 23 views
3

我正在尋找一種方法來將包含numpy數組的嵌套字典轉換爲JSON文件(以將我的實驗和數據的完整日誌保存在一個位置)。將嵌套字典中的numpy數組轉換爲列表,同時保留字典結構

我的字典裏是這樣的(該結構可以是多個嵌套比顯示代碼):

import numpy as np 
data = {'foo': {'bar': np.array([1, 2, 3])}, 'goo': np.array([3,5,7]),'fur': {'dur': {'mur': np.array([7,5,8])}}} 

在此代碼失敗的時刻,因爲numpy的陣列是不可序列:

with open('data.txt','w') as fl: 
    json.dump(data,fl) 

我知道可以使用tolist()函數,但我不知道如何遍歷字典,同時保留數據結構並交換np.arrays列表。

我嘗試使用遞歸從字典中獲取單個值,但我不知道如何「生成字典」。我此刻的代碼(不JSON轉儲):

import numpy as np 

def dict_walk(data): 
    for k, v in data.iteritems(): 
     if isinstance(v, dict): 
      dict_walk(v) 
     else: 
      l = v.tolist() 
      print l 

data = {'foo': {'bar': np.array([1, 2, 3])}, 'goo': np.array([3,5,7]),'fur': {'dur': {'mur': np.array([7,5,8])}}} 
dict_walk(data)  
+0

您可能還想考慮使用[pickle](http://docs.python.org/2/library/pickle。 html),它可以讓你直接保存一個Python對象。 (當然,這個問題還是值得的,只是想指出另一種方法,以防你沒聽說過)。 – ASGM 2013-04-08 10:16:32

+0

@ASGM感謝您的建議!我使用JSON來兼容第三方軟件,所以我決定不要泡菜。 – Matt 2013-04-08 10:24:55

回答

7

你可以給一個json.dump功能default;它被稱爲任何JSON不知道如何處理的數據類型:

def default(obj): 
    if isinstance(obj, np.ndarray): 
     return obj.tolist() 
    raise TypeError('Not serializable') 

with open('data.txt','w') as fl: 
    json.dump(data, fl, default=default) 
+0

@ jmetz:啊,沒關係。 Numpy與它的類型系統是一致的; 'np.array()'產生'np.nparray()'類型的對象,它們在'repr()'輸出中使用'array'作爲名稱。好極了。 – 2016-06-24 10:17:40

相關問題