#python #arrays #numpy
#python #массивы #numpy
Вопрос:
Я хотел бы извлечь значение uint32
числа с плавающей запятой с помощью numpy. Я создаю массив numpy из uint32
объединения 4 uint8
примерно так,
u_arr = np.array([10,2,4,8], "uint8")
arr = (np.array(u_arr[0],"uint32") << 24) (np.array(u_arr[1],"uint32") << 16) (np.array(u_arr[2],"uint32") << 8) (np.array(u_arr[3],"uint32"))
val_f = arr.astype(float) ## gives me the float of the uint32 which is wrong
## arr, val_f = (167904264, 167904264.0)
Как я могу вернуть значение с плавающей запятой, сохраненное uint32
in arr
?
Комментарии:
1. «arr» имеет тип numpy.int64. Знаете ли вы, каково ваше ожидаемое значение для float ?
2. Я только что заметил, что это тоже .. это должно быть uint32, а значение float — float32
Ответ №1:
Выполняет ли это задание?
import numpy as np
import struct
def numpy_int64_bits_to_float(numpy_int64_value):
bytes_object = struct.pack(">l", numpy_int64_value)
float_value = struct.unpack(">f", bytes_object)[0]
return float_value
u_arr = np.array([63,128,0,0], "uint8")
arr = (np.array(u_arr[0],"uint32") << 24) (np.array(u_arr[1],"uint32") << 16) (np.array(u_arr[2],"uint32") << 8) (np.array(u_arr[3],"uint32"))
val_f = numpy_int64_bits_to_float(arr)
«l» для «длинного» типа c, а «f» для «float».
«q» означает «длинный длинный» тип c, а «d» означает double.
Это «символы формата».
Обязательно проверьте типы, которые вы присваиваете функции, и / или адаптируйте символы формата.
Вы можете проверить документ здесь: https://docs.python.org/3/library/struct.html#struct-format-strings .
Использование «>» заключается в том, чтобы гарантировать, что порядок байтов является «порядковым» (тот же источник).
Комментарии:
1. здесь что-то не так.. Логика кажется правильной.. [63,128,0,0] должно быть 1.0, но это дает
5.263544247e-315
2. Я отредактировал свой код с вашими значениями и поэтому изменил типы, это то, что вы ищете?