python - 复杂的矩阵乘法

标签 python numpy matrix scipy sparse-matrix

我有一个(密集)矩阵 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 矩阵的最快方法是什么?

最佳答案

你可以使向量密集并使用 doteinsum:

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)

关于python - 复杂的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37300676/

相关文章:

python - Django:无法使用新用户登录

python - 使用 4 邻域进行骨架化

python - 修改Python字典中的值

numpy - tensorflow batch_matmul如何工作?

python - 在多个 python 模块中使用相同的数组

python - 使用 CX_freeze 创建多个 .exe 文件

python - 估计卡尔曼滤波器周围的置信区间

R 应用并从前一行获取值

python - 二维数组python中的邻居

python - 在 Tensorflow 中将一组常量(一维数组)与一组矩阵(三维数组)相乘