【发布时间】:2017-02-07 00:39:19
【问题描述】:
我有一个随机浮点数组,我需要将它与另一个具有不同顺序的相同值的数组进行比较。就此而言,我使用总和、乘积(以及其他组合,具体取决于表格的维度,因此需要的方程式数量)。
不过,当我根据值的顺序对数组执行求和(或乘积)时遇到了精度问题。
这是一个简单的独立示例来说明这个问题:
import numpy as np
n = 10
m = 4
tag = np.random.rand(n, m)
s1 = np.sum(tag, axis=1)
s2 = np.sum(tag[:, ::-1], axis=1)
# print the number of times s1 is not equal to s2 (should be 0)
print np.nonzero(s1 != s2)[0].shape[0]
如果您执行此代码,它有时会告诉您s1 和s2 不相等,并且差异取决于计算机精度。
问题是我需要在 np.in1d 这样的函数中使用那些我无法真正容忍的函数......
有没有办法避免这个问题?
【问题讨论】:
-
你永远不能期望浮点运算是精确的。您应该更改算法以适应一些错误。否则,
statistics模块中有一些更奇特的总和,但这不是现在的重点。特别是对于 numpy,向量化应该是一个基本工具,你永远不能依赖算术运算的顺序。 -
您如何/在哪里使用
np.in1d?对于列出的代码,您可以使用np.isclose(s1,s2)。 -
@Divakar 我没有在示例中使用它,但在我的实际算法中,我会使用
np.in1d(s1, s2)和通过其他操作(如产品等)获得的其他等效数组... -
@Andras Deak 我想我需要重新考虑我的标签的选择......正如你所指出的那样,随机浮动可能不是一个好主意,但它很方便,因为我正在这样做非常大的数组,我执行像
tag**3这样的操作,我担心如果使用整数会导致溢出......我愿意接受建议(我的标签数组必须有非重复值)...... -
不,不,解决方案通常不是限制您的数据来自浮点数:) 我的观点与 Divakar 的观点相同:不要使用精确测试,使用接近测试。但是您似乎已经意识到这一点,这就是为什么我只建议重构您的算法以避免精确测试。
标签: python arrays numpy random precision