矩阵乘法的Sympy表示法

时间:2018-04-20 11:16:30

标签: sympy

在numpy中,定义矩阵和点积是标准的,如下所示

import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]])
print(a.shape)
print(b.shape)
print(a.dot(b).shape)

按预期输出:

(2, 3)
(3, 4)
(2, 4)

但令我惊讶的是,以下内容失败了

import sympy as sp
a = sp.Matrix([[1, 2, 3], [4, 5, 6]])
b = sp.Matrix([[7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]])
print(a.shape)
print(b.shape)
print(a.dot(b).shape)

输出

(2, 3)
(3, 4)

---------------------------------------------------------------------------
ShapeError                                Traceback (most recent call last)
<ipython-input-30-50c934c7fbaf> in <module>()
      4 print(a.shape)
      5 print(b.shape)
----> 6 print(a.dot(b).shape)

~/miniconda3/lib/python3.6/site-packages/sympy/matrices/matrices.py in dot(self, b)
   2389                 mat = mat.T
   2390                 b = b.T
-> 2391             prod = flatten((mat * b).tolist())
   2392             if len(prod) == 1:
   2393                 return prod[0]

~/miniconda3/lib/python3.6/site-packages/sympy/core/decorators.py in binary_op_wrapper(self, other)
    130                     else:
    131                         return f(self)
--> 132             return func(self, other)
    133         return binary_op_wrapper
    134     return priority_decorator

~/miniconda3/lib/python3.6/site-packages/sympy/matrices/common.py in __mul__(self, other)
   2006             if self.shape[1] != other.shape[0]:
   2007                 raise ShapeError("Matrix size mismatch: %s * %s." % (
-> 2008                     self.shape, other.shape))
   2009 
   2010         # honest sympy matrices defer to their class's routine

ShapeError: Matrix size mismatch: (3, 2) * (4, 3).

这对我来说很困惑!

为什么numpy和sympy之间的不一致?

为什么我不能在sympy的文档中发现此行为的警告?

如何在sympy中正确计算两个矩阵的点积?

我是否可以建议,对于numpy和sympy之间的语法差异,可以输入sympy的文档。 (我很乐意做出贡献,但我不知道这些差异)

2 个答案:

答案 0 :(得分:3)

SymPy中的Matrix产品计算为a*b

method dot in SymPy旨在允许计算代表向量的两个矩阵的点积,例如:

>>> sp.Matrix([1, 2]).dot(sp.Matrix([3, 4]))
11

是两个列向量的点积。这有一个转置。

  

返回Matrix self的点积并放松兼容尺寸的条件:如果行数或列数与b的长度相同,则返回点积。如果self是行或列向量,则返回标量。否则,返回结果列表(在这种情况下,self中的列数必须与b的长度匹配。)

答案 1 :(得分:2)

我将在这里发布SymPy开发人员对Github的回复:

  

作为一般规则,在NumPy中,所有操作都在数组上进行矢量化。在   SymPy,操作符合他们通常的数学意义。这意味着   SymPy通常对数学保持更具限制性   &#34;纯&#34;

     

最明显的一个:在NumPy中,一切都是数字的。函数采用数字或数组,并产生数字或   一系列数字。在SymPy中,一切都是象征性的。表达式可以   使用默认情况下未评估的符号变量。对于   例如,np.exp(np.pi)产生一个数字,但是sympy.exp(sympy.pi)   产生一个未评估的表达式(可以评估为一个数字   与sympy.exp(sympy.pi).evalf())。

     

通常,SymPy函数不适用于NumPy数组,NumPy函数不适用于SymPy表达式。如果你想混合   SymPy和NumPy,建议使用lambdify(以SymPy开头)   表达式只使用SymPy函数,然后使用lambdify进行转换   到等效的NumPy函数,并在NumPy数组上使用它   NumPy数字类型)。我已多次在StackOverflow上讨论过这个问题。

     

&#39; *&#39;是矩阵乘法。请注意,@(Python 3.5+)在NumPy和SymPy中进行矩阵乘法。

     

sympy.Matrix总是排名2.NumPy数组可以是任何排名。请注意,NumPy中的dot / @可以处理任何秩数组。有些奇怪   排名1阵列上的行为(它基本上将它们视为列或列   行向量,取决于上下文)。

     

在SymPy中的矩阵上调用数学函数,如果有效,则执行该函数的分析矩阵估值。例如,   exp(M)计算矩阵指数。可以使用Matrix.applyfunc   以元素方式应用函数。在NumPy中,exp(A)取指数   A的每个元素(使用scipy.linalg.expm取矩阵)   NumPy数组的指数)。

     

np.dot执行矩阵乘法。在SymPy中,dot做一个点积(需要两个1xn或nx1矩阵并产生一个标量)。   sympy.dot错误(实际上当前在master中给出了弃用   警告)如果参数不是1xn。

     

1x1矩阵与SymPy中的标量不同。 1 + Matrix([[1]])是一个错误。