{ "cells": [ { "cell_type": "markdown", "id": "considerable-comedy", "metadata": {}, "source": [ "## Наука о данных\n", "### Совместный бакалавриат ВШЭ-РЭШ, 2021-2022 учебный год\n", "_Илья Щуров_\n", "\n", "[Страница курса](http://math-info.hse.ru/s21/j)" ] }, { "cell_type": "markdown", "id": "dying-easter", "metadata": {}, "source": [ "### broadcasting в numpy" ] }, { "cell_type": "code", "execution_count": 1, "id": "sustainable-quarter", "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "id": "defensive-chain", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([11, 22, 33])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([1, 2, 3]) + np.array([10, 20, 30])" ] }, { "cell_type": "code", "execution_count": 3, "id": "obvious-mongolia", "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "operands could not be broadcast together with shapes (3,) (2,) ", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/var/folders/h2/9nyrt4p55kq6pdvqg02_zmj40000gn/T/ipykernel_60584/3514204344.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m20\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;31mValueError\u001b[0m: operands could not be broadcast together with shapes (3,) (2,) " ] } ], "source": [ "np.array([1, 2, 3]) + np.array([10, 20])" ] }, { "cell_type": "code", "execution_count": 4, "id": "broadband-stretch", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([11, 12, 13])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([1, 2, 3]) + np.array([10])" ] }, { "cell_type": "code", "execution_count": 6, "id": "worst-rocket", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([11, 12, 13])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([1, 2, 3]) + 10" ] }, { "cell_type": "code", "execution_count": 7, "id": "infrared-quarterly", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([11, 12, 13])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([1, 2, 3]) + np.array([10, 10, 10])" ] }, { "cell_type": "code", "execution_count": 13, "id": "removable-buying", "metadata": {}, "outputs": [], "source": [ "M = np.array([[1, 2, 3],\n", " [5, 6, 7]])" ] }, { "cell_type": "code", "execution_count": 15, "id": "nasty-payday", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 3, 4],\n", " [6, 7, 8]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M + 1" ] }, { "cell_type": "code", "execution_count": 16, "id": "cooked-passage", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [5, 6, 7]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "code", "execution_count": 17, "id": "portable-booking", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 22, 33],\n", " [15, 26, 37]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M + np.array([10, 20, 30])" ] }, { "cell_type": "code", "execution_count": 18, "id": "frozen-northwest", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 10, 40, 90],\n", " [ 50, 120, 210]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M * np.array([10, 20, 30])" ] }, { "cell_type": "code", "execution_count": 19, "id": "orange-france", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 22, 33],\n", " [15, 26, 37]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M + np.array([[10, 20, 30]])" ] }, { "cell_type": "code", "execution_count": 20, "id": "indirect-alaska", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [5, 6, 7]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "code", "execution_count": 21, "id": "polish-keeping", "metadata": {}, "outputs": [], "source": [ "P = np.array([1, 2])\n", "v = np.array([4, 2])" ] }, { "cell_type": "markdown", "id": "concrete-guard", "metadata": {}, "source": [ "Хочу нарисовать прямую, проходящую через точку $P$ и содержащую вектор $v$.\n", "\n", "$$\\{P + tv \\mid t \\in \\mathbb R\\}$$" ] }, { "cell_type": "code", "execution_count": 22, "id": "brave-revision", "metadata": {}, "outputs": [], "source": [ "t = np.linspace(-4, 4, 101)" ] }, { "cell_type": "code", "execution_count": 28, "id": "classical-assignment", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 33, "id": "unique-hypothesis", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-16. , -8. ],\n", " [-15.68, -7.84],\n", " [-15.36, -7.68],\n", " [-15.04, -7.52],\n", " [-14.72, -7.36],\n", " [-14.4 , -7.2 ],\n", " [-14.08, -7.04],\n", " [-13.76, -6.88],\n", " [-13.44, -6.72],\n", " [-13.12, -6.56],\n", " [-12.8 , -6.4 ],\n", " [-12.48, -6.24],\n", " [-12.16, -6.08],\n", " [-11.84, -5.92],\n", " [-11.52, -5.76],\n", " [-11.2 , -5.6 ],\n", " [-10.88, -5.44],\n", " [-10.56, -5.28],\n", " [-10.24, -5.12],\n", " [ -9.92, -4.96],\n", " [ -9.6 , -4.8 ],\n", " [ -9.28, -4.64],\n", " [ -8.96, -4.48],\n", " [ -8.64, -4.32],\n", " [ -8.32, -4.16],\n", " [ -8. , -4. ],\n", " [ -7.68, -3.84],\n", " [ -7.36, -3.68],\n", " [ -7.04, -3.52],\n", " [ -6.72, -3.36],\n", " [ -6.4 , -3.2 ],\n", " [ -6.08, -3.04],\n", " [ -5.76, -2.88],\n", " [ -5.44, -2.72],\n", " [ -5.12, -2.56],\n", " [ -4.8 , -2.4 ],\n", " [ -4.48, -2.24],\n", " [ -4.16, -2.08],\n", " [ -3.84, -1.92],\n", " [ -3.52, -1.76],\n", " [ -3.2 , -1.6 ],\n", " [ -2.88, -1.44],\n", " [ -2.56, -1.28],\n", " [ -2.24, -1.12],\n", " [ -1.92, -0.96],\n", " [ -1.6 , -0.8 ],\n", " [ -1.28, -0.64],\n", " [ -0.96, -0.48],\n", " [ -0.64, -0.32],\n", " [ -0.32, -0.16],\n", " [ 0. , 0. ],\n", " [ 0.32, 0.16],\n", " [ 0.64, 0.32],\n", " [ 0.96, 0.48],\n", " [ 1.28, 0.64],\n", " [ 1.6 , 0.8 ],\n", " [ 1.92, 0.96],\n", " [ 2.24, 1.12],\n", " [ 2.56, 1.28],\n", " [ 2.88, 1.44],\n", " [ 3.2 , 1.6 ],\n", " [ 3.52, 1.76],\n", " [ 3.84, 1.92],\n", " [ 4.16, 2.08],\n", " [ 4.48, 2.24],\n", " [ 4.8 , 2.4 ],\n", " [ 5.12, 2.56],\n", " [ 5.44, 2.72],\n", " [ 5.76, 2.88],\n", " [ 6.08, 3.04],\n", " [ 6.4 , 3.2 ],\n", " [ 6.72, 3.36],\n", " [ 7.04, 3.52],\n", " [ 7.36, 3.68],\n", " [ 7.68, 3.84],\n", " [ 8. , 4. ],\n", " [ 8.32, 4.16],\n", " [ 8.64, 4.32],\n", " [ 8.96, 4.48],\n", " [ 9.28, 4.64],\n", " [ 9.6 , 4.8 ],\n", " [ 9.92, 4.96],\n", " [ 10.24, 5.12],\n", " [ 10.56, 5.28],\n", " [ 10.88, 5.44],\n", " [ 11.2 , 5.6 ],\n", " [ 11.52, 5.76],\n", " [ 11.84, 5.92],\n", " [ 12.16, 6.08],\n", " [ 12.48, 6.24],\n", " [ 12.8 , 6.4 ],\n", " [ 13.12, 6.56],\n", " [ 13.44, 6.72],\n", " [ 13.76, 6.88],\n", " [ 14.08, 7.04],\n", " [ 14.4 , 7.2 ],\n", " [ 14.72, 7.36],\n", " [ 15.04, 7.52],\n", " [ 15.36, 7.68],\n", " [ 15.68, 7.84],\n", " [ 16. , 8. ]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.reshape(-1, 1) * v" ] }, { "cell_type": "code", "execution_count": 36, "id": "personal-shame", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "