<p>您可以使用<code>np.linalg.norm</code>和<code>ord=2</code>来获得两个numpy数组之间的欧几里德距离。应用于您的示例,您可以使用以下内容:</p>
<pre><code>from collections import namedtuple
import numpy as np
# Introduce a named tuple for named access to start/end/center points
DetectedObject = namedtuple("DetectedObject",
("start", "end", "center", "score"))
# I am storing your examples as DetectedObjects, each point is
# a vector of length 2.
examples = [DetectedObject(start=np.asarray([10, 10]), # store point coordinates in array
end=np.asarray([200, 200]),
center=np.asarray([105, 105]),
score=0.9),
DetectedObject(start=np.asarray([350, 120]),
end=np.asarray([410, 500]),
center=np.asarray([380, 310]),
score=0.7)]
def get_centers(objects):
"""Retrieve center points from DetectedObject."""
return np.asarray(list(map(lambda o: o.center, objects)))
def get_closest_object_to_centroid(centroid, objects):
"""Given a centroid, extract the closest object from a collection of DetectedObjects."""
centers = get_centers(objects)
# instead of the norm you could also use np.sum((centroid-centers)**2, axis=1)
closest_index = np.argmin(np.linalg.norm(centroid-centers, ord=2, axis=1))
return objects[closest_index]
</code></pre>
<p>然后您可以按如下方式使用它:</p>
<pre><code>closest = get_closest_object_to_centroid(centroid=np.asarray([10, 10]),
objects=examples)
closest # DetectedObject(start=array([10, 10]), end=array([200, 200]), center=array([105, 105]), score=0.9)
</code></pre>