Traduction originale dans mon blogObtenir un accès complet au Wolfram Language à partir de Python
Le langage Wolfram (
Wolfram Language ) offre aux programmeurs un
langage unique avec une grande variété d'algorithmes complexes, ainsi que des connaissances intégrées sur le monde. Au fil des ans, les gens nous ont demandé comment accéder à toutes les fonctionnalités de notre technologie à partir d'autres environnements logiciels et langages de programmation. Des années ont passé et nous avons créé de nombreuses solutions telles que
Wolfram CloudConnector pour Excel ,
WSTP (
Wolfram Symbol Transfer Protocol) pour les programmes C / C ++ et, bien sûr,
J / Link , qui permet d'accéder à Wolfram Language directement à partir de Java.
Par conséquent, nous sommes aujourd'hui heureux de vous présenter officiellement la nouvelle solution tant attendue pour combiner les langues, qui vous
permettra d'appeler directement et efficacement Wolfram Language depuis Python :
Wolfram Client Library for Python . Et surtout, cette bibliothèque cliente a un code source entièrement ouvert hébergé sur
le référentiel git WolframClientForPython sous la licence MIT, vous pouvez donc le copier autant que vous le souhaitez et l'utiliser comme vous le souhaitez.
C'est facile et simple.
La bibliothèque cliente de Wolfram facilite l'intégration d'une grande collection d'
algorithmes Wolfram Language, ainsi que
la base de connaissances Wolfram directement dans tout code Python existant, ce qui vous permet d'économiser considérablement votre temps et vos efforts lors du développement de nouveau code. Dans cet article, nous vous montrons d'abord comment configurer une connexion entre Python et Wolfram Language, examinons plusieurs méthodes et exemples qui peuvent être utilisés pour calculer dans Wolfram Language, puis appelez-le pour une utilisation à partir de Python. Pour des
informations de référence plus
complètes, consultez la
page d'accueil de la documentation de Wolfram Client Library for Python .
Appréciez sur place ...
Commençons par un exemple simple qui calcule la moyenne et l'écart type d'un million de nombres pris à partir d'une distribution normale. Cet exemple montre comment appeler une fonction Wolfram à partir de Python et comparer les résultats de Python avec le même calcul Wolfram Language pour montrer qu'ils sont hautement convergents.
Analyse des données statistiques
Tout d'abord, pour vous connecter à Wolfram Language, vous devez créer une nouvelle session avec
Wolfram Engine (moteur de langue Wolfram gratuit):
from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession()
Pour appeler les fonctions Wolfram Language, vous devez importer le moteur `wl`:
from wolframclient.language import wl
Vous pouvez maintenant exécuter n'importe quel code de langue Wolfram. Attribuez l'
exemple de variable de Python à une valeur de liste d'un million de nombres aléatoires tirés de la distribution normale, avec une moyenne de 0 et un écart-type de 1:
sample = session.evaluate(wl.RandomVariate(wl.NormalDistribution(0,1), 1e6))
Considérez les cinq premiers d'entre eux:
sample[:5] [0.44767075774581, 0.9662810005828261, -1.327910570542906, -0.2383857558557122, 1.1826399551062043]
Vous pouvez calculer la moyenne de cet
échantillon à l' aide de Wolfram Language. Comme prévu, il sera proche de zéro:
session.evaluate(wl.Mean(sample)) 0.0013371607703851515
Vous pouvez également calculer directement la même chose en Python pour vous assurer d'obtenir un résultat similaire:
from statistics import mean mean(sample) 0.0013371607703851474
De même, vous pouvez calculer l'écart type d'un
échantillon à l'aide du Wolfram Language:
session.evaluate(wl.StandardDeviation(sample)) 1.0014296230797068
Exécutez ensuite le code suivant en Python pour vous assurer d'obtenir un résultat similaire:
stdev(sample) 1.0014296230797068
Il ne peut que se réjouir que les résultats convergent. Vous savez maintenant comment appeler des fonctions Wolfram Language simples à partir de Python. Continuons avec un exemple plus intéressant.
Utilisation de la base de connaissances Wolfram
Examinons la fonction intégrée de Wolfram Language, qui n'est pas disponible en Python,
WolframAlpha :
moons = session.evaluate(wl.WolframAlpha('moons of Saturn', 'Result'))
La fonction WolframAlpha est l'une des fonctions de haut niveau du langage Wolfram qui communique avec les serveurs
Wolfram | Alpha via l'
API Web . Vous pouvez utiliser cette API directement à partir de Python, ce qui rend l'appel de la fonction WolframAlpha beaucoup plus puissant et plus pratique, car vous avez accès à toutes les fonctions de traitement des données directement à partir du langage Wolfram. Voyons ce que contient la variable
lune en Python:
moons EntityClass['PlanetaryMoon', 'SaturnMoon']
Le résultat ici est une représentation en Python d'une expression du Wolfram Language, qui peut être utilisée dans tout calcul ultérieur. Par exemple, si vous souhaitez obtenir une liste des quatre premiers satellites de Saturne (par leur degré de proximité avec Saturne) pour cela, vous devez exécuter le code suivant:
session.evaluate(wl.EntityList(moons))[:4] [Entity['PlanetaryMoon', 'S2009S1'], Entity['PlanetaryMoon', 'Pan'], Entity['PlanetaryMoon', 'Daphnis'], Entity['PlanetaryMoon', 'Atlas']]
Ou vous pouvez afficher les quatre plus grands satellites de masse de Saturne avec ce code:
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']]
Ou vous pouvez obtenir un tableau de chaînes avec les noms de ces satellites, par exemple:
session.evaluate(wl.Map(wl.Function( wl.Slot()("Name")), bigmoons)) ['Titan', 'Rhea', 'Iapetus', 'Dione']
Tout cela est très impressionnant. Regardons un autre exemple en utilisant les fonctions de traitement d'image et d'apprentissage automatique intégrées au Wolfram Language.
Traitement d'image et apprentissage automatique
Commençons d'abord par un autre mode pour effectuer des évaluations directement dans le Wolfram Language. Jusqu'à présent, vous avez utilisé le moteur `wl` pour créer des expressions Wolfram Language en Python, mais vous pouvez également exécuter des lignes de code écrites en Python contenant du code Wolfram Language, et parfois il est encore plus facilement perçu:
from wolframclient.language import wlexpr
Par exemple, calculez 1 + 1 dans la langue Wolfram, en l'envoyant sous forme de chaîne:
session.evaluate('1+1') 2
En utilisant cette méthode, vous pouvez écrire un petit code Wolfram Language qui reçoit une image à l'entrée et utilise un
algorithme de détection de visage intégré pour trouver l'emplacement d'un visage dans l'image. Ici, l'image que nous utilisons est le célèbre tableau «
Fille avec une boucle d'oreille en perle » de l'artiste néerlandais
Johannes Vermeer (il convient de noter, naturellement, que cet algorithme fonctionnera également sur presque toutes les images avec des objets dans lesquels les visages peuvent être reconnus). Étant donné que l'interface du terminal Python ne prend pas en charge la sortie d'image, nous devons utiliser le
bloc-notes Jupyter avec le package
Python Image Library (PIL) afin de pouvoir générer le résultat:
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)

En conséquence, tout s'est avéré assez facile et puissant à la fois. Mais que faire si vous n'avez pas le moteur Wolfram installé localement sur votre ordinateur et que vous souhaitez utiliser la bibliothèque cliente Wolfram pour Python? Dans ce cas, vous pouvez toujours utiliser le Wolfram Language directement en l'appelant depuis le
Wolfram Cloud (cloud).
Alors, allez dans le cloud
Wolfram Cloud permet d'accéder facilement à Wolfram Language sans préinstaller localement. Wolfram Cloud fournit une variété de services, y compris l'interface de programmation Web Wolfram Language, ainsi que la possibilité de déployer des API Web Wolfram Language personnalisées.
Dans l'exemple suivant, nous le ferons en déployant l'API Web Wolfram Language. Par exemple, l'API accepte les noms de deux pays (pays1 et pays2) à l'entrée, recherche la capitale de chaque pays, puis calcule la distance entre eux (en kilomètres):
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"]

Après avoir déployé cette API, vous pouvez démarrer une nouvelle session Wolfram Language, mais cette fois, vous vous connectez au Wolfram Cloud au lieu du moteur local:
from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession()
Pour appeler l'API, vous devez spécifier le nom d'utilisateur (utilisateur1) et le point de terminaison de l'API (api / public / capital_distance). En utilisant ces données, vous pouvez vous connecter au cloud ...
api = ('user1', 'api/public/capital_distance') result = cloud.call(api, {'country1': 'Netherlands', 'country2': 'Spain'})
... puis obtenez le résultat souhaité:
result.get() 1481.4538329484521
Évaluez à nouveau à quel point c'est facile et simple.
Si vous souhaitez enregistrer l'API Wolfram Language déployée afin que vous seul puissiez l'utiliser, vous pouvez déployer l'API à l'aide de la commande
Autorisations → «Privé» . Pour ce faire, dans l'API privée, vous pouvez générer (en Wolfram Language) une clé de sécurité d'authentification:

key = GenerateSecuredAuthenticationKey["myapp"]
Copiez les réponses de ces deux lignes de saisie:
key["ConsumerKey"] key["ConsumerSecret"]
Collez-les ensuite dans votre session Python:
SecuredAuthenticationKey('<<paste-consumer-key-here>>', '<<paste-consumer-secret-here>>')
Et puis démarrez une nouvelle session cloud avec authentification:
cloud = WolframCloudSession(credentials=sak) cloud.start() cloud.authorized() True
Maintenant, vous (et vous seul) pouvez utiliser n'importe quelle API Wolfram Language que vous avez déployée pour un usage privé.
Parlons un peu des concepts de base de la sérialisation
Afin de tout faire rapidement et efficacement, la bibliothèque cliente Wolfram pour Python utilise le
format WXF ouvert pour échanger des expressions entre Python et Wolfram. WXF est un format binaire pour sérialiser avec précision les expressions Wolfram Language sous une forme adaptée au partage avec des programmes externes. La fonction de bibliothèque
Export peut sérialiser des objets Python dans un formulaire d'entrée de chaîne et WXF, et prend également en charge un ensemble de classes intégrées Python telles que dict, list et strings:
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 est un tableau numérique avec des données compressées, qui vous permet de prendre en charge efficacement les tableaux
NumPy .
Par exemple, créez un tableau de 255 entiers positifs 8 bits:
import numpy array=numpy.arange(255, dtype='uint8')
Sérialisez-le en octets WXF et calculez le nombre d'octets:
wxf=export(array, target_format='wxf') len(wxf) 262
NumPy vous permet d'accéder à de nombreuses bibliothèques Python. Par conséquent, cette sérialisation efficace et compacte permet de connecter le système Python au Wolfram Language, dont la conséquence directe est la prise en charge dans NumPy que la sérialisation des images PIL est généralement très efficace. La plupart des modes de données de pixels sont affichés comme l'un des types de tableaux numériques spécifiés comme
NumericArrayType .
Il convient également de noter que les
pandas Series et DataFrame sont pris en charge ici initialement. La bibliothèque fournit également un
mécanisme extensible pour sérialiser des classes arbitraires.
Qu'est-ce qui est disponible maintenant?
Installez la dernière bibliothèque client Wolfram pour Python à l'aide de la commande
pip :
$ pip install wolframclient
Pour ce faire, vous avez besoin de Python 3.5.3 (ou d'une version plus récente) et de Wolfram Language 11.3 (ou d'une version plus récente). Consultez la documentation de la
bibliothèque cliente Wolfram pour Python . Tout le code source est hébergé sur le référentiel
WolframClientForPython sur Wolfram Research
GitHub .
Si vous avez des suggestions pour l'améliorer et que vous pouvez et souhaitez nous aider à le faire, vous pouvez le faire en nous envoyant une demande de mise à jour des données dans ce référentiel.
Nous sommes très heureux que cette version ait finalement eu lieu et nous espérons qu'elle vous sera utile. Veuillez nous donner votre avis dans la section commentaires ou dans
la communauté Wolfram , et nous ferons de notre mieux pour vous contacter personnellement.
À propos de la traductionJ'exprime ma profonde gratitude à
Peter Tenishev et
Galina Nikitina pour leur aide dans la traduction et la préparation de la publication.
Vous voulez apprendre à programmer en Wolfram Language?
Regardez des webinaires hebdomadaires.
Inscription aux nouveaux cours . Cours en ligne prêt.
Solution de commande chez Wolfram Language.