Sympy 中的隐式 linsolve() 然后 lambdify
Implicit linsolve() in Sympy and then lambdify
我问是否可以从涉及求解的表达式的 lambdify
中得到 np.linalg.solve()
?
例如让
from sympy import MatrixSymbol, linsolve, lambdify
A = MatrixSymbol('A', 3, 3)
b = MatrixSymbol('b', 3, 1)
func = lambdify((A, b), linsolve((A, b)), modules="numpy")
是否可以生成 func(A, b) = np.linalg.solve(A, b)
?
以上代码肯定行不通。它首先会在 linsolve((A, b))
.
处失败
我的尝试是以某种方式将 linsolve((A, b))
标记为隐式表达式,以便 lambdify
可以识别它,因此 link 可以用 np.linalg.solve
识别它。但是我没发现 sympy
是否支持这个。
您可以使用函数 sympy.codegen.matrix_nodes.MatrixSolve
而不是 sympy.linsolve
。
from sympy import MatrixSymbol, lambdify
from sympy.codegen.matrix_nodes import MatrixSolve
A = MatrixSymbol('A', 3, 3)
b = MatrixSymbol('b', 3, 1)
func = lambdify((A, b), MatrixSolve(A, b), modules="numpy")
对于MatrixSolve
,lambdify
执行简单的词法替换:
In [87]: MatrixSolve(A,b)
Out[87]: MatrixSolve(MatrixSymbol(Str('A'), Integer(3), Integer(3)), vector=MatrixSymbol(Str('b'), Integer(3), Integer(1)))
In [88]: func = lambdify((A, b), MatrixSolve(A, b), modules="numpy")
In [89]: func
Out[89]: <function _lambdifygenerated(A, b)>
In [90]: func?
Signature: func(A, b)
Docstring:
Created with lambdify. Signature:
func(A, b)
Expression:
MatrixSolve(A, vector=b)
Source code:
def _lambdifygenerated(A, b):
return (solve(A, b))
如果不在 ipython/isympy
中,则使用 print(func.__doc__)
显示该文档。
您最初的问题是使用 sympy.linsolve
:
In [81]: linsolve((A,b))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-81-9ddeeeb0f242> in <module>
----> 1 linsolve((A,b))
/usr/local/lib/python3.8/dist-packages/sympy/solvers/solveset.py in linsolve(system, *symbols)
2630 if not isinstance(system[0], MatrixBase):
2631 if sym_gen or not symbols:
-> 2632 raise ValueError(filldedent('''
2633 When passing a system of equations, the explicit
2634 symbols for which a solution is being sought must
ValueError:
When passing a system of equations, the explicit symbols for which a
solution is being sought must be given as a sequence, too.
我问是否可以从涉及求解的表达式的 lambdify
中得到 np.linalg.solve()
?
例如让
from sympy import MatrixSymbol, linsolve, lambdify
A = MatrixSymbol('A', 3, 3)
b = MatrixSymbol('b', 3, 1)
func = lambdify((A, b), linsolve((A, b)), modules="numpy")
是否可以生成 func(A, b) = np.linalg.solve(A, b)
?
以上代码肯定行不通。它首先会在 linsolve((A, b))
.
我的尝试是以某种方式将 linsolve((A, b))
标记为隐式表达式,以便 lambdify
可以识别它,因此 link 可以用 np.linalg.solve
识别它。但是我没发现 sympy
是否支持这个。
您可以使用函数 sympy.codegen.matrix_nodes.MatrixSolve
而不是 sympy.linsolve
。
from sympy import MatrixSymbol, lambdify
from sympy.codegen.matrix_nodes import MatrixSolve
A = MatrixSymbol('A', 3, 3)
b = MatrixSymbol('b', 3, 1)
func = lambdify((A, b), MatrixSolve(A, b), modules="numpy")
对于MatrixSolve
,lambdify
执行简单的词法替换:
In [87]: MatrixSolve(A,b)
Out[87]: MatrixSolve(MatrixSymbol(Str('A'), Integer(3), Integer(3)), vector=MatrixSymbol(Str('b'), Integer(3), Integer(1)))
In [88]: func = lambdify((A, b), MatrixSolve(A, b), modules="numpy")
In [89]: func
Out[89]: <function _lambdifygenerated(A, b)>
In [90]: func?
Signature: func(A, b)
Docstring:
Created with lambdify. Signature:
func(A, b)
Expression:
MatrixSolve(A, vector=b)
Source code:
def _lambdifygenerated(A, b):
return (solve(A, b))
如果不在 ipython/isympy
中,则使用 print(func.__doc__)
显示该文档。
您最初的问题是使用 sympy.linsolve
:
In [81]: linsolve((A,b))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-81-9ddeeeb0f242> in <module>
----> 1 linsolve((A,b))
/usr/local/lib/python3.8/dist-packages/sympy/solvers/solveset.py in linsolve(system, *symbols)
2630 if not isinstance(system[0], MatrixBase):
2631 if sym_gen or not symbols:
-> 2632 raise ValueError(filldedent('''
2633 When passing a system of equations, the explicit
2634 symbols for which a solution is being sought must
ValueError:
When passing a system of equations, the explicit symbols for which a
solution is being sought must be given as a sequence, too.