Mathematica如何用来写Python并且二者之间进行数据转换
Mathematica
前言
现如今Python很火,因为其入门简单,功能强大。在科学计算领域中也占有一席之地。本人作为量子光学领域的理论研究生,平时仿真软件(COMSOL,Lumerical)用的很多,MATLAB,Python以及Mathematica也用得勤。
个人体验来说,MATLAB,Python功能有重叠的地方,也有互相不可替代的地方。比如MATLAB与 COMSOL,Lumerical的Livelink就是我所需要的不可替代的功能,非常方便处理仿真数据。而对于一般的数据处理,MATLAB, Python我觉得不相伯仲。Python有一些开源的包,比如Qutip,在MATLAB里面已经停止维护了,所以想用Qutip还得用Python。
最后来说Mathematica,以前一直以为是个计算器,忽视了其作用,疫情期间花时间了解之后,知晓其功能之强大,也对Mathematica的创始人顶礼膜拜。Mathematica设计的初衷就是想做一个全能型选手,其在各个领域都有涉及,特别是符号计算,其编程的思路以及写程序的模式一旦适应,写起来真的很顺手。
为什么不直接用Mathematica而用Python?
Mathematica的符号计算让很多计算就像写公式一样简单,也许也正因为如此,Mathematica没有对应完善的量子信息包来处理数据。近日也有人和Wolfram介绍量子计算的Package,感兴趣的可以看这个讨论
Quantum Computing in Wolfram Language
还有一些非官方的包,目前还不是很完善, 且没有持续维护
总而言之,Mathematica还没有官方完善的包来量子计算。所以目前Qutip还是上上之选。
另外,大数据处理方面,Mathematica真的还不够优秀。
为什么不用JupyterNotebook?
Jupyter Notebook确实很好用,但是Mathematica对我而言更好用, 就喜欢边写公式边计算个积分,算出个结果马上绘制个曲线,想看哪个pdF、图片、代码、仿真文件,直接通过Mathematica调用系统默认软件打开,Mathematica一个笔记本可以把一切都给你满足。而且其输入公式的逻辑比Latex好,所写即所见,我觉得用Mathematica推导比我用纸笔高效。Jupyter Notebook用Latex输入再公式很长的时候,修改起来贼麻烦。
Mathematica支持折叠,支持不同笔记本的互相引用,用过就知道有多好!
如何在Mathematica简单使用Python?
在Python安装库:pyzmq
其实怎么使用,直接在Mathematica帮助页面搜索“Python”即可。当然,前提是你已经安装了python环境。如下图所示
通过pip安装即可
1 | pip install zmq |
后续的安装成功与否的检测,以及遇到的问题的解决办法,Mathematica都有详细的说明。我这里就不在赘述了。
直接从Mathematica的“外部运行框”里面运行Python代码
在Mathematica的命令块中,输入shift+>
,就会弹出一个Python的对话框,如下图所示,你就可以愉快得输入pyton命令了。
这样的一个窗口就和Jupyter Notebook一样了。你输入公式还是可以自己输入。即还是可以用Mathematica进行排版!或者做符号运算。
通过Mathematica的“ExternalEvaluate”函数
另外就是通过ExternalEvaluate
函数来运行,Mathematica有教程,我就不再赘述了,个人感觉不是很方便。下面是一段示例1
2session = StartExternalSession["Python"]
ExternalEvaluate[session,File["filepath"]]
如何在Mathematica使用Python的函数、数据、图片?
接下来就是更加高阶一点的操作,我们有的函数可能是Python写的,但是我们想通过Mathematica的代码运行,或者我们希望通过python导入数据,Mathematica绘图,或者像jupyter notebook一样内置matplotlib的图片等…
如何让Python绘制的图片内置于Mathematica的Notebook界面内
直接在Mathematica中运行绘图代码,绘图窗口会弹出来,并不会内置在Notebook里面,而且目前有没有官方的支持,解决方案来自:
How to display images inside Mathematica with matplotlib
1 | import io |
如何在Mathematica中使用Python的数组
在Python里面输入1
from wolframclient.serializers import export
比如我们有一个数组为”A”,我们想要在Mathematica使用,直接输入1
export(A)
然后在Mathematica语言中输入1
AMat=Normal[ToExpression[ByteArrayToString[%]]];
下面是我运行的一个例子。
还有一些小技巧可以参见我的另外一篇笔记
Mathematica小技巧
特别是我们想输入比较多的代码时,我们按Enter,不希望新建一个Cell,而实换行,此时我们需要输入以下代码:1
SetOptions[EvaluationNotebook[], FrontEnd`ReturnCreatesNewCell -> False]
如何在Python中使用Mathematica的数组
(更新于2021年12月17日)
这里需要借助ExternalEvaluate
函数,主要参照了该讨论
https://community.wolfram.com/groups/-/m/t/2343086
假设我们已经打开了一个笔记本下的Python交互界面,此时我们需要获取对应的session
1 | session = ExternalSessions["Python"][[1]] |
然后假设我们有一个数据test
是需要在Python里面用的,比如要将其转化为numpy
矩阵,那么我们可以输入1
ExternalEvaluate[session, <|"Command" -> "test=np.array(<*test*>)"|>]
注意我们用<*test*>
将要转化的Mathematica变量名写了出来。
![[Attachment/MMA模板.nb]]