numpy.frexp
numpy.frexp(x, *ufunc_args) = <ufunc 'frexp'>
Функция frexp() выполняет разложение элементов массива на мантиссу и степень двойки.
-
- x - число, массив или подобный массиву объект
- Входной массив.
- *ufunc_args - аргументы универсальной функции
- Аргументы, позволяющие настроить и оптимизировать работу функции (подробнее см. универсальные функции).
-
- результат - кортеж из двух чисел или двух массивов NumPy
- Первый массив содержит значения в интервале (-1, 1), т.е. мантиссу каждого элемента из x, второй массив содержит соответствующую степень двойки. Если на вход подано только одно число, то результатом будет кортеж из двух чисел.
Примеры
>>> import numpy as np
>>>
>>> np.frexp(12)
(0.75, 4)
>>>
>>> 0.75*2**4
12.0
Иногда бывают такие случаи, когда обратное возведение двойки в полученную степень выдает ошибку, если значение степени отрицательно:
>>> m, p = np.frexp(1e-77)
>>> m, p
(0.5789604461865809, -255)
>>>
>>> m*2**p
Traceback (most recent call last):
File "", line 1, in
ValueError: Integers to negative integer powers are not allowed.
Все из-за типов данных, которые очень важны для вычислений под капотом NumPy. При возникновении таких ошибок иногда нужно просто, где-нибудь добавить точку:
>>> m*2.**p
1e-77
>>>
>>>
>>> x = [0, 1, 2, 3]
>>> np.frexp(x)
(array([0. , 0.5 , 0.5 , 0.75]), array([0, 1, 2, 2], dtype=int32))
>>>
>>> x = [0.1, 0.2, 0.3]
>>> np.frexp(x)
(array([0.8, 0.8, 0.6]), array([-3, -2, -1], dtype=int32))
>>>
>>>
>>> # Данная функция неприменима к комплексным числам:
... np.frexp(1 + 1j)
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: ufunc 'frexp' not supported for the input types,
and the inputs could not be safely coerced to any supported
types according to the casting rule ''safe''