如何从numpy数组中删除正无穷大...如果已经转换为数字?

son*_*olo 10 python numpy infinity graph-tool

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

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

DrV*_*DrV 16

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

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

A[A > 1e308] = 0
Run Code Online (Sandbox Code Playgroud)

足够了.它将上面的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
Run Code Online (Sandbox Code Playgroud)

所以,这些是完全不同的东西.你可以比较其中一些:

>>> pinf > fmax
True
>>> ninf < 0.0
True
>>> pinf == pinf
True
>>> pinf == ninf
False
Run Code Online (Sandbox Code Playgroud)

这看起来不错!但是,nan行为不同:

>>> fnan > 0
False
>>> fnan < 0
False
>>> fnan == 0
False
>>> fnan < pinf
False
>>> fnan == fnan
False
Run Code Online (Sandbox Code Playgroud)

你可以使用Numpy的正面和负面无限性而ndarray没有任何问题.这将有效:

A[A == pinf] = 0.0
Run Code Online (Sandbox Code Playgroud)

但如果你有nan阵列,你会得到一些抱怨:

>>> np.array([fnan, pinf, ninf]) < 0
RuntimeWarning: invalid value encountered in less
[False, False, True]
Run Code Online (Sandbox Code Playgroud)

所以,它有效,但抱怨=>不要使用.同样没有nan:

>>> np.array([0.0, pinf, ninf]) < 0
[False, False, True]
Run Code Online (Sandbox Code Playgroud)

如果你想对nans 做一些事情(如果你有的话),请使用numpy.isnan:

A[np.isnan(A)] = 0.0
Run Code Online (Sandbox Code Playgroud)

将所有nans变为零.


并且 - 你没有问过 - 这里有一个让你的朋友惊喜(*):

>>> [float('-0.0'), 0.0] * 3
[-0.0, 0.0, -0.0, 0.0, -0.0, 0.0]
Run Code Online (Sandbox Code Playgroud)

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

>>> float('-0.0') == 0.0
True
Run Code Online (Sandbox Code Playgroud)

(*)取决于你给朋友打电话的人的种类.


tim*_*geb 10

要删除非常高的值:

>>> a = numpy.array([1, 2, 1.8E308, 1.8E308, 42])
>>> a[a < 1E308] # use whatever threshold you like
array([  1.,   2.,  42.])
Run Code Online (Sandbox Code Playgroud)

将它们设置为0:

>>> a = numpy.array([1, 2, 1.8E308, 1.8E308, 42])
>>> a[a >= 1E308] = 0
>>> a
array([  1.,   2.,   0.,   0.,  42.])
Run Code Online (Sandbox Code Playgroud)