大双阵列中小双阵列的最佳匹配

时间:2012-07-04 13:01:38

标签: python math match

我试图在一个大小为~200000的较大数组中匹配大小为~20的小数组。两个数组都包含双精度值。在这种情况下匹配意味着最小的错误,因为不会有完全匹配。

接下来的事情是,我必须更改小数组的值,因为它应该匹配,如果它不同但值之间有相同的间隙,这意味着:

array 1: [1.3, 1.4, 1.3, 1.5, 1.7]
array 2: [..., 2.3, 2.4, 2.4, 2.5, 2.7, ...]

我必须将每个比较的最后一个元素带到相同的数字。上面的示例将是一个非常好的匹配,因为首先我将+1.0整个数组#1。

[编辑] 澄清上述陈述:在计算错误之前,示例数组应如下所示:

array 1: [2.3, 2.4, 2.3, 2.5, 2.7] 
// (+1 of each element so the last element of the small array, 
// and the last element of the part of the large array I am 
// comparing to, has the same values: in this case: 2.7)
array 2: [..., 2.3, 2.4, 2.4, 2.5, 2.7, ...]

[/编辑]

我知道可以简单地遍历大数组,但速度太慢了。当然,不是通过遍历数组来计算误差,而是可以使用像norm(v1 - v2)这样的向量运算。

所以我听说,python非常适合数学运算,但我找不到如何比较2个数组(只是数组中的一个数字)。

最后,问题是:任何想法,我如何以非常快的方式解决问题。哪种语言可以很好地解决这些问题(八度不是因为它只是在矢量计算上很快,但迭代速度很慢) - 可能在python中有一些好的库?

如果我需要更详细地解释一下,请告诉我。

1 个答案:

答案 0 :(得分:0)

我承认我对你的定义最佳匹配有点模糊,但这个例子可以很容易地调整。魔术在closeness函数中,它接收data的片段,其长度与target相同并返回一个数字。数字越低,匹配越好。

import random

target = [random.random() * 10 for i in range(20)]
data   = [random.random() * 10 for i in range(200000)]

def closeness(a_range):
    diffs = list(map(lambda e: e[0]-e[1], zip(a_range, target)))
    avg_diffs = float(sum(diffs)) / len(diffs)
    adjusted_target = [i + avg_diffs for i in target]
    return sum(adjusted_target)

ranges = [data[i:i+len(target)] for i in range(len(data)-len(target))]
best_match = min(ranges, key=closeness) 

print(best_match)