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 分类器创建了一个函数来找到一个点的最近邻居。
我做了以下事情:
- 定义了一个函数
euclid_dist(x,y)
来计算二维平面上两点之间的距离。
- 定义了一个函数
nearest_neigh(p, points, k=3)
以在列表 point
. 中找到与点 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))
我为自制的 knn 分类器创建了一个函数来找到一个点的最近邻居。
我做了以下事情:
- 定义了一个函数
euclid_dist(x,y)
来计算二维平面上两点之间的距离。 - 定义了一个函数
nearest_neigh(p, points, k=3)
以在列表point
. 中找到与点
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))