Finding nearest neighbour =, TypeError: only integer scalar arrays can be converted to a scalar index

Finding nearest neighbour =, TypeError: only integer scalar arrays can be converted to a scalar index

我为自制的 knn 分类器创建了一个函数来找到一个点的最近邻居。

我做了以下事情:

  1. 定义了一个函数 euclid_dist(x,y) 来计算二维平面上两点之间的距离。
  2. 定义了一个函数 nearest_neigh(p, points, k=3) 以在列表 point.
  3. 中找到与点 p 最近的 k 个点

寻找邻居的功能:

def neares_neigh(p, points, k=3):
    """Return the nearest neighbour of a point"""
    distances = []
    for point in points:
        dist = euclid_dist(p, point)
        distances.append(dist)

    distances = np.array(distances)
    ind = np.argsort(distances)
    return points[ind[0:k]]

最后一行return points[ind[0:k]]return错误: TypeError: only integer scalar arrays can be converted to a scalar index

我将 points 中的 ind 数组切片为 return k 最近的邻居。

预期输出:

函数 return 是 k 最近邻。

我希望我没有把这个问题复杂化。

我很确定会发生这种情况,因为 points 是一个列表而不是 numpy array。列表不支持这种索引。将 points 转换为数组应该可以解决问题。

如 Ralvi 所述,问题是因为 points 很可能是 Python 列表而不是 numpy 数组。以下代码不会产生任何错误:

import numpy as np
import math
from random import randint


def euclidean_distance(point1, point2):
    return math.sqrt(sum(math.pow(a - b, 2) for a, b in zip(point1, point2)))


def nearest_neighbor(p, points, k=3):
    """Return the nearest neighbour of a point"""
    distances = []
    for point in points:
        dist = euclidean_distance(p, point)
        distances.append(dist)

    distances = np.array(distances)
    ind = np.argsort(distances)

    print(p)
    return points[ind[0:k]]

# generate an array of random points
points = 0 + np.random.rand(100, 2) * 50

print(nearest_neighbor(points[randint(0, len(points))], points, k=3))