[英]Send numpy array as bytes from python to JS through Flask
一個numpy數組應該從python發送到JS通過flask。 我不想將它jsonify並發送,因為它會增加響應的大小並最終增加響應時間。 所以我認為我可以使用tobytes()將numpy轉換為字節,通過燒瓶將字節發送到JS並將字節轉換回JS中的浮點數並找到將一串打包字節轉換為Javascript中的浮點數組答案有用。
操作列表是
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中創建了另一個客戶端,發出了相同的請求並將響應字節轉換為float。 我也在這里遇到了同樣的問題。 所以我縮小了問題是服務器端而不是客戶端問題。 我在使用多個值時發現的另一個有趣的事情是,只有大於127的數字(我猜是這樣)才會轉換為255。
在嘗試一些隨機黑客時,我嘗試使用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
但我的問題是,這是一個理想的解決方案,還是我在這里做一些破解工作? 任何人都可以幫助我理解為什么在沒有chr()的情況下發送普通字節不起作用?
如果您沒有明確設置MIME類型 ,我認為Flask會將其視為文本數據。 您的瀏覽器似乎已使用ASCII解碼二進制數據,這可以解釋為什么只有大於127的值受到影響。
因此,請嘗試在Flask中設置響應的Content-Type
:
@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
或者,有一個輔助函數flask.send_file
來在flask.send_file
中構造響應。 請在這里找一個例子。
除了這個錯誤,還要注意二進制數據的字節順序 ,這是特定於硬件的。 我會推薦你這個答案 ( Javascript Typed Arrays和Endianness )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.