问问题
170 次
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 回答