如何对含多列表的矩阵执行成对运算并生成对称矩阵及成对分析
矩阵成对运算与NumPy实现方案
核心逻辑:从2个向量到N个向量的扩展
当你有2个向量L、M时,成对点积的结果可以整理为对称矩阵:
[[M·M, M·L], [L·M, L·L]]
这本质是向量矩阵与其转置的矩阵乘法——将所有向量按行(或列)组成矩阵,矩阵与自身转置相乘后,每个位置(i,j)就对应第i个向量和第j个向量的点积。由于点积满足交换律(a·b = b·a),结果自然是对称矩阵。
当向量数量扩展到N个时,这个逻辑完全通用:将N个向量构造成N×D的矩阵(D为向量维度),计算该矩阵与自身转置的乘积,即可得到N×N的对称成对运算矩阵。
针对给定NumPy数组的实现
给定数组:
import numpy as np x = np.array([[1, 3, 5],[1, 4, 5],[2,6,10]])
x包含3个3维行向量,以下是两种常用实现方式:
方法1:矩阵乘法(最简洁)
直接用dot函数计算矩阵与转置的乘积:
pairwise_dot = x.dot(x.T) print(pairwise_dot)
输出结果:
[[ 35 36 72] [ 36 42 84] [ 72 84 140]]
- 对角线元素:对应每个向量自身的点积(如
35 = 1²+3²+5²) - 非对角线元素:对应两个不同向量的点积(如
36 = 1*1 + 3*4 +5*5),且满足对称特性
方法2:使用np.inner函数
np.inner对二维数组默认计算每行之间的点积,结果与上述方法完全一致:
pairwise_dot = np.inner(x, x) print(pairwise_dot)
自定义成对运算的通用方案
如果需要执行点积以外的成对运算(如自定义距离、乘积和等),可以利用三角索引遍历并填充对称矩阵:
n = x.shape[0] result = np.zeros((n, n)) # 获取上三角索引(跳过对角线) i, j = np.triu_indices(n, k=1) # 替换为你的自定义运算,示例仍用点积 result[i, j] = np.einsum('ij,ij->i', x[i], x[j]) # 对称填充下三角 result[j, i] = result[i, j] # 填充对角线(自身运算) np.fill_diagonal(result, np.einsum('ij,ij->i', x, x)) print(result)
内容的提问来源于stack exchange,提问作者ASking
相关产品推荐
相关产品推荐

