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. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая:

  1. Читает из stdin одну строку с целым числом n.
  2. Создаёт одномерный массив v через np.arange(n) — shape (n,).
  3. Превращает v в вектор-столбец col через v[:, np.newaxis] — shape (n, 1).
  4. Превращает v в вектор-строку row через v[np.newaxis, :] — shape (1, n).
  5. Применяет np.squeeze(col, axis=1) — убирает только вторую ось у col, получает массив s1 shape (n,).
  6. Применяет np.squeeze(row, axis=0) — убирает только первую ось у row, получает массив s2 shape (n,).
  7. Выводит в 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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи