一旦这些已经转换为数字格式,如何从 numpy 数组中删除正无穷大数?我正在使用内部使用 numpy 的包,但是当返回某些数组时,某些值作为 1.79769313486e+308 正无穷数返回。
是否有一种优雅而快速的方法来删除它们(在我的例子中我想要'0'),或者遍历数组是最好的解决方案?
请您参考如下方法:
首先,1.79769313486e+308
和+inf
是不一样的。前者是64位 float 所能表达的最大数,后者是特殊的 float 。
如果你的数组中只有非常大的数字,那么:
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
但是如果你在数组中有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
都变成零。
而且——这不是你问的——这是给你的 friend 一个惊喜 (*):
>>> [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
(*) 取决于您称之为 friend 的人的种类。