将JSON字符串解析成numpy数组的最快方法

19
我有包含2D坐标列表的巨大JSON对象,我需要将它们转换为numpy数组以进行处理。
但是使用"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 解码错误: File "/usr/lib/python3.5,... json.decoder.JSONDecodeError: Expecting value: line 1 column 14 (char 13) - hpaulj
@hpaulj 你说得对,问题已经解决了。 - Below the Radar
非标准 JSON 的部分是 () - hpaulj
其他解析器包括evalast.literal_eval(更安全)。在这个小样本中,json.loads明显更快。np.array部分所需时间更少。 - hpaulj
3个回答

6
最简单的回答就是:
numpy_2d_arrays = np.array(dict["rings"])

由于这种方法避免了在Python中显式循环数组,因此您可能会看到适度的加速。如果您可以控制json_input的创建,最好将其写成串行数组。一个版本在这里


4

由于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"]]

试一下,然后告诉我们。


1
谢谢,但是对于我的数据来说,ast.literal_eval比json.loads()慢。 - Below the Radar

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

1
使用eval不安全。 - ei-grad
4
这取决于上下文。Python一直都是为成年人设计的! - Gribouillis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接