He enorme objetos json que contiene 2D listas de coordenadas que tengo que transformar en arrays de numpy para su procesamiento.

Sin embargo el uso de json.loads seguido con np.array() es demasiado lento.

Hay una manera de aumentar la velocidad de creación de arrays de numpy 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"]]

Me gustaría tener solución alguna!

  • Me estoy poniendo un json decodificador de error: «el Archivo «/usr/lib/python3.5,… json.decodificador.JSONDecodeError: se Esperaba valor: línea 1 columna 14 (char 13)`
  • tienes razón, es fija
  • Fue el () que no eran estándar JSON.
  • Otros analizadores eval y ast.literal_eval (más seguro). En esta pequeña muestra json.loads es notablemente más rápido. El np.array parte toma menos tiempo.

3 Comentarios

  1. 3

    La respuesta más sencilla sería:

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

    Ya que esto evita explícitamente en bucle encima de su matriz en python probablemente verá una modesta aceleración. Si usted tiene el control sobre la creación de json_input sería mejor escribir como una serie matriz. Una versión es aquí.

  2. 3

    Desde JSON sintaxis es muy cerca a la sintaxis de Python, le sugiero que utilice ast.literal_eval. Puede ser más rápido…

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

    Darle una oportunidad. Y nos dicen.

    • Gracias pero ast.literal_eval es más lento que el json.cargas() con mis datos
  3. 1

    Por esta específica los datos, usted podría tratar este

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

Dejar respuesta

Please enter your comment!
Please enter your name here