一旦这些已经转换为数字格式,如何从 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 的人的种类。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!