【问题标题】:Importing Mathematica expression to Python correctly将 Mathematica 表达式正确导入 Python
【发布时间】:2017-01-04 00:13:06
【问题描述】:

我正在尝试将一个冗长的表达式从 Mathematica 导入 Python。我将 Mathematica 表达式的 FortranForm 复制粘贴到 Python,并将所有行设置为具有相同的缩进。但我收到一个我不明白的错误。我猜这是缩进的问题,但我不确定。请帮忙。

这是 Python 中的代码,带有缩进:

def f2(x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3):
    return ((x2*(y - y1) + x*(y1 - y2) + x1*(-y + y2))*(y2 - y3) + (-y1 + y2)*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(z - z1) + x*(z1 - z2) + x1*(-z + z2))*(z2 - z3) + (-z1 + z2)*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)))/
    (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
    ((x - x3)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
    (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/
    (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*((x - x3)**2 + (y - y3)**2 + (z - z3)**2)**1.5) - 
    (2*(x - x2)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
    (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/
    (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)**2*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
    ((x - x1)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
    (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/
    (((x - x1)**2 + (y - y1)**2 + (z - z1)**2)**1.5*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2))

这是我得到的错误:

File "<ipython-input-87-f30bebfee3b2>", line 4
x2*(z - z1) + x*(z1 - z2) + x1*(-z + z2))*(z2 - z3) + (-z1 + z2)*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)))/
SyntaxError: invalid syntax

【问题讨论】:

  • 那是什么?某种扩展?您是否检查过numpy / scipy 是否支持它?
  • 代码很丑。通过查看PEP 8 尝试对其进行编辑

标签: python wolfram-mathematica code-formatting


【解决方案1】:

无效的语法是表达式中的换行符。例如,

def invalid_break():
    return 1 /
           2

无效。一个简单的解决方法是将表达式括在括号中:

def valid_break():
    return (1 / 
            2)

参见例如How can I do a line break (line continuation) in Python? 为了清楚起见,一种解决方法是将长表达式括在括号中,即

def f2(x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3):
        return (((x2*(y - y1) + x*(y1 - y2) + x1*(-y + y2))*(y2 - y3) + (-y1 + y2)*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
        (x2*(z - z1) + x*(z1 - z2) + x1*(-z + z2))*(z2 - z3) + (-z1 + z2)*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)))/
        (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
        ((x - x3)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
        (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
        (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/
        (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*((x - x3)**2 + (y - y3)**2 + (z - z3)**2)**1.5) - 
        (2*(x - x2)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
        (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
        (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/
        (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)**2*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
        ((x - x1)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
        (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
        (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/
        (((x - x1)**2 + (y - y1)**2 + (z - z1)**2)**1.5*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)))

【讨论】:

  • @roganjosh 我意识到/ 是除法,\` 是明确的行继续。语法错误是 OP 代码中的无效换行符,恰好发生在除法之后 /
  • @innisfree 那么,您是说在/ 除号之后有一个隐含的无效换行符吗?我该如何解决?通过在每个换行符处在 / 周围添加括号 -- ` ( / ) `?还是有更简单的解决方案?
  • @roganjosh 是的,你可以
  • @ap21 更简单的解决方案是将整个表达式括在括号中,如我的回答中所述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2022-10-14
相关资源
最近更新 更多