
如上图,有ab两条折线,都是以坐标(x,y)来表示其各个端点,如:a = [(x0,y0),(x1,y1)……]。a的端点有5万个,b的端点有4万个,b线的首尾两个点的横坐标也在a线的首尾附近(意思就是不会在图形的首尾出现一大段只有1根线的情况)。且各个端点的横坐标距离并不相等(意思就是X(i)-X(i-1)是一个随机正整数),且a线与b线的横坐标也并不对齐。
现在我输入另一个双折线数据,数据类型与ab相同,不过长度只有几十个端点。拿去跟原图片匹配,获取与其相似度大于90%的部分,并输出原图中相似部分X轴的范围。用代码如何实现呢?
我的疑惑
首先匹配长度并不固定,因为相似图形可能同步缩小放大,长度就变得不一样了,那就不能用简单的滑动窗口来逐帧匹配,运算量太大了。
我也考虑过用dtaidistance库来进行DTW匹配,但我所知的DTW相似度匹配都是单线匹配,像我这样的双线匹配是否能实现?因为分别匹配a和b的话,似乎无法体现a与b之间的相对距离关系。
我的要求
请给出详细代码,因为要同时运算上万个类似的匹配,越高效越好。谢谢
可以提供测试数据
请留下邮箱,我会发给你,就一个30k的 test.pkl 文件。里面的格式是一个字典如下:
{'数据库':{'a':a,'b':b},'要匹配的双折线':{'a':a,'b':b}},里面的a和b都是DataFrame,有x和y的数据。
文件可以用如下代码打开:
import pickle
with open(path, 'rb') as f:
data = pickle.load(f)
实际上端点数据就是以DataFrame的形式来保存的,前面为了方便表达所以用列表来记录各个端点的数据,您提供的代码尽量用DataFrame,谢谢。