В прошлом уроке наценка магазинов — массив из трёх чисел — не приложилась к таблице 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]])В store_markup — наценка каждого из трёх магазинов (множитель). Сохраните в final таблицу цен prices
с наценкой: каждая строка умножается на наценку своего магазина.
store_markup[:, np.newaxis].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
store_markup = np.array([1.25, 1.0, 1.1])
final = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
store_markup = np.array([1.25, 1.0, 1.1])
final = prices * store_markup[:, np.newaxis]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.
Сохраните в personal таблицу: насколько каждый балл студента выше или ниже его собственного среднего
балла (форма 30 × 5).
scores.mean(axis=1, keepdims=True), форма (30, 1).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
scores = np.loadtxt("data/scores.csv", delimiter=",", skiprows=1, usecols=(1, 2, 3, 4, 5))
personal = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
scores = np.loadtxt("data/scores.csv", delimiter=",", skiprows=1, usecols=(1, 2, 3, 4, 5))
personal = scores - scores.mean(axis=1, keepdims=True)Какая форма у np.arange(3)[:, np.newaxis] * np.arange(4)?
(3, 1) и (4,) → (1, 4); растягиваются оба: у (1, 4) единица растягивается до 3, у (3, 1) — до 4. Получается таблица 3 × 4 — все пары.Таблица всех пар
Если столбец (n, 1) встречается со строкой (m,), растягиваются оба, и получается таблица n × m всех
пар — например, таблица умножения:
n = np.arange(1, 10)
n[:, np.newaxis] * narray([[ 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]])В unit_price — цены пяти товаров, в amounts — варианты количества (1, 2, 5, 10). Сохраните в cost таблицу
стоимости: строка — товар, столбец — количество.
unit_price[:, np.newaxis].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
unit_price = np.array([120, 80, 45, 300, 15])
amounts = np.array([1, 2, 5, 10])
cost = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
unit_price = np.array([120, 80, 45, 300, 15])
amounts = np.array([1, 2, 5, 10])
cost = unit_price[:, np.newaxis] * amountsЛовушка квадратной таблицы
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.]]
Таблица sq — квадратная. Вычтите из каждой строки её собственное среднее и сохраните результат в centered:
в каждой строке среднее должно стать 0.
axis=1; чтобы оно приложилось как столбец, добавьте keepdims=True.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
centered = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
centered = sq - sq.mean(axis=1, keepdims=True)Итоги
- Одномерный массив
(n,)транслируется как строка; столбец — это форма(n, 1). a[:, np.newaxis]добавляет ось:(n,)→(n, 1).keepdims=Trueу агрегата сохраняет свёрнутую ось — результат сразу приложится к своим строкам.- Столбец
(n, 1)и строка(m,)дают таблицу всех парn × m. - У квадратной таблицы ошибки не будет — проверяйте, что прикладываете столбец, а не строку.