在numpy中将非常低的值设置为零

Eoi*_*ray 27 python numpy

在numpy我有一个类似的数组

[0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j] 
Run Code Online (Sandbox Code Playgroud)

什么是将超低值设置为零的最快和最简单的方法

[0 +  0.5j, 0.25 + 0j, 0.25+ 0j, 0 + 0j] 
Run Code Online (Sandbox Code Playgroud)

效率不是最重要的.

DSM*_*DSM 25

嗯.我对此并不十分满意,但这似乎有效:

>>> a = np.array([0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j])
>>> a
array([  0.00000000e+00 +5.00000000e-01j,
         2.50000000e-01 +1.23524440e-24j,
         2.50000000e-01 +0.00000000e+00j,   2.46519033e-32 +0.00000000e+00j])
>>> tol = 1e-16
>>> a.real[abs(a.real) < tol] = 0.0
>>> a.imag[abs(a.imag) < tol] = 0.0
>>> a
array([ 0.00+0.5j,  0.25+0.j ,  0.25+0.j ,  0.00+0.j ])
Run Code Online (Sandbox Code Playgroud)

您可以根据问题的需要选择容差.我通常使用一个数量级或更高的数量级

>>> np.finfo(np.float).eps
2.2204460492503131e-16
Run Code Online (Sandbox Code Playgroud)

但它依赖于问题.


jfs*_*jfs 21

要设置小于eps零的元素:

a[np.abs(a) < eps] = 0
Run Code Online (Sandbox Code Playgroud)

可能有一个更有效的专门功能.

如果要禁止打印小浮点数:

import numpy as np
a = np.array([1+1e-10j])
print a # -> [ 1. +1.00000000e-10j]

np.set_printoptions(suppress=True)
print a # -> [ 1.+0.j]
Run Code Online (Sandbox Code Playgroud)

  • 不过,这样就只剩下 `0.25 +1.23524440e-24j` 了。 (2认同)

res*_*epo 15

通过使用数组的方法 round(n)

np.array( [0 +  0.5j, 0.25 + 1.2352444e-24j, 
           0.25+ 0j, 2.46519033e-32 + 0j]  ).round(23)
Run Code Online (Sandbox Code Playgroud)


Mic*_*aël 6

您还可以使用以下numpy.isclose方法

>>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
array([True, False])
Run Code Online (Sandbox Code Playgroud)

通过询问它是否接近于零,它应该可以工作:

>>> np.isclose([1e10,0], [1.00001e-10,0])
array([False, True])
Run Code Online (Sandbox Code Playgroud)

您可以自定义atol(绝对容差,默认为1e-08)和rtol(相对容差,默认为1e-05)参数。然后您可以设置rtol=0为仅使用绝对容差。


ttq*_*ttq 5

如果所有数字都有小的虚部,并且您只想抑制这些数字,那么您可以使用

b=np.real_if_close(a)
Run Code Online (Sandbox Code Playgroud)

否则,DSM的建议就是前进的方向,即

a.real[abs(a.real)<1e-13]=0
a.imag[abs(a.imag)<1e-13]=0
Run Code Online (Sandbox Code Playgroud)