{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "ADioeXA4e9DY" }, "source": [ "# Python для анализа данных" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "Qri5nDu-eSXQ" }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "id": "w5l3lSPkeSXN" }, "source": [ "# Библиотека `numpy`\n", "\n", "![440px-NumPy_logo_2020.svg.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbgAAADGCAYAAACglZW2AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAlWklEQVR42u3deXxU1d0/8M/33smGKG5Y99YFq6JmJkld20etW9FMKMKkah+X6mNsa11QSIKADFghiVgVt4JtRXHBBBBmAqiPFq21VZ+QSbBxKa517c8FqpBlZu79/v5IUGTLnczNZGbyeb9evl4CM3c599zzuefOvecARERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERElKaERdDPVMW/qKVMgDOg9u2h8uI3WShERAy4jDZ6cfPpti2zAJT0/JUNYLFlyZQV53n/yRIiImLAZXqwbYlBR0TEgMuqYNtm0KlgcuM431qWIBERAy59qErp4jWlovaNCQQbg46IiAGX3sFmqE5TaLFLS41BZKFCb2LQEREx4LIh2LYZdGJbM/jUJRERAy4bgo1BR0TEgMvqYGPQEREx4Po32MS2ghApSpOtikFkoRmPT196XslbPEhERAy4TA82Bh0RUYIMFsG3ndXw6m6AfRrEODKNNzMHqhdaplHnDzcN4VEjImIPzrExS1r3ilvWdYBcDaAgvXqZ8iJgV4fLi57jkSIiYsAlGXTGNYDmD/DRek0U00IBXwOPDBERA84Vox995QDbY00AUJHyoBN9X2zjt3n45x8bysstHg0iIgZcpgfd54Dc8tWGdXc8+4tTO1n6REQMuK8Fg2qsPqp1HFR32ecL64F5V5TE3Fiuv77pQIjnekCvAJDn8mZvBPSufLVnNZSX/MeNBZbVr/5JzPT8Y+XYwg9Y7YmIAZfhwdZ01JpzRO3pAHw9f/2eKG6LDR36+5Vnj+hyYz1nL27+rmkb17kUdDEI7rfs2LQV5cd+4kqwLY6cpBZmQvBfAKIQzI+LcRODjogYcNkRbFt6T1Rmfjl83Z+ePfXUuGtBp3IDFJcC8CT4dRvAYtOyJrn1Xtvo+jVH22JNBRDYxj8z6IiIAZdpwWaoPUMBr8O9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)\n", "\n", "Пакет `numpy` предоставляет $n$-мерные однородные массивы (все элементы одного типа); в них нельзя вставить или удалить элемент в произвольном месте. В `numpy` реализовано много операций над массивами в целом. Если задачу можно решить, произведя некоторую последовательность операций над массивами, то это будет столь же эффективно, как в `C` или `matlab` — львиная доля времени тратится в библиотечных функциях, написанных на `C`.\n", "\n", "\n", "## 1. Одномерные массивы\n", "\n", "#### 1.1 Типы массивов, атрибуты" ] }, { "cell_type": "markdown", "metadata": { "id": "4OYggcLMeSXY" }, "source": [ "Можно преобразовать список в массив." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "60DzfgyMeSXa", "outputId": "a03727c2-4295-43f2-d0ec-07ff0863bc6e" }, "outputs": [ { "data": { "text/plain": [ "(array([ 5, 7, -3, 4, 2, -4]), numpy.ndarray)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.array([5, 7, -3, 4, 2, -4])\n", "a, type(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "G1DRYeu5eSX0" }, "source": [ "#### 1.2 Индексация\n", "\n", "Индексировать массив можно обычным образом." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Y9tGXwDIeSX1", "outputId": "cb25adaf-3e7c-4ff2-afb3-e86186d9e949" }, "outputs": [ { "data": { "text/plain": [ "np.int64(7)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[1]" ] }, { "cell_type": "markdown", "metadata": { "id": "rmKD1RweeSX3" }, "source": [ "Массивы — изменяемые объекты." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QlkGiSjxeSX3", "outputId": "8bb4dfec-01c5-40f0-d378-852198c3c626" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 5 3 -3 4 2 -4]\n" ] } ], "source": [ "a[1] = 3\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "emMTo7dI3Ovd" }, "source": [ "Хотим удалить из него отрицательные значения." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gnEca4_-3Ove", "outputId": "b6cbc36c-d379-4a3f-bf3e-899b7089db66" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True False True True False]\n", "[5 3 4 2]\n" ] } ], "source": [ "print(a > 0)\n", "print(a[a > 0])" ] }, { "cell_type": "markdown", "metadata": { "id": "6n7n_2-n3Ove" }, "source": [ "Кроме того, отфильтрованные значения можно заполнить, например, нулями." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3gF4sDRQ3Ove", "outputId": "8060fa35-02b1-4b44-d3a6-1934691e1c01" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[5 3 0 4 2 0]\n" ] } ], "source": [ "a[a < 0] = 0\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "ViI6VqnXeSYE" }, "source": [ "#### 1.3 Создание массивов\n", "\n", "Массивы, заполненные нулями или единицами. Часто лучше сначала создать такой массив, а потом присваивать значения его элементам." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "V8yK0FLteSYF", "outputId": "278ad938-6cdd-428a-d9be-d808c509d120" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0.]\n", "[1 1 1]\n" ] } ], "source": [ "a = np.zeros(3)\n", "b = np.ones(3, dtype=np.int64)\n", "print(a)\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "-nnOn0gNeSYL" }, "source": [ "Функция `arange` подобна `range`. Аргументы могут быть с плавающей точкой. Следует избегать ситуаций, когда *(конец-начало)/шаг* — целое число, потому что в этом случае включение последнего элемента зависит от ошибок округления. Лучше, чтобы конец диапазона был где-то посредине шага." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gqTdkX18eSYL", "outputId": "478de6cf-8ae3-4432-ffcc-37332b82a066" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 2 4 6 8]\n", "[0. 2. 4. 6. 8.]\n" ] } ], "source": [ "a = np.arange(0, 9, 2)\n", "b = np.arange(0., 9, 2)\n", "print(a)\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "vgPAKPaqeSYP" }, "source": [ "Последовательности чисел с постоянным шагом можно также создавать функцией `linspace`. Начало и конец диапазона включаются; последний аргумент — число точек." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "l1ruNluSeSYP", "outputId": "00c64d37-44a6-405c-c235-92bde302958e", "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 2. 4. 6. 8.]\n" ] } ], "source": [ "a = np.linspace(0, 8, 5)\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "7t8OsUzt3Ovf" }, "source": [ "Функция `np.random.random()`.\n", "Данная функция создает массив указанной формы и заполняет его случайными числами с плавающей точкой из непрерывного равномерного распределения в интервале [0, 1)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "K9nQT1HY3Ovg", "outputId": "a5293cce-2105-4c68-e495-bd22be6584b3" }, "outputs": [ { "data": { "text/plain": [ "array([0.28194415, 0.10660636, 0.3367799 , 0.66343749, 0.79696398])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.random(5)" ] }, { "cell_type": "markdown", "metadata": { "id": "QFhzbGhb3Ovg" }, "source": [ "Функция `np.random.choice`.\n", "Генерирует случайную выборку из заданного одномерного массива." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ffjn77Hd3Ovg", "outputId": "dbe6b448-35ce-472a-f244-20e0504689f2" }, "outputs": [ { "data": { "text/plain": [ "array([6, 9, 1, 5])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.choice(10, 4)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iVEbZETZ3Ovg", "outputId": "9029dbf0-b7d6-4c4d-d6fd-823866abc62c" }, "outputs": [ { "data": { "text/plain": [ "array([5, 0, 8, 3, 2, 2, 0])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.choice(10, 7, replace=True)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6OidJf3_3Ovh", "outputId": "1ab8ed83-bc27-4d3e-bd2c-d79882d9f426" }, "outputs": [ { "data": { "text/plain": [ "array(['foo', 'bar'], dtype=' b)\n", "print(a == b)" ] }, { "cell_type": "markdown", "metadata": { "id": "vQ05bHN4eSYo" }, "source": [ "Кванторы \"существует\" и \"для всех\"." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "HTMkK7wYeSYo", "outputId": "fc93a0d1-47a9-4e21-dd2e-30c38550bb6c" }, "outputs": [ { "data": { "text/plain": [ "(np.True_, np.False_)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.any(a == b), np.all(a == b)" ] }, { "cell_type": "markdown", "metadata": { "id": "YdXbXq--eSYp" }, "source": [ "Модификация на месте." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iNT_nYSveSYq", "outputId": "487b93fa-4c98-4226-ec2d-e8be873ce59c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 2 1]\n", "[1 3 2]\n" ] } ], "source": [ "print(a)\n", "a += 1\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CItC6JrLeSYr", "outputId": "61f4a55f-da5b-4164-f0b3-e55eb8c47389" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3 2 5]\n", "[ 6 4 10]\n" ] } ], "source": [ "print(b)\n", "b *= 2\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "JtiaPtiGeSYu" }, "source": [ "При выполнении операций над массивами деление на 0 не возбуждает исключения, а даёт значения `np.nan` или `np.inf`." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uksiTX96eSYu", "outputId": "37ed7b87-2c42-4b43-d700-c579742a92c0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. nan inf -inf]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_28824/3088186758.py:1: RuntimeWarning: divide by zero encountered in divide\n", " print(np.array([0.0, 0.0, 1.0, -1.0]) / np.array([1.0, 0.0, 0.0, 0.0]))\n", "/tmp/ipykernel_28824/3088186758.py:1: RuntimeWarning: invalid value encountered in divide\n", " print(np.array([0.0, 0.0, 1.0, -1.0]) / np.array([1.0, 0.0, 0.0, 0.0]))\n" ] } ], "source": [ "print(np.array([0.0, 0.0, 1.0, -1.0]) / np.array([1.0, 0.0, 0.0, 0.0]))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sXwqQVDHeSYw", "outputId": "0ecb63d5-f780-4ac2-b826-50db4536b8bb" }, "outputs": [ { "data": { "text/plain": [ "(nan, inf, nan, 0.0)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.nan + 1, np.inf + 1, np.inf * 0, 1. / np.inf" ] }, { "cell_type": "markdown", "metadata": { "id": "ukM-LTuAeSYx" }, "source": [ "Сумма и произведение всех элементов массива; максимальный и минимальный элемент; среднее и среднеквадратичное отклонение." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZIo9nEFCeSYx", "outputId": "4d1170a6-ca34-4ba3-9fec-cefb2f6930ba" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6 4 10]\n" ] }, { "data": { "text/plain": [ "(np.int64(20),\n", " np.int64(240),\n", " np.int64(10),\n", " np.int64(4),\n", " np.float64(6.666666666666667),\n", " np.float64(2.494438257849294))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(b)\n", "b.sum(), b.prod(), b.max(), b.min(), b.mean(), b.std()" ] }, { "cell_type": "markdown", "metadata": { "id": "rju3ggwJeSYy" }, "source": [ "Имеются встроенные функции." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "H3xDbf6PeSYz", "outputId": "baec065c-9065-42d7-cd91-e134f188ad3f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2.44948974 2. 3.16227766]\n", "[ 403.42879349 54.59815003 22026.46579481]\n", "[1.79175947 1.38629436 2.30258509]\n", "[-0.2794155 -0.7568025 -0.54402111]\n", "2.718281828459045 3.141592653589793\n" ] } ], "source": [ "print(np.sqrt(b))\n", "print(np.exp(b))\n", "print(np.log(b))\n", "print(np.sin(b))\n", "print(np.e, np.pi)" ] }, { "cell_type": "markdown", "metadata": { "id": "g6EBDaBWeSY0" }, "source": [ "Иногда бывает нужно использовать частичные (кумулятивные) суммы. В наших курсах такое может пригодиться." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JzFVH5DIeSY0", "outputId": "0314f209-9510-4f7e-f65d-09119992fafd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6 10 20]\n" ] } ], "source": [ "print(b.cumsum())" ] }, { "cell_type": "markdown", "metadata": { "id": "dyaDa9YXeSY1" }, "source": [ "#### 2.2 Сортировка, изменение массивов\n", "\n", "Функция `sort` возвращает отсортированную копию, метод `sort` сортирует на месте." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XS7IRW09eSY2", "outputId": "f6228618-b2a8-4041-a7ae-e10214852c84" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6 4 10]\n", "[ 4 6 10]\n", "[ 6 4 10]\n" ] } ], "source": [ "print(b)\n", "print(np.sort(b))\n", "print(b)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QENzFihJeSY3", "outputId": "20d00e78-04b9-4470-f638-2de205afc226" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6 4 10]\n", "[ 4 6 10]\n" ] } ], "source": [ "print(b)\n", "b.sort()\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "ZPjBXM_OeSY4" }, "source": [ "Объединение массивов." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_SYn0MdseSY4", "outputId": "e8a0d1ee-e7f3-4be2-e0e0-20c16fc72202" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 3 2]\n", "[ 4 6 10]\n", "[ 1 3 2 4 6 10]\n" ] } ], "source": [ "print(a)\n", "print(b)\n", "a = np.hstack((a, b))\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "q669pBe0eSY_" }, "source": [ "#### 2.3 Способы индексации массивов\n", "\n", "Есть несколько способов индексации массива. Вот обычный индекс." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "oW8SgWFLeSZA", "outputId": "f070500a-badc-48d6-d7a7-f60e5760d22b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n" ] } ], "source": [ "a = np.linspace(0, 1, 11)\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7eQ_xryueSZB", "outputId": "a03b4e1c-2b57-4816-a11c-c5eea54efa9d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.2\n" ] } ], "source": [ "print(a[2])" ] }, { "cell_type": "markdown", "metadata": { "id": "corcUOljeSZC" }, "source": [ "Диапазон индексов. Создаётся новый заголовок массива, указывающий на те же данные. Изменения, сделанные через такой массив, видны и в исходном массиве." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "g7sRF3GqeSZC", "outputId": "c0f0da24-fab0-45f6-f0a2-2a642a72249c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.2 0.3 0.4 0.5]\n", "[-0.2 0.3 0.4 0.5]\n", "[ 0. 0.1 -0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n" ] } ], "source": [ "b = a[2:6]\n", "print(b)\n", "\n", "b[0] = -0.2\n", "print(b)\n", "\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "lE9gziSweSZG" }, "source": [ "Диапазон с шагом 2." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wLEQPJsXeSZH", "outputId": "d9c1120d-97bf-472b-9720-a5e2d7c25b6b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.1 0.3 0.5 0.7 0.9]\n" ] } ], "source": [ "b = a[1:10:2]\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "Nh9e4ZWNeSZK" }, "source": [ "Массив в обратном порядке." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LKbKi90neSZK", "outputId": "aa8126fe-1a81-4dcb-dc57-1c83e9f983f2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 0.9 0.8 0.7 0.6 0.5 0.4 0.3 -0.2 0.1 0. ]\n" ] } ], "source": [ "b = a[::-1]\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "Zjq__bNXeSZP" }, "source": [ "Чтобы скопировать и данные массива, нужно использовать метод `copy`." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VVds6EI5eSZP", "outputId": "480a6d30-e8fd-4c51-b7fc-c9f6b2e45068" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.1 0. 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n", "[ 0. 0.1 -0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n" ] } ], "source": [ "b = a.copy()\n", "b[2] = 0\n", "print(b)\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "2ynzvLTmeSZR" }, "source": [ "Можно задать список индексов." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "id": "fRF4VWZmeSZR" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.2 0.3 0.5]\n" ] } ], "source": [ "print(a[[2, 3, 5]])" ] }, { "cell_type": "markdown", "metadata": { "id": "JF2kGGHDeSZT" }, "source": [ "Можно задать булев массив той же величины." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "id": "yeFzrHxfeSZT", "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False True False True True True True True True True True]\n" ] } ], "source": [ "b = a > 0\n", "print(b)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "id": "CS_Xass1eSZU" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.1 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n", "[ 0. 0.1 -0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n", "[False True False True True True True True True True True]\n" ] } ], "source": [ "print(a[b])\n", "print(a)\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": { "id": "DUBkecfkeSZW" }, "source": [ "## 3. Двумерные массивы\n", "\n", "#### 3.1 Создание, простые операции" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kELaHm5YeSZW", "outputId": "d5644e82-f679-4878-e416-42df3b986f92" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0. 1.]\n", " [-1. 0.]]\n", "-1.0\n" ] } ], "source": [ "a = np.array([[0.0, 1.0], [-1.0, 0.0]])\n", "print(a)\n", "print(a[1, 0])" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0TUKspWjeSZZ", "outputId": "673e25c7-a442-456d-da85-bc65b0f4957a" }, "outputs": [ { "data": { "text/plain": [ "(2, 2)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.shape" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "mH7fe1FkeSZa", "outputId": "56251c84-be12-4d7d-eeef-b8cca8bfae74" }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "jWVJLH9ZeSZh" }, "source": [ "Можно растянуть в одномерный массив." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "aJdF4hyreSZi", "outputId": "b6d87e4d-c6b5-4a82-b982-e73537165700" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 1. -1. 0.]\n" ] } ], "source": [ "print(a.ravel())" ] }, { "cell_type": "markdown", "metadata": { "id": "ff31TTeHeSZj" }, "source": [ "Арифметические операции поэлементные." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "a6WXKEj4eSZj", "outputId": "ec1259f0-3491-44c1-f6be-cd0dea07fc15" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 2.]\n", " [0. 1.]]\n", "[[ 0. 2.]\n", " [-2. 0.]]\n", "[[ 0. 2.]\n", " [-1. 1.]]\n", "[[0. 1.]\n", " [1. 2.]]\n", "[[ 1. -4.]\n", " [-4. 8.]]\n" ] } ], "source": [ "print(a + 1)\n", "print(a * 2)\n", "print(a + [0, 1]) # второе слагаемое дополняется до матрицы копированием строк\n", "print(a + np.array([[0, 2]]).T) # .T - транспонирование\n", "\n", "b = np.array([[1.0, -5.0], [-3.0, 8.0]])\n", "print(a + b)" ] }, { "cell_type": "markdown", "metadata": { "id": "nLIlrz-BeSZl" }, "source": [ "#### 3.2 Работа с матрицами\n", "\n", "Поэлементное и матричное умножение." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xAUzdffSeSZl", "outputId": "2dbeb579-5105-48bb-9feb-12ce02f15d63" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0. -5.]\n", " [ 3. 0.]]\n" ] } ], "source": [ "print(a * b)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GAI2uX5PeSZn", "outputId": "50ccf93c-20c0-457c-b5e9-ab3c00f0d802" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-3. 8.]\n", " [-1. 5.]]\n" ] } ], "source": [ "print(a @ b)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6ERS9kXLeSZp", "outputId": "76a44c70-534a-4eb8-9271-cf950297709f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 5. 1.]\n", " [-8. -3.]]\n" ] } ], "source": [ "print(b @ a)" ] }, { "cell_type": "markdown", "metadata": { "id": "KwK4g9gZeSaA" }, "source": [ "Единичная матрица." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ST8KOHBWeSaB", "outputId": "b20ac614-d4d1-4e53-99d0-2e0b39a5d00d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0. 0.]\n", " [0. 1. 0. 0.]\n", " [0. 0. 1. 0.]\n", " [0. 0. 0. 1.]]\n" ] } ], "source": [ "I = np.eye(4)\n", "print(I)" ] }, { "cell_type": "markdown", "metadata": { "id": "zDOuMhIzeSaC" }, "source": [ "Метод `reshape`." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iV0R_x39eSaC", "outputId": "5eb58827-ccc1-44e9-a13a-533c604a036f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1.]\n" ] } ], "source": [ "print(I.reshape(16))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uIEi4h1MeSaD", "outputId": "b2115a77-15f9-4f30-96c3-3bd8eb13e204" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0. 0. 0. 1. 0. 0.]\n", " [0. 0. 1. 0. 0. 0. 0. 1.]]\n" ] } ], "source": [ "print(I.reshape(2, 8))" ] }, { "cell_type": "markdown", "metadata": { "id": "HfQZjZZleSaE" }, "source": [ "Строка." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dU-B5CsdeSaE", "outputId": "60595b08-120f-4fe0-dc1f-7dcc14e3b197" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 1. 0. 0.]\n" ] } ], "source": [ "print(I[1])" ] }, { "cell_type": "markdown", "metadata": { "id": "V6lshMkHeSaH" }, "source": [ "Столбец." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "orbMt6WMeSaH", "outputId": "cbd660ee-cdba-4595-85e4-109706cde7e1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 1. 0.]\n" ] } ], "source": [ "print(I[:, 2])" ] }, { "cell_type": "markdown", "metadata": { "id": "nqnUtI-SeSaI" }, "source": [ "Подматрица." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "p8ycTAw3eSaI", "outputId": "868c26e6-726e-4e79-9c74-efd0cfda2ba8", "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0.]\n", " [1. 0.]]\n" ] } ], "source": [ "print(I[0:2, 1:3])" ] }, { "cell_type": "markdown", "metadata": { "id": "OFz0xwrreSaL" }, "source": [ "Транспонированная матрица." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Z4J5zzvNeSaL", "outputId": "67475b6a-0bac-4452-fc0d-51722b42f6a2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. -3.]\n", " [-5. 8.]]\n" ] } ], "source": [ "print(b.T)" ] }, { "cell_type": "markdown", "metadata": { "id": "yGeRknu3eSaM" }, "source": [ "Соединение матриц по горизонтали и по вертикали." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ObH0A6B3eSaM", "outputId": "9e711514-e2c5-4496-f0b2-f36a443be012" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1]\n", " [2 3]]\n", "[[4 5 6]\n", " [7 8 9]]\n", "[[4 5]\n", " [6 7]\n", " [8 9]]\n" ] } ], "source": [ "a = np.array([[0, 1], [2, 3]])\n", "b = np.array([[4, 5, 6], [7, 8, 9]])\n", "c = np.array([[4, 5], [6, 7], [8, 9]])\n", "print(a)\n", "print(b)\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0cpapPNveSaN", "outputId": "476034c1-18b5-410b-e2d8-7b2b9e715f71" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 4 5 6]\n", " [2 3 7 8 9]]\n" ] } ], "source": [ "print(np.hstack((a, b)))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EPxXHWTAeSaO", "outputId": "5f85e045-fabd-4b8c-ffe6-be7664468ede" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1]\n", " [2 3]\n", " [4 5]\n", " [6 7]\n", " [8 9]]\n" ] } ], "source": [ "print(np.vstack((a, c)))" ] }, { "cell_type": "markdown", "metadata": { "id": "i3SBcbGzeSaP" }, "source": [ "Сумма всех элементов; суммы столбцов; суммы строк." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "V4Mgz9GIe0iL", "outputId": "88b3d22a-d71c-4fad-f134-c25a24471f23" }, "outputs": [ { "data": { "text/plain": [ "array([[4, 5, 6],\n", " [7, 8, 9]])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kQLBs3mHeSaP", "outputId": "79299428-0996-4211-b731-79b77e1e8313" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "39\n", "[11 13 15]\n", "[15 24]\n" ] } ], "source": [ "print(b.sum())\n", "print(b.sum(axis=0))\n", "print(b.sum(axis=1))" ] }, { "cell_type": "markdown", "metadata": { "id": "rc8otaIBeSaQ" }, "source": [ "Аналогично работают `prod`, `max`, `min` и т.д." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "822so2-9eSaQ", "outputId": "9ed50917-5ad7-4e84-8a8d-4d086e43d763" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n", "[7 8 9]\n", "[4 7]\n" ] } ], "source": [ "print(b.max())\n", "print(b.max(axis=0))\n", "print(b.min(axis=1))" ] }, { "cell_type": "markdown", "metadata": { "id": "AlzAeJI-eSaR" }, "source": [ "След - сумма диагональных элементов." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-BlaKobheSaR", "outputId": "41709f85-0265-4f22-b504-9b2e358fb6a4" }, "outputs": [ { "data": { "text/plain": [ "np.int64(3)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.trace(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "7VULr5jSeSaS" }, "source": [ "## 4. Тензоры (многомерные массивы)" ] }, { "cell_type": "markdown", "metadata": { "id": "3wwvC1UOQppZ" }, "source": [ "#### 4.1 Создание, простые операции" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_Vx6sZvjeSaT", "outputId": "270e56a2-15d3-40a7-bc12-27b56d508c93" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[ 0 1 2 3]\n", " [ 4 5 6 7]\n", " [ 8 9 10 11]]\n", "\n", " [[12 13 14 15]\n", " [16 17 18 19]\n", " [20 21 22 23]]]\n" ] } ], "source": [ "X = np.arange(24).reshape(2, 3, 4)\n", "print(X)" ] }, { "cell_type": "markdown", "metadata": { "id": "6-a_IMz5eSaU" }, "source": [ "Суммирование (аналогично остальные операции)." ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XnTt-275eSaU", "outputId": "14391cab-ea20-4806-ac30-f2ebaa37d0f7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[12 14 16 18]\n", " [20 22 24 26]\n", " [28 30 32 34]]\n" ] } ], "source": [ "# суммируем только по нулевой оси, то есть для фиксированных j и k \n", "# суммируем только элементы с индексами (*, j, k)\n", "print(X.sum(axis=0))" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "O5m-SV4Ge0iN", "outputId": "e9001e81-f3b5-47af-f581-a8688deabc05" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 66 210]\n" ] } ], "source": [ "# суммируем сразу по двум осям, то есть для фиксированной i \n", "# суммируем только элементы с индексами (i, *, *)\n", "print(X.sum(axis=(1, 2)))" ] }, { "cell_type": "markdown", "metadata": { "id": "-FWPCnqzQppZ" }, "source": [ "#### 4.2. Broadcasting" ] }, { "cell_type": "markdown", "metadata": { "id": "uPjV3yjKQppZ" }, "source": [ "Выше при арифметических операциях с массивами, например, при сложении и умножении, мы перемножали массивы одинаковой формы. В самом простом случае операндами были одномерные массивы одинаковой длины." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vjFxZY6JQppa", "outputId": "ef8baac4-3a40-4554-f441-36f90d013e06" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 6]\n" ] } ], "source": [ "# Самый простой случай\n", "a = np.array([1, 2, 3])\n", "b = np.array([2, 2, 2])\n", "print(a * b)" ] }, { "cell_type": "markdown", "metadata": { "id": "CFUBi7CDQppa" }, "source": [ "Произошло поэлементное умножение, все элементы массива $a$ умножились на $2$. Но мы знаем, что это можно сделать проще, просто умножив массив на $2$." ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "eSGmLzA5Qppa", "outputId": "a58ccfb2-5b71-4e9f-bef2-11b43fd01cde" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 6]\n" ] } ], "source": [ "# Умножение массива на число\n", "print(a * 2)" ] }, { "cell_type": "markdown", "metadata": { "id": "u7_r9j_9Qppb" }, "source": [ "На самом деле поведение будет аналогичным, если умножить одномерный массив на массив длины $1$." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yg6006goQppb", "outputId": "6b80a310-14ec-47e6-b293-b835d55cc4c7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 6]\n" ] } ], "source": [ "# Умножение массивов разных длин\n", "print(a * [2])" ] }, { "cell_type": "markdown", "metadata": { "id": "FoaMvoBmQppc" }, "source": [ "В этом случае работает так называемый *broadcasting*. Один массив \"растягивается\", чтобы повторить форму другого.\n", "\n", "![theory.broadcast_1.gif](data:image/gif;base64,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)" ] }, { "cell_type": "markdown", "metadata": { "id": "vzmLw9c3Qppc" }, "source": [ "Такой же эффект работает и для многомерных массивов. Если по какому-то измерению размер у одного массива равен $1$, а у другого — произвольный, то по этому измерению может произойти \"рястяжение\". Таким образом, массивы можно умножать друг на друга, если в измерениях, где они по размеру не совпадают, хотя бы у одного размер $1$. Для других поэлементных операций правило аналогично.\n", "\n", "Важно отметить, что размерности сопоставляются справа налево. Если их количество не совпадает, то массивы меньшей размерности сначала дополняются слева размерностями 1. Например, при сложении массива размера $4 \\times 3$ с массивом размера $3$ последний сначала преобразуется в массив размера $1 \\times 3$." ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MPaw_M3iQppc", "outputId": "3111ab64-9c1d-45f9-c403-9957b06adae0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 1 2]\n", " [10 11 12]\n", " [20 21 22]\n", " [30 31 32]]\n" ] } ], "source": [ "\n", "a = np.array([[ 0, 0, 0],\n", " [10, 10, 10],\n", " [20, 20, 20],\n", " [30, 30, 30]])\n", "\n", "b = np.array([0, 1, 2])\n", "\n", "print(a + b)" ] }, { "cell_type": "markdown", "metadata": { "id": "NVxT_nHjQppd" }, "source": [ "Схематично проведенную операцию можно визуализировать следующим образом.\n", "\n", "![theory.broadcast_2.gif](data:image/gif;base64,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)\n", "\n", "\n", "Если неединичные размерности справа не будут совпадать, то выполнить операцию уже не получится. Например, как приведено на схеме ниже. \n", "\n", "![theory.broadcast_3.gif](data:image/gif;base64,R0lGODlhbgH7AHcAMSH+GlNvZnR3YXJlOiBNaWNyb3NvZnQgT2ZmaWNlACH5BAEAAAAALAIADQBeAekAhgAAAAAAAAQHDA0LCAQECA0LCgcCAgcJDAIGCgQABAkLDAcCAA0JBgICBgsLDA0HBAAECAkEAAAABAkLCgAAAgsGAgACBgIABAIAAgQAAAsJCgIAAAQCBgQAAgIECAIEBAQHCAcGAg0JCAQEBgQHCgkJBgsLCAICAAAAKwAAVQArgABVqisAACsrACuA1FUAAFWAgFWq/4ArAICqgIDU1IDU/6pVAKqqVar/1Kr//9SAK8DAwNT///+qVf/UgP//qv//1P///wECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwf/gACCg4SFhoeIiYqLjI2Oj5CRhRECkogDBIgFBgeWnp+goaKjpKWmp6ipjBEIlwkKqrGys7S1tre4jAULlYcMDQ65wsPExca0DxARARITC8ywyYLLARSdycvNzxKwANTcuwEBlQ/i4wDY1Z3H7O3u7+wV5xHW3pUVrQ8WwQ/c8pX0OlECUAHCNIMMLsCqwA0AAwwH/hFsBa+ixYsYQ7GaVmkXwEoDMjScRnGgRwAaBm2UFrKXyl4bM8qcSVPmpk43AQx4lVMQgw3gOAHIuRMWNXEAWyXsJihnz5pQo0rNNYBDsF9XgRXVF8xe1axguerscOCkWG8IsOp8NbWt27el/6ShMzjXoQeHG0BmECC3r0GxEbgNIDv2Gje5auEqXsxYET5BjydKRmeuVeTLrcIF+KAwZL1y0CZHbky6tOnTqFOrXs26tevXsGPLnk27tu3buHO3M8e7t+/fwIMLH068uPHjyJMrD6D7NfPmcJ9DXy19+tTq1k9jz15zO/fG3r9nDC8+enmo5M+3Ta/eHfv24wm9h5+r+nz6FqU/v49/ln5B/PXHzn4ABChgLAQaeKAxzDW44IAFRvhgd+JMOGCFFnaXIYQb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)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "p-EYlh-03Ov4" }, "source": [ "А если размеры будут не совместимы, то произойдет ошибка." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 182 }, "id": "jPo3OiBZ3Ov4", "outputId": "7e261607-3764-4e80-ffca-2dcd6e7e028b" }, "outputs": [ { "ename": "ValueError", "evalue": "operands could not be broadcast together with shapes (4,3) (4,) ", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[66], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m b \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray([\u001b[38;5;241m1.0\u001b[39m, \u001b[38;5;241m2.0\u001b[39m, \u001b[38;5;241m3.0\u001b[39m, \u001b[38;5;241m4.0\u001b[39m])\n\u001b[0;32m----> 2\u001b[0m \u001b[43ma\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\n", "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (4,3) (4,) " ] } ], "source": [ "b = np.array([1.0, 2.0, 3.0, 4.0])\n", "a + b" ] }, { "cell_type": "markdown", "metadata": { "id": "Hn5BEycv3Ov4" }, "source": [ "Если массивы имеют несовместимый размер, можно их сначала привести к одной форме." ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BsLoImoW3Ov4", "outputId": "f1f38273-63b0-420c-b924-4b9bdc3a2c57" }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 2., 3.],\n", " [11., 12., 13.],\n", " [21., 22., 23.],\n", " [31., 32., 33.]])" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.array([0.0, 10.0, 20.0, 30.0])\n", "b = np.array([1.0, 2.0, 3.0])\n", "a.reshape((-1, 1)) + b" ] }, { "cell_type": "markdown", "metadata": { "id": "sWPEBlaKQppe" }, "source": [ "*Замечание*\n", "\n", "Знать про broadcasting нужно, но пользоваться им надо с осторожностью. Многократное копирование массива при растяжении может привести к неэффективной работе программы по памяти. Особенно за этим приходится следить при работе с GPU." ] }, { "cell_type": "markdown", "metadata": { "id": "qpZqvsLu3Ov5" }, "source": [ "Часто при работе с массивами NumPy требуется добавлять новые оси измерений и удалять существующие. В NumPy добавлять новые оси иногда удобнее с помощью специального объекта `newaxis`. Например, пусть у нас есть одномерный массив:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "id": "ptHIMxD73Ov5" }, "outputs": [], "source": [ "a = np.array([1,2,3,4,5,6,7,8,9,10])" ] }, { "cell_type": "markdown", "metadata": { "id": "wbMn6eA93Ov5" }, "source": [ "У него одна ось – одно измерение. Добавим еще одну ось, допустим, в начало. С помощью объекта np.newaxis это можно сделать так:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SEVHK1rc3Ov5", "outputId": "06ea936c-92b4-4b7b-e0a3-5b550202936f" }, "outputs": [ { "data": { "text/plain": [ "(1, 10)" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = a[np.newaxis, :] # добавление оси axis0\n", "b.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "osZG_dcW3Ov5" }, "source": [ "Или, можно прописать сразу две оси:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "00aotrkP3Ov5", "outputId": "18d662d3-6e0f-4d7c-e853-171350107a96" }, "outputs": [ { "data": { "text/plain": [ "(1, 10, 1)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = a[np.newaxis, :, np.newaxis]\n", "c.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "fQu4JWrkeSaV" }, "source": [ "## 5. Линейная алгебра" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "id": "KJ9qk8KBe0iO" }, "outputs": [], "source": [ "a = np.array([[0, 1], [2, 3]])" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QfoGKtHdeSaV", "outputId": "7931ab04-ea1b-4cf4-e6f5-0331bbf06cce" }, "outputs": [ { "data": { "text/plain": [ "np.float64(-2.0)" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.det(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "fh6WDlobeSaW" }, "source": [ "Обратная матрица." ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6_JMYc5NeSaX", "outputId": "17aa79fe-c804-4b1a-c6e6-836d4dfec4a7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-1.5 0.5]\n", " [ 1. 0. ]]\n" ] } ], "source": [ "a1 = np.linalg.inv(a)\n", "print(a1)" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9RK1Y8tOeSaY", "outputId": "c89fefe9-326c-4847-a7ec-d71ac9b2aa9d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0.]\n", " [0. 1.]]\n", "[[1. 0.]\n", " [0. 1.]]\n" ] } ], "source": [ "print(a @ a1)\n", "print(a1 @ a)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "LinAlgError", "evalue": "Singular matrix", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mLinAlgError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[4], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m a \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray([[\u001b[38;5;241m1e-9\u001b[39m, \u001b[38;5;241m0\u001b[39m],[\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m]])\n\u001b[0;32m----> 2\u001b[0m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlinalg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minv\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/torch-env/lib/python3.12/site-packages/numpy/linalg/linalg.py:561\u001b[0m, in \u001b[0;36minv\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 559\u001b[0m signature \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mD->D\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m isComplexType(t) \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124md->d\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 560\u001b[0m extobj \u001b[38;5;241m=\u001b[39m get_linalg_error_extobj(_raise_linalgerror_singular)\n\u001b[0;32m--> 561\u001b[0m ainv \u001b[38;5;241m=\u001b[39m \u001b[43m_umath_linalg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minv\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msignature\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msignature\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m wrap(ainv\u001b[38;5;241m.\u001b[39mastype(result_t, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m))\n", "File \u001b[0;32m~/torch-env/lib/python3.12/site-packages/numpy/linalg/linalg.py:112\u001b[0m, in \u001b[0;36m_raise_linalgerror_singular\u001b[0;34m(err, flag)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21m_raise_linalgerror_singular\u001b[39m(err, flag):\n\u001b[0;32m--> 112\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m LinAlgError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSingular matrix\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "\u001b[0;31mLinAlgError\u001b[0m: Singular matrix" ] } ], "source": [ "a = np.array([[1e-9, 0],[0, 0]])\n", "np.linalg.inv(a)" ] }, { "cell_type": "markdown", "metadata": { "id": "Y4voLe-LeSau" }, "source": [ "## 6. Производительность numpy\n", "\n", "Посмотрим на простой пример — сумма первых $10^8$ чисел." ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nvCQ_4WReSav", "outputId": "206ff723-f29c-47c7-ce17-b061a9ce95f3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4999999950000000\n", "CPU times: user 12.4 s, sys: 1.79 ms, total: 12.4 s\n", "Wall time: 12.4 s\n" ] } ], "source": [ "%%time\n", "\n", "sum_value = 0\n", "for i in range(10 ** 8):\n", " sum_value += i\n", "print(sum_value)" ] }, { "cell_type": "markdown", "metadata": { "id": "v4SQIcy8eSaw" }, "source": [ "Немного улучшенный код." ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ewr9BFMpeSaw", "outputId": "c476b8da-b480-4501-923b-0638f89e7c39" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4999999950000000\n", "CPU times: user 2.63 s, sys: 8.12 ms, total: 2.64 s\n", "Wall time: 2.62 s\n" ] } ], "source": [ "%%time\n", "\n", "sum_value = sum(range(10 ** 8))\n", "print(sum_value)" ] }, { "cell_type": "markdown", "metadata": { "id": "pUjiYs86eSax" }, "source": [ "Код с использованием функций библиотеки `numpy`." ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Jv6RFksoeSax", "outputId": "79144d35-18e1-477a-cda9-ea6866dfa371" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4999999950000000\n", "CPU times: user 103 ms, sys: 78.1 ms, total: 181 ms\n", "Wall time: 192 ms\n" ] } ], "source": [ "%%time\n", "\n", "sum_value = np.arange(10 ** 8).sum()\n", "print(sum_value)" ] }, { "cell_type": "markdown", "metadata": { "id": "ya-V2P3veSay" }, "source": [ "Простой и понятный код работает в $60$ раз быстрее!\n", "\n", "Посмотрим на другой пример. Сгенерируем матрицу размера $500\\times1000$, и вычислим средний минимум по колонкам.\n", "\n", "Простой код, но при этом даже использующий некоторые питон-функции.\n", "\n", "*Замечание*. Далее с помощью `scipy.stats` происходит генерация случайных чисел из равномерного распределения на отрезке $[0, 1]$. Этот модуль будем изучать в следующем ноутбуке." ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "id": "Ulfmy68keSaz" }, "outputs": [], "source": [ "import scipy.stats as sps" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bp_qnnwPeSaz", "outputId": "5c99eb42-2674-4c55-e43e-e36097ceacae" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.003937677101331695\n", "CPU times: user 13.2 s, sys: 86.1 ms, total: 13.2 s\n", "Wall time: 13.2 s\n" ] } ], "source": [ "%%time\n", "\n", "N, M = 500, 1000\n", "matrix = []\n", "for i in range(N):\n", " matrix.append([sps.uniform.rvs() for j in range(M)])\n", "\n", "min_col = [min([matrix[i][j] for i in range(N)]) for j in range(M)]\n", "mean_min = sum(min_col) / N\n", "print(mean_min)" ] }, { "cell_type": "markdown", "metadata": { "id": "c47oHwHzeSa0" }, "source": [ "Понятный код с использованием функций библиотеки numpy." ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "h1WGN9hseSa0", "outputId": "926ee2fe-bb94-4ff5-d2e3-d75ae6ca9109" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0010190658049421483\n", "CPU times: user 14.3 ms, sys: 2.98 ms, total: 17.2 ms\n", "Wall time: 16.1 ms\n" ] } ], "source": [ "%%time\n", "\n", "N, M = 500, 1000\n", "matrix = sps.uniform.rvs(size=(N, M))\n", "mean_min = matrix.min(axis=1).mean()\n", "print(mean_min)" ] }, { "cell_type": "markdown", "metadata": { "id": "ABVSxP6seSa1" }, "source": [ "Простой и понятный код работает в 800 раз быстрее!" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.3" }, "vscode": { "interpreter": { "hash": "33e61429d47ea5072c304948017faf4b8066559ab931d76623e2d35f352f9359" } } }, "nbformat": 4, "nbformat_minor": 1 }