You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

考试项目:Matlab中pdist2语句转Python求助(含I参数需求)

解决Matlab pdist2 取最近邻索引的Python等效实现

我刚好之前也碰到过类似的Matlab转Python的需求,你的问题核心是要复刻[~, I] = pdist2(X,Y,'euclidean','Smallest',1)的功能——也就是给X中的每个点找到Y里距离最近的点的1-based索引。下面给你两种可行的实现方式,都能完美匹配需求:

方法1:Scipy + Numpy 组合(适合小样本量)

Scipy的cdist其实已经能计算出X到Y的距离矩阵,只是你需要额外一步提取索引。注意Matlab的索引是从1开始的,Python默认从0开始,所以最后要加1对齐:

import numpy as np
from scipy.spatial.distance import cdist

# 假设X、Y是形状为(n_samples_X, n_features)和(n_samples_Y, n_features)的numpy数组
dist_matrix = cdist(X, Y, metric='euclidean')
# 对每一行(每个X的点)取最小距离对应的Y的索引,转成1-based
I = np.argmin(dist_matrix, axis=1) + 1

方法2:Scikit-learn NearestNeighbors(适合大样本量)

如果你的X/Y样本量很大,用KD-Tree优化的NearestNeighbors会比暴力计算距离矩阵高效得多,而且直接就能返回索引,代码更简洁:

from sklearn.neighbors import NearestNeighbors
import numpy as np

# 先把Y作为候选数据集构建索引
nn = NearestNeighbors(n_neighbors=1, metric='euclidean')
nn.fit(Y)
# 查询X中每个点的最近邻,返回距离和索引
_, I = nn.kneighbors(X)
# 把二维数组展平并转成1-based索引
I = I.flatten() + 1

补充说明一下:你提到Scipy的pdist/cdist无法满足需求,应该是没意识到可以用np.argmin从距离矩阵中提取索引——其实它完全可以搞定,只是需要多一步转换。而NearestNeighbors则是更贴合Matlabpdist2带'Smallest'参数的设计思路,底层做了优化,大数据场景下更推荐用这个。

内容的提问来源于stack exchange,提问作者Neoeden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:52:25