{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# библиотека NumPy\n",
"\n",
"автор: Дьяконов Александр www.dyakonov.org/ag/\n",
"\n",
"для поддержки курсов автора, в частности https://github.com/Dyakonov/IML"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"# подгружаем все нужные пакеты\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# для встроенных картинок\n",
"%pylab inline\n",
"# чуть покрасивше картинки:\n",
"plt.style.use('seaborn-dark')\n",
"plt.rc('font', size=14)\n",
"\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"pd.set_option('display.max_columns', None)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"plt.rc('font', size=14)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.15.1'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"np.__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Создание вектора"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([0., 1., 2., 3.]), array([0, 1, 2, 3]), array([0, 1, 2, 3]))"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = np.array([0, 1, 2, 3], dtype='float')\n",
"b = np.array(range(4))\n",
"c = np.arange(4)\n",
"\n",
"a, b, c"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"206 µs ± 1.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
]
}
],
"source": [
"%timeit z = [x ** 2 for x in range(1000)]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.97 µs ± 31.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n"
]
}
],
"source": [
"%timeit z = np.arange(1000) ** 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## создание разные векторов"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3.14 3.14 3.14 3.14 3.14]\n",
"[1 4 7]\n",
"[0. 0.25 0.5 0.75 1. ]\n",
"[1. 1. 1.]\n",
"[1 1 1]\n",
"[[1. 1.]\n",
" [1. 1.]]\n",
"[0. 0. 0.]\n",
"[1. 1. 1. 1.]\n",
"[0.77132064 0.02075195 0.63364823 0.74880388]\n",
"[-1.54540029 -0.00838385 0.62133597 -0.72008556]\n",
"[0 2 0 4 3 0 4 3 0 3]\n",
"[1 2 1 2 1 2]\n",
"[0. 0. 0.]\n"
]
},
{
"data": {
"text/plain": [
"array([4, 4, 3, 2, 2])"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print (np.full(5, 3.14)) # заполнить одним элементом\n",
"print (np.arange(1, 10, 3))\n",
"print (np.linspace(0, 1, 5))\n",
"print (np.ones(3))\n",
"print (np.ones(3, dtype=int))\n",
"print (np.ones((2, 2)))\n",
"print (np.zeros(3))\n",
"print (np.empty(4))\n",
"np.random.seed(10) \n",
"print (np.random.rand(4))\n",
"print (np.random.randn(4))\n",
"print (np.random.randint(0, 5, 10))\n",
"print (np.tile([1, 2], 3))\n",
"print (np.empty(3)) # просто массив из 3х элементов\n",
"np.random.choice([2, 3, 4], 5, replace=True)"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 1, 2, 2])"
]
},
"execution_count": 137,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.choose([0,1,0,1,1], [[1,1,1,1,1], [2,2,2,2,2]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Динамическая типизация"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"int64\n",
"float64\n",
"complex128\n",
"bool\n"
]
}
],
"source": [
"x = np.array([1, 2])\n",
"print (x.dtype)\n",
"x = x + 0.0 # x += 0.0 конкретно здесь не сработает\n",
"print (x.dtype)\n",
"x = x + 2j\n",
"print (x.dtype)\n",
"x = x > 0\n",
"print (x.dtype)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1. 0. 1. 2. 2.]\n",
"[0 0 1 1 1]\n",
"[-1. 0. 1. 2. 2.]\n",
"[-1 0 1 2 2]\n"
]
}
],
"source": [
"x = np.array([-0.6, 0.4, 1.4, 1.5, 1.6])\n",
"print (np.round(x))\n",
"print (x.astype(int))\n",
"print (np.round(x))\n",
"print (np.round(x).astype(int))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## сравнения"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[False True False]\n",
"[False False True]\n",
"False\n",
"True\n"
]
}
],
"source": [
"x = np.array([1, 3, 2])\n",
"y = np.array([2, 1, 2])\n",
"\n",
"print (x > y)\n",
"print (x == y)\n",
"print (np.array_equal(x, y))\n",
"print (np.array_equal(x, x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# создание матрицы"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2\n",
"0 0 1 2\n",
"1 3 4 5"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"b = np.array([[0, 1, 2], [3, 4, 5]])\n",
"\n",
"pd.DataFrame(b)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2\n",
"0 0 1 2\n",
"1 3 4 5"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = np.arange(6).reshape(2, 3)\n",
"pd.DataFrame(a)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1. 0. 0.]\n",
" [0. 1. 0.]\n",
" [0. 0. 1.]]\n"
]
}
],
"source": [
"# матрицы\n",
"\n",
"print (np.eye(3))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ndim: 3\n",
"shape: (3, 4, 5)\n",
"size: 60\n",
"dtype: int64\n",
"itemsize: 8 bytes\n",
"nbytes: 480 bytes\n"
]
}
],
"source": [
"# многомерные матрицы\n",
"\n",
"x = np.random.randint(10, size=(3, 4, 5))\n",
"\n",
"print(\"ndim: \", x.ndim)\n",
"print(\"shape:\", x.shape)\n",
"print(\"size: \", x.size)\n",
"print(\"dtype:\", x.dtype)\n",
"print(\"itemsize:\", x.itemsize, \"bytes\")\n",
"print(\"nbytes:\", x.nbytes, \"bytes\")"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1. 1. 1. 1. 1.]\n",
" [ 0. 1. 1. 1. 1.]\n",
" [ 0. 0. 1. 1. 1.]\n",
" [ 0. 0. 0. 1. 1.]\n",
" [ 0. 0. 0. 0. 1.]]\n",
"[[ 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0.]\n",
" [ 1. 0. 0. 0. 0.]\n",
" [ 1. 1. 0. 0. 0.]\n",
" [ 1. 1. 1. 0. 0.]]\n",
"[[ 0. 1. 1. 1. 1.]\n",
" [ 0. 0. 1. 1. 1.]\n",
" [ 0. 0. 0. 1. 1.]\n",
" [ 0. 0. 0. 0. 1.]\n",
" [ 0. 0. 0. 0. 0.]]\n"
]
}
],
"source": [
"print (np.triu(np.ones((5,5))))\n",
"print (np.tril(np.ones((5,5)), k=-2))\n",
"print (np.triu(np.ones((5,5)).T, k=1))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# присваивание, индексирование\n",
"\n",
"индексация как в списках"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 3, 2, 3, 4])"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.arange(5, dtype='int')\n",
"x[1] = 3.14 # округление\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0, 1, 10, 10, -1])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.arange(5, dtype='int')\n",
"x[2:] = 10\n",
"x[-1] = -1\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0., 0., 0.],\n",
" [0., 1., 0.],\n",
" [0., 0., 0.]])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# опасность - не происходит копирования\n",
"x = np.zeros((3,3))\n",
"x2 = x[1:, 1:] # надо .copy()\n",
"x2[0, 0] = 1\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1., 0., 1.])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# опасность - не происходит копирования\n",
"x = np.ones(3)\n",
"x2 = x[1:]\n",
"x2[0] = 0\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.may_share_memory(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9]), True)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.arange(10)\n",
"y = x[::2]\n",
"y[0] = 100\n",
"x, np.may_share_memory(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 5, 6])"
]
},
"execution_count": 108,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.arange(10)\n",
"i = [2, 5, 6]\n",
"x[i]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Поэлементные операции"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3 3 3]\n",
"[-1 1 3]\n",
"[2 2 0]\n",
"[0.5 2. inf]\n",
"[1 2 1]\n",
"[0.84147098 0.90929743 0.14112001]\n",
"[ 2.71828183 7.3890561 20.08553692]\n",
"[0. 0.69 1.1 ]\n"
]
}
],
"source": [
"x = np.array([1, 2, 3])\n",
"y = np.array([2, 1, 0])\n",
"\n",
"print (x + y)\n",
"print (x - y)\n",
"print (x * y)\n",
"print (x / y)\n",
"print (x ** y)\n",
"\n",
"print (np.sin(x))\n",
"print (np.exp(x))\n",
"print (np.log(x).round(2))"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2 3 4]\n",
"[2 4 8]\n"
]
}
],
"source": [
"print (x + 1)\n",
"print (2 ** x)\n",
"#print (x + np.array([1, 2])) ошибка"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## графики"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"