Поиск ближайшего соседа =, TypeError: только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс - PullRequest
1 голос
/ 24 апреля 2020

Я сделал функцию, чтобы найти ближайшего соседа к точке для домашнего классификатора knn.

Я сделал следующее:

  1. Определил функцию euclid_dist(x,y), чтобы найти расстояние между двумя точками на плоскости 2 *.
  2. Определена функция nearest_neigh(p, points, k=3) для поиска k ближайших точек к точке p среди списка point.

Функция для поиска соседей:

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]] возвращает ошибку: TypeError: only integer scalar arrays can be converted to a scalar index

Я нарезал массив ind внутри points, чтобы вернуть k ближайшие соседи.

Ожидаемый результат:

Функция возвращает k ближайшего соседа.

Надеюсь, я не слишком усложнил этот вопрос.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Я почти уверен, что это происходит, потому что points - это список, а не numpy array. Такая индексация не поддерживается для списков. Приведение points к массиву должно решить проблему.

0 голосов
/ 24 апреля 2020

Проблема, как упоминал 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...