考试项目: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
相关产品推荐
相关产品推荐

