使numpy数组JSON可序列化

时间:2018-01-17 21:12:44

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

我有一个以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形式存储数组(无论解决方案可能需要多么复杂)?

2 个答案:

答案 0 :(得分:8)

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

json.dumps(my_array.tolist())

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

答案 1 :(得分:0)

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