3
4

3 回答 3

2

如何按大小对数组进行排序?

def foo(a):
    return a[np.argsort(a*a.conjugate())]
np.testing.assert_array_almost_equal(foo(a),foo(b))
于 2014-01-04T05:31:44.087 回答
0

我不确定在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

不是最漂亮的解决方案,但至少似乎以一种非常透明的方式工作。

于 2014-01-04T02:57:22.067 回答
0

另一种方法可能是考虑二维空间中的点。 a是一组点。 b是另一组。in 中的每个点都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],因此所有行和列都有匹配项。这套测试可能就足够了,即使有重复。我必须探索点和不匹配的其他组合。

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

于 2014-01-04T23:35:51.487 回答