Python 复杂矩阵乘法

Python 复杂矩阵乘法,python,numpy,matrix,scipy,sparse-matrix,Python,Numpy,Matrix,Scipy,Sparse Matrix,我有一个(密集的)矩阵nxm和一个稀疏向量(scipy.sparse)1xm。 如果我们看一下稠密的nxnnxm矩阵,它可以被解释为一个nxn矩阵,每个位置上都有一个m1向量。现在我想计算稀疏向量的点积,每个m x 1稠密向量在nxn矩阵中产生一个nxn矩阵,所有这些点积 一种方法是通过nxn矩阵构建for循环,然后使用scipy.sparse的.dot()函数计算矩阵中每个向量的点积。然而,为了提高效率,我正在寻找一种完全以矢量化方式执行此计算的方法。这可能吗?如果不是,Python中循环我的

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


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

您可以使向量密集,并使用
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)

您可以使向量密集并使用
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)

如果你的n*n矩阵是稠密的,那么你如何循环就无关紧要了,因为你需要用n^2个元素中的每一个计算点积。因此,双for循环可以很好地工作。如果你的n*n矩阵是稠密的,那么你如何循环就无关紧要了,因为你需要用n^2个元素中的每一个计算点积。所以双for循环可以很好地工作。