Python np.tril不能使事物精确地为0 将numpy导入为np def foo(A): (m,n)=A形状 如果m

Python np.tril不能使事物精确地为0 将numpy导入为np def foo(A): (m,n)=A形状 如果m,python,numpy,Python,Numpy,在这段代码中,例如,当我打印出foo返回到一个随机的4x4矩阵时,出于某种原因,假定正好为0的上三角形并不是正好为0,而是在控制台中显示0.000000e+00。编译器未能清除0的原因是什么?另外,如果我直接将np.tril应用于一个随机矩阵,则可以很容易地清除0 由于某些原因,原本应该正好为0的上部三角形并没有完全为0 它被精确地设置为0。您可以通过以下方式进行测试: res=foo(A) 打印(分辨率[0,0]==1) 打印(分辨率[0,1]==0) 打印(分辨率[0,2]==0) 打印(分

在这段代码中,例如,当我打印出foo返回到一个随机的4x4矩阵时,出于某种原因,假定正好为0的上三角形并不是正好为0,而是在控制台中显示0.000000e+00。编译器未能清除0的原因是什么?另外,如果我直接将np.tril应用于一个随机矩阵,则可以很容易地清除0

由于某些原因,原本应该正好为0的上部三角形并没有完全为0

它被精确地设置为0。您可以通过以下方式进行测试:

res=foo(A)
打印(分辨率[0,0]==1)
打印(分辨率[0,1]==0)
打印(分辨率[0,2]==0)
打印(分辨率[1,2]==0)
这表明:

True
真的
真的
真的
您可能认为Numpy在内部舍入值或进行弱检查,但这也不是真的,因为
print(res[0,0]==1.00000000000000 1)
print
False
同样适用于
print(res[0,1]==1e-320)
。因此,问题与值不完全等于0无关。这个问题来自误导性的印刷结果

而是在控制台中显示0.000000e+00

如果打印
res
,您将看到:

数组([[1.00000000e+00,0.00000000e+00,0.00000000e+00],
[8.06225775e+00,9.42663983e+00,0.00000000e+00],
[1.77635684e-15、3.72104204e-01、7.44208408e-01]]
但是如果您打印
res[0,:]
,您将得到:

数组([1,0,0.]))
在第一种情况下获得
0.00000000 e+00
,在第二种情况下获得
0.
的事实来自Numpy的矩阵打印算法:打印数字的精度根据数组中的所有值进行调整。数字的准确性保持不变。更具体地说,Numpy检查同一行和同一列中的其他数字,以执行值的漂亮打印。如果您不相信这一点,您可以自己使用
res[2,:]
(第一行保持不变)重置
res
的值并打印它。您将得到以下结果:

数组([[1,0,0.]),
[8.06225775, 9.42663983, 0.        ],
[0.        , 0.        , 0.        ]])

不太可能,因为我认为numpy.tril会清除正好为0的条目。为什么您认为该值不完全为零?你试过了吗0?请注意,在打印数组时,numpy会尝试使用科学记数法打印具有相同位数的所有值,或者全部打印,或者不打印。请注意,Python的默认实现是CPython,它不是编译器,而是解释器。Cython是一个编译器。PyPy是一个JIT编译器。解释器通常比编译器慢得多(但通常也不太灵活)。