使用 Flask 将 Numpy 数组从 Python 发送到 JS。我不想使用 jsonify 将其发送,因为这样会增加响应大小并最终增加响应时间。因此,我考虑使用 tobytes() 将 numpy 转换为字节,通过 Flask 将字节发送到 JS,并在 JS 中将字节转换回浮点数,我发现 Converting a string of packed bytes into an array of floats in Javascript 的解答很有用。
操作列表如下:
在JS中,
操作列表如下:
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
在JS中,
str = response.text
bytes = Uint8Array.from(str, c => c.charCodeAt(0))
floats = new Float32Array(bytes.buffer)
但是在JS中转换为float时,我得不到正确的值。在调试过程中,我发现在JS中,一些Uint8数组中的值与从Python发送的字节值不匹配。
JS: console.log(bytes) // [51, 51, 255, 64]
Python: for val in byte_arr: print(val, end=" ") // 51, 51, 179, 64
仅为了验证,我在Python中创建了另一个客户端,发出了相同的请求,并将响应字节转换为浮点数。我在这里也遇到了相同的问题。因此,我缩小了问题范围,发现问题出现在服务器端而不是客户端。
在尝试多个值时,我发现有趣的一件事是,只有大于127(我猜是)的数字才会被转换为255。
在尝试一些随机的hack时,在发送响应之前,我尝试使用Python的chr()方法将字节整数转换为字符,并且在客户端上进行了转换。
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
但我的问题是,这是否是一个理想的解决方案,或者我在进行一些 hack 才能使其正常工作?有人能帮我理解为什么发送普通字节而不使用 chr() 会失败吗?
byte_arr
的值是什么,JS中response.text
的值是什么吗? - mostsquaresresponse
是如何接收的?你是否确保设置了适当的响应类型? - Martijn Pieters