Traducción original en mi blogObtener acceso completo al lenguaje Wolfram desde Python
El lenguaje Wolfram (
Wolfram Language ) brinda a los programadores un
lenguaje único con una gran variedad de algoritmos complejos, así como un conocimiento incorporado sobre el mundo. A lo largo de los años, las personas nos han estado preguntando cómo acceder a todas las funciones de nuestra tecnología desde otros entornos de software y lenguajes de programación. Pasaron los años y creamos muchas soluciones como
Wolfram CloudConnector para Excel ,
WSTP (protocolo de transferencia de símbolos Wolfram) para programas C / C ++ y, por supuesto,
J / Link , que proporciona acceso a Wolfram Language directamente desde Java.
Por lo tanto, hoy nos complace presentarle oficialmente la nueva solución tan esperada para combinar idiomas, que
le permitirá llamar de forma directa y eficiente a Wolfram Language desde Python :
Wolfram Client Library para Python . Y lo más importante, esta biblioteca cliente tiene un código fuente completamente abierto alojado en
el repositorio git WolframClientForPython bajo la licencia MIT, para que pueda copiarlo tanto como desee y usarlo como desee.
Es facil y sencillo.
La biblioteca de cliente de Wolfram facilita la integración de una gran colección de
algoritmos de Wolfram Language, así como
la base de conocimiento de Wolfram directamente en cualquier código Python existente, lo que ahorra mucho tiempo y esfuerzo al desarrollar un nuevo código. En este artículo, primero le mostramos cómo configurar una conexión entre Python y Wolfram Language, observamos varios métodos y ejemplos que se pueden usar para calcular en Wolfram Language, y luego lo llamamos para usarlo desde Python. Para obtener
información de referencia más
completa, vaya a:
Wolfram Client Library para la página de inicio de documentación de Python .
Apreciar en el acto ...
Comencemos con un ejemplo simple que calcula la desviación promedio y estándar de un millón de números tomados de una distribución normal. Este ejemplo muestra cómo llamar a una función Wolfram desde Python y comparar los resultados de Python con el mismo cálculo de Wolfram Language para mostrar que son altamente convergentes.
Análisis estadístico de datos
En primer lugar, para conectarse al Wolfram Language, debe crear una nueva sesión con
Wolfram Engine (
motor de Wolfram gratuito):
from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession()
Para llamar a las funciones de Wolfram Language necesita importar el motor `wl`:
from wolframclient.language import wl
Ahora puede ejecutar cualquier código de idioma Wolfram. Asigne la variable de
muestra de Python a un valor de lista de un millón de números aleatorios tomados de la distribución normal, con una media de 0 y una desviación estándar de 1:
sample = session.evaluate(wl.RandomVariate(wl.NormalDistribution(0,1), 1e6))
Considere los primeros cinco de ellos:
sample[:5] [0.44767075774581, 0.9662810005828261, -1.327910570542906, -0.2383857558557122, 1.1826399551062043]
Puede calcular el promedio de esta
muestra usando Wolfram Language. Como se esperaba, será cercano a cero:
session.evaluate(wl.Mean(sample)) 0.0013371607703851515
También puede calcular directamente lo mismo en Python para asegurarse de obtener un resultado similar:
from statistics import mean mean(sample) 0.0013371607703851474
Del mismo modo, puede calcular la desviación estándar de una
muestra utilizando Wolfram Language:
session.evaluate(wl.StandardDeviation(sample)) 1.0014296230797068
Luego ejecute el siguiente código en Python para asegurarse de obtener un resultado similar:
stdev(sample) 1.0014296230797068
No puede sino alegrarse de que los resultados converjan. Ahora ya sabe cómo llamar a funciones simples de Wolfram Language desde Python. Continuemos con un ejemplo más interesante.
Usando la base de conocimiento Wolfram
Veamos la función incorporada Wolfram Language, que no está disponible en Python,
WolframAlpha :
moons = session.evaluate(wl.WolframAlpha('moons of Saturn', 'Result'))
La función WolframAlpha es una de las funciones de alto nivel en Wolfram Language que se comunica con los servidores
Wolfram | Alpha a través de la
API web . Puede usar esta API directamente desde Python, lo que hace que llamar a la función WolframAlpha sea mucho más potente y conveniente, ya que obtiene acceso a todas las funciones de procesamiento de datos directamente desde Wolfram Language. Veamos qué contiene la variable de la
luna en Python:
moons EntityClass['PlanetaryMoon', 'SaturnMoon']
El resultado aquí es una representación en Python de una expresión del lenguaje Wolfram, que se puede usar en cualquier cálculo posterior. Por ejemplo, si desea obtener una lista de los primeros cuatro satélites de Saturno (por su grado de proximidad a Saturno) para esto, debe ejecutar el siguiente código:
session.evaluate(wl.EntityList(moons))[:4] [Entity['PlanetaryMoon', 'S2009S1'], Entity['PlanetaryMoon', 'Pan'], Entity['PlanetaryMoon', 'Daphnis'], Entity['PlanetaryMoon', 'Atlas']]
O puede mostrar los cuatro satélites masivos más grandes de Saturno con este código:
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']]
O puede obtener una serie de cadenas con los nombres de estos satélites, por ejemplo:
session.evaluate(wl.Map(wl.Function( wl.Slot()("Name")), bigmoons)) ['Titan', 'Rhea', 'Iapetus', 'Dione']
Todo esto es muy impresionante. Veamos otro ejemplo utilizando las funciones de procesamiento de imágenes y aprendizaje automático integradas en Wolfram Language.
Procesamiento de imágenes y aprendizaje automático
Primero, cambiemos a otro modo para realizar evaluaciones directamente en Wolfram Language. Hasta ahora, ha utilizado el motor `wl` para crear expresiones Wolfram Language en Python, pero también puede ejecutar líneas de código escritas en Python que contienen código Wolfram Language, y a veces se percibe aún más fácilmente:
from wolframclient.language import wlexpr
Por ejemplo, calcule 1 + 1 en Wolfram Language, enviándolo como una cadena:
session.evaluate('1+1') 2
Con este método, puede escribir un pequeño código de Wolfram Language que recibe una imagen en la entrada y utiliza un
algoritmo de detección de rostros incorporado para encontrar la ubicación de una cara en la imagen. Aquí, la imagen que usamos es la famosa pintura "
Girl with a Pearl Earring " del artista holandés
Johannes Vermeer (debe tenerse en cuenta, naturalmente, este algoritmo funcionará también en casi cualquier imagen con objetos en los que se puedan reconocer caras). Dado que la interfaz del terminal Python no admite la salida de imágenes, necesitamos usar el
Jupyter Notebook junto con el paquete de la
Biblioteca de imágenes de Python (PIL) para poder generar el resultado:
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)

Como resultado, todo resultó bastante fácil y poderoso al mismo tiempo. Pero, ¿qué hacer si no tiene Wolfram Engine instalado localmente en su computadora y desea utilizar la biblioteca de cliente Wolfram para Python? En este caso, siempre puede usar Wolfram Language directamente llamándolo desde
Wolfram Cloud (nube).
Entonces, ve a la nube
Wolfram Cloud proporciona acceso fácil al Wolfram Language sin preinstalar localmente. Wolfram Cloud ofrece una variedad de servicios, incluida la interfaz de programación web Wolfram Language, así como la capacidad de implementar API web personalizadas de Wolfram Language.
En el siguiente ejemplo, haremos esto implementando la API web Wolfram Language. Por ejemplo, la API acepta los nombres de dos países (país1 y país2) en la entrada, encuentra la capital para cada país y luego calcula la distancia entre ellos (en kilómetros):
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"]

Después de implementar esta API, puede iniciar una nueva sesión de Wolfram Language, pero esta vez se está conectando a Wolfram Cloud en lugar del motor local:
from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession()
Para llamar a la API, debe especificar el nombre de usuario (usuario1) y el punto final de la API (api / public / capital_distance). Con estos datos puede conectarse a la nube ...
api = ('user1', 'api/public/capital_distance') result = cloud.call(api, {'country1': 'Netherlands', 'country2': 'Spain'})
... y luego obtener el resultado deseado:
result.get() 1481.4538329484521
Evalúa una vez más lo fácil y simple que es.
Si desea guardar la API Wolfram Language implementada para que solo usted pueda usarla, puede implementar la API utilizando el comando
Permisos → "Privado" . Para hacer esto, en la API privada, puede generar (en Wolfram Language) una clave de seguridad de autenticación:

key = GenerateSecuredAuthenticationKey["myapp"]
Copie las respuestas de estas dos líneas de entrada:
key["ConsumerKey"] key["ConsumerSecret"]
Luego péguelos en su sesión de Python:
SecuredAuthenticationKey('<<paste-consumer-key-here>>', '<<paste-consumer-secret-here>>')
Y luego comience una nueva sesión en la nube con autenticación:
cloud = WolframCloudSession(credentials=sak) cloud.start() cloud.authorized() True
Ahora usted (y solo usted) puede usar cualquier API de Wolfram Language que haya implementado para uso privado.
Hablemos un poco sobre los conceptos básicos de serialización.
Para hacer todo de manera rápida y eficiente, la biblioteca del cliente Wolfram para Python usa el
formato abierto WXF para intercambiar expresiones entre Python y Wolfram. WXF es un formato binario para serializar con precisión las expresiones de Wolfram Language en una forma adecuada para compartir con programas externos. La función de biblioteca
Exportar puede serializar objetos de Python en un formulario de entrada de cadena y WXF, y también admite un conjunto de clases incorporadas de Python como dict, list y 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 es una matriz numérica con datos empaquetados, que le permite admitir eficazmente las matrices
NumPy .
Por ejemplo, cree una matriz de 255 enteros positivos de 8 bits:
import numpy array=numpy.arange(255, dtype='uint8')
Serialízalo a bytes WXF y calcula el número de bytes:
wxf=export(array, target_format='wxf') len(wxf) 262
NumPy le permite acceder a muchas bibliotecas de Python. En consecuencia, esta serialización eficiente y compacta ayuda a conectar el sistema Python al Wolfram Language, una consecuencia directa de la cual es compatible con NumPy que la serialización de imágenes PIL en general es muy eficiente. La mayoría de los modos de datos de píxeles se muestran como uno de los tipos de matrices numéricas especificadas como
NumericArrayType .
También vale la pena señalar que
pandas Series y DataFrame son compatibles aquí inicialmente. La biblioteca también proporciona un
mecanismo extensible para serializar clases arbitrarias.
¿Qué hay disponible ahora?
Instale la última biblioteca de cliente Wolfram para Python usando el comando
pip :
$ pip install wolframclient
Para hacer esto, necesita Python 3.5.3 (o una versión más reciente) y Wolfram Language 11.3 (o una versión más nueva). Consulte la documentación de la
biblioteca del cliente Wolfram para Python . Todo el código fuente está alojado en el repositorio
WolframClientForPython en Wolfram Research
GitHub .
Si tiene sugerencias para mejorarlo y puede y desea ayudarnos a hacerlo, puede hacerlo enviándonos una solicitud para actualizar los datos en este repositorio.
Estamos muy contentos de que este lanzamiento finalmente haya tenido lugar y esperamos que te sea útil. Díganos su opinión en la sección de comentarios o en
la comunidad Wolfram , y haremos nuestro mejor esfuerzo para contactarlo personalmente.
Sobre la traducciónExpreso mi profunda gratitud a
Peter Tenishev y
Galina Nikitina por su ayuda en la traducción y preparación de la publicación.
¿Quieres aprender a programar en Wolfram Language?
Mira seminarios web semanales.
Inscripción para nuevos cursos . Curso en línea listo.
Solicite una solución en Wolfram Language.