Skip to main content
 首页 » 编程设计

python之复杂的矩阵乘法

2025年05月04日23dyllove98

我有一个(密集)矩阵 n x n x m 和一个稀疏向量 (scipy.sparse) 1 x m。 如果我们看一下我的密集 n x n x m 矩阵,它可以被解释为一个 n x n 矩阵,每个位置都有一个 m x 1 向量。现在我想计算我的稀疏向量与 n x n 矩阵中的每个 m x 1 密集向量的点积,产生一个包含所有这些点积的 n x n 矩阵。

一种方法是构建一个 for 循环来遍历 n x n 矩阵,然后使用 scipy.sparse 的 .dot() 函数计算矩阵中每个向量的点积。但是,我正在寻找一种以矢量化方式完全执行此计算以提高效率的方法。这可能吗?如果不是,Python 中遍历我的 n x n 矩阵的最快方法是什么?

请您参考如下方法:

你可以使向量密集并使用 dot 或 einsum:

ans = arr.dot(vec.A.T) 
# or 
ans = numpy.einsum('ijk,k->ij', arr, vec.A.squeeze()) 

如果向量非常稀疏,首先从数组中选择与向量中的非零值相对应的项可能是值得的:

ans = arr[...,vec.nonzero()[1]].dot(vec.data) 

对于非常大的数据,使用 tensordot 而不是 dot 可能更快,因为它更有可能调用 BLAS 函数:

ans = numpy.tensordot(arr, vec.A.T, 1) 
# or, for a very sparse vec: 
ans = numpy.tensordot(arr[...,vec.nonzero()[1]], vec.data, 1)