假设我想计算二次形式x^T A y
,其中x
和y
是NumPy向量,并且我已将A
存储为SciPy csc_matrix
为了提高效率。
似乎执行计算的一种方法是
(x * A).dot(y)
因为SciPy将*
用于矩阵产品,而NumPy则使用.dot
。
虽然这种方法给了我正确的答案,但对我来说这似乎是违反直觉的,我想知道是否有更可读/更有效的方法?
答案 0 :(得分:1)
正如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
的点方法不适合用稀疏矩阵进行乘法。
虽然SciPy稀疏矩阵将x * A
和A * y
解释为矩阵乘法,但我宁愿永远不要使用该选项,因为如果A由于某种原因改变为密集矩阵,则存在错误操作的风险。看起来在SciPy文档中不会提升*
的这种用法;所有示例都使用dot
。