{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Scientific modules and IPython"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nikolay Koldunov\n",
"\n",
"\n",
"koldunovn@gmail.com"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is part of [**Python for Geosciences**](https://github.com/koldunovn/python_for_geosciences) notes."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pylab as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Core scientific packages"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When people say that they do their scientific computations in Python it's only half true. Python is a construction set, similar to MITgcm or other models. Without packages it's only a core, that although very powerful, does not seems to be able to do much by itself.\n",
"\n",
"There is a set of packages, that almost every scientist would need:\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are going to talk about all exept Sympy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Installation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Installation instructions can be found in the README.md file of this repository. Better to use [rendered version from GitHub](https://github.com/koldunovn/python_for_geosciences/blob/master/README.md).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## IPython"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to be productive you need comfortable environment, and this is what IPython provides. It was started as enhanced python interactive shell, but with time become architecture for interactive computing."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Jupyter notebook "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since the 0.12 release, IPython provides a new rich text web interface - IPython notebook. Here you can combine:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Code execution"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I love Python\n"
]
}
],
"source": [
"print('I love Python')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Text (Markdown)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"IPython [website](http://ipython.org/).\n",
"\n",
"List:\n",
"\n",
"* [Python on Codeacademy](http://www.codecademy.com/tracks/python)\n",
"* [Google's Python Class](https://developers.google.com/edu/python/)\n",
"\n",
"Code:\n",
"\n",
" print('hello world')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### $\\LaTeX$ equations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\int_0^\\infty e^{-x^2} dx=\\frac{\\sqrt{\\pi}}{2}$$\n",
"$$\n",
"F(x,y)=0 ~~\\mbox{and}~~\n",
"\\left| \\begin{array}{ccc}\n",
" F''_{xx} & F''_{xy} & F'_x \\\\\n",
" F''_{yx} & F''_{yy} & F'_y \\\\\n",
" F'_x & F'_y & 0 \n",
" \\end{array}\\right| = 0\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Plots"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"