Originalübersetzung in meinem BlogVoller Zugriff auf die Wolfram-Sprache von Python aus
Die Wolfram-Sprache (
Wolfram Language ) bietet Programmierern eine
einzigartige Sprache mit einer Vielzahl komplexer Algorithmen sowie integriertem Wissen über die Welt. Im Laufe der Jahre haben uns die Leute gefragt, wie wir von anderen Softwareumgebungen und Programmiersprachen aus auf alle Funktionen unserer Technologie zugreifen können. Jahre vergingen und wir entwickelten viele Lösungen wie
Wolfram CloudConnector für Excel ,
WSTP (
Wolfram Symbol Transfer Protocol) für C / C ++ - Programme und natürlich
J / Link , das den direkten Zugriff auf Wolfram Language von Java aus ermöglicht.
Daher freuen wir uns, Ihnen heute offiziell die lang erwartete neue Lösung zum Kombinieren von Sprachen vorstellen zu können, mit der Sie
Wolfram Language direkt und effizient aus der Python-Sprache aufrufen können :
Wolfram Client Library for Python . Und am wichtigsten ist, dass diese
Clientbibliothek vollständig Open Source-Code enthält, der
im WolframClientForPython-Git-Repository unter der MIT-Lizenz gehostet wird, sodass Sie ihn beliebig kopieren und verwenden können, wie Sie
möchten .
Es ist leicht und einfach.
Die Wolfram-Clientbibliothek erleichtert die direkte Integration einer großen Sammlung von Wolfram-Sprachalgorithmen sowie
der Wolfram-Wissensdatenbank in vorhandenen Python-Code. Dies spart erheblich Zeit und Mühe bei der Entwicklung neuen Codes. In diesem Artikel zeigen wir Ihnen zunächst, wie Sie eine Verbindung zwischen Python und der Wolfram-Sprache herstellen, verschiedene Methoden und Beispiele betrachten, die zum Berechnen in der Wolfram-Sprache verwendet werden können, und sie dann zur Verwendung in Python aufrufen.
Ausführlichere Referenzinformationen finden Sie unter:
Wolfram Client Library für Python-Dokumentationshomepage .
Vor Ort schätzen ...
Beginnen wir mit einem einfachen Beispiel, das den Durchschnitt und die Standardabweichung von einer Million Zahlen aus einer Normalverteilung berechnet. Dieses Beispiel zeigt, wie Sie eine Wolfram-Funktion aus Python aufrufen und die Ergebnisse aus Python mit derselben Wolfram-Sprachberechnung vergleichen, um zu zeigen, dass sie sehr konvergent sind.
Statistische Datenanalyse
Um eine Verbindung zur Wolfram-Sprache herzustellen, müssen Sie zunächst eine neue Sitzung mit der
Wolfram-Engine (kostenlose Wolfram-Sprach-Engine) erstellen:
from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession()
Um Wolfram Language-Funktionen aufzurufen, müssen Sie die `wl`-Engine importieren:
from wolframclient.language import wl
Jetzt können Sie einen beliebigen Wolfram-Sprachcode ausführen. Ordnen Sie die
Beispielvariable aus Python einem Listenwert von einer Million Zufallszahlen aus der Normalverteilung mit einem Mittelwert von 0 und einer Standardabweichung von 1 zu:
sample = session.evaluate(wl.RandomVariate(wl.NormalDistribution(0,1), 1e6))
Betrachten Sie die ersten fünf von ihnen:
sample[:5] [0.44767075774581, 0.9662810005828261, -1.327910570542906, -0.2383857558557122, 1.1826399551062043]
Sie können den Durchschnitt dieser
Stichprobe mit Wolfram Language berechnen. Wie erwartet wird es nahe Null sein:
session.evaluate(wl.Mean(sample)) 0.0013371607703851515
Sie können dasselbe auch direkt in Python berechnen, um sicherzustellen, dass Sie ein ähnliches Ergebnis erhalten:
from statistics import mean mean(sample) 0.0013371607703851474
Ebenso können Sie die Standardabweichung einer
Stichprobe mit der Wolfram-Sprache berechnen:
session.evaluate(wl.StandardDeviation(sample)) 1.0014296230797068
Führen Sie dann den folgenden Code in Python aus, um sicherzustellen, dass Sie ein ähnliches Ergebnis erhalten:
stdev(sample) 1.0014296230797068
Es kann nur freuen, dass die Ergebnisse konvergieren. Jetzt wissen Sie, wie Sie einfache Wolfram Language-Funktionen von Python aus aufrufen. Fahren wir mit einem interessanteren Beispiel fort.
Verwenden der Wolfram Knowledge Base
Schauen wir uns die in Wolfram Language integrierte Funktion an, die in Python,
WolframAlpha , nicht verfügbar ist:
moons = session.evaluate(wl.WolframAlpha('moons of Saturn', 'Result'))
Die WolframAlpha-Funktion ist eine der übergeordneten Funktionen in der Wolfram-Sprache, die über die
Web-API mit
Wolfram | Alpha- Servern kommuniziert. Sie können diese API direkt in Python verwenden, wodurch das Aufrufen der WolframAlpha-Funktion viel leistungsfähiger und bequemer wird, da Sie direkt aus der Wolfram-Sprache auf alle Datenverarbeitungsfunktionen zugreifen können. Schauen wir uns an, was die
Mondvariable in Python enthält:
moons EntityClass['PlanetaryMoon', 'SaturnMoon']
Die Ausgabe hier ist eine Darstellung eines Ausdrucks aus der Wolfram-Sprache in Python, der für jede nachfolgende Berechnung verwendet werden kann. Wenn Sie beispielsweise eine Liste der ersten vier Saturn-Satelliten (nach ihrer Nähe zum Saturn) erhalten möchten, müssen Sie den folgenden Code ausführen:
session.evaluate(wl.EntityList(moons))[:4] [Entity['PlanetaryMoon', 'S2009S1'], Entity['PlanetaryMoon', 'Pan'], Entity['PlanetaryMoon', 'Daphnis'], Entity['PlanetaryMoon', 'Atlas']]
Oder Sie können die vier größten Massensatelliten des Saturn mit diesem Code anzeigen:
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']]
Oder Sie können eine Reihe von Zeichenfolgen mit den Namen dieser Satelliten abrufen, zum Beispiel:
session.evaluate(wl.Map(wl.Function( wl.Slot()("Name")), bigmoons)) ['Titan', 'Rhea', 'Iapetus', 'Dione']
Das alles ist sehr beeindruckend. Schauen wir uns ein weiteres Beispiel an, das die in der Wolfram-Sprache integrierten Bildverarbeitungs- und maschinellen Lernfunktionen verwendet.
Bildverarbeitung und maschinelles Lernen
Wechseln wir zunächst in einen anderen Modus, um Auswertungen direkt in der Wolfram-Sprache durchzuführen. Bisher haben Sie die `wl`-Engine verwendet, um Wolfram Language-Ausdrücke in Python zu erstellen. Sie können jedoch auch in Python geschriebene Codezeilen ausführen, die Wolfram Language-Code enthalten. Manchmal wird dies sogar noch leichter wahrgenommen:
from wolframclient.language import wlexpr
Berechnen Sie beispielsweise 1 + 1 in der Wolfram-Sprache und senden Sie sie als Zeichenfolge:
session.evaluate('1+1') 2
Mit dieser Methode können Sie einen kleinen Code in Wolfram Language schreiben, der das Bild an der Eingabe empfängt und mithilfe des integrierten
Gesichtserkennungsalgorithmus die Position des Gesichts im Bild ermittelt. Das Bild, das wir verwenden, ist das berühmte Gemälde „
Mädchen mit einem Perlenohrring “ des niederländischen Künstlers
Johannes Vermeer (es sollte natürlich beachtet werden, dass dieser Algorithmus auch bei fast jedem Bild mit Objekten funktioniert, bei denen Gesichter erkannt werden können). Da die Python-Terminalschnittstelle keine Bildausgabe unterstützt, müssen wir das
Jupyter Notebook zusammen mit dem PIL-Paket (
Python Image Library ) verwenden, um das Ergebnis ausgeben zu können:
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)

Infolgedessen stellte sich heraus, dass alles gleichzeitig ziemlich einfach und leistungsstark war. Was tun, wenn Sie die Wolfram Engine nicht lokal auf Ihrem Computer installiert haben und die Wolfram-Clientbibliothek für Python verwenden möchten? In diesem Fall können Sie die Wolfram-Sprache jederzeit direkt verwenden, indem Sie sie aus der
Wolfram Cloud (Cloud) aufrufen.
Also geh in die Cloud
Wolfram Cloud bietet einfachen Zugriff auf die Wolfram-Sprache ohne lokale Vorinstallation. Wolfram Cloud bietet eine Vielzahl von Diensten, einschließlich der Wolfram Language-Webprogrammierschnittstelle sowie die Möglichkeit, benutzerdefinierte Wolfram Language-Web-APIs bereitzustellen.
Im folgenden Beispiel werden wir dazu die Wolfram Language-Web-API bereitstellen. Beispielsweise akzeptiert die API die Namen von zwei Ländern (Land1 und Land2) bei der Eingabe, ermittelt die Hauptstadt für jedes Land und berechnet dann die Entfernung zwischen ihnen (in Kilometern):
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"]

Nach der Bereitstellung dieser API können Sie eine neue Wolfram Language-Sitzung starten. Diesmal stellen Sie jedoch anstelle der lokalen Engine eine Verbindung zur Wolfram Cloud her:
from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession()
Um die API aufzurufen, müssen Sie den Benutzernamen (Benutzer1) und den API-Endpunkt (api / public / capital_distance) angeben. Mit diesen Daten können Sie eine Verbindung zur Cloud herstellen ...
api = ('user1', 'api/public/capital_distance') result = cloud.call(api, {'country1': 'Netherlands', 'country2': 'Spain'})
... und dann das gewünschte Ergebnis erhalten:
result.get() 1481.4538329484521
Bewerten Sie noch einmal, wie einfach und unkompliziert es ist.
Wenn Sie die bereitgestellte Wolfram-Sprach-API speichern möchten, damit nur Sie sie verwenden können, können Sie die API mit dem Befehl
Berechtigungen → "Privat" bereitstellen. Zu diesem Zweck können Sie in der privaten API (in Wolfram-Sprache) einen Authentifizierungssicherheitsschlüssel generieren:

key = GenerateSecuredAuthenticationKey["myapp"]
Kopieren Sie die Antworten aus diesen beiden Eingabezeilen:
key["ConsumerKey"] key["ConsumerSecret"]
Fügen Sie sie dann in Ihre Python-Sitzung ein:
SecuredAuthenticationKey('<<paste-consumer-key-here>>', '<<paste-consumer-secret-here>>')
Starten Sie dann eine neue Cloud-Sitzung mit Authentifizierung:
cloud = WolframCloudSession(credentials=sak) cloud.start() cloud.authorized() True
Jetzt können Sie (und nur Sie) jede Wolfram-Sprach-API verwenden, die Sie für den privaten Gebrauch bereitgestellt haben.
Lassen Sie uns ein wenig über die Grundkonzepte der Serialisierung sprechen
Um alles schnell und effizient zu erledigen, verwendet die Wolfram-Clientbibliothek für Python das
offene WXF-Format für den Austausch von Ausdrücken zwischen Python und Wolfram. WXF ist ein Binärformat zum genauen Serialisieren von Wolfram Language-Ausdrücken in einer Form, die für die gemeinsame Nutzung mit externen Programmen geeignet ist. Die Bibliotheksfunktion
Export kann Python-Objekte in ein Zeichenfolgen-Eingabeformular und WXF serialisieren und unterstützt auch eine Reihe von in Python integrierten Klassen wie dict, list und Zeichenfolgen:
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 ist ein numerisches Array mit gepackten Daten, mit dem Sie
NumPy- Arrays effektiv unterstützen können.
Erstellen Sie beispielsweise ein Array mit 255 positiven 8-Bit-Ganzzahlen:
import numpy array=numpy.arange(255, dtype='uint8')
Serialisieren Sie es in WXF-Bytes und berechnen Sie die Anzahl der Bytes:
wxf=export(array, target_format='wxf') len(wxf) 262
Mit NumPy können Sie auf viele Python-Bibliotheken zugreifen. Folglich hilft diese effiziente und kompakte Serialisierung dabei, das Python-System mit der Wolfram-Sprache zu verbinden. Eine direkte Folge davon ist die Unterstützung in NumPy, dass die Serialisierung von PIL-Bildern im Allgemeinen sehr effizient ist. Die meisten Pixeldatenmodi werden als einer der als
NumericArrayType angegebenen Typen von numerischen Arrays
angezeigt .
Es ist auch erwähnenswert, dass
Pandas Series und DataFrame hier zunächst unterstützt werden. Die Bibliothek bietet auch einen
erweiterbaren Mechanismus zum Serialisieren beliebiger Klassen.
Was ist jetzt verfügbar?
Installieren Sie die neueste Wolfram-Clientbibliothek für Python mit dem Befehl
pip :
$ pip install wolframclient
Dazu benötigen Sie Python 3.5.3 (oder eine neuere Version) und Wolfram Language 11.3 (oder eine neuere Version). Lesen Sie die Dokumentation
zur Wolfram-Clientbibliothek für Python . Der gesamte Quellcode wird im
WolframClientForPython- Repository auf Wolfram Research
GitHub gehostet .
Wenn Sie Verbesserungsvorschläge haben und uns dabei helfen können und möchten, können Sie dies tun, indem Sie uns eine Anfrage zur Aktualisierung der Daten in diesem Repository senden.
Wir freuen uns sehr, dass diese Veröffentlichung endlich stattgefunden hat und hoffen, dass sie für Sie nützlich sein wird. Bitte teilen Sie uns Ihre Meinung im Kommentarbereich oder in
der Wolfram-Community mit. Wir werden unser Bestes tun, um Sie persönlich zu kontaktieren.
Möchten Sie lernen, wie man in Wolfram-Sprache programmiert?
Sehen Sie sich wöchentliche Webinare an .
Anmeldung für neue Kurse . Bereit Online-Kurs .
Bestelllösung bei Wolfram Language.