2013-04-08 125 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