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

时间:2013-01-19 21:56:22

标签: python numpy

在numpy中我有一个像

这样的数组
[0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j] 

将超低值设置为零以获得

的最快和最简单的方法是什么
[0 +  0.5j, 0.25 + 0j, 0.25+ 0j, 0 + 0j] 

效率不是最重要的。

6 个答案:

答案 0 :(得分:23)

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

>>> 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 ])

您可以根据问题的需要选择容差。我通常使用比

高一个数量级的数量级
>>> np.finfo(np.float).eps
2.2204460492503131e-16

但它依赖于问题。

答案 1 :(得分:18)

将小于eps的元素设置为零:

a[np.abs(a) < eps] = 0

可能有一种更有效的专业功能。

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

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]

答案 2 :(得分:4)

您还可以使用numpy.isclose method

>>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
array([True, False])

通过询问它是否接近零,它应该起作用:

>>> np.isclose([1e10,0], [1.00001e-10,0])
array([False, True])

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

答案 3 :(得分:3)

使用数组的方法round(n)

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

答案 4 :(得分:2)

如果所有数字的虚部都很小,而您只想抑制它们,那么可以使用

b=np.real_if_close(a)

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

a.real[abs(a.real)<1e-13]=0
a.imag[abs(a.imag)<1e-13]=0

答案 5 :(得分:0)

diff = x-y
diff[diff>1.e-16]

Out[93]:
array([], dtype=float64)

diff[diff>1.e-18]

array([1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18])