使 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 可序列化以在自定义 Pyspark 转换器中使用
TypeError:“float32”类型的对象不是 JSON 可序列化的 [重复]