{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# NumPy\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Создание Numpy массивов" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 2. 3.]\n", "\n", "[-1. -1. -1. -1. -1. -1. -1. -1. -1. -1.]\n", "\n", "[[ 0. 0. 0. 0. 0.]\n", " [ 0. 0. 0. 0. 0.]\n", " [ 0. 0. 0. 0. 0.]]\n", "\n", "[[[ 1. 1.]\n", " [ 1. 1.]]\n", "\n", " [[ 1. 1.]\n", " [ 1. 1.]]]\n", "\n", "[[ 1. 0. 0. 0. 0.]\n", " [ 0. 1. 0. 0. 0.]\n", " [ 0. 0. 1. 0. 0.]\n", " [ 0. 0. 0. 1. 0.]\n", " [ 0. 0. 0. 0. 1.]]\n", "(3, 5)\n" ] } ], "source": [ "import numpy as np\n", "\n", "a = np.array([1,2,3], float) # Однмемерный массив из списка \n", "b = np.repeat(-1. ,10) # Массив полученные повоторением исходного объекта\n", "c = np.zeros((3, 5)) # Матрица из нулей размера 3х5\n", "d = np.ones((2, 2, 2)) # Трехмерный массив из единиц\n", "e = np.eye(5) # Единичная матрица\n", "print(a, b, c, d, e, sep='\\n\\n')\n", "print(c.shape) # Возвращает размерность массива, для двумерного это количество строк и столбцов" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Арифметические операции с массивами и векторизация\n", "\n", "Полезной особенностью numpy-массивов является так называемая _векторизация_ --- возможность делать быстрые поэлементные операции с массивами без использования цикла `for`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6. 4. 9.]\n", "[-4. 0. -3.]\n", "[ 5. 4. 18.]\n", "[ 5. 1. 2.]\n", "[ 1. 0. 3.]\n", "[ 5. 4. 216.]\n", "[ 1. 1.41421356 1.73205081]\n", "6.0\n", "60.0\n", "27.0\n", "[False False False]\n", "[ 1. 2. 0.33333333]\n" ] } ], "source": [ "a = np.array([1,2,3], float)\n", "b = np.array([5,2,6], float)\n", "print(a + b)\n", "print(a - b)\n", "print(a * b)\n", "print(b / a)\n", "print(a % b)\n", "print(b ** a)\n", "print(np.sqrt(a))\n", "print(np.sum(a))\n", "print(np.prod(b))\n", "print(a.dot(b)) # Скалярное произведение\n", "print(a > b)\n", "print(np.where(a != 2, 1 / a, a))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Линейная алгебра\n", "\n", "NumPy также предоставляет набор встроенных функций и методов для работы с линейной алгеброй. Это всё можно найти в под-модуле `linalg`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-48.0\n", "[ 8.85591316 1.9391628 -2.79507597]\n", "[[-0.3663565 -0.54736745 0.25928158]\n", " [-0.88949768 0.5640176 -0.88091903]\n", " [-0.27308752 0.61828231 0.39592263]]\n" ] } ], "source": [ "a = np.array([[4, 2, 0], [9, 3, 7], [1, 2, 1]], float)\n", "b = a.T # Транспонированый массив\n", "print(np.linalg.det(a)) # Ищем детерминант \n", "vals, vecs = np.linalg.eig(a)\n", "print(vals)\n", "print(vecs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Операции с индексами \n", "Оперативная память компьютера линейна, и поэтому даже многомерные массивы, на самом деле являются некоторыми линейными структурами, над которыми существуют система индексов, говорящих как именно читать этот линейный блок. Проведение операций над индексами в большистве случаев эффективно и поэтому операции смены размерности массива или транспонирования выполняются быстро" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 3]\n", " [2 4]]\n" ] } ], "source": [ "a = np.asarray([[1,2], [3,4]])\n", "b = a.T # Транспонированый массив\n", "print(b)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[10 3]\n", " [ 2 4]]\n" ] } ], "source": [ "b[0,0] = 10\n", "print(b)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[10 2]\n", " [ 3 4]]\n" ] } ], "source": [ "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как мы видим при изменени переменной `b` изменилась переменная `a`. Это произошло потому, что обе эти переменные использубют один и тот же кусок памяти, но по разному " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Чтение даных\n", "\n", "Numpy также предоставляет функционал для чтения данных, который бывает весьма полезен" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0.],\n", " [ 1., 1.],\n", " [ 2., 4.],\n", " [ 3., 9.],\n", " [ 4., 16.],\n", " [ 5., 25.],\n", " [ 6., 36.],\n", " [ 7., 49.],\n", " [ 8., 64.],\n", " [ 9., 81.]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = np.loadtxt('./data/data.txt')\n", "data" ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "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.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }