Después de crear una matriz NumPy y guardarla como una variable de contexto de Django, recibo el siguiente error al cargar la página web:
array([ 0, 239, 479, 717, 952, 1192, 1432, 1667], dtype=int64) is not JSON serializable
¿Qué significa esto?
json
módulo. Peronumpy.ndarray
no es un tipo quejson
sepa manejar. Necesitará escribir su propio serializador o (más simplemente) simplemente pasarlist(your_array)
a lo que sea que esté escribiendo el json.list(your_array)
no siempre funcionará, ya que devuelve entradas numpy, no entradas nativas. Usar en suyour_array.to_list()
lugar.Respuestas:
Regularmente "jsonify" np.arrays. Intente usar primero el método ".tolist ()" en las matrices, de esta manera:
Para "desjonificar" el uso de la matriz:
fuente
tolist()
.tolist()
lleva una gran cantidad de tiempo cuando los datos son grandes.Almacene como JSON un numpy.ndarray o cualquier composición de lista anidada.
Saldrá:
Para restaurar desde JSON:
Saldrá:
fuente
numpy.asarray()
?if isinstance(obj, np.float32) or isinstance(obj, np.float64): return float(obj)
Puedes usar Pandas :
fuente
pd.DataFrame(your_array).to_json('data.json', orient='split')
.Encontré la mejor solución si ha anidado matrices numpy en un diccionario:
Gracias a este chico .
fuente
json
reverso puede usar esto:,with open(path, 'r') as f:
data = json.load(f)
que devuelve un diccionario con sus datos.json
archivo y luego para deserializar su salida, puede usar esto:data = json.loads(data)
Usa el
json.dumps
default
kwarg:En la
default
función, compruebe si el objeto es numpy del módulo, si es así, usendarray.tolist
para aondarray
use.item
para cualquier otro tipo específico de numpy.fuente
type(obj).__module__ == np.__name__:
allí? ¿No sería suficiente verificar la instancia?.item
para casi cualquier objeto numpy.default
Se llama a la función para todos losjson.dumps
intentos de serialización de tipos desconocidos . no solo numpyPor defecto, esto no es compatible, ¡pero puede hacer que funcione con bastante facilidad! Hay varias cosas que querrá codificar si desea recuperar exactamente los mismos datos:
obj.tolist()
como se menciona en @travelingbones. A veces esto puede ser lo suficientemente bueno.Además, su matriz numpy podría formar parte de su estructura de datos, por ejemplo, tiene una lista con algunas matrices dentro. Para eso, podría usar un codificador personalizado que básicamente hace lo anterior.
Esto debería ser suficiente para implementar una solución. O podría usar json-tricks que hace exactamente esto (y admite varios otros tipos) (descargo de responsabilidad: lo hice).
Luego
fuente
Tuve un problema similar con un diccionario anidado con algunos numpy.ndarrays en él.
fuente
También podría usar
default
argumentos, por ejemplo:fuente
Además, hay información muy interesante sobre listas vs. arrays en Python ~> Python List vs. Array: ¿cuándo usarlo?
Cabe señalar que una vez que convierto mis matrices en una lista antes de guardarlo en un archivo JSON, en mi implementación ahora mismo de todos modos, una vez que leí ese archivo JSON para usarlo más tarde, puedo seguir usándolo en forma de lista (como opuesto a convertirlo de nuevo a una matriz).
Y en realidad se ve mejor (en mi opinión) en la pantalla como una lista (separada por comas) frente a una matriz (no separada por comas) de esta manera.
Usando el método .tolist () de @ travelingbones anterior, he estado usando como tal (detectando algunos errores que he encontrado también):
GUARDAR DICCIONARIO
LEER DICCIONARIO
¡Espero que esto ayude!
fuente
Aquí hay una implementación que funcionó para mí y eliminó todos los nans (suponiendo que estos sean objetos simples (list o dict)):
fuente
Esta es una respuesta diferente, pero podría ayudar a las personas que intentan guardar datos y luego volver a leerlos.
Hay Hickle que es más rápido que encurtido y más fácil.
Traté de guardarlo y leerlo en pickle dump, pero mientras leía hubo muchos problemas y perdí una hora y aún no encontré la solución, aunque estaba trabajando en mis propios datos para crear un bot de chat.
vec_x
yvec_y
son matrices numpy:Luego solo lo lees y realizas las operaciones:
fuente
Puede hacer un bucle simple con tipos de comprobación:
fuente
use NumpyEncoder procesará el volcado json con éxito. Sin tirar - La matriz NumPy no es serializable JSON
fuente
TypeError: array ([[0.46872085, 0.67374235, 1.0218339, 0.13210179, 0.5440686, 0.9140083, 0.58720225, 0.2199381]], dtype = float32) no es serializable JSON
El error mencionado anteriormente se produjo cuando intenté pasar la lista de datos a model.predict () cuando esperaba la respuesta en formato json.
Pero afortunadamente encontré la pista para resolver el error que estaba lanzando. La serialización de los objetos es aplicable solo para la siguiente conversión La asignación debe ser de la siguiente manera objeto - matriz dict - cadena de lista - entero de cadena - entero
Si se desplaza hacia arriba para ver la línea número 10 prediction = loaded_model.predict (d) donde esta línea de código estaba generando la salida del tipo de datos de matriz, cuando intenta convertir la matriz a formato json no es posible
Finalmente encontré la solución simplemente convirtiendo la salida obtenida a la lista de tipos siguiendo las líneas de código
Bhoom! finalmente obtuve el resultado esperado,
fuente