2015-04-15 74 views
0

我知道this post,但我沒有看到答案。我想將數值代入sympy矩陣。更詳細地說,我確實在sympy中建立了一個系統,並且在某些情況下我想插入基於numpy數組的數值。我認爲這是可以使用字典。但是,我誤解了這個概念,或者這不是該語言的一個特徵。使用字典的Sympy矩陣替換

我有一個矩陣:

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) 

輸出(應該是數字):

​​

如果我使用一個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⎦ 

和取代(如上圖所示)這個矩陣爲符號,我期望符號矩陣看起來像數字一樣。

+0

你能澄清你到底想要什麼作爲輸出嗎?應該執行哪個替換?你想要塊矩陣嗎? –

+0

不,我嘗試用基於numpy數組的數值替換 – Moritz

+0

您可以添加您想要的輸出結果嗎? – miradulo

回答

1

雖然希望充滿了來自numpy的起源仍然逃避我數一sympy矩陣的原因,你可以進行這樣的替換:

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]]]) 

剛剛添加完成。

+0

也許,我不是那麼直白。我有一些系統設置numpy並調用fsolve來解決它。系統本身根據組分存在的數量(蛋白質)改變其大小。我想用sympy提供一個分析梯度。並將矩陣從numpy插入到sympy矩陣中。我剛剛發現了lambdify。也許這將是評估表達式的更好方法。 – Moritz