Python 两个数组的高效匹配(如何使用KDTree)

Python 两个数组的高效匹配(如何使用KDTree),python,numpy,pandas,scipy,kdtree,Python,Numpy,Pandas,Scipy,Kdtree,我有两个二维阵列,obs1和obs2。它们代表两个独立的测量系列,都有dim0=2,dim1稍有不同,例如obs1.shape=(225000),和obs2.shape=(225050)obs1[0]和obs2[0]表示时间,obs1[1]和obs2[1]表示某种空间坐标。两个数组(或多或少)都按时间排序。两个测量系列之间的时间和坐标应该是相同的,但实际上并非如此。此外,并非来自obs1的每个测量值在obs2中都有相应的值,反之亦然。另一个问题是,《纽约时报》可能会有轻微的偏移 我正在寻找一种有

我有两个二维阵列,
obs1
obs2
。它们代表两个独立的测量系列,都有dim0=2,dim1稍有不同,例如
obs1.shape=(225000)
,和
obs2.shape=(225050)
obs1[0]
obs2[0]
表示时间,
obs1[1]
obs2[1]
表示某种空间坐标。两个数组(或多或少)都按时间排序。两个测量系列之间的时间和坐标应该是相同的,但实际上并非如此。此外,并非来自
obs1
的每个测量值在
obs2
中都有相应的值,反之亦然。另一个问题是,《纽约时报》可能会有轻微的偏移

我正在寻找一种有效的算法,将
obs2
中的最佳匹配值与
obs1
中的每个度量值相关联。目前,我是这样做的:

define dt = some_maximum_time_difference
define dx = 3
j = 0
i = 0
matchresults = np.empty(obs1.shape[1])
for j in obs1.shape[1]:
    while obs1[0, j] - obs2[0, j] < dt:
        i += 1
    matchresults[j] = i - dx + argmin(abs(obs1[1, i] - obs2[1, i-dx:i+dx+1]))
define dt=某个最大时间差
定义dx=3
j=0
i=0
matchresults=np.empty(obs1.shape[1])
对于obs1.形状[1]中的j:
而obs1[0,j]-obs2[0,j]
这将产生良好的结果。但是,它非常慢,在循环中运行


对于如何在速度方面改进此算法的想法,例如使用KDtree或类似的工具,我将非常感谢。

在这种情况下使用
cKDTree

from scipy.spatial import cKDTree

obs2 = array with shape (2, m)
obs1 = array with shape (2, n)

kdt = cKDTree(obs2.T)
dist, indices = kdt.query(obs1.T)

其中
索引
将包含
obs2
中与
obs1
中的每个观察值相对应的列索引。请注意,我必须转置
obs1
obs2

您能在
第一个obs2\u索引上展开一点吗?它的时间差小于delta,结果是I=I+argmin(abs(obs1[1,I]-obs2[1,I-delta\ux:I+delta\ux+1])
?假设您没有在这里执行另一个循环,我不相信KDTrees会加快速度。@MikyDinescu谢谢您的问题;我在原始帖子中更新了算法。您能发布一些数据和预期结果吗?我想知道是否有人回复您。谢谢您发布更多详细信息,但很遗憾我仍然不清楚你当前的算法是如何工作的。我不是python开发人员,所以可能会有其他人插话。我建议你用伪代码来演示你的算法。或者可能会询问更多的CS堆栈交换。@andreas-h你检查了下面的答案了吗?