用于 Python 的 Wolfram 客户端库(图像处理|机器学习|API|云)

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

Wolfram语言为程序员提供了一种独特的计算语言,具有大量复杂的算法和内置的现实世界知识。多年来,人们一直问我们如何从其他软件环境和编程语言中获得我们技术的所有力量。多年来,我们已经建立了许多这样的连接, 比如 Wolfram CloudConnector for Excel, WSTP (Wolfram Symbolic Transfer Protocol) for C/C++ programs ,当然还有J/Link,直接从Java提供了对Wolfram语言访问。

所以今天我们很高兴地正式宣布一个新的和经常请求的连接,它允许您从 Python 直接有效地调用 Wolfram 语言:Python 的Wolfram 客户端库。而且,更好的是,这个客户端库是完全开源的,作为MIT 许可下的WolframClientForPython git 存储库,因此您可以克隆它并以任何您认为合适的方式使用它。

用于Python的Wolfram客户端是完全开源的

这很简单

Wolfram 客户端库可以轻松地将大量 Wolfram 语言算法以及Wolfram 知识库直接集成到您已有的任何 Python 代码中。这可以在开发新代码时为您节省大量时间和精力。在这篇文章中,我们将首先向您展示如何建立从 Python 到 Wolfram 语言的连接。接下来,我们将探索一些可用于在 Wolfram 语言中进行计算的方法和示例,然后调用它以在 Python 会话中使用。如需完整的介绍教程和完整的参考文档,请访问Wolfram Client Library for Python的文档主页。

本地评估

让我们从一个简单的例子开始,它计算从正态分布中抽取的一百万个数字的均值和标准差。此示例说明如何从 Python 调用 Wolfram 语言函数,并比较 Python 和 Wolfram 语言的结果以表明它们在数值上彼此接近。

统计数据分析

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

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

现在您可以计算任何Wolfram语言代码。将Python变量sample设置为一个由正态分布中抽取的100万个随机数组成的列表,均值为0,标准差为1:

您可以看看前五个:

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

您也可以直接在 Python 中计算它,以验证您是否得到数值相似的结果:

类似地,您可以用Wolfram语言计算样本的标准偏差:

再次在Python中运行以下代码,以验证是否得到类似的结果:

很高兴看到这些结果具有可比性。现在您知道如何从 Python 调用一些简单的 Wolfram 语言函数。让我们继续一个更令人兴奋的例子。

使用Wolfram知识库

让我们来看看 Python 中不容易获得的内置 Wolfram 语言函数WolframAlpha:

WolframAlpha函数是Wolfram语言中的高级函数之一,它通过web API与Wolfram|Alpha服务器交互。您可以直接从 Python 使用这个 API,但是通过调用WolframAlpha函数来实现它更加强大和方便,因为您可以直接从 Wolfram 语言访问所有数据框架函数。我们来看看Python变量moons包含什么:

此处的输出是 Wolfram 语言表达式的 Python 表示,可以在任何后续计算中重用。例如,如果您想明确获取土星的前四个卫星(按接近度)的列表,您可以这样做:

或者,您可以使用以下一小段代码轻松获得土星的四个最大卫星质量:

您可以得到一个简单的字符串数组,其中包含这些卫星的名称,如下所示:

这一切都非常酷。让我们看另一个例子,使用 Wolfram 语言的内置图像处理和机器学习功能。

图像处理和机器学习

首先,让我们切换到另一种模式,直接在 Wolfram 语言中进行计算。到目前为止,您已经使用`wl`工厂在 Python 中构建 Wolfram 语言表达式。但是您也可以计算包含 Wolfram 语言代码的 Python 字符串,有时这更容易阅读:

例如,您可以在 Wolfram 语言中通过将其作为字符串发送来计算 1+1:

使用这种方法,您可以编写一小段 Wolfram 语言代码,获取图像并使用内置的人脸检测算法来查找图像中人脸的位置。在这里,我们使用的图像是荷兰画家约翰内斯·维米尔(Johannes Vermeer ) 的著名画作《戴珍珠耳环的女孩》(但它几乎适用于任何具有可识别面孔的图像)。由于 Python 终端界面不支持图像显示,我们需要使用 Jupyter notebook 和 Python Image Library (PIL) 包来帮助显示结果:

相当简单和强大。但是如果您没有本地安装的 Wolfram 引擎,并且想使用 Python 的 Wolfram 客户端库怎么办?您仍然可以直接在Wolfram Cloud (https://www.wolfram.com/cloud/) 中使用 Wolfram 语言。

到云端

Wolfram Cloud 提供对 Wolfram 语言的轻松访问,无需在本地安装。Wolfram Cloud 提供各种服务,包括用于 Wolfram 语言编程的笔记本网络界面以及部署任意 Wolfram 语言网络 API 的能力。

这里您将使用后者,部署一个Wolfram语言web API。 这个特定的API接受两个国家的名称(国家1和国家2),查找每个国家的首都,然后计算它们之间的距离(以公里为单位):

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

要调用 API,您必须提供用户名 ( user1 ) 和 API 端点 ( api/public/capital_distance )。有了这些信息,您就可以调用云……

...并得到结果:

再一次,简单而有用。

如果您想将部署的 Wolfram 语言 API 保密,以便只有您可以使用它,您可以使用权限部署 API →“私人”。然后,为了向私有 API 验证您自己,您可以生成(在 Wolfram 语言中)一个安全的验证密钥:

从这两个输入复制输出:

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

最后,开始一个新的经过身份验证的云会话:

就是这样。此时,您(并且只有您)可以使用您私下部署的任何 Wolfram 语言 API。

关于底层序列化的一点

为了使一切变得非常快速和高效,用于 Python 的 Wolfram 客户端库使用开放的 WXF 格式在 Python 和 Wolfram 语言之间交换表达式。WXF 是一种二进制格式,用于忠实地序列化 Wolfram 语言表达式,其形式适合与外部程序互换. 库函数export可以将 Python 对象序列化为字符串输入形式和 WXF,并且原生支持dict、list和strings等一组 Python 内置类:

WXF 表示带有打包数据的数值数组,从而有效支持NumPy数组。

创建一个包含 255 个无符号 8 位整数的新数组:

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

NumPy 数组支持许多 Python 库。因此,高效且紧凑的序列化有助于将 Python 生态系统与 Wolfram 语言连接起来。支持 NumPy 的一个直接结果是 PIL 图像的序列化通常非常有效;大多数像素数据模式映射到数值数组类型之一,由NumericArrayType指定。还值得一提的是,pandas Series 和 DataFrame 是原生支持的。该库还提供了用于序列化任意类的可扩展机制。

现在可以获取

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

它需要 Python 3.5.3(或更高版本)和 Wolfram 语言 11.3(或更高版本)。查看关于 Python的Wolfram 客户端库的完整文档(https://reference.wolfram.com/language/WolframClientForPython/)。整个源代码托管在 Wolfram Research GitHub 站点上的 WolframClientForPython 存储库中 (https://github.com/wolframresearch)。如果您有改进它的方法,您可以通过向此存储库提交 PR 请求来帮助我们改进它。