复杂的矩阵乘法

sjo*_*999 1 python numpy matrix scipy sparse-matrix

我有一个(密集)矩阵nxnxm和一个稀疏矢量(scipy.sparse)1 x m.如果我们查看我的密集nxnxm矩阵,它可以被解释为在每个位置amx 1向量上的nxn矩阵.现在我想用nxn矩阵中的每个mx 1密集向量计算稀疏向量的点积,产生具有所有这些点积的焦虑矩阵.

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

小智 5

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

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

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

ans = arr[...,vec.nonzero()[1]].dot(vec.data)
Run Code Online (Sandbox Code Playgroud)

对于非常大的数据可能更快地使用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)
Run Code Online (Sandbox Code Playgroud)