繁体   English   中英

使用字典进行Sympy矩阵替换

[英]Sympy matrix substitution using a dictionary

我知道此帖子,但没有看到答案。 我想将数值替换为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)

有什么线索吗?

编辑:作为评论的答案,我发布我的输出应如下所示:

如果我生成随机矩阵(我尝试过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⎦

然后将此矩阵替换为符号矩阵(如上所示),我希望符号矩阵看起来像数字矩阵。

虽然我仍然想得到一个以numpy开头的数字填充的sympy Matrix的原因仍然可以避免,但是您可以执行以下替换:

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不再返回列表,而是生成器。 没有它,在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]]])

只需添加即可完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM