我有一个(密集)矩阵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×n矩阵。
执行此操作的一种方法是构建for循环以循环遍历n x n矩阵,然后使用scipy.sparse的.dot()函数计算矩阵中每个向量的点积。但是,我正在寻找一种完全以矢量化方式执行此计算的方法,以提高效率。这可能吗?如果没有,Python中循环我的n x n矩阵的最快方法是什么?
答案 0 :(得分:5)
您可以使矢量密集并使用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)