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

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

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


person songololo    schedule 06.07.2014    source источник


Ответы (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.])
person timgeb    schedule 06.07.2014

Во-первых, 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

Но если у вас есть nans в массиве, вы получите некоторые жалобы:

>>> 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

изменит все nans на нули.


И -- об этом вы не спрашивали -- вот один сюрприз для ваших друзей (*):

>>> [float('-0.0'), 0.0] * 3
[-0.0, 0.0, -0.0, 0.0, -0.0, 0.0]

Да, у float64float32) есть даже отдельный -0.0. Однако в вычислениях он действует как обычный ноль:

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

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

person DrV    schedule 06.07.2014