稀疏 SciPy 矩阵与两个 NumPy 向量的矩阵乘法
Matrix multiplication of a sparse SciPy matrix with two NumPy vectors
假设我想计算二次形式 x^T A y
,其中 x
和 y
是 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 * A
和 A * y
解释为矩阵乘法,但我宁愿永远不要使用该选项,因为如果 A 变为密集矩阵,则存在错误操作的风险出于某种原因矩阵。 SciPy 文档中似乎没有提倡 *
的这种用法;所有示例都使用 dot
。
假设我想计算二次形式 x^T A y
,其中 x
和 y
是 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 * A
和 A * y
解释为矩阵乘法,但我宁愿永远不要使用该选项,因为如果 A 变为密集矩阵,则存在错误操作的风险出于某种原因矩阵。 SciPy 文档中似乎没有提倡 *
的这种用法;所有示例都使用 dot
。