[英]How can I find the nearest distance between points in a 2D array and a 3D matrix grid?
[英]Find distance to nearest neighbor in 2d array
我有一個2D數組,我想為每個(x, y)
點找到到其最近鄰居的距離盡快。
我可以使用scipy.spatial.distance.cdist做到這一點 :
import numpy as np
from scipy.spatial.distance import cdist
# Random data
data = np.random.uniform(0., 1., (1000, 2))
# Distance between the array and itself
dists = cdist(data, data)
# Sort by distances
dists.sort()
# Select the 1st distance, since the zero distance is always 0.
# (distance of a point with itself)
nn_dist = dists[:, 1]
這行得通,但是我覺得它的工作量很大, KDTree應該可以處理這個,但是我不確定如何。 我對最近的鄰居的坐標不感興趣,我只想要距離(並盡可能快)。
KDTree可以做到這一點。 該過程與使用cdist時幾乎相同。 但是cdist更快。 正如評論中指出的那樣,cKDTree甚至更快:
import numpy as np
from scipy.spatial.distance import cdist
from scipy.spatial import KDTree
from scipy.spatial import cKDTree
import timeit
# Random data
data = np.random.uniform(0., 1., (1000, 2))
def scipy_method():
# Distance between the array and itself
dists = cdist(data, data)
# Sort by distances
dists.sort()
# Select the 1st distance, since the zero distance is always 0.
# (distance of a point with itself)
nn_dist = dists[:, 1]
return nn_dist
def KDTree_method():
# You have to create the tree to use this method.
tree = KDTree(data)
# Then you find the closest two as the first is the point itself
dists = tree.query(data, 2)
nn_dist = dists[0][:, 1]
return nn_dist
def cKDTree_method():
tree = cKDTree(data)
dists = tree.query(data, 2)
nn_dist = dists[0][:, 1]
return nn_dist
print(timeit.timeit('cKDTree_method()', number=100, globals=globals()))
print(timeit.timeit('scipy_method()', number=100, globals=globals()))
print(timeit.timeit('KDTree_method()', number=100, globals=globals()))
輸出:
0.34952507635557595
7.904083715193579
20.765962179145546
再一次,那么非常不需要的證據證明C很棒!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.