web-dev-qa-db-ja.com

JSON文字列をnumpy配列に解析する最速の方法

処理のためにnumpy配列に変換する必要がある座標の2Dリストを含む巨大なjsonオブジェクトがあります。

ただし、_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"]]
_

私はどんな解決策もとります!

12
Below the Radar

最も簡単な答えは次のとおりです。

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

これにより、python=で配列を明示的にループすることが回避されるため、おそらく適度なスピードアップが見られます。json_inputの作成を制御できる場合は、シリアルとして書き出す方がよいでしょう配列。バージョンは here です。

3
Daniel

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

試してみる。そして教えてください。

3
Laurent LAPORTE

この特定のデータについては、これを試すことができます

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
Gribouillis