Определенно работа для поиска ближайшего соседа:
import seaborn as sns
import numpy as np
from sklearn.neighbors import KDTree
from matplotlib import pyplot as plt
step_size = np.array([5,5]) # size of step in each dimension
arr = np.array([[0,0,0,0,0,0,0,0,1,0],[1,0,0,0,0,0,0,1,0,0],[1,0,0,0,0,0,0,1,0,0],[0,1,0,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,1,0,0],[0,0,1,1,1,1,1,0,0,0]])
sns.heatmap(arr, annot=True, cbar=False, linewidths=.3)
# get boundary pts (+0.5 to center for plot)
boundary = np.column_stack(np.nonzero(arr)) + 0.5
# create tree
tree = KDTree(boundary)
# get zero points to test for
zeros = np.column_stack(np.nonzero(~arr)) + 0.5
# get nearest neighbour boundary point for each zero
distance, index = tree.query(zeros)
# plot the results
for i, pt in enumerate(zeros):
plt.gca().plot([pt[1], boundary[index[i,0]][1]], [pt[0], boundary[index[i,0]][0]], 'r')
KDTree
может легко вычислить k
соседей и возвращает вам как евклидово distance
, так и index
результата в оригинальном дереве. Действительно полезный инструмент. См. График ниже:
Также результат для вторых ближайших соседей, передайте от k=2
до query
и построите с помощью:
# plot the results
colors = ['r', 'b']
for i, pt in enumerate(zeros):
for k in range(index.shape[1]):
plt.gca().plot([pt[1], boundary[index[i,k]][1]], [pt[0], boundary[index[i,k]][0]], colors[k])