{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 1: Computing with Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Robert Johansson\n", "\n", "Source code listings for [Numerical Python - Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib](https://www.apress.com/us/book/9781484242452) (ISBN 978-1-484242-45-2)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interpreter" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting hello.py\n" ] } ], "source": [ "%%writefile hello.py\n", "print(\"Hello from Python!\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello from Python!\n" ] } ], "source": [ "!python hello.py" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python 3.7.3\n" ] } ], "source": [ "!python --version" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Input and output caching" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3 * 3" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'3 * 3'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "In[1]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Out[1]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['', '3 * 3', 'In[1]', 'Out[1]', 'In']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "In" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: 9, 2: '3 * 3', 3: 9, 4: ['', '3 * 3', 'In[1]', 'Out[1]', 'In', 'Out']}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Out" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1+2" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "1+2;" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "x = 1" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 2; x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Documentation" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import os" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# try os.w" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import math" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mDocstring:\u001b[0m\n", "cos(x)\n", "\n", "Return the cosine of x (measured in radians).\n", "\u001b[0;31mType:\u001b[0m builtin_function_or_method\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "math.cos?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interaction with System Shell" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "!touch file1.py file2.py file3.py" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "file1.py file2.py file3.py\n" ] } ], "source": [ "!ls file*" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "files = !ls file*" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(files)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['file1.py', 'file2.py', 'file3.py']" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "files" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "file = \"file1.py\"" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-rw-r--r-- 1 rob staff 0 May 6 12:30 file1.py\n" ] } ], "source": [ "!ls -l $file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running scripts from the IPython console" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting fib.py\n" ] } ], "source": [ "%%writefile fib.py\n", "\n", "def fib(N): \n", " \"\"\" \n", " Return a list of the first N Fibonacci numbers.\n", " \"\"\" \n", " f0, f1 = 0, 1\n", " f = [1] * N\n", " for n in range(1, N):\n", " f[n] = f0 + f1\n", " f0, f1 = f1, f[n]\n", "\n", " return f\n", "\n", "print(fib(10))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]\n" ] } ], "source": [ "!python fib.py" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]\n" ] } ], "source": [ "%run fib.py" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 1, 2, 3, 5, 8]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fib(6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Debugger" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "can't multiply sequence by non-int of type 'float'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfib\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/Desktop/numerical-python-apress-revision/numerical-python-book-code/fib.py\u001b[0m in \u001b[0;36mfib\u001b[0;34m(N)\u001b[0m\n\u001b[1;32m 5\u001b[0m \"\"\" \n\u001b[1;32m 6\u001b[0m \u001b[0mf0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mf1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: can't multiply sequence by non-int of type 'float'" ] } ], "source": [ "fib(1.0)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m/Users/rob/Desktop/numerical-python-apress-revision/numerical-python-book-code/fib.py\u001b[0m(7)\u001b[0;36mfib\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 5 \u001b[0;31m \"\"\" \n", "\u001b[0m\u001b[0;32m 6 \u001b[0;31m \u001b[0mf0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 7 \u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 8 \u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 9 \u001b[0;31m \u001b[0mf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mf1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> q\n" ] } ], "source": [ "%debug" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Timing and profiling code" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "12.5 µs ± 712 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit fib(100)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 21 µs, sys: 1 µs, total: 22 µs\n", "Wall time: 27.2 µs\n" ] } ], "source": [ "result = %time fib(100)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "def random_walker_max_distance(M, N):\n", " \"\"\"\n", " Simulate N random walkers taking M steps, and return the largest distance\n", " from the starting point achieved by any of the random walkers.\n", " \"\"\"\n", " trajectories = [np.random.randn(M).cumsum() for _ in range(N)]\n", " return np.max(np.abs(trajectories))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " " ] }, { "data": { "text/plain": [ " 20010 function calls in 0.353 seconds\n", "\n", " Ordered by: internal time\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", " 10000 0.194 0.000 0.194 0.000 {method 'randn' of 'mtrand.RandomState' objects}\n", " 10000 0.069 0.000 0.069 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", " 1 0.054 0.054 0.340 0.340 :3(random_walker_max_distance)\n", " 1 0.019 0.019 0.282 0.282 :8()\n", " 1 0.013 0.013 0.353 0.353 :1()\n", " 1 0.004 0.004 0.004 0.004 {method 'reduce' of 'numpy.ufunc' objects}\n", " 1 0.000 0.000 0.004 0.004 fromnumeric.py:69(_wrapreduction)\n", " 1 0.000 0.000 0.353 0.353 {built-in method builtins.exec}\n", " 1 0.000 0.000 0.004 0.004 fromnumeric.py:2397(amax)\n", " 1 0.000 0.000 0.000 0.000 fromnumeric.py:70()\n", " 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%prun random_walker_max_distance(400, 10000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jupyter notebook" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "from IPython.display import display, Image, HTML, Math" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(url='http://python.org/images/python-logo.gif')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "import scipy, numpy, matplotlib\n", "modules = [numpy, matplotlib, scipy]\n", "row = \" %s %s \"\n", "rows = \"\\n\".join([row % (module.__name__, module.__version__) for module in modules])\n", "s = \" %s
LibraryVersion
\" % rows" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\n\\n
LibraryVersion
numpy 1.13.3
matplotlib 3.0.0
scipy 1.1.0
'" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
LibraryVersion
numpy 1.13.3
matplotlib 3.0.0
scipy 1.1.0
" ], "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HTML(s)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "class HTMLDisplayer(object):\n", " def __init__(self, code):\n", " self.code = code\n", " \n", " def _repr_html_(self):\n", " return self.code" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
LibraryVersion
numpy 1.13.3
matplotlib 3.0.0
scipy 1.1.0
" ], "text/plain": [ "<__main__.HTMLDisplayer at 0x10f83a4e0>" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HTMLDisplayer(s)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\hat{H} = -\\frac{1}{2}\\epsilon \\hat{\\sigma}_z-\\frac{1}{2}\\delta \\hat{\\sigma}_x$$" ], "text/plain": [ "" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Math(r'\\hat{H} = -\\frac{1}{2}\\epsilon \\hat{\\sigma}_z-\\frac{1}{2}\\delta \\hat{\\sigma}_x')" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "class QubitHamiltonian(object):\n", " def __init__(self, epsilon, delta):\n", " self.epsilon = epsilon\n", " self.delta = delta\n", "\n", " def _repr_latex_(self):\n", " return \"$\\hat{H} = -%.2f\\hat{\\sigma}_z-%.2f\\hat{\\sigma}_x$\" % \\\n", " (self.epsilon/2, self.delta/2)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\hat{H} = -0.25\\hat{\\sigma}_z-0.12\\hat{\\sigma}_x$" ], "text/plain": [ "<__main__.QubitHamiltonian at 0x10f83a2e8>" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "QubitHamiltonian(0.5, 0.25)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from scipy import stats\n", "\n", "def f(mu):\n", " X = stats.norm(loc=mu, scale=np.sqrt(mu))\n", " N = stats.poisson(mu)\n", " x = np.linspace(0, X.ppf(0.999))\n", " n = np.arange(0, x[-1])\n", "\n", " fig, ax = plt.subplots()\n", " ax.plot(x, X.pdf(x), color='black', lw=2, label=\"Normal($\\mu=%d, \\sigma^2=%d$)\" % (mu, mu))\n", " ax.bar(n, N.pmf(n), align='edge', label=r\"Poisson($\\lambda=%d$)\" % mu)\n", " ax.set_ylim(0, X.pdf(x).max() * 1.25)\n", " ax.legend(loc=2, ncol=2)\n", " plt.close(fig)\n", " return fig" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "from ipywidgets import interact\n", "import ipywidgets as widgets" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(f, mu=widgets.FloatSlider(min=1.0, max=20.0, step=1.0));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jupyter nbconvert" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[TerminalIPythonApp] WARNING | Subcommand `ipython nbconvert` is deprecated and will be removed in future versions.\n", "[TerminalIPythonApp] WARNING | You likely want to use `jupyter nbconvert` in the future\n", "[NbConvertApp] Converting notebook ch01-code-listing.ipynb to html\n", "[NbConvertApp] Writing 315769 bytes to ch01-code-listing.html\n" ] } ], "source": [ "!ipython nbconvert --to html ch01-code-listing.ipynb" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[TerminalIPythonApp] WARNING | Subcommand `ipython nbconvert` is deprecated and will be removed in future versions.\n", "[TerminalIPythonApp] WARNING | You likely want to use `jupyter nbconvert` in the future\n", "[NbConvertApp] Converting notebook ch01-code-listing.ipynb to pdf\n", "[NbConvertApp] Support files will be in ch01-code-listing_files/\n", "[NbConvertApp] Making directory ch01-code-listing_files\n", "[NbConvertApp] Writing 42308 bytes to notebook.tex\n", "[NbConvertApp] Building PDF\n", "[NbConvertApp] Running xelatex 3 times: ['xelatex', 'notebook.tex']\n", "[NbConvertApp] CRITICAL | xelatex failed: ['xelatex', 'notebook.tex']\n", "This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex)\n", " restricted \\write18 enabled.\n", "entering extended mode\n", "(./notebook.tex\n", "LaTeX2e <2018-04-01> patch level 2\n", "Babel <3.18> and hyphenation patterns for 84 language(s) loaded.\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/article.cls\n", "Document Class: article 2014/09/29 v1.4h Standard LaTeX document class\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/size11.clo))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/fontenc.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/t1enc.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/lm/t1lmr.fd))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/mathpazo.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/graphicx.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/keyval.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/graphics.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/trig.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics-cfg/graphics.cfg)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics-def/xetex.def)))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/caption/caption.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/caption/caption3.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/adjustbox.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/xkeyval/xkeyval.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/xkeyval/xkeyval.tex\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/xkeyval/xkvutils.tex)))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/adjcalc.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/trimclip.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/collectbox/collectbox.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/tc-xetex.def))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/varwidth/varwidth.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/xcolor/xcolor.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics-cfg/color.cfg))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/tools/enumerate.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/geometry/geometry.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifpdf.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifvtex.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/ifxetex/ifxetex.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsmath.sty\n", "For additional information on amsmath, use the `?' option.\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amstext.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsgen.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsopn.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsfonts/amssymb.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsfonts/amsfonts.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/textcomp.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/ts1enc.def))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/upquote/upquote.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/eurosym/eurosym.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ucs/ucs.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ucs/data/uni-global.def))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/inputenc.sty\n", "\n", "Package inputenc Warning: inputenc package ignored with utf8 based engines.\n", "\n", ") (/usr/local/texlive/2018/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty\n", "Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix \n", "<2008/02/07> (tvz))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/grffile.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/kvoptions.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ltxcmds.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/infwarerr.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/etexcmds.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifluatex.sty))))\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/hyperref.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/auxhook.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/pd1enc.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/latexconfig/hyperref.cfg)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/url/url.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/hxetex.def\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/puenc.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/stringenc.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/tools/longtable.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/booktabs/booktabs.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/enumitem/enumitem.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/ulem/ulem.sty)\n", "No file notebook.aux.\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/ts1cmr.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/t1ppl.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/caption/ltcaption.sty)\n", "*geometry* driver: auto-detecting\n", "*geometry* detected driver: xetex\n", "*geometry* verbose mode - [ preamble ] result:\n", "* driver: xetex\n", "* paper: \n", "* layout: \n", "* layoutoffset:(h,v)=(0.0pt,0.0pt)\n", "* modes: \n", "* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)\n", "* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)\n", "* \\paperwidth=614.295pt\n", "* \\paperheight=794.96999pt\n", "* \\textwidth=469.75502pt\n", "* \\textheight=650.43001pt\n", "* \\oddsidemargin=0.0pt\n", "* \\evensidemargin=0.0pt\n", "* \\topmargin=-37.0pt\n", "* \\headheight=12.0pt\n", "* \\headsep=25.0pt\n", "* \\topskip=11.0pt\n", "* \\footskip=30.0pt\n", "* \\marginparwidth=59.0pt\n", "* \\marginparsep=10.0pt\n", "* \\columnsep=10.0pt\n", "* \\skip\\footins=10.0pt plus 4.0pt minus 2.0pt\n", "* \\hoffset=0.0pt\n", "* \\voffset=0.0pt\n", "* \\mag=1000\n", "* \\@twocolumnfalse\n", "* \\@twosidefalse\n", "* \\@mparswitchfalse\n", "* \\@reversemarginfalse\n", "* (1in=72.27pt=25.4mm, 1cm=28.453pt)\n", "\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ucs/ucsencs.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/nameref.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/gettitlestring.sty))\n", "\n", "Package hyperref Warning: Rerun to get /PageLabels entry.\n", "\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/ot1ppl.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/omlzplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/omszplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/omxzplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/ot1zplm.fd)\n", "\n", "LaTeX Warning: No \\author given.\n", "\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/se-ascii-print.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/lm/t1lmtt.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/lm/ts1lmtt.fd) [1]\n", "! Text line contains an invalid character.\n", "l.431 ^^[\n", " [0;31mDocstring:^^[[0m\n", "? \n", "! Emergency stop.\n", "l.431 ^^[\n", " [0;31mDocstring:^^[[0m\n", "Output written on notebook.pdf (1 page).\n", "Transcript written on notebook.log.\n", "\n", "[NbConvertApp] PDF successfully created\n", "[NbConvertApp] Writing 16831 bytes to ch01-code-listing.pdf\n" ] } ], "source": [ "!ipython nbconvert --to pdf ch01-code-listing.ipynb" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting custom_template.tplx\n" ] } ], "source": [ "%%writefile custom_template.tplx\n", "((*- extends 'article.tplx' -*))\n", "\n", "((* block title *)) \\title{Document title} ((* endblock title *))\n", "((* block author *)) \\author{Author's Name} ((* endblock author *))" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[TerminalIPythonApp] WARNING | Subcommand `ipython nbconvert` is deprecated and will be removed in future versions.\n", "[TerminalIPythonApp] WARNING | You likely want to use `jupyter nbconvert` in the future\n", "[NbConvertApp] Converting notebook ch01-code-listing.ipynb to pdf\n", "[NbConvertApp] Support files will be in ch01-code-listing_files/\n", "[NbConvertApp] Making directory ch01-code-listing_files\n", "[NbConvertApp] Writing 42331 bytes to notebook.tex\n", "[NbConvertApp] Building PDF\n", "[NbConvertApp] Running xelatex 3 times: ['xelatex', 'notebook.tex']\n", "[NbConvertApp] CRITICAL | xelatex failed: ['xelatex', 'notebook.tex']\n", "This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex)\n", " restricted \\write18 enabled.\n", "entering extended mode\n", "(./notebook.tex\n", "LaTeX2e <2018-04-01> patch level 2\n", "Babel <3.18> and hyphenation patterns for 84 language(s) loaded.\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/article.cls\n", "Document Class: article 2014/09/29 v1.4h Standard LaTeX document class\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/size11.clo))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/fontenc.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/t1enc.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/lm/t1lmr.fd))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/mathpazo.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/graphicx.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/keyval.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/graphics.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/trig.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics-cfg/graphics.cfg)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics-def/xetex.def)))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/caption/caption.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/caption/caption3.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/adjustbox.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/xkeyval/xkeyval.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/xkeyval/xkeyval.tex\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/xkeyval/xkvutils.tex)))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/adjcalc.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/trimclip.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/collectbox/collectbox.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/adjustbox/tc-xetex.def))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/varwidth/varwidth.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/xcolor/xcolor.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics-cfg/color.cfg))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/tools/enumerate.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/geometry/geometry.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifpdf.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifvtex.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/ifxetex/ifxetex.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsmath.sty\n", "For additional information on amsmath, use the `?' option.\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amstext.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsgen.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsmath/amsopn.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsfonts/amssymb.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/amsfonts/amsfonts.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/textcomp.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/ts1enc.def))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/upquote/upquote.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/eurosym/eurosym.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ucs/ucs.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ucs/data/uni-global.def))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/inputenc.sty\n", "\n", "Package inputenc Warning: inputenc package ignored with utf8 based engines.\n", "\n", ") (/usr/local/texlive/2018/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty\n", "Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix \n", "<2008/02/07> (tvz))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/grffile.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/kvoptions.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ltxcmds.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/infwarerr.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/etexcmds.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifluatex.sty))))\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/hyperref.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/auxhook.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/pd1enc.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/latexconfig/hyperref.cfg)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/url/url.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/hxetex.def\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/puenc.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/stringenc.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty))\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/tools/longtable.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/booktabs/booktabs.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/enumitem/enumitem.sty)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/ulem/ulem.sty)\n", "No file notebook.aux.\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/base/ts1cmr.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/t1ppl.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/caption/ltcaption.sty)\n", "*geometry* driver: auto-detecting\n", "*geometry* detected driver: xetex\n", "*geometry* verbose mode - [ preamble ] result:\n", "* driver: xetex\n", "* paper: \n", "* layout: \n", "* layoutoffset:(h,v)=(0.0pt,0.0pt)\n", "* modes: \n", "* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)\n", "* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)\n", "* \\paperwidth=614.295pt\n", "* \\paperheight=794.96999pt\n", "* \\textwidth=469.75502pt\n", "* \\textheight=650.43001pt\n", "* \\oddsidemargin=0.0pt\n", "* \\evensidemargin=0.0pt\n", "* \\topmargin=-37.0pt\n", "* \\headheight=12.0pt\n", "* \\headsep=25.0pt\n", "* \\topskip=11.0pt\n", "* \\footskip=30.0pt\n", "* \\marginparwidth=59.0pt\n", "* \\marginparsep=10.0pt\n", "* \\columnsep=10.0pt\n", "* \\skip\\footins=10.0pt plus 4.0pt minus 2.0pt\n", "* \\hoffset=0.0pt\n", "* \\voffset=0.0pt\n", "* \\mag=1000\n", "* \\@twocolumnfalse\n", "* \\@twosidefalse\n", "* \\@mparswitchfalse\n", "* \\@reversemarginfalse\n", "* (1in=72.27pt=25.4mm, 1cm=28.453pt)\n", "\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/ucs/ucsencs.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/hyperref/nameref.sty\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/gettitlestring.sty))\n", "\n", "Package hyperref Warning: Rerun to get /PageLabels entry.\n", "\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/ot1ppl.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/omlzplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/omszplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/omxzplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/psnfss/ot1zplm.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/se-ascii-print.def)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/lm/t1lmtt.fd)\n", "(/usr/local/texlive/2018/texmf-dist/tex/latex/lm/ts1lmtt.fd) [1]\n", "! Text line contains an invalid character.\n", "l.431 ^^[\n", " [0;31mDocstring:^^[[0m\n", "? \n", "! Emergency stop.\n", "l.431 ^^[\n", " [0;31mDocstring:^^[[0m\n", "Output written on notebook.pdf (1 page).\n", "Transcript written on notebook.log.\n", "\n", "[NbConvertApp] PDF successfully created\n", "[NbConvertApp] Writing 17066 bytes to ch01-code-listing.pdf\n" ] } ], "source": [ "!ipython nbconvert ch01-code-listing.ipynb --to pdf --template custom_template.tplx" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[TerminalIPythonApp] WARNING | Subcommand `ipython nbconvert` is deprecated and will be removed in future versions.\n", "[TerminalIPythonApp] WARNING | You likely want to use `jupyter nbconvert` in the future\n", "[NbConvertApp] Converting notebook ch01-code-listing.ipynb to python\n", "[NbConvertApp] Writing 5081 bytes to ch01-code-listing.py\n" ] } ], "source": [ "!ipython nbconvert ch01-code-listing.ipynb --to python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Versions" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
SoftwareVersion
Python3.6.6 64bit [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
IPython6.5.0
OSDarwin 17.3.0 x86_64 i386 64bit
numpy1.13.3
Tue Oct 02 06:08:48 2018 JST
" ], "text/latex": [ "\\begin{tabular}{|l|l|}\\hline\n", "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", "Python & 3.6.6 64bit [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE\\_401/final)] \\\\ \\hline\n", "IPython & 6.5.0 \\\\ \\hline\n", "OS & Darwin 17.3.0 x86\\_64 i386 64bit \\\\ \\hline\n", "numpy & 1.13.3 \\\\ \\hline\n", "\\hline \\multicolumn{2}{|l|}{Tue Oct 02 06:08:48 2018 JST} \\\\ \\hline\n", "\\end{tabular}\n" ], "text/plain": [ "Software versions\n", "Python 3.6.6 64bit [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]\n", "IPython 6.5.0\n", "OS Darwin 17.3.0 x86_64 i386 64bit\n", "numpy 1.13.3\n", "Tue Oct 02 06:08:48 2018 JST" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%reload_ext version_information\n", "%version_information numpy" ] } ], "metadata": { "kernelspec": { "display_name": "py36", "language": "python", "name": "py36" }, "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }