Numpy массив должен быть отправлен из Python в JS через колбу.Я не хочу jsonify это и отправить, поскольку это увеличило бы размер ответа и в конечном счете время ответа.Поэтому я подумал, что смогу преобразовать numy в байты с помощью tobytes (), отправить байты в JS через flask и преобразовать байты обратно в float в 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)
Но при конвертации в float в JS я не получаю правильныйценности.При отладке я обнаружил, что в 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.
При попытке случайного взлома я попытался преобразовать байтцелое число в символе с использованием метода chr () python перед отправкой ответа и преобразование на стороне клиента сработало.
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 () не работает?