Numpy计算不正确

2024-05-14 13:40:04 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码行:

    y[:,:,i,p] = np.divide(x[:,:,i,p], npq)   #divide array by constant
    orig = np.dot(y[:,:,i,p], npq)            #take previous output, and multiply by constant
    print(np.mean(x[:,:,i,p] - orig))         #print mean. should be 0

这些计算的预期输出应为0。相反,我得到的是:

...
0.0
-1.81671383445
-0.0719097733101
-0.102587446807
...

我做错什么了?我试过把所有的数字都转换成整数而不是浮点数,错误依然存在。你知道吗

编辑 np.乘法无法解决问题。 我自己写了乘法码。它只是在阵列中运行,工作得很好,尽管速度慢得多。你知道吗


Tags: 代码outputbynpmeanarraydotprint
1条回答
网友
1楼 · 发布于 2024-05-14 13:40:04

原因很可能是有限精度浮点数的精度损失。你知道吗

如果npq是标量,那么np.dot(y[:,:,i,p], npq)将给出与np.multiply(y[:,:,i,p], npq)相同的结果。因此,如果浮点计算是以无限精度完成的,那么您的代码将打印0.0。当然,它们不是;默认的浮点数据类型是np.float64,因此在算术计算中可能会丢失精度。我怀疑这就是为什么打印的值不是0.0。你知道吗

例如

In [78]: npq = 3

In [79]: np.random.seed(123)

In [80]: x = 1e20*np.random.randn(100, 100)

In [81]: y = np.divide(x, npq)

In [82]: orig = np.dot(y, npq)

如果我们有无限精度,这个结果将是0:

In [83]: np.mean(x - orig)
Out[83]: -5.2468000000000004

“往返”计算中最大的误差是:

In [84]: np.max(np.abs(x - orig))
Out[84]: 32768.0

使用np.multiply(y, npq)而不是np.dot(y, npq)可以准确地给出结果:

In [85]: xx = np.multiply(y, npq)

In [86]: np.max(np.abs(x - xx))
Out[86]: 32768.0

相关问题 更多 >

    热门问题