как удалить положительную бесконечность из массива numpy … если она уже преобразована в число?

#python #numpy #infinity #graph-tool

#python #numpy #бесконечность #graph-инструмент

Вопрос:

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

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

Ответ №1:

Прежде всего, 1.79769313486e 308 это не то же самое, что inf . Первое — это наибольшее число, которое может быть выражено с помощью 64-битного float, второе — специальное float.

Если у вас просто очень большие числа в вашем массиве, то:

 A[A > 1e308] = 0
  

достаточно. Все элементы выше 1e308 будут заменены на 0.

Также можно работать с inf ‘s. Например:

 >>> 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 s (если они у вас есть), используйте 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
  

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

Ответ №2:

Чтобы удалить очень высокие значения:

 >>> 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.])