{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Díky své univerzálnosti a rozšiřitelnosti dokáže Python spolupracovat s mnoha rozdílnými jazyky. Obvykle to je z pohledu programátora poměrně jednoduché. Musíme ovšem vědět, že ne vždy je použité řešení optimalizované pro rychlost. Mohou také existovat jistá omezení, týkající se např. kompatibility datových typů.\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Velký přehled možností, jak integrovat Python s jinými jazyky, najdeme na [wiki.python.org](https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages). My se podíváme na některé z jazyků a možností.\n", "\n", "## Nízkoúrovňové jazyky\n", "Nízkoúrovňové jazyky už jsme použili pro optimalizaci, takže dobře víme, že jejich volání je poměrně snadné. Shrňme si, jaké jsou nejrozšířenější možnosti.\n", "\n", "### C/C++\n", "\n", "C konvence (konkrétně cdecl) pro volání funkcí je asi nejrozšířenějším standardem. Pokud takové rozhraní umíme použít, případně vytvořit, máme k dispozici velké množství knihoven.\n", "\n", "* Pro volání funkcí z dynamických knihoven můžeme použít [`ctypes`](http://docs.python.org/2/library/ctypes.html).\n", "* [Cython](http://cython.org/] dovoluje volat C/C++.\n", "* [`scipy.weave`](http://docs.scipy.org/doc/scipy/reference/tutorial/weave.html), [Instant](https://bitbucket.org/fenics-project/instant) nebo [Bitey](https://github.com/dabeaz/bitey) umožňuje kompilovat C/C++ kód vložený přímo do Python kódu.\n", "* [F2PY](http://cens.ioc.ee/projects/f2py2e/) umožňuje příomčaře vytvořit Python rozhraní pro C funkci.\n", "* [Boost.Python](http://www.boost.org/doc/libs/1_55_0/libs/python/doc/index.html) zjednodušuje vytváření Python rozhraní pro C++.\n", "* [SWIG](http://www.swig.org/) je tradiční nástroj pro integraci C/C++ do jiných jazyků, včetně Pythonu.\n", "\n", "### Fortran\n", "\n", "* [F2PY](http://cens.ioc.ee/projects/f2py2e/) umožňuje příomčaře vytvořit Python rozhraní pro Fortran funkci. Pro IPython existuje díky tomu kouzlo `%%fortran`. F2PY má sofistikovanou podporu pro NumPy pole.\n", "* [Forthon](https://github.com/dpgrote/Forthon) dovoluje podobně jako F2PY kombinovat Fortran a Python, navíc podporuje struktury (derived types). Podobně jako F2PY, NumPy pole jsou předávána jen referencí (pokud jsou uložena ve Fortran uspořádání).\n", "\n", "## Vysokoúrovňové jazyky\n", "\n", "### Java\n", "\n", "* Pokud používáme čistý Python bez rozšíření v C/Fortranu apod. (což je případ např. NumPy, Scipy aj.), je nejjednodušší použít [Jython](http://www.jython.org/), což je interpret Pythonu běžící v Java virtuálním stroji. V Jythonu můžeme používat Java knihovny a naopak, Jython má rozhraní pro Javu.\n", "* [Py4J](http://py4j.sourceforge.net/index.html) nebo [JPYPE](http://jpype.sourceforge.net/) dovolují volat Javu z (C)Pythonu. [Pyjnius](http://pyjnius.readthedocs.org/en/latest/) je podobný projekt zaměřený na Android.\n", "* [Jepp](http://jepp.sourceforge.net/) umožňuje opak, tj. volání (C)Pythonu z Javy. Zdá se, že tento projekt je ovšem nedostatečně udržovaný a kompatibilní: http://gillius.org/blog/2012/01/java-and-python-with-jepp-or-not.html. Zde je třeba sledovat [vývoj](https://github.com/mrj0/jep).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## (Primárně) vědecké jazyky \n", "\n", "Jazykům, které jsou primárně určeny pro vědu, numeriku, zpracování dat apod., se budeme věnovat trochu podrobněji. To, že pro Python existují nástroje pro integraci těchto jazyků, je velice důležité pro případný přechod na Python. Pokud totiž máme programy v nějakém z těchto jazyků, nemusíme je hned přepisovat do Pythonu, přesto je v Pythonu můžeme poměrně pohodlně používat. To může být pro mnoho lidí rozhodujícím faktorem pro (ne)použití nového nástroje, v našem případě Pythonu.\n", "\n", "### R\n", "\n", "R je velice populárním nástrojem pro (statistické) zpracování dat. Zde je nutno poznamenat, že v Python světě slouží k podobným účelům R-kem inspirovaný projekt [Pandas](http://pandas.pydata.org/) a také (poměrně mladý) [ggplot](https://github.com/yhat/ggplot/), což je náhražka za oblíbený [ggplot2](https://github.com/hadley/ggplot2) pro R. Asi hlavním nástrojem pro volání R z Pythonu je [Rpy](http://rpy.sourceforge.net/). Pojďme se podívat na jednoduchou ukázku." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import rpy2.robjects as robjects" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[1] 3.141593\n", "\n", "3.141592653589793\n" ] } ], "source": [ "pi_r = robjects.r['pi']\n", "print(type(pi_r))\n", "print(pi_r)\n", "print(pi_r[0])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 3.141593 2.000000\n", "\n", "c(3.14159265358979, 2)\n", "5.141592653589793\n" ] } ], "source": [ "piplus2 = robjects.r('pi') + 2\n", "print(piplus2)\n", "print(piplus2.r_repr())\n", "pi0plus2 = robjects.r('pi')[0] + 2\n", "print(pi0plus2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "V následujícím příkladě definujeme v R funkci f, kterou následně i zavoláme." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\n", "[18.849556]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "robjects.r('''\n", " f <- function(r, verbose=FALSE) {\n", " if (verbose) {\n", " cat(\"I am calling f().\\n\")\n", " }\n", " 2 * pi * r\n", " }\n", " f(3)\n", " ''')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Funkci f můžeme také používat přímo v Pythonu. Nejprve ji uložíme do proměnné `r_f`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "function (r, verbose = FALSE) \n", "{\n", " if (verbose) {\n", " cat(\"I am calling f().\\n\")\n", " }\n", " 2 * pi * r\n", "}\n" ] } ], "source": [ "r_f = robjects.r['f']\n", "print(r_f.r_repr())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A nyní už můžeme `r_f` přímo volat:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 18.84956\n", "\n" ] } ], "source": [ "print(r_f(3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data z R můžeme převádět do NumPy polí." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from rpy2.robjects.packages import importr\n", "import numpy as np\n", "\n", "datasets = importr('datasets')\n", "\n", "ostatus = datasets.__rdata__.fetch('occupationalStatus')['occupationalStatus']\n", "ostatus_np = np.array(ostatus)\n", "ostatus_npnc = np.asarray(ostatus)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " destination\n", "origin 1 2 3 4 5 6 7 8\n", " 1 50 19 26 8 7 11 6 2\n", " 2 16 40 34 18 11 20 8 3\n", " 3 12 35 65 66 35 88 23 21\n", " 4 11 20 58 110 40 183 64 32\n", " 5 2 8 12 23 25 46 28 12\n", " 6 12 28 102 162 90 554 230 177\n", " 7 0 6 19 40 21 158 143 71\n", " 8 0 3 14 32 15 126 91 106\n", "\n", "[[ 50 19 26 8 7 11 6 2]\n", " [ 16 40 34 18 11 20 8 3]\n", " [ 12 35 65 66 35 88 23 21]\n", " [ 11 20 58 110 40 183 64 32]\n", " [ 2 8 12 23 25 46 28 12]\n", " [ 12 28 102 162 90 554 230 177]\n", " [ 0 6 19 40 21 158 143 71]\n", " [ 0 3 14 32 15 126 91 106]]\n" ] } ], "source": [ "print(ostatus)\n", "print(ostatus_np)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rozdíl mezi `ostatus_np` a `ostatus_npnc` je v tom, že `ostatus_npnc` je pouze pohled (view) na data R. Poznáme to např. podle příznaku `owndata`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "print(ostatus_np.flags.owndata)\n", "print(ostatus_npnc.flags.owndata)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "IPython nám navíc pro zjednodušení poskytuje rozšíření `rmagic`. Ukázka např. [zde](http://nbviewer.ipython.org/github/ipython/ipython/blob/3607712653c66d63e0d7f13f073bde8c0f209ba8/docs/examples/notebooks/rmagic_extension.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Matlab / Octave" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pro integraci s Matlabem existuje [Python-MATLAB(R) Bridge](https://github.com/arokem/python-matlab-bridge). Nemá tak propracované možnosti jako rpy2, nicméně použít ho můžeme." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "ename": "ImportError", "evalue": "No module named 'pymatbridge'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mpymatbridge\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mImportError\u001b[0m: No module named 'pymatbridge'" ] } ], "source": [ "import pymatbridge\n", "import os\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mlab = pymatbridge.Matlab()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting MATLAB on http://localhost:51059\n", " visit http://localhost:51059/exit.m to shut down same\n", "...MATLAB started and connected!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlab.start()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = mlab.run_func('%s/matlab/www/demo_func.m'%os.path.dirname(pymatbridge.__file__), {'a': 10})\n", "res['result']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Takto vypadá výsledek `run_code`." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{u'content': {u'code': u'a=[1,3,7]',\n", " u'datadir': u'/tmp/MatlabData/',\n", " u'figures': [u'/tmp/MatlabData/MatlabFig001.png',\n", " u'/tmp/MatlabData/MatlabFig002.png'],\n", " u'stdout': u'\\na =\\n\\n 1 3 7\\n\\n'},\n", " u'success': u'true'}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlab.run_code('a=[1,3,7]')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`get_variable` dokáže přenést proměnnou z Matlabu do Pythonu." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "u'[1,3,7]'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = mlab.get_variable('a')\n", "a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Výsledkem je (bohužel) string (unicode). Pomocí `numpy.matrix` ho můžeme převést na numpy matici (musíme ovšem převést unicode na str)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[1, 3, 7]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.matrix(str(a))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matlab ukončíme, aby zbytečně neběžel na pozadí." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MATLAB closed\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlab.stop()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Takto zpřístupníme `%%matlab` magic." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting MATLAB on http://localhost:45630\n", " visit http://localhost:45630/exit.m to shut down same\n", "...MATLAB started and connected!\n" ] } ], "source": [ "ip = get_ipython()\n", "pymatbridge.load_ipython_extension(ip)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "V Matlabu můžeme pak dělat cokoli, včetně grafů." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\ngocAAAAASUVORK5CYII=\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%matlab\n", "a = linspace(0.01,6*pi,100);\n", "plot(sin(a))\n", "grid on\n", "hold on\n", "plot(cos(a),'r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pomocí `-i` a `-o` můžeme posílat / získávat proměnné. *Pozor, zdá se, že toto nefunguje spolehlivě pokud voláme `%%matlab` vícekrát se stejnými proměnnými.*" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a = np.array([1,2,3])" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%matlab -i a -o x\n", "x = 2 * a;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Proměnné z Matlabu přicházejí jako obejkty PyTables." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "tables.array.Array" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(x)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2]\n", " [4]\n", " [6]]\n" ] } ], "source": [ "print(np.array(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Octave\n", "Pokud nemáte (rádi) Matlab, můžete použít Octave pomocí [Oct2Py](http://pythonhosted.org/oct2py/). Oct2Py navíc poskytuje lepší možnosti než pymatbridge, takže pokud váš kód pod Octave funguje, může to být preferovaná možnost." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import oct2py\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Získáme instanci Octave." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [], "source": [ "oc = oct2py.Oct2Py()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tento objekt obsahuje přímo základní funkce." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "print(oc.abs(-1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Funguje i Pythonovská nápověda." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function abs in module oct2py.session:\n", "\n", "abs(*args, **kwargs)\n", " 'abs' is a built-in function\n", " \n", " -- Mapping Function: abs (Z)\n", " Compute the magnitude of Z, defined as |Z| = `sqrt (x^2 + y^2)'.\n", " \n", " For example:\n", " \n", " abs (3 + 4i)\n", " => 5\n", " \n", " \n", " Additional help for built-in functions and operators is\n", " available in the online version of the manual. Use the command\n", " 'doc ' to search the manual index.\n", " \n", " Help and information about Octave is also available on the WWW\n", " at http://www.octave.org and via the help@octave.org\n", " mailing list.\n", "\n" ] } ], "source": [ "help(oc.abs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "oct2py umí pracovat s NumPy poli pro vstup i výstup." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 3.86432845],\n", " [ 0.25877718]])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "oc.svd(np.array([[1,2], [1,3]]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Některé funkce v Octave (stejně jako v Matlabu), např. `svd`, vrací jiný výstup podle počtu výstupních proměnných. I toto je v oct2py podporováno." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-0.57604844 -0.81741556]\n", " [-0.81741556 0.57604844]]\n", "[[ 3.86432845 0. ]\n", " [ 0. 0.25877718]]\n", "[[-0.36059668 -0.93272184]\n", " [-0.93272184 0.36059668]]\n" ] } ], "source": [ "U, S, V = oc.svd([[1,2], [1,3]])\n", "print(U)\n", "print(S)\n", "print(V)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### IDL\n", "\n", "Pokud se konečně chcete zbavit obludy jménem [IDL](http://en.wikipedia.org/wiki/IDL_(programming_language)) (Interactive Data Language) a nemáte čas všechny vaše programy hned přepisovat do Pythonu, pomůže vám [pIDLy](https://github.com/anthonyjsmith/pIDLy), případně ve spojení s [ipython-idlmagic](https://github.com/ebellm/ipython-idlmagic)." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pidly" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Použijeme GDL, což je open source náhražka IDL (podobně jako Octave pro Matlab)." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [], "source": [ "idl = pidly.IDL('/usr/bin/gdl', idl_prompt='GDL> ')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "idl('x = total([1, 1], /int)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Proměnné z IDL získáme takto" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array(2)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "idl.x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "nebo takto (tato varianta by měla být rychlejší)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "print idl.ev('x')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sezení ukončíme pomocí `close`." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "idl.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pro notebook můžeme použít `%idl` po instalaci rozšíření." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Installed idlmagic.py. To use it, type:\n", " %load_ext idlmagic\n" ] } ], "source": [ "%install_ext https://raw.github.com/ebellm/ipython-idlmagic/master/idlmagic.py" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IDL not found, using GDL\n" ] } ], "source": [ "%load_ext idlmagic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`%idl` automaticky detekuje, zda použít IDL či GDL." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ " 0.00000 1.00000 2.00000 3.00000 4.00000" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%idl print, findgen(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mathematica\n", "\n", "Pro integraci Mathematica existuje [pythonica](https://github.com/bjedwards/pythonica) a také [IPython rozšíření](https://github.com/bjedwards/IPython-mathematicamagic-extension). Pro opačný proces, tj. použití Pythonu v Mathematice, lze použít [pythonika](https://code.google.com/p/pythonika/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sage -> Maple, Maxima, Matlab, Octave, ...\n", "\n", "Sage dokáže volat mnoho externích nástrojů, viz [dokumentace](http://www.sagemath.org/doc/reference/interfaces/sage/interfaces/maple.html)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }