Python Numpy - 将非常小的数字视为零
Python Numpy - Treat really small numbers as zero
我想用 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)视为零并向我显示零。我之前也问过 ,如果你看一下矩阵,你会发现它充满了非常小的数字但不是零,而它应该是一个对角矩阵,对角线上有数字,其他地方为零...
谢谢...
您可以使用 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'
由于较早的优化,最后一行显示了错误的结果。
>>> if np.abs(determinant) < 0.000001:
... determinant=0
...
>>> print determinant
0
如果是数组,您可以使用单个操作来完成(请参阅我对您的其他问题的回答:)
要将小于 eps 的数组元素设置为零:
array[np.abs(array) < eps] = 0
我正在使用 Python 2.7.11 |Anaconda 自定义 (x86_64)| (默认,2015 年 12 月 6 日,18:57:58)IPython 4.0.3 -- 增强的交互式 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)视为零并向我显示零。”,我认为你确实解决了这个问题。
一般来说,就 floats/exponents 而言,超出特定点的计算会出现小错误,.. 例如您的 e power -30 案例。因此,如果您使用高级浮点数或指数,最好预料到一些错误。
使用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
我想用 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)视为零并向我显示零。我之前也问过
谢谢...
您可以使用 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'
由于较早的优化,最后一行显示了错误的结果。
>>> if np.abs(determinant) < 0.000001:
... determinant=0
...
>>> print determinant
0
如果是数组,您可以使用单个操作来完成(请参阅我对您的其他问题的回答:
要将小于 eps 的数组元素设置为零:
array[np.abs(array) < eps] = 0
我正在使用 Python 2.7.11 |Anaconda 自定义 (x86_64)| (默认,2015 年 12 月 6 日,18:57:58)IPython 4.0.3 -- 增强的交互式 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)视为零并向我显示零。”,我认为你确实解决了这个问题。
一般来说,就 floats/exponents 而言,超出特定点的计算会出现小错误,.. 例如您的 e power -30 案例。因此,如果您使用高级浮点数或指数,最好预料到一些错误。
使用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