使 numpy 数组 JSON 可序列化

Posted

技术标签:

【中文标题】使 numpy 数组 JSON 可序列化【英文标题】:Making numpy arrays JSON serializable 【发布时间】: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

我有两个问题:

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

【问题讨论】:

【参考方案1】:

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

json.dumps(my_array.tolist())

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

【讨论】:

除了 user2357112 关于如何让您的代码工作的正确答案之外,请考虑扩展 json 以便能够按照指定的 here 对您的数组进行编码。

以上是关于使 numpy 数组 JSON 可序列化的主要内容,如果未能解决你的问题,请参考以下文章

使用常规编码器使对象 JSON 可序列化

JSON 数组反序列化使 Dalvik VM 崩溃

如何使方法 JSON 可序列化以在自定义 Pyspark 转换器中使用

TypeError:“float32”类型的对象不是 JSON 可序列化的 [重复]

python常用序列listtuples及矩阵库numpy的使用

序列化 Numpy 数组的意外行为