Как вычислить число, такое как np.exp(-28000) на Python? Ответ около 5E-12161. Мне сказали, что из-за формата с плавающей запятой двойной точности я смогу вычислить только число > 1e-2048.
Экспонента больших отрицательных чисел
comment
в чем проблема с np.exp(-28000)?
- person Eric   schedule 29.03.2017
comment
Я получаю 0,0 для np.exp(-28000)
- person Daniel George   schedule 29.03.2017
comment
Что ты собираешься делать с этим номером? Можете ли вы организовать свои расчеты так, чтобы вам нужно было работать только с логарифмами чисел? -28000 гораздо проще работать, чем exp(-28000).
- person Warren Weckesser   schedule 29.03.2017
comment
Я пытаюсь создать затухающую синусоиду с заданным массивом времени до 28000
- person Daniel George   schedule 29.03.2017
comment
@WarrenWeckesser: см. мой полный вопрос: stackoverflow.com/q/43100725/6943476
- person Daniel George   schedule 29.03.2017
Ответы (3)
Попробуйте десятичный модуль.
Decimal(math.exp(1))**-28000
person
phg1024
schedule
29.03.2017
Благодарю вас! Теперь мне нужно выяснить, как это сделать для массива
- person Daniel George; 29.03.2017
@DanielGeorge: я добавил подход, позволяющий работать с массивами. Пожалуйста, посмотрите.
- person kmario23; 29.03.2017
Попробуйте mpmath для арифметики с плавающей запятой с произвольной точностью.
Редактировать 1:
>>> import mpmath as mp
>>> import numpy as np
>>> a = np.matrix((0,0))
>>> print(a)
[0.0 0.0]
>>> b = mp.matrix(a.tolist())
>>> c = b.apply(mp.exp)
>>> print(c)
[1.0]
[1.0]
person
arduinolover
schedule
29.03.2017
Я попытался установить этот модуль с помощью pip, но он не появился во время компиляции. Кроме того, я пытаюсь найти экспоненту массива, и я слышал, что mpmath этого не делает.
- person Daniel George; 29.03.2017
Для массива mpmath можно выполнять операции над массивом. См. приведенный выше пример.
- person arduinolover; 29.03.2017
@arduinolover: это не сработало для массивов numpy, и я не знаю, как преобразовать массивы numpy в формат mp.
- person kmario23; 29.03.2017
@arduinolover: есть ли простой способ преобразовать массивы в матрицы? См. мой полный вопрос: stackoverflow.com/q/43100725/6943476
- person Daniel George; 29.03.2017
Вы можете определить функцию для вычисления «большой экспоненты» и применить ее к массиву (вдоль оси). Но обратите внимание, что входной массив должен быть типа int
.
# solution courtesy: http://stackoverflow.com/a/43084475/2956066
In [97]: def bigexp(x):
...: return Decimal(math.exp(1))**x
In [98]: np.apply_along_axis(bigexp, 1, arr)
Эффективность (в порядке убывания)
# twice faster than applying along axis 0
In [115]: %timeit np.apply_along_axis(bigexp, 1, a)
1000 loops, best of 3: 272 µs per loop
In [116]: %timeit np.apply_along_axis(bigexp, 0, a)
1000 loops, best of 3: 465 µs per loop
person
kmario23
schedule
29.03.2017
Я пытался использовать ваш метод, но получаю эту ошибку: ValueError: ось должна быть меньше, чем arr.ndim; ось=1, ранг=1. См. полный вопрос, который я разместил: stackoverflow.com/q/43100725/6943476
- person Daniel George; 29.03.2017