преобразование бит uint32 в float в numpy

#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. Я отредактировал свой код с вашими значениями и поэтому изменил типы, это то, что вы ищете?