簡體   English   中英

通過Flask將numpy數組作為字節從python發送到JS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM