Python 大双阵中小双阵的最佳匹配
我正在尝试将大小约为20的小阵列与大小约为200000的大阵列进行匹配。两个数组都包含双值。在这种情况下,匹配意味着最小的错误,因为不会有精确的匹配 下一件事是,我必须更改小数组的值,因为如果它不同,但值之间有相同的间隙,它也应该匹配,这意味着: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, ...] 我必须将每个比较的最后一个元素设置为相同的数字。上面的例子将是一个非常好的匹配,因为首先我
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更快:)