使用字典的 Sympy 矩阵替换
Sympy matrix substitution using a dictionary
我知道 this post 但我没有看到答案。我想将数值代入一个 sympy 矩阵。更详细地说,我确实在 sympy 中建立了一个系统,在某些情况下我想插入基于 numpy 数组的数值。我认为可以使用字典。但是要么我误解了这个概念,要么它不是语言的特性。
我有一个矩阵:
import sympy as sp
cp = sp.MatrixSymbol('cp',3,3)
C = sp.Matrix(cp)
sp.pprint(Q)
⎡cp₀₀ cp₀₁ cp₀₂⎤
⎢ ⎥
⎢cp₁₀ cp₁₁ cp₁₂⎥
⎢ ⎥
⎣cp₂₀ cp₂₁ cp₂₂⎦
我创建了一个字典
mydict={'cp', sp.Matrix(np.random.rand(3,3))}
但是替换不起作用:
mydict = {'cp':sp.Matrix(cp)}
subs = C.subs(mydict)
sp.pprint(subs)
输出(应该是数字):
⎡cp₀₀ cp₀₁ cp₀₂⎤
⎢ ⎥
⎢cp₁₀ cp₁₁ cp₁₂⎥
⎢ ⎥
⎣cp₂₀ cp₂₁ cp₂₂⎦
如果我使用 numpy 数组而不是 sympy 矩阵,我会收到以下错误:
SympifyError: Sympify of expression 'could not parse u'[[ 0.69780014 0.89835127 0.9623417 ] [ 0.28375306 0.94416287 0.12325111] [ 0.20154648 0.7324886 0.87209933]]'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
这次尝试给出了同样的错误(替换为确切的变量名称):
mydict2 = {}
i,j = C.shape
[ mydict2.update( {C[i,j]: cp[i,j]} )for i in range(i) for j in range(j)]
C.subs(mydict2)
有什么线索吗?
编辑:作为对评论的回答,我 post 我的输出应该是这样的:
如果我生成随机矩阵(我尝试了 sp.Matrix、np.matrix 和 np.array):
sp.Matrix(np.random.rand(3,3))
⎡0.12 0.87 0.96⎤
⎢ ⎥
⎢0.31 0.71 0.44⎥
⎢ ⎥
⎣0.36 0.23 0.55⎦
并将这个矩阵(如上所示)代入符号矩阵,我希望符号矩阵看起来像数字矩阵。
虽然想要一个 sympy 矩阵填充源自 numpy 的数字的原因仍然让我难以理解,但您可以像这样执行替换:
import sympy as sp
import numpy as np
cp = sp.MatrixSymbol('cp',3,3)
C = sp.Matrix(cp) # same thing as cp.as_explicit()
C.subs(list(zip(cp, np.random.rand(9))))
# example output:
#
# Matrix([
# [0.993152112961882, 0.898596737383104, 0.403274559253394],
# [0.831318080769803, 0.296307294254107, 0.57444787963296],
# [0.424120969168281, 0.985130115570423, 0.113035586132516]])
我使用了对 list
的额外调用,因为我使用的是 Python3,其中 zip
不再是 return 列表,而是生成器.没有它,在 Python3,你会得到:
Matrix([
[0.0798937249416819, cp[0, 1], cp[0, 2]],
[ cp[1, 0], cp[1, 1], cp[1, 2]],
[ cp[2, 0], cp[2, 1], cp[2, 2]]])
刚刚添加完成。
我知道 this post 但我没有看到答案。我想将数值代入一个 sympy 矩阵。更详细地说,我确实在 sympy 中建立了一个系统,在某些情况下我想插入基于 numpy 数组的数值。我认为可以使用字典。但是要么我误解了这个概念,要么它不是语言的特性。
我有一个矩阵:
import sympy as sp
cp = sp.MatrixSymbol('cp',3,3)
C = sp.Matrix(cp)
sp.pprint(Q)
⎡cp₀₀ cp₀₁ cp₀₂⎤
⎢ ⎥
⎢cp₁₀ cp₁₁ cp₁₂⎥
⎢ ⎥
⎣cp₂₀ cp₂₁ cp₂₂⎦
我创建了一个字典
mydict={'cp', sp.Matrix(np.random.rand(3,3))}
但是替换不起作用:
mydict = {'cp':sp.Matrix(cp)}
subs = C.subs(mydict)
sp.pprint(subs)
输出(应该是数字):
⎡cp₀₀ cp₀₁ cp₀₂⎤
⎢ ⎥
⎢cp₁₀ cp₁₁ cp₁₂⎥
⎢ ⎥
⎣cp₂₀ cp₂₁ cp₂₂⎦
如果我使用 numpy 数组而不是 sympy 矩阵,我会收到以下错误:
SympifyError: Sympify of expression 'could not parse u'[[ 0.69780014 0.89835127 0.9623417 ] [ 0.28375306 0.94416287 0.12325111] [ 0.20154648 0.7324886 0.87209933]]'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
这次尝试给出了同样的错误(替换为确切的变量名称):
mydict2 = {}
i,j = C.shape
[ mydict2.update( {C[i,j]: cp[i,j]} )for i in range(i) for j in range(j)]
C.subs(mydict2)
有什么线索吗?
编辑:作为对评论的回答,我 post 我的输出应该是这样的:
如果我生成随机矩阵(我尝试了 sp.Matrix、np.matrix 和 np.array):
sp.Matrix(np.random.rand(3,3))
⎡0.12 0.87 0.96⎤
⎢ ⎥
⎢0.31 0.71 0.44⎥
⎢ ⎥
⎣0.36 0.23 0.55⎦
并将这个矩阵(如上所示)代入符号矩阵,我希望符号矩阵看起来像数字矩阵。
虽然想要一个 sympy 矩阵填充源自 numpy 的数字的原因仍然让我难以理解,但您可以像这样执行替换:
import sympy as sp
import numpy as np
cp = sp.MatrixSymbol('cp',3,3)
C = sp.Matrix(cp) # same thing as cp.as_explicit()
C.subs(list(zip(cp, np.random.rand(9))))
# example output:
#
# Matrix([
# [0.993152112961882, 0.898596737383104, 0.403274559253394],
# [0.831318080769803, 0.296307294254107, 0.57444787963296],
# [0.424120969168281, 0.985130115570423, 0.113035586132516]])
我使用了对 list
的额外调用,因为我使用的是 Python3,其中 zip
不再是 return 列表,而是生成器.没有它,在 Python3,你会得到:
Matrix([
[0.0798937249416819, cp[0, 1], cp[0, 2]],
[ cp[1, 0], cp[1, 1], cp[1, 2]],
[ cp[2, 0], cp[2, 1], cp[2, 2]]])
刚刚添加完成。