panda数据框中每行的最近点

2024-09-29 22:31:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个带有X,Y和Z坐标的CSV文件。我需要添加两列:RNereastIdx,其中R表示到最近点(行)的距离,NereastIdx是该点的行号。每行都是唯一的点

我正试图找到一个有效的方法来做到这一点。在我的第一次尝试中(使用pandas),我迭代了for循环中的所有行,计算了所有距离,计算了最小值,检查了索引,并为两个新列指定了值。但是速度太慢了。我在谷歌上搜索到KDTree可能有用,但老实说,我不知道如何在我的特殊情况下使用它

任何帮助都将受到感谢


Tags: 文件csv方法距离pandasfor情况速度
2条回答

查看最近邻图的实现,如sklearn.neighbors.kneighbors_graph。您尝试做的是相同的,所以请看库实现。 您可以找到有关它的更多信息: https://scikit-learn.org/stable/modules/neighbors.html#unsupervised-neighborshttps://scikit-learn.org/stable/modules/generated/sklearn.neighbors.kneighbors_graph.html#sklearn.neighbors.kneighbors_graph

我认为您正在寻找这个(首先将数据导入numpy数组,或者使用熊猫数据帧中的.to_numpy()):

from scipy.spatial import KDTree

pts_nn = np.hstack((pts, np.stack(KDTree(pts).query(pts, k=2))[:,:,1].T))

其中pts是点的Nx3数组(它实际上可以是任何维度点)。第4列是到最近邻的距离,第5列是最近邻行的索引

示例代码:

N = 10
pts = np.random.random((N, 3))


pts_nn:
                                   distance to   nearest
                                     nearest     neighbor
      X           Y          Z       neighbor    index
      |           |          |          |         |
      v           v          v          v         v

[[0.36154214 0.11883743 0.04484198 0.15207073 6.        ]
 [0.26106654 0.25574324 0.45306327 0.20522814 4.        ]
 [0.15989573 0.55955844 0.63199334 0.35385276 8.        ]
 [0.21143747 0.47216402 0.11990295 0.22398747 5.        ]
 [0.10244485 0.12636136 0.43829583 0.20522814 1.        ]
 [0.0101051  0.41025922 0.19608337 0.13800542 8.        ]
 [0.24196598 0.03731428 0.09154342 0.15207073 0.        ]
 [0.78249018 0.81468931 0.21105137 0.11227299 9.        ]
 [0.06798827 0.41764963 0.32114501 0.13800542 5.        ]
 [0.86526876 0.74024578 0.22558034 0.11227299 7.        ]]

相关问题 更多 >

    热门问题