【问题标题】:Nearest Neighbor Distances for a 2D Grid in PythonPython中二维网格的最近邻距离
【发布时间】:2021-07-05 23:55:16
【问题描述】:

我有一个二维网格上的离散点数据集,尺寸为 4x4,每个都有给定的 x 和 y 坐标,例如:

x_coord, y_coord
0.5     2.1
0.8     3.2
3.3     1.1
2.8     0.6
1.9     1.0

我想遍历每个网格点以找到到第三近邻的距离。所以我想知道以下坐标到第三近邻的距离

[0,0]
[0,1]
[0,2]
[0,3]
[1,0]
[1,1]
[1,2]
[1,3]
[2,0]
[2,1]
[2,2]
[2,3]
[3,0]
[3,1]
[3,2]
[3,3]

我认为我的麻烦在于如何通过网格并计算到最近邻居的距离。我只是在学习 python,所以我在嵌套 for 循环方面的经验非常有限,但我猜这就是我需要的。

目前为止

from sklearn.neighbors import NearestNeighbors
import numpy as np

x=[0.5,0.8,3.3,2.8,1.9]
y=[2.1,3.2,1.1,0.6,1.0]

myarray = np.array([x,y])
myarray_trans = np.transpose(myarray)
myarray_trans

nbrs = NearestNeighbors(n_neighbors=3, algorithm='ball_tree').fit(myarray_trans)
distances, indices = nbrs.kneighbors(myarray_trans)

现在使用它作为我的训练集,我需要遍历整个网格以从离散列表中找到到第三近邻的距离。我试过这个:

for i in range(0,4):
   for j in range(0,4):
      distances2[i,j], indices[i,j] = nbrs.kneighbors([i,j])

我收到一条错误消息,提示“预期的 2D 数组,得到 1D 数组:array=[0 0]

我必须在更大的数据集上执行此操作,该数据集的网格尺寸更像 500 x 500,所以这是一个示例。

【问题讨论】:

  • 嘿,你最好在遇到错误时使用堆栈,这样我们就可以看到哪个调用失败了,而不是从你说的内容中猜测。

标签: python for-loop multidimensional-array nested nearest-neighbor


【解决方案1】:

根据我在https://scikit-learn.org/stable/modules/neighbors.htmlnbrs.kneighbors 上看到的内容,期望列表列表作为输入。这正是错误告诉您的内容。

在 python 中,nbrs.kneighbors([i,j]) 求值为 [3,8] 之类的列表,这是一个简单的列表,而不是多维数组

【讨论】: