我有一个(密集)矩阵 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)
关于python - 复杂的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37300676/