【问题标题】:Nearest points for each row in panda's data frame熊猫数据框中每一行的最近点
【发布时间】:2020-05-10 21:12:16
【问题描述】:

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

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

如有任何帮助,将不胜感激。

【问题讨论】:

  • 请分享一个带有预期输出的示例输入。

标签: python pandas numpy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为您正在寻找这个(首先将您的数据导入 numpy 数组,或使用 pandas 数据框中的.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.        ]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 2021-07-01
      • 2017-09-15
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多