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

还有一些非官方的包,目前还不是很完善, 且没有持续维护

Quantum Mathematica

总而言之,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
2
session = 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
2
3
4
5
6
7
8
9
10
11
import io
from PIL import Image
import matplotlib.pyplot as plt

def show_plt(plot):
buf = io.BytesIO()
plot.savefig(buf, transparent=True, format='png')
buf.seek(0)
im = Image.open(buf).convert("RGBA")
buf.close()
return im

如何在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]]