【问题标题】:Convert numpy arrays in a nested dictionary into list whilst preserving dictionary structure将嵌套字典中的 numpy 数组转换为列表,同时保留字典结构
【发布时间】:2013-03-30 08:42:06
【问题描述】:

我正在寻找一种方法,如何将包含 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)       

【问题讨论】:

  • 您可能还想考虑使用pickle,它可以让您直接保存 Python 对象。 (这个问题还是值得的,当然,只是想指出另一种方法,以防你没听说过)。
  • @ASGM 感谢您的建议!我使用 JSON 是为了与第三方软件兼容,所以我决定不使用 pickle。

标签: python json numpy dictionary


【解决方案1】:

你可以给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)

【讨论】:

  • @jmetz:啊,没关系。 Numpy 的类型系统很迟钝。 np.array() 生成 np.nparray() 类型的对象,这些对象在其 repr() 输出中使用 array 作为名称。耶。
猜你喜欢
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2017-01-20
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多