如何在 Python 中评估预定义的符号变量数组?

如何解决如何在 Python 中评估预定义的符号变量数组?

我有一个 MATLAB 代码,我正在尝试将其转换为 Python。我使用 eval() 来评估我在 MATLAB 中的符号数组。但是我找不到如何在 Python 中解决这个问题。这是一个简单的例子:

MATLAB 代码


%values to be assigned
input = [10 20 30; ...
         15 25 20; ...
         20 20 10]

%decision variables     
x_1_1 = input(1)    
x_2_1 = input(2)    
x_3_1 = input(3)    
x_1_2 = input(4)
x_2_2 = input(5)    
x_3_2 = input(6)
x_1_3 = input(7)    
x_2_3 = input(8)    
x_3_3 = input(9)

%symbolic arrray
symbolic_eq  = sym('x_',[3,3])

%any math operation    
m  =  [-1  0  0 ; ...
        0 -1  0 ; ...
        0  1 -1 ]

% new equations for symbolic array    
multp_eq  = m*symbolic_eq

% get results
results   = eval(multp_eq)

Python 代码

from sympy import *
import numpy as np

#values to be assigned
input = np.array([[10,20,30,15,25,10]])

#decision variables
x_1_1 = input[0]
x_2_1 = input[1]
x_3_1 = input[2]
x_1_2 = input[3]
x_2_2 = input[4]
x_3_2 = input[5]
x_1_3 = input[6]
x_2_3 = input[7]
x_3_3 = input[8]

#symbolic array (edited)
symbolic_eq = symarray('x',(4,4))
symbolic_eq = np.array(symbolic_eq [1:,1:])

#any math operation
m  =  np.array([[-1,0 ],[ 0,-1,1,-1 ]])

#new equations for symbolic array
multp_eq  = m*symbolic_eq

# get results
results   = eval(multp_eq)

此外,对于 MATLAB 和 Python,如何轻松定义 input() 变量?

解决方法

您的代码的主要问题是您需要进行替换(使用 .subs() 方法才能评估您的表达式。这是通过提供包含变量及其值的列表元组来完成的。我在这里构建这个列表在一个 for 循环中。

关于您的代码的一些额外注释。通常,避免使用 from sympy import * 之类的命令。它无缘无故地填充了您的命名空间。最后,我看不出从 1 开始索引而不是从 0 开始的“好”理由。我建议考虑切换到本机索引,因为它通常会使代码更简洁。

import sympy as sp
import numpy as np

#values to be assigned
aninput = np.array([[10,20,30],[15,25,20],[20,10]])

#symbolic array (edited)
symbolic_eq = sp.symarray('x',(4,4))
symbolic_eq = symbolic_eq [1:,1:]

thesubs = []
for index,theinput in np.ndenumerate(aninput):
    thesubs.append((symbolic_eq[index],aninput[index]))
print(thesubs)

#any math operation
m  =  sp.Matrix([[-1,0 ],[ 0,-1,1,-1 ]])

#new equations for symbolic array
multp_eq  = m*symbolic_eq

# get results
results   = multp_eq.subs(thesubs)
results

最后,这段代码不会运行得很快。如果要对大量输入的值数组执行此操作,则应考虑使用 sympy.lambdify 而不是 .subs

function = sp.lambdify(np.array(symbolic_eq).flatten(),multp_eq,modules="numpy" )

然后你只需要调用函数来得到答案:

result = function(*aninput.flatten())

在我的机器上,对于这个简单的例子,最后一行比使用 subs 的代码快近 400 倍。但是,如果您的输入数组的大小可以增加,那么此解决方案可能会遇到一些限制(如果我记得的话,最多为 256 个值)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?