WolframClientForPython | Perpustakaan Klien Bahasa Wolfram Baru untuk Python


Terjemahan asli di blog saya

Mendapatkan akses penuh ke Bahasa Wolfram dari Python


Bahasa Wolfram ( Bahasa Wolfram ) memberi programmer bahasa yang unik dengan berbagai macam algoritma kompleks, serta pengetahuan bawaan tentang dunia. Selama bertahun-tahun, orang telah bertanya kepada kami bagaimana mengakses semua fitur teknologi kami dari lingkungan perangkat lunak lain dan bahasa pemrograman. Tahun berlalu dan kami menciptakan banyak solusi seperti Wolfram CloudConnector untuk Excel , WSTP ( Wolfram Symbol Transfer Protocol) untuk program C / C ++ dan, tentu saja, J / Link , yang menyediakan akses ke Bahasa Wolfram langsung dari Jawa.

Karenanya, hari ini kami dengan senang hati menghadirkan solusi baru yang telah lama ditunggu-tunggu untuk menggabungkan bahasa, yang akan memungkinkan Anda untuk secara langsung dan efisien memanggil Bahasa Wolfram dari bahasa Python : Wolfram Client Library for Python . Dan yang paling penting, pustaka klien ini memiliki kode sumber terbuka sepenuhnya yang dihosting di repositori git WolframClientForPython di bawah lisensi MIT, sehingga Anda dapat menyalinnya sebanyak yang Anda suka dan menggunakannya sesuka Anda.

Mudah dan sederhana.


Pustaka klien Wolfram memudahkan untuk mengintegrasikan banyak koleksi algoritma Bahasa Wolfram, serta basis pengetahuan Wolfram langsung ke kode Python yang ada, yang secara signifikan menghemat waktu dan upaya Anda saat mengembangkan kode baru. Pada artikel ini, pertama-tama kami menunjukkan kepada Anda cara mengatur koneksi antara Python dan Bahasa Wolfram, lihat beberapa metode dan contoh yang dapat digunakan untuk menghitung dalam Bahasa Wolfram, dan kemudian menyebutnya untuk digunakan dari Python. Untuk informasi referensi yang lebih lengkap, kunjungi: Wolfram Client Library untuk beranda dokumentasi Python .

Hargai di tempat ...


Mari kita mulai dengan contoh sederhana yang menghitung rata-rata dan standar deviasi satu juta angka yang diambil dari distribusi normal. Contoh ini menunjukkan bagaimana memanggil fungsi Wolfram dari Python dan membandingkan hasil dari Python dengan perhitungan Bahasa Wolfram yang sama untuk menunjukkan bahwa mereka sangat konvergen.

Analisis Data Statistik


Pertama, untuk terhubung ke Bahasa Wolfram, Anda perlu membuat sesi baru dengan Mesin Wolfram (mesin bahasa Wolfram gratis):

from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession() 

Untuk memanggil fungsi Bahasa Wolfram Anda perlu mengimpor mesin `wl`:

 from wolframclient.language import wl 

Sekarang Anda dapat menjalankan kode bahasa Wolfram. Tetapkan variabel sampel dari Python ke nilai daftar satu juta angka acak yang diambil dari distribusi normal, dengan rata-rata 0 dan standar deviasi 1:

 sample = session.evaluate(wl.RandomVariate(wl.NormalDistribution(0,1), 1e6)) 

Pertimbangkan lima yang pertama:

 sample[:5] [0.44767075774581, 0.9662810005828261, -1.327910570542906, -0.2383857558557122, 1.1826399551062043] 

Anda dapat menghitung rata-rata sampel ini menggunakan Bahasa Wolfram. Seperti yang diharapkan, itu akan mendekati nol:

 session.evaluate(wl.Mean(sample)) 0.0013371607703851515 

Anda juga dapat langsung menghitung yang sama dengan Python untuk memastikan Anda mendapatkan hasil yang serupa:

 from statistics import mean mean(sample) 0.0013371607703851474 

Demikian pula, Anda dapat menghitung standar deviasi sampel menggunakan Bahasa Wolfram:

 session.evaluate(wl.StandardDeviation(sample)) 1.0014296230797068 

Kemudian jalankan kode berikut dengan Python untuk memastikan Anda mendapatkan hasil yang serupa:

 stdev(sample) 1.0014296230797068 

Tidak bisa tidak bersukacita bahwa hasilnya bertemu. Sekarang Anda tahu cara memanggil fungsi Bahasa Wolfram sederhana dari Python. Mari kita lanjutkan dengan contoh yang lebih menarik.

Menggunakan Basis Pengetahuan Wolfram


Mari kita lihat fungsi bawaan Bahasa Wolfram, yang tidak tersedia dalam Python, WolframAlpha :

 moons = session.evaluate(wl.WolframAlpha('moons of Saturn', 'Result')) 

Fungsi WolframAlpha adalah salah satu fungsi tingkat tinggi dalam Bahasa Wolfram yang berkomunikasi dengan server Wolfram | Alpha melalui API web . Anda dapat menggunakan API ini langsung dari Python, yang membuat memanggil fungsi WolframAlpha jauh lebih kuat dan lebih nyaman, karena Anda mendapatkan akses ke semua fungsi pemrosesan data langsung dari Bahasa Wolfram. Mari kita lihat apa isi variabel bulan dalam Python:

 moons EntityClass['PlanetaryMoon', 'SaturnMoon'] 

Output di sini adalah representasi dalam Python ekspresi dari Bahasa Wolfram, yang dapat digunakan dalam perhitungan selanjutnya. Misalnya, jika Anda ingin mendapatkan daftar empat satelit pertama Saturnus (berdasarkan tingkat kedekatannya dengan Saturnus) untuk ini, Anda perlu menjalankan kode berikut:

 session.evaluate(wl.EntityList(moons))[:4] [Entity['PlanetaryMoon', 'S2009S1'], Entity['PlanetaryMoon', 'Pan'], Entity['PlanetaryMoon', 'Daphnis'], Entity['PlanetaryMoon', 'Atlas']] 

Atau Anda dapat menampilkan empat satelit massal terbesar di Saturnus dengan kode ini:

 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']] 

Atau Anda bisa mendapatkan serangkaian string dengan nama-nama satelit ini, misalnya:

 session.evaluate(wl.Map(wl.Function( wl.Slot()("Name")), bigmoons)) ['Titan', 'Rhea', 'Iapetus', 'Dione'] 

Semua ini sangat mengesankan. Mari kita lihat contoh lain menggunakan fungsi pemrosesan gambar dan pembelajaran mesin yang dibangun ke dalam Bahasa Wolfram.

Pemrosesan Gambar dan Pembelajaran Mesin


Pertama, mari kita beralih ke mode lain untuk melakukan evaluasi langsung dalam Bahasa Wolfram. Sejauh ini, Anda telah menggunakan mesin `wl` untuk membuat ekspresi Bahasa Wolfram dalam Python, tetapi Anda juga dapat menjalankan baris kode yang ditulis dalam Python yang berisi kode Bahasa Wolfram, dan kadang-kadang bahkan lebih mudah dirasakan:

 from wolframclient.language import wlexpr 


Misalnya, hitung 1 +1 dalam Bahasa Wolfram, kirimkan sebagai string:

 session.evaluate('1+1') 2 


Dengan menggunakan metode ini, Anda dapat menulis kode kecil dalam Bahasa Wolfram, yang menerima gambar pada input dan menggunakan algoritma deteksi wajah bawaan untuk menemukan lokasi wajah pada gambar. Di sini, gambar yang kami gunakan adalah lukisan terkenal “ Gadis dengan Anting-Anting Mutiara ” oleh seniman Belanda Johannes Vermeer (harus dicatat, tentu saja, algoritma ini akan bekerja juga pada hampir semua gambar dengan objek di mana wajah dapat dikenali). Karena antarmuka terminal Python tidak mendukung output gambar, kita perlu menggunakan Notebook Jupyter bersama dengan paket Python Image Library (PIL) agar dapat menampilkan hasilnya:

 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) 



Hasilnya, semuanya ternyata cukup mudah dan kuat pada saat bersamaan. Tetapi apa yang harus dilakukan jika Anda tidak menginstal Mesin Wolfram secara lokal di komputer Anda, dan Anda ingin menggunakan pustaka klien Wolfram untuk Python? Dalam hal ini, Anda selalu dapat menggunakan Bahasa Wolfram secara langsung dengan memanggilnya dari Wolfram Cloud (cloud).

Jadi, pergi ke cloud


Wolfram Cloud menyediakan akses mudah ke Bahasa Wolfram tanpa melakukan pra-instal secara lokal. Wolfram Cloud menyediakan berbagai layanan, termasuk antarmuka pemrograman web Wolfram Language, serta kemampuan untuk menggunakan API web kustom Wolfram Language.

Dalam contoh berikut, kami akan melakukan ini dengan menggunakan web-API Bahasa Wolfram. Misalnya, API menerima nama dua negara (country1 dan country2) pada input, menemukan modal untuk setiap negara dan kemudian menghitung jarak di antara mereka (dalam kilometer):

 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"] 



Setelah menggunakan API ini, Anda dapat memulai sesi Bahasa Wolfram baru, tetapi kali ini Anda terhubung ke Wolfram Cloud alih-alih mesin lokal:

 from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession() 

Untuk memanggil API, Anda harus menentukan nama pengguna (pengguna1) dan titik akhir API (api / publik / capital_distance). Dengan menggunakan data ini, Anda dapat terhubung ke cloud ...

 api = ('user1', 'api/public/capital_distance') result = cloud.call(api, {'country1': 'Netherlands', 'country2': 'Spain'}) 

... lalu dapatkan hasil yang diinginkan:
 result.get() 1481.4538329484521 

Evaluasi sekali lagi betapa mudah dan sederhananya.

Jika Anda ingin menyimpan API Bahasa Wolfram yang digunakan sehingga hanya Anda yang dapat menggunakannya, Anda dapat menggunakan API menggunakan izin → → "Pribadi" . Untuk melakukan ini, di API pribadi, Anda dapat membuat (dalam Bahasa Wolfram) kunci keamanan otentikasi:

gambar
 key = GenerateSecuredAuthenticationKey["myapp"] 

Salin jawaban dari dua jalur input ini:

 key["ConsumerKey"] key["ConsumerSecret"] 

Kemudian rekatkan ke dalam sesi Python Anda:

 SecuredAuthenticationKey('<<paste-consumer-key-here>>', '<<paste-consumer-secret-here>>') 

Dan kemudian mulai sesi cloud baru dengan otentikasi:

 cloud = WolframCloudSession(credentials=sak) cloud.start() cloud.authorized() True 

Sekarang Anda (dan hanya Anda) dapat menggunakan API Bahasa Wolfram apa pun yang Anda gunakan untuk penggunaan pribadi.

Mari kita bicara sedikit tentang konsep dasar serialisasi


Untuk melakukan semuanya dengan cepat dan efisien, pustaka klien Wolfram untuk Python menggunakan format WXF terbuka untuk bertukar ekspresi antara Python dan Wolfram. WXF adalah format biner untuk membuat serialisasi ekspresi Bahasa Wolfram secara akurat dalam bentuk yang cocok untuk berbagi dengan program eksternal. Fungsi pustaka Ekspor dapat membuat serial objek Python ke bentuk input string dan WXF, dan juga mendukung sekumpulan kelas bawaan Python seperti dikt, daftar, dan string:

 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 adalah susunan numerik dengan data yang dikemas, yang memungkinkan Anda untuk secara efektif mendukung array NumPy .

Misalnya, buat array 255 bilangan bulat 8-bit:

 import numpy array=numpy.arange(255, dtype='uint8') 

Serialisasi ke byte WXF dan hitung jumlah byte:

 wxf=export(array, target_format='wxf') len(wxf) 262 

NumPy memungkinkan Anda untuk mengakses banyak pustaka Python. Konsekuensinya, serialisasi yang efisien dan ringkas ini membantu menghubungkan sistem Python ke Bahasa Wolfram, akibat langsung yang mendukung di NumPy bahwa membuat serialisasi gambar PIL pada umumnya sangat efisien. Sebagian besar mode data piksel ditampilkan sebagai salah satu jenis array numerik yang ditentukan sebagai NumericArrayType .

Perlu juga dicatat bahwa Seri panda dan DataFrame awalnya didukung di sini. Perpustakaan juga menyediakan mekanisme yang dapat diperluas untuk membuat serialisasi kelas yang sewenang-wenang.

Apa yang tersedia sekarang?


Instal pustaka klien Wolfram terbaru untuk Python menggunakan perintah pip :

 $ pip install wolframclient 

Untuk melakukan ini, Anda memerlukan Python 3.5.3 (atau versi yang lebih baru) dan Wolfram Language 11.3 (atau versi yang lebih baru). Lihat dokumentasi pustaka klien Wolfram untuk Python . Semua kode sumber di-host di repositori WolframClientForPython di Wolfram Research GitHub .

Jika Anda memiliki saran untuk meningkatkannya dan Anda bisa dan ingin membantu kami melakukan ini, Anda dapat melakukan ini dengan mengirimkan permintaan kepada kami untuk memperbarui data dalam repositori ini.
Kami sangat senang bahwa rilis ini akhirnya terjadi dan kami berharap ini akan bermanfaat bagi Anda. Tolong beri tahu kami pendapat Anda di bagian komentar atau di komunitas Wolfram , dan kami akan melakukan yang terbaik untuk menghubungi Anda secara pribadi.

Tentang terjemahan
Saya mengucapkan terima kasih yang mendalam kepada Peter Tenishev dan Galina Nikitina atas bantuan mereka dalam menerjemahkan dan menyiapkan publikasi.

Ingin belajar cara memprogram dalam Bahasa Wolfram?
Tonton webinar mingguan.
Pendaftaran untuk kursus baru . Kursus online siap.
Memesan solusi di Bahasa Wolfram.

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


All Articles