2014-07-06 8 views
9

Как удалить положительные числа бесконечности из массива numpy, как только они уже преобразованы в числовой формат? Я использую пакет, который использует numpy внутри, однако при возврате некоторых массивов определенные значения возвращаются как положительный номер бесконечности 1.79769313486e + 308.Как удалить положительную бесконечность из массива numpy ... если он уже преобразован в число?

Есть ли элегантный и быстрый способ удалить их (я хотел бы «0» в моем случае) или выполняет итерацию по массиву наилучшим решением?

ответ

8

Для удаления очень высоких значений:

>>> a = numpy.array([1, 2, 1.8E308, 1.8E308, 42]) 
>>> a[a < 1E308] # use whatever threshold you like 
array([ 1., 2., 42.]) 

Чтобы установить их 0:

>>> a = numpy.array([1, 2, 1.8E308, 1.8E308, 42]) 
>>> a[a >= 1E308] = 0 
>>> a 
array([ 1., 2., 0., 0., 42.]) 
13

Прежде всего, 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, float64float32) есть даже отдельный -0.0. В расчетах он действует как обычный ноль:

>>> float('-0.0') == 0.0 
True 

(*) В зависимости от вида людей, которых вы называете друзьями.