如何计算向量x1与x2间3×3规格的Pairwise distance matrix
3×3规格Pairwise距离矩阵计算方案
已知输入
- 向量1:
x1 = [1, 2, 3] - 向量2:
x2 = [2, 3, 4] - 输出要求:3×3尺寸的成对距离矩阵
这里先明确容易踩的坑:如果直接把
x1、x2各当作一个3维特征的单样本计算成对距离,输出只会是1×1的矩阵。要得到3×3的结果,必须把两个向量里的每个元素拆成独立的1维样本,计算两组样本所有配对的距离。
计算规则
默认采用最常用的欧氏距离,矩阵第i行第j列的取值为x1第i个元素和x2第j个元素的差的绝对值:dist[i][j] = abs(x1[i] - x2[j])
手动代入数值计算的结果:
- 第一行(对应x1元素1):和x2的2、3、4分别作差取绝对值,得到
[1, 2, 3] - 第二行(对应x1元素2):和x2的2、3、4分别作差取绝对值,得到
[0, 1, 2] - 第三行(对应x1元素3):和x2的2、3、4分别作差取绝对值,得到
[1, 0, 1]
最终矩阵如下:
[[1, 2, 3], [0, 1, 2], [1, 0, 1]]
代码实现
方法1:调用scipy现成接口
import numpy as np from scipy.spatial.distance import cdist # 把向量转成n_samples×n_features的格式,每个元素是单独的1维样本 x1_arr = np.array([1,2,3]).reshape(-1, 1) x2_arr = np.array([2,3,4]).reshape(-1, 1) dist_matrix = cdist(x1_arr, x2_arr, metric='euclidean')
方法2:用numpy广播原生实现
不需要额外依赖距离计算库,直接靠numpy的广播机制就能算:
import numpy as np x1 = np.array([1,2,3]) x2 = np.array([2,3,4]) # 把x1转成列向量,广播机制会自动计算所有两两组合的差值 dist_matrix = np.abs(x1.reshape(-1, 1) - x2)
两种方法运行后得到的结果和手动计算完全一致,都是要求的3×3规格。
内容的提问来源于stack exchange,提问作者cys
相关产品推荐
相关产品推荐

