在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的文档。 (我很乐意做出贡献,但我不知道这些差异)
答案 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]])是一个错误。