Python Numpy -将非常小的数字视为零

xxslljrj  于 2023-10-19  发布在  Python
关注(0)|答案(4)|浏览(144)

我想用Numpy计算一个奇异矩阵的行列式(行列式为0),当我打印行列式时,它显示一个非常小的数字(接近零= -7.09974814699e-30),但本身不是零。
当我试着用%s%d,或%f来打印行列式时,有时它是零,有时是-0,有时是-7.09974814699e-30。
代码如下:

import numpy as np

array = np.arange(16)
array = array.reshape(4, -1)
determinant = np.linalg.det(array)

print("Determinant is %s" % determinant)
print("Determinant is %d" % determinant)
print("Determinant is %f" % determinant)

Determinant is -7.09974814699e-30
Determinant is 0
Determinant is -0.000000

我怎样才能让Numpy把非常小的数字,如-7.09974814699e-30当作零,并向我显示零。我之前也问过this question,如果你看一下这个矩阵,你会发现它充满了非常小的数字,但不是零,而它应该是一个对角矩阵,对角线上有数字,其他地方为零。

aydmsdu9

aydmsdu91#

>>> if np.abs(determinant) < 0.000001:
...     determinant=0
...
>>> print determinant
0

在数组的情况下,你可以使用一个操作来完成它(请参阅我对你的其他问题的回答:https://stackoverflow.com/a/36395905/5088142
要将小于eps的数组元素设置为零,请执行以下操作:

array[np.abs(array) < eps] = 0
flmtquvp

flmtquvp2#

您可以使用np.round截断较低的有效数字。但对于浮点运算来说,最好还是保持精度。您需要控制的只是最终输出的格式,使用str.format函数。

In [7]: a=rand(12,12)
In [8]: deta=det(a)
#0.0063854296972496311

In [10]: detar=det(a.round(3))
# 0.0063817871557592153

In [12]: '{:.5f}'.format(deta)
Out[12]: '0.00639'

In [13]: '{:.5f}'.format(detar)
Out[13]: '0.00638'

最后一行显示了由于早期优化而导致的错误结果。

rbpvctlc

rbpvctlc3#

使用numpy.set_printoptions并启用suppress选项:

>>> import numpy as np
>>> np.set_printoptions(precision=3, suppress=True)
>>> array = np.arange(16)
>>> array = array.reshape(4, -1)
>>> determinant = np.linalg.det(array)
>>> print("Determinant is:", determinant)
Determinant is: 0.0
gudnpqoy

gudnpqoy4#

使用Python 2.7.11| Anaconda自定义(x86_64)|(default,Dec 6 2015,18:57:58)IPython 4.0.3 -- An enhanced Interactive Python.我得到的结果如下,

In [6]: print("Determinant is %s" % determinant)
Determinant is 0.0

In [7]: print("Determinant is %d" % determinant)
Determinant is 0

In [8]: print("Determinant is %f" % determinant)
Determinant is 0.000000

我想如果你更新numpy它可能适合你,你使用下面的方法

In [9]: sam = 0.000000121

In [10]: sam
Out[10]: 1.21e-07

In [11]: print sam if sam > 0.00001 else 1
1

这并没有完全回答你的问题“* 我如何才能让Numpy将非常小的数字,如-7.09974814699e-30视为零,并向我显示零。
一般来说,当涉及到浮点数/指数时,超过某个点的计算会产生微小的误差,...比如你的E Power-30机箱。因此,如果你使用高级浮点数或指数,你最好期待一些错误。

相关问题