Базовая индексация: элементы, строки, столбцы и срезы
Содержание курса
Выбор целой строки и столбца в 2D-массиве
Когда нужен не один элемент, а целая строка или столбец, в игру вступает двоеточие : — символ, который означает «все индексы по этой оси».
Возьмём массив shape (3, 4):
import numpy as np
arr = np.arange(12).reshape(3, 4)
# [[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]]
Чтобы взять вторую строку (индекс 1), можно написать двумя эквивалентными способами:
print(arr[1]) # [4, 5, 6, 7] — shape (4,)
print(arr[1, :]) # [4, 5, 6, 7] — shape (4,)
arr[1] — сокращённая запись; NumPy автоматически дополняет недостающие оси полными срезами. arr[1, :] делает то же самое явно: берём строку 1, а по столбцам — всё подряд.
Чтобы взять третий столбец (индекс 2), двоеточие ставится на место строкового индекса:
print(arr[:, 2]) # [ 2, 6, 10] — shape (3,)
Здесь : по первой оси означает «все строки», а 2 по второй фиксирует конкретный столбец.
Что происходит с shape. Результат в обоих случаях — одномерный массив, а не двумерный. Механизм простой: целый индекс убирает ту ось, по которой он задан.
arr[1, :]— ось строк схлопнулась из-за1, ось столбцов сохранилась полностью → shape(4,).arr[:, 2]— ось строк сохранилась полностью, ось столбцов схлопнулась из-за2→ shape(3,).
Проверить это можно прямо в коде:
row = arr[1]
col = arr[:, 2]
print(row.shape) # (4,)
print(col.shape) # (3,)
Одномерный массив — это не скаляр и не строка-матрица. Его можно складывать, умножать, передавать в функции — и при этом shape чётко говорит, сколько в нём элементов и вдоль какой логической оси они лежат.
Отрицательные индексы работают так же, как при точечном доступе: arr[-1] даёт последнюю строку, arr[:, -1] — последний столбец.
print(arr[-1]) # [ 8, 9, 10, 11] — shape (4,)
print(arr[:, -1]) # [ 3, 7, 11] — shape (3,)
Это часто используют, когда нужно быстро взять крайние строки или столбцы, не зная заранее размеров массива.
