当前位置: 首页 > 知识库问答 >
问题:

复杂浮点数无序集的近似等式

颜功
2023-03-14

我想对无序的复杂浮点数组进行鼻子测试。

例如,如果

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的东西,但这似乎需要添加到测试文件中。

共有3个答案

张俊茂
2023-03-14

另一种方法可能是根据2d空间中的点进行思考<代码>a是一组点<代码>b是另一组。b中的每个点应接近a中的一个点。

diff = np.array(a)[None,:]-np.array(b)[:,None]
X = np.round(diff*diff.conjugate())==0  # round to desired error tollerance
X

array([[False, False,  True, False,  True, False],
       [False, False, False,  True, False,  True],
       [ True, False, False, False, False, False],
       [False,  True, False, False, False, False],
       [False, False,  True, False,  True, False],
       [False, False, False,  True, False,  True]], dtype=bool)

下一步是测试X。如果a(和b)中的值不同,则每列和每行应有一个True。但这里有重复的。

In [29]: I,J=np.where(X)

In [30]: I
Out[30]: array([0, 0, 1, 1, 2, 3, 4, 4, 5, 5])

In [31]: J
Out[31]: array([2, 4, 3, 5, 0, 1, 2, 4, 3, 5])

set(I)set(J)都是[0,1,...5],因此所有行和列都有匹配项。这个集合测试可能就足够了,即使是重复的。我必须探索点和不匹配的其他组合。

这个答案不完整,但可能提供一些有用的想法。

支劲
2023-03-14

我不确定是否有任何方法可以在比O(n^2)更好的最坏情况下做到这一点,但如果您可以接受,您可以复制其中一个列表并使用修改后的equals函数消除以查看它们是否匹配。

def equals(a, b, tolerance):
    return abs(a-b) < tolerance

然后遍历列表,在找到匹配项时将其删除

def equivalent_lists(a, b, tolerance):
    new_b = b[:]
    for a_item in a:
        truths = [equals(a_item, b_item, tolerance) for b_item in new_b]
        if not any(truths):
            return False
        else:
            new_b.pop(truths.index(True))
    return not bool(new_b)

在您最初的情况下似乎有效,至少粗略地说:

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]
c = [2+2j, 2-2j, 1+1j, 2-1j, 2+2j, 2-2j]

equivalent_lists(a, b, 0.0001)
>>> True
equivalent_lists(a, c, 0.0001)
>>> False

不是最漂亮的解决方案,但至少看起来以一种相当透明的方式工作。

丁志勇
2023-03-14

按数组的大小排序如何?

def foo(a):
    return a[np.argsort(a*a.conjugate())]
np.testing.assert_array_almost_equal(foo(a),foo(b))
 类似资料:
  • 众所周知,在比较浮点值时必须小心。通常,我们不使用,而是使用一些基于epsilon或ULP的相等性测试。 然而,我想知道,当使用时,是否存在任何情况? 看看这个简单的片段,哪些案例可以保证成功? 注意:我已经检查了这个和这个,但是它们不包括我的(所有)病例。 注2:似乎我必须添加一些附加信息,因此答案在实践中可能很有用:我想知道: C标准的内容 这是我在当前标准草案中发现的唯一相关声明: 浮点类型

  • 试图写一个程序在Java计算幂级数近似in(x)使用以下公式: 我是用while循环来做的,我似乎无法100%正确地得到sin近似值。你知道我哪里出错了吗? 这目前给了我以下输出:

  • 问题内容: 我有一个浮点数数组: 在数组上运行sort()后,我得到了: 请注意,JavaScript(节点)的5.8 …大于49.6…。这是为什么? 如何正确地对这些数字进行排序? 问题答案: 传递排序函数: 结果: 从MDN: 如果未提供compareFunction,则通过将元素转换为字符串并按字典顺序(“字典”或“电话簿”,而非数字)顺序比较字符串来对元素进行排序。

  • 通过类似于的方式比较两个浮点数会带来麻烦,因为由于舍入错误,可能不等于。 一个人通常做的事情类似于

  • 有没有一种优雅的方法来断言数字相等而忽略它们的类?我想在JUnit测试框架中使用它,但例如 因Java . lang . assertion错误而失败:应为:java.lang.Integer 我希望在某个地方有一个很好的方法,只比较值,并与int,long,float,byte,double,BigDecimal,BigInteger一起工作...

  • 为了让大家直观地感受这一系列过程是如何近似模拟一种语言的,我们构造了英文的一些典型近似序列,并给出如下。在所有情况下,我们假定“字母表”中有27个符号——26个字母和一个空格。 零阶近似(符号的选择相互独立,概率相等)。 XFOML RXKHRJFFJUJ ZLPWCFWKCYJ FFJEYVKCQSGHYD QPAAMKBZAACIBZLHJQD。 一阶近似(符号的选择相互独立,但其概率与英文文