Python Numpy - 将小数字视为零

时间:2016-04-04 06:03:21

标签: python numpy matrix linear-algebra determinants

我想用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,如果你看看矩阵,你会发现它填充了非常小的数字而不是零,而它应该是对角线矩阵,对角线上的数字和其他地方的零。 ..

谢谢...

3 个答案:

答案 0 :(得分:3)

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

如果是数组,您可以使用单个操作执行此操作(请参阅我对您的其他问题的回答:https://stackoverflow.com/a/36395905/5088142

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

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

答案 1 :(得分:1)

您可以使用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'

由于早期优化,最后一行显示错误结果。

答案 2 :(得分:1)

我正在使用Python 2.7.11 | Anaconda custom(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为零并向我显示零。”,我认为你可以解决对此。

一般来说,对于浮点数/指数,超出某一点的计算会带来轻微误差,例如你的电源-30情况。因此,如果您使用高级浮点数或指数,那么您最好还是会遇到一些错误。