Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

399
Views
Enviar matriz numpy como bytes de python a JS a través de Flask

Se debe enviar una matriz numpy desde python a JS a través del matraz. No quiero jsonificarlo y enviarlo, ya que aumentaría el tamaño de la respuesta y, finalmente, el tiempo de respuesta. Así que pensé que podía convertir numpy en bytes usando tobytes (), enviar los bytes a JS a través del matraz y convertir los bytes nuevamente para flotar en JS y encontré útil Convertir una cadena de bytes empaquetados en una matriz de flotadores en Javascript .

La lista de operaciones son

 byte_arr = np.array([5.6], dtype=np.float32).tobytes() # Used one value just to make it simple return byte_arr # Bytes can be directly sent from flask as response

en JS,

 str = response.text bytes = Uint8Array.from(str, c => c.charCodeAt(0)) floats = new Float32Array(bytes.buffer)

Pero al convertir a float en JS, no obtengo los valores correctos. Al depurar, descubrí que en JS algunos valores en la matriz Uint8 no coinciden con los valores de byte que se envían desde python.

 JS: console.log(bytes) // [51, 51, 255, 64] Python: for val in byte_arr: print(val, end=" ") // 51, 51, 179, 64

Solo para verificar, creé otro cliente en python, hice la misma solicitud y convertí los bytes de respuesta en flotantes. Encontré el mismo problema aquí también. Así que reduje que el problema está en el lado del servidor, no en el lado del cliente. Otra cosa interesante que encontré al jugar con valores múltiples es que solo los números que son mayores que 127 (supongo que sí) se convierten a 255.

Mientras probaba algunos trucos aleatorios, traté de convertir el número entero de bytes en caracteres usando el método chr() de python antes de enviar la respuesta y la conversión en el lado del cliente funcionó.

 byte_arr = np.array([5.6], dtype=np.float32).tobytes() byte_arr_char = "".join([chr(i) for i in byte_arr]) return byte_arr_char

Pero la pregunta que tengo es, ¿es esta una solución ideal o estoy haciendo algún truco aquí para que funcione? ¿Alguien puede ayudarme a entender por qué no funciona el envío de bytes sin formato sin chr()?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Si no establece el tipo MIME explícitamente, creo que Flask lo tratará como datos de texto. Su navegador parece haber decodificado los datos binarios con ASCII, lo que puede explicar por qué solo se vieron afectados los valores superiores a 127.

Por lo tanto, intente configurar el Content-Type de la respuesta en Flask:

 @app.route('/your/url/to/numpy/data') def get_nparray(): your_np_array = np.array([5.6], dtype=np.float32) response = flask.make_response(your_np_array.tobytes()) response.headers.set('Content-Type', 'application/octet-stream') # response.headers.set('Content-Disposition', 'attachment', filename='np-array.bin') return response

Alternativamente, hay una función auxiliar flask.send_file para construir la respuesta en una sola línea. Encuentre un ejemplo aquí .

Además de este error, también preste atención a la endianidad de sus datos binarios, que es específica del hardware. Lo remitiría a esta respuesta ( Javascript Typed Arrays and Endianness ).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!