WolframClientForPython | 适用于Python的新Wolfram语言客户端库


我博客中的原始翻译

从Python获得对Wolfram语言的完全访问权限


Wolfram语言( Wolfram语言 )为程序员提供了一种独特的语言,其中包含多种复杂算法以及关于世界的内置知识。 多年来,人们一直在问我们如何从其他软件环境和编程语言访问我们技术的所有功能。 多年过去了,我们创建了许多此类解决方案, 例如用于Excel的Wolfram CloudConnector,用于C / C ++程序的WSTP (Wolfram符号传输协议),以及当然是J / Link ,它可以直接从Java访问Wolfram语言。

因此,今天我们很高兴正式向您介绍期待已久的新的语言组合解决方案,它将使能够直接有效地从Python语言调用Wolfram语言Wolfram Client Library for Python 。 最重要的是,此客户端库具有完全开放源代码, 代码在MIT许可证下托管在WolframClientForPython git存储库中 ,因此您可以随意复制并随意使用它。

很简单。


Wolfram客户端库可轻松将大量Wolfram语言算法以及Wolfram知识库直接集成到任何现有的Python代码中,从而大大节省了开发新代码的时间和精力。 在本文中,我们首先向您展示如何在Python和Wolfram语言之间建立连接,查看几种可用于Wolfram语言进行计算的方法和示例,然后从Python调用它。 有关更完整的参考信息,请访问: Wolfram Python客户端库文档主页

当场欣赏...


让我们从一个简单的示例开始,该示例计算从正态分布获取的一百万个数字的平均和标准偏差。 本示例说明如何从Python调用Wolfram函数,并将Python的结果与相同的Wolfram语言计算结果进行比较,以表明它们具有高度收敛性。

统计数据分析


首先,要连接到Wolfram语言,您需要使用Wolfram引擎 (免费的Wolfram语言引擎)创建一个新会话:

from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession() 

要调用Wolfram语言函数,您需要导入`wl`引擎:

 from wolframclient.language import wl 

现在,您可以执行任何Wolfram语言代码。 将来自Python的样本变量分配给从正态分布中提取的一百万个随机数的列表值,平均值为0,标准差为1:

 sample = session.evaluate(wl.RandomVariate(wl.NormalDistribution(0,1), 1e6)) 

考虑其中的前五个:

 sample[:5] [0.44767075774581, 0.9662810005828261, -1.327910570542906, -0.2383857558557122, 1.1826399551062043] 

您可以使用Wolfram语言计算此样本的平均值。 如预期的那样,它将接近零:

 session.evaluate(wl.Mean(sample)) 0.0013371607703851515 

您也可以在Python中直接计算出相同的值,以确保获得相似的结果:

 from statistics import mean mean(sample) 0.0013371607703851474 

同样,您可以使用Wolfram语言计算样本的标准偏差:

 session.evaluate(wl.StandardDeviation(sample)) 1.0014296230797068 

然后在Python中运行以下代码,以确保获得类似的结果:

 stdev(sample) 1.0014296230797068 

不得不为结果收敛而感到高兴。 现在您知道了如何从Python调用简单的Wolfram语言函数。 让我们继续一个更有趣的示例。

使用Wolfram知识库


让我们看一下Wolfram语言内置函数,该函数在Python WolframAlpha中不可用:

 moons = session.evaluate(wl.WolframAlpha('moons of Saturn', 'Result')) 

WolframAlpha函数是Wolfram语言中的高级功能之一,可通过Web APIWolfram | Alpha服务器进行通信。 您可以直接从Python使用此API,当您直接从Wolfram语言访问所有数据处理功能时,调用WolframAlpha函数将更加强大和便捷。 让我们看一下Python中的moon变量包含什么:

 moons EntityClass['PlanetaryMoon', 'SaturnMoon'] 

此处的输出是Wolfram语言的表达式在Python中的表示形式,可用于任何后续计算中。 例如,如果要为此获取土星的前四颗卫星的列表(按它们与土星的接近程度),则需要运行以下代码:

 session.evaluate(wl.EntityList(moons))[:4] [Entity['PlanetaryMoon', 'S2009S1'], Entity['PlanetaryMoon', 'Pan'], Entity['PlanetaryMoon', 'Daphnis'], Entity['PlanetaryMoon', 'Atlas']] 

或者,您可以使用以下代码显示土星的四颗最大质量的卫星:

 bigmoons = session.evaluate(wl.EntityList(wl.SortedEntityClass(moons, wl.Rule("Mass","Descending"),4))) bigmoons [Entity['PlanetaryMoon', 'Titan'], Entity['PlanetaryMoon', 'Rhea'], Entity['PlanetaryMoon', 'Iapetus'], Entity['PlanetaryMoon', 'Dione']] 

或者,您可以获取带有这些卫星名称的字符串数组,例如:

 session.evaluate(wl.Map(wl.Function( wl.Slot()("Name")), bigmoons)) ['Titan', 'Rhea', 'Iapetus', 'Dione'] 

这一切都令人印象深刻。 让我们看看使用Wolfram语言中内置的图像处理和机器学习功能的另一个示例。

图像处理与机器学习


首先,让我们切换到另一种模式,以Wolfram语言直接执行评估。 到目前为止,您已经使用`wl`引擎在Python中创建Wolfram语言表达式,但是您还可以执行用Python编写的包含Wolfram语言代码的代码行,有时甚至更容易理解:

 from wolframclient.language import wlexpr 


例如,使用Wolfram语言计算1 +1,然后将其作为字符串发送:

 session.evaluate('1+1') 2 


使用此方法,您可以用Wolfram语言编写一小段代码,该代码在输入处接收图像,并使用内置的人脸检测算法在图像中查找人脸的位置。 在这里,我们使用的图像是荷兰艺术家约翰内斯·维米尔Johannes Vermeer )的著名画作“ 戴珍珠耳环的女孩 ”(应该指出的是,这种算法自然也适用于几乎任何可识别面部的物体图像)。 由于Python终端界面不支持图像输出,因此我们需要使用Jupyter NotebookPython图像库 (PIL)包才能输出结果:

 from PIL import Image import io 

 session.evaluate(wlexpr(''' image = ImageResize[ Import["Girl_with_a_Pearl_Earring.jpg"], 300]; boxes = FindFaces[image]; face = ImageAssemble[{{image,HighlightImage[image, boxes, "Blur"]}}]; ''') ) 

 data = session.evaluate( wlexpr('ExportByteArray[ face, "PNG" ]') ) 

 Image.open(io.BytesIO) 



结果,所有东西同时变得非常容易和强大。 但是,如果您没有在计算机上本地安装Wolfram引擎,并且想将Wolfram客户端库用于Python,该怎么办? 在这种情况下,始终可以通过从Wolfram Cloud (云)中调用Wolfram语言来直接使用它。

所以,去云端


Wolfram Cloud提供了对Wolfram语言的轻松访问,而无需在本地进行预安装。 Wolfram Cloud提供了多种服务,包括Wolfram语言Web编程界面以及部署自定义Wolfram语言Web API的功能。

在以下示例中,我们将通过部署Wolfram语言Web-API来完成此任务。 例如,API在输入中接受两个国家(country1和country2)的名称,找到每个国家的首都,然后计算它们之间的距离(以公里为单位):

 CloudDeploy[ APIFunction[{"country1"->"String","country2"->"String"}, QuantityMagnitude[ GeoDistance[ EntityValue[Entity["Country", #country1], "CapitalCity"], EntityValue[Entity["Country", #country2], "CapitalCity"] ], "Kilometers" ]&, "WXF" ], CloudObject["api/public/capital_distance"], Permissions->"Public"] 



部署此API之后,您可以启动新的Wolfram语言会话,但是这次您要连接到Wolfram Cloud而不是本地引擎:

 from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession() 

要调用API,您必须指定用户名(user1)和API端点(api / public / capital_distance)。 使用此数据,您可以连接到云...

 api = ('user1', 'api/public/capital_distance') result = cloud.call(api, {'country1': 'Netherlands', 'country2': 'Spain'}) 

...然后获得所需的结果:
 result.get() 1481.4538329484521 

再次评估它是多么容易和简单。

如果要保存已部署的Wolfram语言API,以便只有您可以使用它,则可以使用权限 →“私有”命令来部署该API。 为此,可以在私有API中生成(使用Wolfram语言)身份验证安全密钥:

图片
 key = GenerateSecuredAuthenticationKey["myapp"] 

从以下两行输入中复制答案:

 key["ConsumerKey"] key["ConsumerSecret"] 

然后将它们粘贴到您的Python会话中:

 SecuredAuthenticationKey('<<paste-consumer-key-here>>', '<<paste-consumer-secret-here>>') 

然后使用身份验证启动新的云会话:

 cloud = WolframCloudSession(credentials=sak) cloud.start() cloud.authorized() True 

现在,您(而且只有您)可以使用已部署为私有使用的任何Wolfram语言API。

让我们谈谈序列化的基本概念


为了快速高效地完成所有工作,用于Python的Wolfram客户端库使用开放的WXF格式在Python和Wolfram之间交换表达式。 WXF是一种二进制格式,用于以适合与外部程序共享的形式准确地序列化Wolfram语言表达式。 库函数Export可以将Python对象序列化为字符串输入形式和WXF,并且还支持一组Python内置类,例如dict,list和string:

 from wolframclient.serializers import export export({ 'list': [1,2,3], 'string': u'abc', 'etc': [0, None, -1.2] }) b'<|"list" -> {1, 2, 3}, "string" -> "abc", "etc" -> {0, None, -1.2}|>' 

WXF是带有打包数据的数字数组,可让您有效地支持NumPy数组。

例如,创建一个由255个8位正整数组成的数组:

 import numpy array=numpy.arange(255, dtype='uint8') 

将其序列化为WXF字节并计算字节数:

 wxf=export(array, target_format='wxf') len(wxf) 262 

NumPy允许您访问许多Python库。 因此,这种高效而紧凑的序列化有助于将Python系统连接到Wolfram语言,其直接结果是NumPy支持序列化PIL图像通常非常有效。 大多数像素数据模式显示为指定为NumericArrayType的数字数组类型之一。

还值得注意的是,此处最初支持pandas Series和DataFrame。 该库还提供了一种用于序列化任意类的可扩展机制

现在有什么?


使用pip命令为Python安装最新的Wolfram客户端库:

 $ pip install wolframclient 

为此,您需要Python 3.5.3(或更高版本)和Wolfram语言11.3(或更高版本)。 查看PythonWolfram客户端库文档。 所有源代码都托管在Wolfram Research GitHub上的WolframClientForPython存储库中。

如果您有改进的建议,可以并希望帮助我们做到这一点,可以通过向我们发送更新该存储库中数据的请求来做到这一点。
我们很高兴此版本终于发布,希望对您有用。 请在评论部分或Wolfram社区中告诉我们您的意见,我们将尽力与您联系。

关于翻译
我非常感谢Peter TenishevGalina Nikitina在翻译和准备出版物方面的帮助。

想学习如何用Wolfram语言编程吗?
观看每周的网络研讨会
新课程注册 。 准备在线课程
订购 Wolfram语言的解决方案

Source: https://habr.com/ru/post/zh-CN471814/


All Articles