Прежде всего, 1.79769313486e+308
- это не то же самое, что и +inf
. Первое является наибольшим числом, которое может быть выражено с 64-битным поплавком, последнее является специальным поплавком.
Если вы просто очень большие числа в массиве, а затем:
A[A > 1e308] = 0
достаточно. Они заменяют элементы oll выше 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
Вы можете использовать положительные и negativi бесконечности с Numpy ndarray
без каких-либо проблем. Это будет работать:
A[A == pinf] = 0.0
Но если у вас есть nan
с в массиве, вы получите некоторые жалобы:
>>> 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
сек в нули.
А - это ты не спрашивал - вот один, чтобы удивить своих друзей (*):
>>> [float('-0.0'), 0.0] * 3
[-0.0, 0.0, -0.0, 0.0, -0.0, 0.0]
Yep, float64
(и float32
) есть даже отдельный -0.0
. В расчетах он действует как обычный ноль:
>>> float('-0.0') == 0.0
True
(*) В зависимости от вида людей, которых вы называете друзьями.