添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

将带有Numpy Nd-Array值的Python字典写入Json文件的高效方法

5 人关注

我如何有效地写一个Python字典,其中的值是Numpy Nd-Array到一个Json文件? 我得到一个错误,说Numpy Nd-Array不是Json-Serializable。有什么方法可以克服这个问题吗?

2 个评论
你是否尝试将Numpy数组转换为(可能是嵌套的)列表?
是的,可以将Numpy数组转换为列表,然后就可以工作了。我的问题是另一个方向:是否有更快的方法来达到这个目的,而不需要所有的转换和复制到列表?
python
numpy
dictionary
multidimensional-array
AlexGuevara
AlexGuevara
发布于 2017-06-01
2 个回答
PM 2Ring
PM 2Ring
发布于 2021-09-13
已采纳
0 人赞同

JSON只支持有限数量的数据类型。如果你想将其他类型的数据存储为JSON,那么你需要将其转换为JSON所接受的类型。Numpy数组的明显选择是将它们存储为(可能是嵌套的)列表。幸运的是,Numpy数组有一个 .tolist 方法可以有效地进行转换。

import numpy as np
import json
a = np.array(range(25), dtype=np.uint8).reshape(5, 5) 
print(a)
print(json.dumps(a.tolist()))

output

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]

.tolist将把数组元素转换为本地Python类型(int或float),如果它能无损地做到这一点。如果你使用其他数据类型,我建议你在调用.tolist之前将它们转换为可移植的类型。

henry
henry
发布于 2021-09-13
0 人赞同

这里有一个可以处理NumPy数组的编码器/解码器的完整工作实例。

import numpy
from json import JSONEncoder,JSONDecoder
import json
# ********************************** #
class NumpyArrayEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, numpy.ndarray):
            return obj.tolist()
        return JSONEncoder.default(self, obj)
class NumpyArrayDecoder(JSONDecoder):
    def default(self, obj):
        if isinstance(obj, list):
            return numpy.asarray(obj)
        return JSONEncoder.default(self, obj)
# ********************************** #
if __name__ == "__main__":
    # TO TEST
    numpyArrayOne = numpy.array([[11 ,22, 33], [44, 55, 66], [77, 88, 99]])
    numpyArrayTwo = numpy.array([[51, 61, 91], [121 ,118, 127]])
    # Serialization
    numpyData = {"arrayOne": numpyArrayOne, "arrayTwo": numpyArrayTwo}
    print("Original Data: \n")
    print(numpyData)
    print("\nSerialize NumPy array into JSON and write into a file")
    with open("numpyData.json", "w") as write_file:
        json.dump(numpyData, write_file, cls=NumpyArrayEncoder)
    print("Done writing serialized NumPy array into file")
    # Deserialization
    print("Started Reading JSON file")
    with open("numpyData.json", "r") as read_file:
        print("Converting JSON encoded data into Numpy array")