如何在使用numpy将非常小的值设为实际0时优雅地设置精度/容差?

时间:2018-03-13 06:08:30

标签: python numpy

我想numpy将小值取为0,而不是自己明确地为每个结果做。

有没有一种干净的方法可以在不调用numpy.isclose冷却功能或将其设置为零的情况下执行此操作:c[c<1e-20]=0或任何其他类似的方法。什么是最干净的为什么要在整个会话中做到这一点(像帖子底部的matlab行为一样干净)?

import numpy as np
a=np.random.randn(3,3)
b=np.random.randn(3,3)
a[1,:]=1e-20
c=np.matmul(a,b)
c[c<1e-20]=0

给出了:

>> c
array([[  4.16639233e-01,   0.00000000e+00,   1.23275238e+00],
       [  1.59739149e-20,   0.00000000e+00,   0.00000000e+00],
       [  0.00000000e+00,   7.97659305e-01,   1.14217399e-01]])

与matlab比较:

>> format long
>> a=randn(3,3);
>> b=randn(3,3);
>> a(1,:)=1e-20;
>> a*b

ans =

   0.000000000000000   0.000000000000000   0.000000000000000
  -0.123562969836108  -0.148234256997880   4.136510695446545
   0.596809154812933   1.837267263414820  -2.998336234205494

1 个答案:

答案 0 :(得分:1)

使用np.set_printoptions(suppress=True)。有关文档,请参阅this

import numpy as np
np.set_printoptions(suppress=True)
a=np.random.randn(3,3)
b=np.random.randn(3,3)
a[1,:]=1e-20
c=np.matmul(a,b)

print(c)

输出:

array([[ 0.        ,  0.31346501,  0.        ],
       [ 0.        ,  0.        ,  0.        ],
       [ 0.81057613,  1.916861  ,  0.        ]])