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