【问题标题】:Making numpy arrays JSON serializable使 numpy 数组 JSON 可序列化
【发布时间】:2018-06-26 20:42:30
【问题描述】:

我有一个程序以 NumPy 数组的形式处理数据,它需要以 JSON 形式存储(稍后将其传递给另一个程序以可视化数据)。当我尝试以下操作时:

my_array = np.array([3, 4, 5])
json.dumps(my_array)

我收到一条错误消息阅读

TypeError: array([3, 4, 5]) is not JSON serializable

所以事实证明数组是不可序列化的。我希望通过将数组转换为普通列表来解决这个问题,但如果我尝试

my_array = np.array([3, 4, 5])
my_list = list(my_array)
json.dumps(my_list)

我只是读错了

TypeError: 3 is not JSON serializable

3 似乎是因为 '3' 是列表的第一个元素)

更奇怪的是,当我尝试从头开始重建列表时,此错误仍然存​​在:

def plain_list(ls):
  pl = []
  for element in ls:
    pl.append(element)
  return pl

my_array = np.array([3, 4, 5])
my_list = plain_list(my_array)
json.dumps(my_list)

仍然返回

TypeError: 3 is not JSON serializable

我有两个问题:

  1. 怎么连最后一个都不起作用?它不应该“忘记”曾经是 NumPy 数组的一切吗? NumPy 数组中的整数是否真的与普通整数不是相同的对象,它们是否带有一些特殊的不可见属性,即使在数组之外也仍然存在?
  2. 如何我如何有效地以 JSON 格式存储数组(无论解决方案可能需要多么复杂)?

【问题讨论】:

    标签: python arrays json python-3.x numpy


    【解决方案1】:

    3 是一个 NumPy integer,它的显示方式与常规 Python int 类似,但不是一个。使用tolist 获取普通 Python 整数列表:

    json.dumps(my_array.tolist())
    

    这也将多维数组转换为嵌套列表,因此您不必为 3 维数组处理 3 层列表推导。

    【讨论】:

    • 除了 user2357112 关于如何让您的代码工作的正确答案之外,请考虑扩展 json 以便能够按照指定的 here 对您的数组进行编码。
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 2017-12-06
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多