我需要創建函式nearest_neighbor(src, dst),它接受兩個二維點陣列,并且對于陣列 A 的每個點計算陣列 B 到最近鄰居的距離和索引。
示例輸入:
src = np.array([[1,1], [2,2],[3,3],[4,4],[9,9]])
dst = np.array([[6,7],[10,10],[10,20]])
示例輸出:
(array([7.81024968, 6.40312424, 5. , 3.60555128, 1.41421356]),
array([0, 0, 0, 0, 1]))
使用 sklearn,您可以這樣做:
def nearest_neighbor(src, dst):
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(dst)
distances, indices = neigh.kneighbors(src, return_distance=True)
return distances.ravel(), indices.ravel()
但我只需要用 numpy 創建它。我是這樣設計的:
def nearest_neighbor(src, dst):
distances = []
indices = []
for dot in src:
dists = np.linalg.norm(dst - dot,axis=1)
dist = np.min(dists)
idx = np.argmin(dists)
distances.append(dist)
indices.append(idx)
return np.array(distances), np.array(indices)
但由于 python 回圈,它的作業速度很慢。我怎樣才能讓它更快?
uj5u.com熱心網友回復:
您可以使用scipy.spatial.distance.cdist:
from scipy.spatial.distance import cdist
# compute matrix of distances
dist = cdist(src, dst)
# get min distance
closest = dist.argmin(axis=1)
# array([0, 0, 0, 0, 1])
distance = dist[np.arange(src.shape[0]), closest]
#array([7.81024968, 6.40312424, 5. , 3.60555128, 1.41421356])
uj5u.com熱心網友回復:
您應該閱讀 numpy 廣播:
dist = np.square(src[:,None] - dst).sum(axis=-1) ** .5
idx = dist.argmin(axis=-1)
# array([0, 0, 0, 0, 1])
min_dist = dist[np.arange(len(dist)), idx]
uj5u.com熱心網友回復:
使用廣播,src[:, None] - dst使每一行src減去每一行dst:
>>> def nearest_neighbor(src, dst):
... dist = np.linalg.norm(src[:, None] - dst, axis=-1)
... indices = dist.argmin(-1)
... return dist[np.arange(len(dist)), indices], indices
...
>>> src = np.array([[1,1], [2,2],[3,3],[4,4],[9,9]])
>>> dst = np.array([[6,7],[10,10],[10,20]])
>>> nearest_neighbor(src, dst)
(array([7.81024968, 6.40312424, 5. , 3.60555128, 1.41421356]),
array([0, 0, 0, 0, 1], dtype=int64))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490672.html
