2012-07-04 58 views
2

我想在〜200000的大小的阵列中匹配大小为〜20的小阵列。这两个数组都包含double值。在这种情况下匹配意味着最小的错误,因为不会有完全匹配。大双阵列中小双阵列的最佳匹配

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

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

从'numpy'开始。 – eumiro

+0

您应该澄清'将最后一个元素添加到相同数字'的含义,请编辑您的问题以更加精确。 – unkulunkulu

+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) 
+0

感谢您的回答。我已经尝试过它,它的工作原理。我的解决方案非常相似,除了我使用numpy进行差异计算。但总的来说,这似乎是解决这个问题的唯一(也许是最好的)方法 - 因此我接受了这个答案。只是为了让别人知道:使用numpy更快:) –