Что такое вектор и как его складывать

Вектор — это одновременно стрелка в пространстве и список чисел; обе картинки описывают одно и то же.

Вектор — направленный отрезок, заданный своими координатами; в линейной алгебре это просто упорядоченный список чисел, с которым умеют складываться и масштабироваться.

Когда мы пишем $\vec{v} = (3, 4)$, мы имеем в виду стрелку из начала координат в точку с координатами 3 по горизонтали и 4 по вертикали. Но та же запись — это и «два числа в строчке», над которыми можно выполнять арифметику. Вся сила линейной алгебры в том, что геометрическая картинка (стрелка) и арифметика (список чисел) — это одно и то же, и мы свободно переключаемся между ними.

Зачем это нужно

Скорость, сила, сдвиг пикселя, признаки объекта в машинном обучении, цвет в формате RGB — всё это векторы. Если научиться складывать и масштабировать стрелки, открывается единый аппарат: одно правило работает и для физики, и для графики, и для данных. Поэтому начинаем с самого простого действия — сложения.

Сложение векторов

Геометрически складывают стрелки по правилу треугольника: приставляем начало второй стрелки к концу первой, а сумма — стрелка от начала первой к концу второй. Арифметически это значит просто сложить координаты по отдельности:

$$\vec{a} + \vec{b} = (a_1 + b_1,\; a_2 + b_2)$$

Умножение на число $k$ растягивает стрелку в $k$ раз (а при отрицательном $k$ — ещё и разворачивает):

$$k \cdot \vec{a} = (k a_1,\; k a_2)$$

def add(a, b):
    return [x + y for x, y in zip(a, b)]

def scale(k, a):
    return [k * x for x in a]

a = [3, 4]
b = [1, -2]
print("a + b =", add(a, b))
print("2a    =", scale(2, a))
print("a - b =", add(a, scale(-1, b)))

Вывод:

a + b = [4, 2]
2a    = [6, 8]
a - b = [2, 6]

Векторы любой размерности

Стрелку на плоскости легко нарисовать, но формула не меняется и для трёх, и для ста координат. Вектор в $n$-мерном пространстве — это просто список из $n$ чисел, и сложение по-прежнему идёт покоординатно. Рисовать мы уже не можем, а считать — запросто.

Как работает под капотом

В программе вектор — это обычный список [3, 4]. Функция zip(a, b) идёт по двум спискам параллельно, выдавая пары (3, 1), (4, -2), а генератор списка складывает каждую пару. Никакой магии: «сложение векторов» — это цикл по координатам. Важно, что складывать можно только векторы одной длины; если размерности разные, операция не определена — zip молча обрежет лишнее, и это частый источник скрытых ошибок.

Частые ошибки

  • Путать точку и вектор. Точка — это «где», вектор — «куда и насколько». Координаты записываются одинаково, но точку нельзя умножить на число осмысленно, а вектор — можно.
  • Складывать векторы разной размерности. $(1, 2)$ и $(1, 2, 3)$ сложить нельзя — это разные пространства.
  • Думать, что начало вектора обязательно в нуле. Стрелку можно нарисовать где угодно; важны только её длина и направление, то есть разности координат.

Итог

  • Вектор — это и стрелка, и список чисел одновременно.
  • Складывают векторы покоординатно (геометрически — по правилу треугольника).
  • Умножение на число масштабирует стрелку, отрицательное — разворачивает.
  • Формулы не зависят от размерности: тот же код работает в $n$ измерениях.
Проверьте себя
1. Чему равна сумма векторов (2, 5) и (3, -1)?
A(5, 4)
B(6, -5)
C(5, 6)
D(-1, 6)
2. Что делает умножение вектора на число k = -2?
AУдваивает длину и сохраняет направление
BУдваивает длину и разворачивает на противоположное направление
CПоворачивает на 90 градусов
DОбнуляет вектор
3. Почему векторы (1, 2) и (1, 2, 3) нельзя сложить?
AИх координаты слишком разные
BОни принадлежат пространствам разной размерности
CОдин из них нулевой
DСложить можно, получится (2, 4, 3)