【发布时间】:2014-01-21 20:32:24
【问题描述】:
我想对无序的复杂浮点数的 numpy 数组进行鼻子测试。
例如,如果
a = [1+1j, 1-1j, 2+2j, 2-2j, 2+2j, 2-2j]
和
b = [2+2j, 2-2j, 1+1j, 1.000000000000001-1j, 2+2j, 2-2j]
断言应该成功,因为它们具有大致相同的值相同的次数。顺序无关紧要。
对于常规浮点数,assert_array_almost_equal(np.sort(a), np.sort(b)) 可以,但在这里不起作用,因为它先按实部排序,然后按虚部排序,因此由于浮点错误,它们被排序为:
a: [ 1.-1.j, 1.+1.j, 2.-2.j, 2.-2.j, 2.+2.j, 2.+2.j]
b: [ 1.+1.j, 1.-1.j, 2.-2.j, 2.-2.j, 2.+2.j, 2.+2.j]
有没有内置的方法来做到这一点?如果没有,我想我可以诉诸 cplxreal 之类的东西,但这似乎需要添加到测试文件中。
【问题讨论】:
-
如果您尝试严格遵循结果规范,这似乎是 NP 完全的,但如果您对在疯狂情况下变得有点模糊的结果感到满意,也不会太难。
-
首先想到的算法是某种贪婪的最近邻匹配,您可以将一个集合中的每个元素连续匹配到另一个集合中最近的未匹配邻居,当您用完或最近的邻居太远了。看起来可能会有更有效的东西,但无论如何,它不会像排序那么简单。
-
您可以尝试消除浮点错误,例如,截断到 x 个有效数字(其中 x 由您的应用程序所需的精度确定),然后进行比较。我怀疑这将是一个非常有效的想法,并且不是一个内置的解决方案。
标签: python numpy floating-point equality approximate