WolframClientForPython | Neue Wolfram Language Client Library für Python


Originalübersetzung in meinem Blog

Voller 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:

Bild
 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.

Über die Übersetzung
Ich bedanke mich bei Peter Tenishev und Galina Nikitina für ihre Hilfe bei der Übersetzung und Vorbereitung der Veröffentlichung.

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.

Source: https://habr.com/ru/post/de471814/


All Articles