Функция frexp
Функция frexp разлагает каждое число из переданного массива на мантиссу и экспоненту,
таким образом, что число = мантисса * 2^экспонента. Первым параметром функция принимает
входной массив. Вторым параметром можно указать массив для вывода экспонент (необязательно).
Функция возвращает кортеж из двух массивов: первый содержит мантиссы в диапазоне [0.5, 1.0),
второй - целочисленные экспоненты.
Синтаксис
np.frexp(arr, [out2])
Пример
Давайте разложим число 8.0 на мантиссу и экспоненту:
import numpy as np
mantissa, exponent = np.frexp(8.0)
print(f"mantissa: {mantissa}, exponent: {exponent}")
Результат выполнения кода:
"mantissa: 0.5, exponent: 4"
Проверяем: 0.5 * 2^4 = 0.5 * 16 = 8.0.
Пример
Применим frexp к массиву чисел:
import numpy as np
arr = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
mantissa, exponent = np.frexp(arr)
print("Mantissas:", mantissa)
print("Exponents:", exponent)
Результат выполнения кода:
"Mantissas: [0.5 0.5 0.75 0.5 0.625]"
"Exponents: [1 2 2 3 3]"
Для проверки: 0.5*2^1 = 1.0, 0.5*2^2 = 2.0, 0.75*2^2 = 3.0, 0.5*2^3 = 4.0, 0.625*2^3 = 5.0.
Пример
Функция frexp работает и с отрицательными числами:
import numpy as np
arr = np.array([-1.5, 2.5, -3.5])
mantissa, exponent = np.frexp(arr)
print("Mantissas:", mantissa)
print("Exponents:", exponent)
Результат выполнения кода:
"Mantissas: [-0.75 0.625 -0.875]"
"Exponents: [1 2 2]"
Знак числа сохраняется в мантиссе, а экспонента всегда положительна для чисел > 1.
Пример
Используем frexp для малых чисел:
import numpy as np
arr = np.array([0.1, 0.01, 0.001])
mantissa, exponent = np.frexp(arr)
print("Mantissas:", mantissa)
print("Exponents:", exponent)
Результат выполнения кода:
"Mantissas: [0.8 0.64 0.512]"
"Exponents: [-3 -6 -9]"
Для чисел меньше 1 экспонента становится отрицательной.
Пример
Восстановим исходное число с помощью обратной функции ldexp:
import numpy as np
arr = np.array([1.5, 2.7, 3.8])
mantissa, exponent = np.frexp(arr)
restored = np.ldexp(mantissa, exponent)
print("Original:", arr)
print("Restored:", restored)
Результат выполнения кода:
"Original: [1.5 2.7 3.8]"
"Restored: [1.5 2.7 3.8]"