2016-07-23 81 views
1

尽管我的问题似乎与sympy github问题here相关,但它似乎没有直接关系,或者仍然是一个未解决的问题(从2012年开始)。sympy矩阵内的sympy矩阵仍未评估代换

我的问题是我在我的矩阵表示的矩阵中有一个'矩阵'(实际上,它只是一个矢量,但是我唯一的选择,因为sympy处理的是事物),当被替换时,矩阵显示出一个矩阵而不是评估它。

下面是代码的样品块,这将证明这一点:

import numpy as np 
import sympy 
x = np.random.rand(15, 3) 
l_syms = sympy.MatrixSymbol('l', 1, 3) 
m = sympy.Matrix(x/l_syms) 
m.subs({l_syms:sympy.Matrix([[1,1,1]])}) 

中的每个值的matrix [[1,1,1]]应当分为m矩阵的每个元素,但矩阵按原样放置,并保留索引符号。

Matrix([ 
[ 0.98979011265311*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.833576329284127*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.575808048824554*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.523263044342704*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.320197709246721*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.592365354846089*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.943288501064919*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.996020450969247*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.964522394691641*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.763752929521655*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.690054409108757*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.417629855595703*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.213578356927868*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.362782611339912*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.892921288169683*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.068921237699985*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.244310349677818*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.977494896836049*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[0.0169721915631557*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.254316922886399*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.682785271511585*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.768287921847173*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.679243253034139*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.790710466097621*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.892115183428169*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.988514816033581*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.537769900907173*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.275725750770885*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.928279364723852*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.18023576064915*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.71421202332017*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.663585719630706*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.43460735199406*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.770814091341355*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.0650430822905173*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.0845773234523002*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[0.0398441324212175*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.0358479090409692*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.0801076763216808*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.89937521111821*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.21500916688666*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.661216039738327*Matrix([[1, 1, 1]])[0, 2]**(-1)], 
[ 0.866641224226343*Matrix([[1, 1, 1]])[0, 0]**(-1), 0.0506005171711028*Matrix([[1, 1, 1]])[0, 1]**(-1), 0.791277139679317*Matrix([[1, 1, 1]])[0, 2]**(-1)]]) 

我似乎没有能够找到一种方法来评估所有的Matrix对象,它们的指标 - 远程相关的是GitHub的问题上面链接的唯一的事情,但使用xreplace是我的意图甚至不太理想/正确,因为它留下的符号就位,而不是取代矩阵英寸

任何帮助非常感谢。

+0

这是一个更相关的问题https://github.com/sympy/sympy/issues/2962 – asmeurer

回答

1

doit将评估表达

In [9]: print(m.subs({l_syms:sympy.Matrix([[1,1,1]])}).doit()) 
Matrix([[0.391482321650262, 0.261165517803277, 0.142349217414644], [0.273871679444907, 0.753721446526393, 0.915204734923647], [0.689284430582533, 0.509755263016457, 0.828178833602631], [0.258602302969241, 0.561852165820955, 0.926528186168350], [0.932268817842373, 0.275670112515102, 0.313790471533159], [0.815965494794080, 0.00638263457666399, 0.728986133320254], [0.771288596688822, 0.159602759327409, 0.846541783656596], [0.703501924167250, 0.168463436323684, 0.496465192945264], [0.265617558320534, 0.727288058464723, 0.301561940789455], [0.134747729067062, 0.315683443879649, 0.741893699540517], [0.763480667163729, 0.459612818589501, 0.295897102504639], [0.519647253027057, 0.884505816757734, 0.823849322619653], [0.0499379745242409, 0.333299403033741, 0.960531610086280], [0.658552664971765, 0.788381947436270, 0.609862319604282], [0.748840147759344, 0.434013189476355, 0.747584770109250]]) 
+0

感谢@asmeurer。我很快就遇到了这个问题,忘记回来发布答案。 – mediantis