在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]
效率不是最重要的。
答案 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])