【问题标题】:Efficient way to write a python dictionary with Numpy Nd-Array values into a Json File将具有 Numpy Nd-Array 值的 python 字典写入 Json 文件的有效方法
【发布时间】:2017-11-02 07:12:45
【问题描述】:

如何有效地编写 Python 字典,其中值是 Numpy Nd-Arrays 到 Json 文件? 我收到一条错误消息,指出 Numpy Nd-Array 不是 Json-Serializable。有什么办法可以克服吗?

【问题讨论】:

  • 您是否尝试将 Numpy 数组转换为(可能是嵌套的)列表?
  • 是的,可以将 Numpy 数组转换为列表,然后就可以工作了。我的问题是在另一个方向上:有没有更快的方法来实现这个目的,而不需要所有的转换和复制到列表?

标签: python numpy dictionary multidimensional-array


【解决方案1】:

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()))

输出

[[ 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 之前将它们转换为可移植的。

【讨论】:

    【解决方案2】:

    这是一个可以处理 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")
            decodedArray = json.load(read_file, cls=NumpyArrayDecoder)
            
        print("Re-Imported Data: \n")
        print(decodedArray)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多