Во-первых, 1.79769313486e+308
не то же самое, что +inf
. Первое — это наибольшее число, которое может быть выражено 64-битным числом с плавающей запятой, второе — специальным числом с плавающей запятой.
Если у вас просто очень большие числа в вашем массиве, то:
A[A > 1e308] = 0
достаточно. Он заменит все элементы выше 1e308
на 0.
Также возможно работать с inf
. Например:
>>> fmax = np.finfo(np.float64).max
>>> pinf = float('+inf')
>>> ninf = float('-inf')
>>> fnan = float('nan')
>>> print fmax, pinf, ninf, fnan
1.79769313486e+308 inf -inf nan
Так что это совершенно разные вещи. Вы можете сравнить некоторые из них:
>>> pinf > fmax
True
>>> ninf < 0.0
True
>>> pinf == pinf
True
>>> pinf == ninf
False
Это выглядит хорошо! Однако nan
действует иначе:
>>> fnan > 0
False
>>> fnan < 0
False
>>> fnan == 0
False
>>> fnan < pinf
False
>>> fnan == fnan
False
Вы можете использовать положительные и отрицательные бесконечности с Numpy ndarray
без каких-либо проблем. Это будет работать:
A[A == pinf] = 0.0
Но если у вас есть nan
s в массиве, вы получите некоторые жалобы:
>>> np.array([fnan, pinf, ninf]) < 0
RuntimeWarning: invalid value encountered in less
[False, False, True]
Итак, работает, но жалуется => не использовать. То же самое без nan
:
>>> np.array([0.0, pinf, ninf]) < 0
[False, False, True]
Если вы хотите что-то сделать с nan
(если они у вас есть), используйте numpy.isnan
:
A[np.isnan(A)] = 0.0
изменит все nan
s на нули.
И -- об этом вы не спрашивали -- вот один сюрприз для ваших друзей (*):
>>> [float('-0.0'), 0.0] * 3
[-0.0, 0.0, -0.0, 0.0, -0.0, 0.0]
Да, у float64
(и float32
) есть даже отдельный -0.0
. Однако в вычислениях он действует как обычный ноль:
>>> float('-0.0') == 0.0
True
(*) В зависимости от того, каких людей вы называете друзьями.
person
DrV
schedule
06.07.2014