稀疏 SciPy 矩阵与两个 NumPy 向量的矩阵乘法

Matrix multiplication of a sparse SciPy matrix with two NumPy vectors

假设我想计算二次形式 x^T A y,其中 xy 是 NumPy 向量,我将 A 存储为 SciPy csc_matrix为了效率。

似乎执行计算的一种方法是

(x * A).dot(y)

因为 SciPy 使用 * 作为矩阵乘积,而 NumPy 使用 .dot 代替。

虽然这种方法给了我正确的答案,但对我来说似乎有点违反直觉,我想知道是否还有更 readable/efficient 的方法?

正如 Paul Panzer 所说,x @ A @ y 的可读性最高并且按预期工作(需要 Python 3.5+ 和 NumPy 1.10+)。

SciPy 也使用 dot 进行矩阵乘法,在他们自己关于 sparse matrices page 的示例中。所以你可以像

这样一致地使用点
x.dot(A.dot(y))

A.dot(y).dot(x) 尽管后者更难阅读,因为 x 不合适。

不能使用x.dot(A).dot(y)的唯一原因是NumPy不理解稀疏矩阵,所以x的dot方法不适合乘以稀疏矩阵。

尽管 SciPy 稀疏矩阵将 x * AA * y 解释为矩阵乘法,但我宁愿永远不要使用该选项,因为如果 A 变为密集矩阵,则存在错误操作的风险出于某种原因矩阵。 SciPy 文档中似乎没有提倡 * 的这种用法;所有示例都使用 dot