【问题标题】:Write a sympy matrix to a python file将 sympy 矩阵写入 python 文件
【发布时间】:2016-09-25 14:23:17
【问题描述】:

我有一个脚本可以自动生成方程式并将它们添加到列表中。

例如:

eq = [a*b, a + b*c -d, c**2 + a, d*a - 2]

带有 a、b、c、d 所有符号。

然后它将列表转换为 sympy 矩阵并计算雅可比矩阵

eq = sympy.Matrix(eq)
jacobi = eq.jacobian([a, b, c, d])

我想将这个 jacobian 保存在一个 python 文件中,以便我在另一个 python 脚本中使用它。

目前我使用字符串列表创建定义并将其写入 python 文件

variable_list = [a, b, c, d]

jacobian_lines = ["def jacobian(variables):",
                           '    """ Returns the evaluated jacobian matrix',
                           '    :param variables: a list of numeric values to evaluate the jacobian',
                           '    """', '', '    {} = variables'.format(str(variable_list)), '',
                           '    j = {}'.format(jacobi), '', "    return j"]

file_path = 'jacobian.py'
file = open(file_path, 'w')

for line in jacobian_lines:
    file.write('{}\n'.format(line))

有没有更正确/更好的方法来做到这一点?

【问题讨论】:

  • 这是现在最好的方法。 SymPy 具有代码生成功能,目前针对 C 和 Fortran 等其他语言,但它们主要在未来获得编写 Python 代码的能力,这可能会使这类事情更容易编写。

标签: python sympy


【解决方案1】:

不确定您之前是否遇到过这种情况,但您可以使用标准库中的 pickle module 将任意 Python 对象写入文件。这将允许您执行以下操作来保存 jacobian:

import pickle
import sympy

a = sympy.symbols('a')
b = sympy.symbols('b')
c = sympy.symbols('c')
d = sympy.symbols('d')

eq = [a*b, a + b*c -d, c**2 + a, d*a - 2]
eq = sympy.Matrix(eq)
jacobi = eq.jacobian([a, b, c, d])

with open('~/Desktop/jacobian.pickle', 'wb') as outf:
    outf.write(pickle.dumps(jacobi))

然后,当您想在其他脚本中加载它时,您可以像这样将该 jacobian 加载回内存中:

import pickle
import sympy

with open('~/Desktop/jacobian.pickle', 'rb') as inf:    
   jacobi = pickle.loads(inf.read())
print(jacobi)

输出:

Matrix([
[b, a,   0,  0],
[1, c,   b, -1],
[1, 0, 2*c,  0],
[d, 0,   0,  a]])

【讨论】:

  • 是的,我知道,但我试图避免写入二进制文件。
  • 您可能希望将其添加到问题中。
【解决方案2】:

我可以让你的代码简单一点

这项工作可以在没有'for循环'的情况下完成:

variable_list = [a, b, c, d]

jacobian_lines = ["def jacobian(variables):",
                           '    """ Returns the evaluated jacobian matrix',
                           '    :param variables: a list of numeric values to evaluate the jacobian',
                           '    """', '', '    {} = variables'.format(str(variable_list)), '',
                           '    j = {}'.format(jacobi), '', "    return j"]

file_path = 'jacobian.py'
file = open(file_path, 'w').write('\n'.join(jacobian_lines))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2023-03-17
    • 2015-02-16
    • 2021-10-16
    相关资源
    最近更新 更多