将嵌套字典中的numpy数组转换为列表,同时保留字典结构

时间:2013-04-08 09:54:33

标签: python json numpy dictionary

我正在寻找一种方法如何将包含numpy数组的嵌套字典转储到JSON文件中(以便在一个地方保存我的实验和数据的完整日志)。

我的字典看起来像这样(结构可能比显示的代码更嵌套):

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)       

1 个答案:

答案 0 :(得分:9)

您可以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)