Нашли ошибку?
Скачать чистый
урок 2 из 4≈ 15 минупражнения: 0 из 4

Столбец и строка

Одномерный массив всегда прикладывается как строка. Чтобы приложить его как столбец, нужна форма (n, 1) — через np.newaxis или keepdims=True. Таблица всех пар и ловушка квадратной матрицы.

Python запустится при первом выполнении

В прошлом уроке наценка магазинов — массив из трёх чисел — не приложилась к таблице 3 × 4. Одномерный массив транслируется как строка, а нам нужно, чтобы каждое число приложилось к своей строке таблицы, то есть массив вёл себя как столбец.

Форма (n, 1)

Столбец — это двумерный массив формы (3, 1): три строки, один столбец. По правилам транслирования (3, 1) и (3, 4) совместимы: 3 = 3, а 1 растягивается до 4. Превратить (3,) в (3, 1) можно, добавив ось длины 1: markup[:, np.newaxis] — «все элементы по оси 0, и новая ось». (Тот же столбец даёт знакомый по модулю 3 markup.reshape(-1, 1).)

[ ]Наценка магазинов — столбцом
import numpy as np

prices = np.array([
    [120, 80, 45, 300],
    [130, 85, 50, 290],
    [110, 90, 40, 310],
])
markup = np.array([1.1, 1.2, 1.05])
print(markup.shape, markup[:, np.newaxis].shape)
prices * markup[:, np.newaxis]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(3,) (3, 1)
array([[132. ,  88. ,  49.5, 330. ],
       [156. , 102. ,  60. , 348. ],
       [115.5,  94.5,  42. , 325.5]])
[ ]Упражнение 1Своя наценка у каждого магазина решено

В store_markup — наценка каждого из трёх магазинов (множитель). Сохраните в final таблицу цен prices с наценкой: каждая строка умножается на наценку своего магазина.

store_markup = np.array([1.25, 1.0, 1.1])
final = ...

keepdims=True

Часто столбец получается из агрегата: сумма каждой строки — sum(axis=1) — даёт форму (3,), и её снова пришлось бы превращать в столбец. Параметр keepdims=True сохраняет свёрнутую ось длиной 1 — результат сразу форма (3, 1):

[ ]Доля месяца в годовой выручке
monthly = np.array([            # строка — магазин, столбец — месяц
    [40, 42, 45, 50, 48, 52, 55, 58, 50, 47, 60, 75],
    [30, 28, 33, 35, 40, 38, 36, 35, 39, 58, 45, 55],
    [70, 72, 68, 75, 80, 85, 90, 125, 82, 79, 95, 120],
])
year = monthly.sum(axis=1, keepdims=True)
print(year.shape)
shares = monthly / year
print(shares.sum(axis=1))
print(np.round(shares[:, -1] * 100, 1))   # доля декабря, %
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(3, 1)
[1. 1. 1.]
[12.1 11.7 11.5]

Каждая строка разделилась на сумму своей строки — у каждого магазина доли месяцев в сумме дают 1.

[ ]Упражнение 2Сильные предметы студента решено

Сохраните в personal таблицу: насколько каждый балл студента выше или ниже его собственного среднего балла (форма 30 × 5).

scores = np.loadtxt("data/scores.csv", delimiter=",", skiprows=1, usecols=(1, 2, 3, 4, 5))
personal = ...

Вопрос

Какая форма у np.arange(3)[:, np.newaxis] * np.arange(4)?

Таблица всех пар

Если столбец (n, 1) встречается со строкой (m,), растягиваются оба, и получается таблица n × m всех пар — например, таблица умножения:

[ ]Таблица умножения
n = np.arange(1, 10)
n[:, np.newaxis] * n
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 2,  4,  6,  8, 10, 12, 14, 16, 18],
       [ 3,  6,  9, 12, 15, 18, 21, 24, 27],
       [ 4,  8, 12, 16, 20, 24, 28, 32, 36],
       [ 5, 10, 15, 20, 25, 30, 35, 40, 45],
       [ 6, 12, 18, 24, 30, 36, 42, 48, 54],
       [ 7, 14, 21, 28, 35, 42, 49, 56, 63],
       [ 8, 16, 24, 32, 40, 48, 56, 64, 72],
       [ 9, 18, 27, 36, 45, 54, 63, 72, 81]])
[ ]Упражнение 3Цена за количество решено

В unit_price — цены пяти товаров, в amounts — варианты количества (1, 2, 5, 10). Сохраните в cost таблицу стоимости: строка — товар, столбец — количество.

unit_price = np.array([120, 80, 45, 300, 15])
amounts = np.array([1, 2, 5, 10])
cost = ...

Ловушка квадратной таблицы

[ ]Квадратная таблица: ошибки нет, а ответ неверный
sq = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(sq.mean(axis=1))
print(sq - sq.mean(axis=1))                  # неверно: вычли как строку
print(sq - sq.mean(axis=1, keepdims=True))   # верно: каждая строка минус своё среднее
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[2. 5. 8.]
[[-1. -3. -5.]
 [ 2.  0. -2.]
 [ 5.  3.  1.]]
[[-1.  0.  1.]
 [-1.  0.  1.]
 [-1.  0.  1.]]
[ ]Упражнение 4Центрировать строки решено

Таблица sq — квадратная. Вычтите из каждой строки её собственное среднее и сохраните результат в centered: в каждой строке среднее должно стать 0.

centered = ...

Итоги

  • Одномерный массив (n,) транслируется как строка; столбец — это форма (n, 1).
  • a[:, np.newaxis] добавляет ось: (n,) → (n, 1).
  • keepdims=True у агрегата сохраняет свёрнутую ось — результат сразу приложится к своим строкам.
  • Столбец (n, 1) и строка (m,) дают таблицу всех пар n × m.
  • У квадратной таблицы ошибки не будет — проверяйте, что прикладываете столбец, а не строку.

Подробнее в справочнике

Нашли ошибку?