首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Mathematica中的代码转换为Python?

如何将Mathematica中的代码转换为Python?
EN

Stack Overflow用户
提问于 2020-09-22 05:02:37
回答 2查看 5.2K关注 0票数 2

我有下面的Mathematica代码来缩放图的边长度,使其等于边权值。(参考)

代码语言:javascript
运行
复制
edges = {1 <-> 2, 1 <-> 3, 1 <-> 4, 2 <-> 5, 2 <-> 6, 5 <-> 6, 
   3 <-> 4, 3 <-> 7, 6 <-> 7, 7 <-> 8, 2 <-> 9};

vd = {{75., 25., 0}, {115., 45., 0}, {10., 5., 0}, {45., 0, 0}, 
  {90., 60., 0}, {45., 55., 0}, {0, 25., 0}, {10., 50., 0}, {115.,  25.,0}};

vl = Range[Length@vd];

vcoords = MapIndexed[#2[[1]] -> # &, vd];
ew = {1 \[UndirectedEdge] 2 -> 49.6, 1 \[UndirectedEdge] 3 -> 74.4, 
 1 \[UndirectedEdge] 4 -> 49.6, 2 \[UndirectedEdge] 5 -> 37.2, 
 2 \[UndirectedEdge] 6 -> 74.4, 5 \[UndirectedEdge] 6 -> 49.6, 
 3 \[UndirectedEdge] 4 -> 37.2, 3 \[UndirectedEdge] 7 -> 24.8, 
 6 \[UndirectedEdge] 7 -> 62, 7 \[UndirectedEdge] 8 -> 37.2, 
 2 \[UndirectedEdge] 9 -> 24.8}

g3d = Graph3D[vl, edges, VertexCoordinates -> vcoords, 
  EdgeWeight -> ew, VertexLabels -> Placed["Name", Center], 
  EdgeLabels -> {e_ :> Placed["EdgeWeight", Center]}, 
  VertexSize -> .3, VertexStyle -> Red]
vars3d = Array[Through[{x, y, z}@#] &, Length @ vd];

λ = 1/100.;

obj3d = Total[(Norm[vars3d[[First@#]] - vars3d[[Last@#]]] - # /. ew)^2 & /@ 
  EdgeList[g3d]] +  λ Total[Norm /@ (vars3d - vd)];

lbnd = 0;
ubnd = 500;

solution3d = Last@Minimize[{obj3d, And @@ Thread[lbnd <= Join @@ vars3d <= ubnd]}, 
    Join @@ vars3d];

edgeLengths3d = # -> Norm[vars3d[[First@#]] - vars3d[[Last@#]]] /. 
     solution3d & /@ EdgeList[g3d];

Grid[Prepend[{#, # /. ew, # /. edgeLengths3d} & /@ 
   EdgeList[g3d], {"edge", "EdgeWeight", "Edge Length"}], 
 Dividers -> All]

我试图用Python重写相同的代码。输入已转换为python数据类型、列表和dict。

代码语言:javascript
运行
复制
edges = [(1,2), (1,3), (1,4), (2,5), (2,6), (5,6), (3,4), (3,7), (6,7), (7,8), (2,9)];
vl = [1,2,3,4,5,6,7,8,9]
ew = {(1, 2) : 49.6, (1,3): 74.4, (1, 4) : 49.6, (2,5): 37.2, (2, 6) : 74.4, (5, 6): 49.6, 
     (3, 4) : 37.2, (3, 7):24.8, (6, 7) : 62, (7, 8) : 37.2, (2, 9) : 24.8}
vd = {1:[75., 25., 0], 2:[115., 45., 0], 3:[10., 5., 0], 4:[45., 0, 0], 
      5:[90., 60., 0], 6:[45., 55., 0], 7:[0, 25., 0], 8:[10., 50., 0], 9:[115.,  25.,0]}; 

我不确定如何在Python中转换优化命令。关于如何用Python编写行obj3dsolution3d的建议将有很大帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-10 23:03:51

将Mathematica转换为Python

这只是在某种程度上使用了各种语言和工具,到目前为止,我还不知道有一个完整的解决方案。

我对它做了一些研究,可行的路线可能是:

Mathematica -> SymPy / ANTLR -> PythonMathematica -> C / Fortran -> Callable from Python

Mathematica的做事方式(自然)比面向对象的功能更强,所以直接转换到Python可能是可能的,但是会产生一些看起来相当复杂的Python代码。

如果你真的想继续沿着Mathematica -> Python的路线走下去,有一个非常聪明的家伙(量子信息与基金会集团CSIC)的高级科学家,名叫Juan JoséGarcía Ripoll,他已经启动了一个工具,可以直接将Mathematica笔记本电脑转换成Python。

它使用了一种非常直接的基于解析器的方法,它基本上是通过Mathematica表达式爬行,将操作符转换为Python等价物,并从中创建一个有效的Python表达式。目前,它适用于最简单的操作,但如果您不想从头开始,这将是一个很好的起点。

它已经能够翻译Mathematica表达式如下:

转到Python代码中,所以它并不那么基本。一个不错的起点。

您可以下载包含代码和示例这里的Mathematica笔记本文件

解释这个工具的博客文章是这里

数学项目还包含相同域中的一些有趣的代码。您可能需要查看相关的源文件

我知道这并没有完全回答你的问题,但它确实提供了一个可能的解决方案的指针,使它工作,尽管这需要一些工作。

票数 4
EN

Stack Overflow用户

发布于 2020-10-10 05:41:45

如何将Mathematica中的代码转换为Python?

如果代码很小(几百行),则最好手工进行转换(或者将其转包)。

您需要阅读数学Python的文档。

如果代码很大(成千上万行),您可以考虑编写一个源对源转换器。为此,请阅读,然后选择一种高级编程语言(如奥卡姆SBCLHaskell)来编写这样的翻译程序(使用门希尔等解析器生成器工具以及伊堡等启发方法)。预算半年的全职工作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64003338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档