【问题标题】:Fastest way to parse JSON strings into numpy arrays将 JSON 字符串解析为 numpy 数组的最快方法
【发布时间】:2017-04-25 10:26:52
【问题描述】:

我有巨大的 json 对象,其中包含我需要转换为 numpy 数组进行处理的 2D 坐标列表。

但是使用json.loads 后跟np.array() 太慢了。

有没有办法提高从 json 创建 numpy 数组的速度?

import json
import numpy as np

json_input = '{"rings" : [[[-8081441.0, 5685214.0], [-8081446.0, 5685216.0], [-8081442.0, 5685219.0], [-8081440.0, 5685211.0], [-8081441.0, 5685214.0]]]}'

dict = json.loads(json_input)
numpy_2d_arrays = [np.array(ring) for ring in dict["rings"]]

我会采取任何解决方案!

【问题讨论】:

  • 我收到 json 解码器错误:` 文件 "/usr/lib/python3.5,... json.decoder.JSONDecodeError: 期望值:第 1 行第 14 列(字符 13 )`
  • @hpaulj 你是对的,它是固定的
  • () 是非标准 JSON。
  • 其他解析器是evalast.literal_eval(更安全)。在这个小样本上,json.loads 明显更快。 np.array 部分花费的时间更少。

标签: python json numpy cython


【解决方案1】:

最简单的答案就是:

numpy_2d_arrays = np.array(dict["rings"])

由于这避免了在 python 中显式循环您的数组,您可能会看到适度的加速。如果您可以控制json_input 的创建,最好将其写为串行数组。一个版本是here

【讨论】:

    【解决方案2】:

    由于 JSON 语法非常接近 Python 语法,我建议您使用ast.literal_eval。可能会更快……

    import ast
    import numpy as np
    
    json_input = """{"rings" : [[[-8081441.0, 5685214.0],
                                 [-8081446.0, 5685216.0],
                                 [-8081442.0, 5685219.0],
                                 [-8081440.0, 5685211.0],
                                 [-8081441.0, 5685214.0]]]}"""
    
    rings = ast.literal_eval(json_input)
    numpy_2d_arrays = [np.array(ring) for ring in rings["rings"]]
    

    试一试。告诉我们。

    【讨论】:

    • 谢谢,但我的数据中 ast.literal_eval 比 json.loads() 慢
    【解决方案3】:

    对于这个特定的数据,你可以试试这个

    import numpy as np
    
    json_input = '{"rings" : [[(-8081441.0, 5685214.0), (-8081446.0, 5685216.0), (-8081442.0, 5685219.0), (-8081440.0, 5685211.0), (-8081441.0, 5685214.0)]]}'
    i = json_input.find('[')
    L = eval(json_input[i+1:-2])
    print(np.array(L))
    

    【讨论】:

    • 使用 eval 是不安全的
    • @ei-grad 这取决于上下文。 Python 一直是为同意的成年人而设计的!
    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多