ポイントが多い場合は、KDTreeを使用して最近傍をより効率的に計算できます。
import numpy as np
import scipy.spatial as spatial
points = np.array([(1, 2), (3, 4), (4, 5), (100,100)])
tree = spatial.KDTree(np.array(points))
radius = 3.0
neighbors = tree.query_ball_tree(tree, radius)
print(neighbors)
# [[0, 1], [0, 1, 2], [1, 2], [3]]
tree.query_ball_treepoints
は、最近傍の(の)インデックスを返します。たとえば、[0,1]
(インデックス0で)はpoints[0]
、からの距離points[1]
内にあることを意味します。(インデックス1で)は、を意味し、からの距離内にあります。radius
points[0]
[0,1,2]
points[0]
points[1]
points[2]
radius
points[1]
frequency = np.array(map(len, neighbors))
print(frequency)
# [2 3 2 1]
density = frequency/radius**2
print(density)
# [ 0.22222222 0.33333333 0.22222222 0.11111111]