更新:我将解决方案放入一个名为close-numerical-matches的库中
我正在寻找一种方法来查找两个2D数组之间的所有紧密匹配(在一定公差范围内),并获得所找到匹配的索引数组。上面的多个答案显示了如何解决精确匹配的问题(通常是使用字典),但这不是我想要的。让我举一个例子:
>>> arr1 = [
[19.21, 19.19],
[13.18, 11.55],
[21.45, 5.83]
]
>>> arr2 = [
[13.11, 11.54],
[19.20, 19.19],
[51.21, 21.55],
[19.22, 19.18],
[11.21, 11.55]
]
>>> find_close_match_indices(arr1, arr2, tol=0.1)
[[0, 1], [0, 3], [1, 0]]
在上面,返回[[0, 1], [0, 3], [1, 0]]
,因为arr1
[19.21,19.19]中的元素0在arr2
中的元素1和3的容差范围内。顺序对我来说并不重要,也就是说[[0, 3], [1, 0], [0, 1]]
同样可以接受
{
我曾考虑过使用k-means集群将问题划分为k个桶,从而使嵌套for循环方法更易于处理,但我认为可能存在一个小风险,即两个紧密元素正好位于每个集群的“边界”,因此无法进行比较
任何外部依赖项(如Numpy、Scipy等)都可以,使用O(n+m)空间也可以
也许您会发现以下内容很有用。可能比@Tim Roberts的解决方案更快,因为没有显式for循环。但它将使用更多的存储空间
我有了一个如何使用桶来解决这个问题的想法。其思想是根据元素的值和公差级别形成一个键。为了确保将存储桶“边缘”中的潜在匹配项与“边缘”中的其他元素进行比较,将比较所有相邻存储桶。最后,我修改了@Tim Roberts执行实际匹配的方法,使之在两列上都匹配
我把它做成了一个叫做close-numerical-matches的图书馆。示例用法:
一些分析:
不使用循环无法完成此操作,但可以通过利用布尔索引使用一个循环完成此操作:
输出:
相关问题 更多 >
编程相关推荐