16

一旦已经将它们转换为数字格式,如何从 numpy 数组中删除正无穷大数?我正在使用一个在内部使用 numpy 的包,但是在返回某些数组时,某些值作为 1.79769313486e+308 正无穷大数返回。

是否有一种优雅而快速的方法来删除这些(在我的情况下我想要'0'),或者迭代数组是最好的解决方案?

4

2 回答 2

20

首先,1.79769313486e+308不一样+inf。前者是 64 位浮点数可以表示的最大数,后者是特殊浮点数。

如果您的数组中只有非常大的数字,那么:

A[A > 1e308] = 0

足够了。Thet 将上面的 oll 元素替换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]

如果你想对nans 做一些事情(如果你有的话),使用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]

是的,float64(和float32)甚至有一个单独的-0.0. 但是,在计算中,它充当普通的零:

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

(*) 取决于你称之为朋友的人。

于 2014-07-06T19:43:37.823 回答
14

要删除非常高的值:

>>> 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.])
于 2014-07-06T19:44:10.797 回答