NumPy newaxis и squeeze: вектор-строка и вектор-столбец
np.newaxis добавляет ось длины 1, а np.squeeze удаляет оси длины 1. Вектор с формой (n,) отличается и от строки (1, n), и от столбца (n, 1).
Зачем добавлять единичную ось
У v[:, np.newaxis] появляется вторая ось: значения можно использовать как столбец при broadcasting. У v[np.newaxis, :] добавляется первая ось, и получается строка. Число элементов при этом не меняется.
np.squeeze(a, axis=...) удаляет только указанную ось и требует, чтобы её длина была равна 1. Если длина больше 1, будет ValueError. Вариант без axis удаляет все единичные оси, что иногда убирает больше измерений, чем нужно.
Пример на других данных
import numpy as np
v = np.array([3, 6, 9, 12])
column = v[:, np.newaxis]
row = v[np.newaxis, :]
print(v.shape, column.shape, row.shape)
print(np.squeeze(column, axis=1).shape)
Результат:
(4,) (4, 1) (1, 4) (4,)
Попробуйте сами
Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.
Вектор-столбец, вектор-строка и squeeze с axis: управление единичными осями
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinодну строку с целым числомn. - Создаёт одномерный массив
vчерезnp.arange(n)— shape(n,). - Превращает
vв вектор-столбецcolчерезv[:, np.newaxis]— shape(n, 1). - Превращает
vв вектор-строкуrowчерезv[np.newaxis, :]— shape(1, n). - Применяет
np.squeeze(col, axis=1)— убирает только вторую ось уcol, получает массивs1shape(n,). - Применяет
np.squeeze(row, axis=0)— убирает только первую ось уrow, получает массивs2shape(n,). - Выводит в
stdoutровно шесть строк в формате<имя>: shape=<shape> size=<size>:
v: shape=...col: shape=...row: shape=...s1: shape=...s2: shape=...all_equal=Trueеслиv.size == col.size == row.size == s1.size == s2.size, иначеall_equal=False.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Формат ввода
Одна строка: целое число n (гарантируется n >= 2).
Формат вывода
Шесть строк:
v: shape=(n,) size=<n>
col: shape=(n, 1) size=<n>
row: shape=(1, n) size=<n>
s1: shape=(n,) size=<n>
s2: shape=(n,) size=<n>
all_equal=True
Формат shape — строго как у Python: (n,), (n, 1), (1, n) и т. д.
Пример
- Ввод
4
- Вывод
v: shape=(4,) size=4 col: shape=(4, 1) size=4 row: shape=(1, 4) size=4 s1: shape=(4,) size=4 s2: shape=(4,) size=4 all_equal=True
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- NumPy reshape и transpose: разница на примере и задача
- dtype NumPy: целые и вещественные массивы, типы элементов
- NumPy shape, ndim, size и dtype: атрибуты массива и задача
- Срезы двумерного массива NumPy: строки, столбцы и шаг
- NumPy: целочисленная индексация, присваивание и маска
- NumPy zeros, ones и full: dtype — пример и задача
