web-dev-qa-db-fra.com

Le moyen le plus rapide d'analyser les chaînes JSON dans des tableaux numpy

J'ai d'énormes objets JSON contenant des listes 2D de coordonnées que je dois transformer en tableaux numpy pour le traitement. 

Cependant, utiliser json.loads suivi de np.array() est trop lent. 

Est-il possible d'augmenter la vitesse de création de tableaux numpy à partir de json?

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

Je prendrais n'importe quelle solution!

6
Below the Radar

La réponse la plus simple serait simplement:

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

Comme cela évite de boucler explicitement votre tableau en python, vous verriez probablement une accélération modeste. Si vous avez le contrôle sur la création de json_input, il serait préférable d'écrire en tant que tableau série. Une version est ici .

3
Daniel

Comme la syntaxe JSON est très proche de la syntaxe Python, je vous suggère d'utiliser ast.literal_eval. C'est peut-être plus rapide…

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

Essaie. Et dis nous.

3
Laurent LAPORTE

Pour ces données spécifiques, vous pouvez essayer ceci

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