通过欧几里德距离从 numpy 数组的平均值中选择最接近的值

Selecting closest values by Euclidian distance from the mean from a numpy array

我确信对此有一个简单的答案,但我是一个 Python 新手,拖网 Whosebug 让我非常接近但在最后的障碍中落下,所以道歉。我有一个一维数组的数组(实际上由> 2000个数组组成,每个数组约800个值),但为了表示的缘故:

group = [[0,1,3,4,5],[0,2,3,6,7],[0,4,3,2,5],...]

我正在尝试 select 最近的 n 一维数组的平均值(通过欧几里得距离),但很难从原始列表中提取它们.我可以算出距离并对它们进行排序,但无法从原始组中提取它们。

# Compute the mean
group_mean = group.mean(axis = 0)
     
distances = []
for x in group:
    # Compute Euclidian distance from the mean
    distances.append(np.linalg.norm(x - group_mean))
    # Sort distances
    distances.sort()

print(distances[0:5]) # Prints the five nearest distances

任何关于如何 select 从 group 中找出对应于最近距离的五个(或其他)数组的任何建议将不胜感激。

你可以将数组与 dist 数组放在一起,并根据与平均值的距离进行排序:

import numpy as np 
group = np.array([[0,1,3,4,5],[0,2,3,6,7],[0,4,3,2,5]])
group_mean = group.mean(axis = 0)

distances = [[np.linalg.norm(x - group_mean),x] for x in group]
distances.sort(key=lambda a : a[0])

print(distances[0:5]) # Prints the five nearest distances

如果您的数组变大,最好只保存索引而不是整个数组:

distances = [[np.linalg.norm(x - group_mean),i] for i,x in enumerate(group)]

如果不想自己保存距离,只想根据距离排序,可以这样做:

group = list(group)
group.sort(key=lambda group: np.linalg.norm(group - np.mean(group)))