Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大双阵中小双阵的最佳匹配_Python_Math_Match - Fatal编程技术网

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

Python 大双阵中小双阵的最佳匹配,python,math,match,Python,Math,Match,我正在尝试将大小约为20的小阵列与大小约为200000的大阵列进行匹配。两个数组都包含双值。在这种情况下,匹配意味着最小的错误,因为不会有精确的匹配 下一件事是,我必须更改小数组的值,因为如果它不同,但值之间有相同的间隙,它也应该匹配,这意味着: array 1: [1.3, 1.4, 1.3, 1.5, 1.7] array 2: [..., 2.3, 2.4, 2.4, 2.5, 2.7, ...] 我必须将每个比较的最后一个元素设置为相同的数字。上面的例子将是一个非常好的匹配,因为首先我

我正在尝试将大小约为20的小阵列与大小约为200000的大阵列进行匹配。两个数组都包含双值。在这种情况下,匹配意味着最小的错误,因为不会有精确的匹配

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

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非常适合数学运算,但我找不到任何方法来比较两个数组(数组中只有一个数字)

最后,问题是:任何想法,我如何能以一种真正快速的方式解决问题。哪种语言可以很好地解决这类问题(octave不是因为它在向量计算方面很快,但迭代速度很慢)——python中可能有一些很好的库


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

我承认我对如何定义最佳匹配有点模糊,但是这个示例可以很容易地调整。神奇之处在于
closeness
函数,它接收与
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)

我承认我对如何定义最佳匹配有点模糊,但这个例子可以很容易地调整。神奇之处在于
closeness
函数,它接收与
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)

你应该澄清“将最后一个元素带到同一个数字”的含义,请将你的问题编辑得更精确;另外,以完全不同的方式解决问题的想法也很好。你真的有最小化问题吗?也就是说,您是否希望最小差值接近零,或者您正在寻找的可能是
[1,1]
,而最佳匹配是
[3,1]
,必须找到它?(输入可能
[100,3,1]
)是的,这可能会发生,但我的案例中的数字不清楚。所以我会说:是的,这是一个最小化问题。问题是有相当复杂的模糊字符串匹配算法,而你的问题更一般(两个元素之间的距离取决于移位,加上距离不是离散的),所以我认为对于一个真正有效的算法有一点希望。这种最小化必须多久执行一次?也许简单的C实现再加上一些修改就足够了?可能是多线程?你应该澄清“将最后一个元素带到同一个数字”的含义,请将你的问题编辑得更精确;另外,以完全不同的方式解决问题的想法也很好。你真的有最小化问题吗?也就是说,您是否希望最小差值接近零,或者您正在寻找的可能是
[1,1]
,而最佳匹配是
[3,1]
,必须找到它?(输入可能
[100,3,1]
)是的,这可能会发生,但我的案例中的数字不清楚。所以我会说:是的,这是一个最小化问题。问题是有相当复杂的模糊字符串匹配算法,而你的问题更一般(两个元素之间的距离取决于移位,加上距离不是离散的),所以我认为对于一个真正有效的算法有一点希望。这种最小化必须多久执行一次?也许简单的C实现再加上一些修改就足够了?可能是多线程?谢谢你的回答。我已经试过了,效果很好。我的解决方案非常相似,只是我使用numpy进行diff计算。但总的来说,这似乎是解决这个问题的唯一(可能也是最好的)方法——因此我接受这个答案。只是想让其他人知道:使用numpy更快:)谢谢你的回答。我已经试过了,效果很好。我的解决方案非常相似,只是我使用numpy进行diff计算。但总的来说,这似乎是解决这个问题的唯一(可能也是最好的)方法——因此我接受这个答案。只是想让其他人知道:使用numpy更快:)