gpt4 book ai didi

python - cKDTree 与 dsearchn

转载 作者:太空宇宙 更新时间:2023-11-03 17:36:43 24 4
gpt4 key购买 nike

我有两个数组(A,B),其中包含:IDxyz 点数相同但略有不同。我想要一个数组,其中每行都有两个数组的两个最近点的 ID x y z 。目前我有这个:

import numpy as np
from scipy.spatial import cKDTree
A = np.loadtxt('A.txt')
B = np.loadtxt('B.txt')
tree = cKDTree( B[:,[1,2,3]] )
d, inds = tree.query( A[:,[1,2,3]], k=1, p=np.inf, eps=0.0)
A_new = A[inds]
xyz_near = np.hstack(( B[:,0:4], A_new[:,0:4] ))

但是数组xyz_near不包含正确的对(IDB xB yB zB DIA xA yA zA):

12587 18.0445 0.0784 -7.4705 3422 18.0444 0.0403 -7.4639

12588 18.0447 0.0783 -7.2231 3421 18.0446 0.0402 -7.2164

12589 18.0450 0.0781 -6.9756 7764 18.0461 0.0400 -5.9785

12590 18.0452 0.0779 -6.7281 7765 18.0464 0.0399 -5.7310

12591 18.0454 0.0777 -6.4805 7766 18.0467 0.0399 -5.4835

12592 18.0457 0.0775 -6.2329 7767 18.0470 0.0398 -5.2359

12593 18.0459 0.0773 -5.9852 7768 18.0473 0.0398 -4.9884

正如您所看到的,前两行是正确的,但下一行不是。

如果我在 matlab 中使用 dsearchn (IDB xB yB zB DIA xA yA zA) 做同样的事情:

12587 18.0445 0.0784 -7.4705 3422 18.0444 0.0403 -7.4639

12588 18.0447 0.0783 -7.2231 3421 18.0446 0.0402 -7.2164

12589 18.0450 0.0781 -6.9756 3420 18.0448 0.0402 -6.9688

12590 18.0452 0.0779 -6.7281 3419 18.0450 0.0401 -6.7212

12591 18.0454 0.0777 -6.4805 3418 18.0453 0.0401 -6.4737

12592 18.0457 0.0775 -6.2329 3417 18.0455 0.0400 -6.2261

12593 18.0459 0.0773 -5.9852 3416 18.0458 0.0400 -5.9785

没错。我尝试将 p 更改为 1、2 和 np.inf,但这给出了相同的结果。

文件:

A.txt:http://pasted.co/8c5b6156

B.txt:http://pasted.co/28a228e6

谢谢

更新:即使使用 ergo_ 建议的修复程序,我也得到了:

12587 18.0445 0.0784 -7.4705 7758 18.0448 0.0403 -7.4639

12587 18.0445 0.0784 -7.4705 3422 18.0444 0.0403 -7.4639

12588 18.0447 0.0783 -7.2231 3421 18.0446 0.0402 -7.2164

12588 18.0447 0.0783 -7.2231 7759 18.0450 0.0402 -7.2163

12589 18.0450 0.0781 -6.9756 7760 18.0452 0.0402 -6.9688

12589 18.0450 0.0781 -6.9756 3420 18.0448 0.0402 -6.9688

12590 18.0452 0.0779 -6.7281 3419 18.0450 0.0401 -6.7212

12590 18.0452 0.0779 -6.7281 7761 18.0454 0.0401 -6.7212

12591 18.0454 0.0777 -6.4805 7762 18.0456 0.0401 -6.4736

12591 18.0454 0.0777 -6.4805 3418 18.0453 0.0401 -6.4737

因此它会多次考虑相同的点。

最佳答案

您可以验证 cKDTree 给出了正确的结果。这里,对于“对于 A 中的每个点,B 中的哪个点最接近”的问题:

import numpy as np
from scipy.spatial import cKDTree
A = np.loadtxt('A.txt')
B = np.loadtxt('B.txt')
tree = cKDTree( B[:,[1,2,3]] )
d, inds = tree.query( A[:,[1,2,3]], k=1, p=2)
B_new = B[inds]
xyz_near = np.hstack(( B_new[:,0:4], A[:,0:4] ))

for j, a in enumerate(A):
# compute 2-norms from each point in B to a
dd = np.sqrt(((a[1:] - B[:,1:])**2).sum(axis=1))
# find closest point
jx = np.argmin(dd)
# check solution
assert inds[j] == jx
assert np.allclose(d[j], dd.min())
# check it is unique
assert (dd[jx+1:] > d[j]).all()
assert (dd[:jx] > d[j]).all()

print("All OK")

该解决方案也是独一无二的,如上所示。

如果另一方面你想要一对一映射,这是一个不同的问题,在 finding nearest items across two lists/arrays in Python但是,我认为 dsearchn 不会给您这个答案。

关于python - cKDTree 与 dsearchn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31124930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com