Python 在numpy中将非常低的值设置为零
在numpy中,我有一个数组Python 在numpy中将非常低的值设置为零,python,numpy,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] 效率不是最重要的。嗯。我对它不太满意,但这似乎有效: >>> a = np.array([0 + 0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46
[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]
效率不是最重要的。嗯。我对它不太满意,但这似乎有效:
>>> 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 ])
但这取决于问题。要将小于eps的元素设置为零:
a[np.abs(a) < eps] = 0
您还可以使用:
通过询问它是否接近于零,它应该起作用:
>>> np.isclose([1e10,0], [1.00001e-10,0])
array([False, True])
您可以自定义
atol
(绝对公差,默认为1e-08
)和rtol
(相对公差,默认为1e-05
)参数。然后,您可以将rtol=0
设置为仅使用绝对公差。如果所有数字都有小的虚部,并且您只想抑制这些虚部,则可以使用
b=np.real_if_close(a)
否则,DSM的建议就是前进的方向,即
a.real[abs(a.real)<1e-13]=0
a.imag[abs(a.imag)<1e-13]=0
a.real[abs(a.real)使用数组取整(n)的方法
np.array( [0 + 0.5j, 0.25 + 1.2352444e-24j,
0.25+ 0j, 2.46519033e-32 + 0j] ).round(23)
不过,这将只剩下0.25+1.23524440e-24j
。@DSM:我添加了一个变体,它可以抑制打印时的小浮动(OPs意图的另一种可能解释)我之所以选择它,是因为它可以处理实数和复数,而且非常简单直观。欢迎使用StackOverflow!不清楚这是如何回答问题的。请添加一些关于您在此处提供的代码以及它如何回答问题的解释。还可以格式化要呈现的代码(使用编辑窗口中的按钮栏)。这是一个很棒的函数!我已经使用numpy多年了,从来都不知道数组有一个round
函数。
b=np.real_if_close(a)
a.real[abs(a.real)<1e-13]=0
a.imag[abs(a.imag)<1e-13]=0
np.array( [0 + 0.5j, 0.25 + 1.2352444e-24j,
0.25+ 0j, 2.46519033e-32 + 0j] ).round(23)
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])