Python 在矩阵中查找最接近/相似的值(向量)

Python 在矩阵中查找最接近/相似的值(向量),python,numpy,Python,Numpy,假设我有以下numpy矩阵(简化): 现在我想从最接近“搜索”向量的矩阵中得到向量: 我所做的工作如下: min_dist = None result_vec = None for ref_vec in matrix: distance = np.linalg.norm(search_vec-ref_vec) distance = abs(distance) print(ref_vec, distance) if min_dist == None or min_d

假设我有以下numpy矩阵(简化):

现在我想从最接近“搜索”向量的矩阵中得到向量:

我所做的工作如下:

min_dist = None
result_vec = None
for ref_vec in matrix:
    distance = np.linalg.norm(search_vec-ref_vec)
    distance = abs(distance)
    print(ref_vec, distance)
    if min_dist == None or min_dist > distance:
        min_dist = distance
        result_vec = ref_vec
结果是可行的,但是是否有一个本地的numpy解决方案可以更有效地实现这一点? 我的问题是,矩阵越大,整个过程就越慢。 是否有其他解决方案可以更优雅、更有效地处理这些问题?

方法#1

我们可以使用,这是非常有效的内存和性能-

In [276]: from scipy.spatial import cKDTree

In [277]: matrix[cKDTree(matrix).query(search_vec, k=1)[1]]
Out[277]: array([2, 2])
方法#2

与-

方法#3

与-

方法#4

与-

方法#5

从软件包(免责声明:我是它的作者)和下面的,我们可以利用
矩阵乘法
-

M = matrix.dot(search_vec)
d = np.einsum('ij,ij->i',matrix,matrix) + np.inner(search_vec,search_vec) -2*M
closest_vec = matrix[d.argmin()]

很好,谢谢。我会试试看。在这种情况下,scipy也可以使用3d向量吗?嘿@Divakar,如果我写一个规范的重复问题,你能帮我回答吗?@DanielF当然!我们可能会在上面有一个维基问答帖子。看起来学校又开始上课了。“我们可能需要一个伪造的副本,@Daniel F请随意编辑我的帖子,这样有助于防止重复。”。我又问了同样的问题。在发布这个新问题之前,我找不到它。
In [276]: from scipy.spatial import cKDTree

In [277]: matrix[cKDTree(matrix).query(search_vec, k=1)[1]]
Out[277]: array([2, 2])
In [286]: from scipy.spatial.distance import cdist

In [287]: matrix[cdist(matrix, np.atleast_2d(search_vec)).argmin()]
Out[287]: array([2, 2])
from sklearn.neighbors import NearestNeighbors

nbrs = NearestNeighbors(n_neighbors=1).fit(matrix)
closest_vec = matrix[nbrs.kneighbors(np.atleast_2d(search_vec))[1][0,0]]
from sklearn.neighbors import KDTree
kdt = KDTree(matrix, metric='euclidean')
cv = matrix[kdt.query(np.atleast_2d(search_vec), k=1, return_distance=False)[0,0]]
M = matrix.dot(search_vec)
d = np.einsum('ij,ij->i',matrix,matrix) + np.inner(search_vec,search_vec) -2*M
closest_vec = matrix[d.argmin()]