Индексация и срезы массивов NumPy

Создано: 25.11.2025

Если получение значений элементов из одномерных массивов в NumPy происходит так же, как из списков Python, то синтаксис извлечения из многомерных структур отличается. В NumPy индексы указываются через запятую, а не каждый отдельно в квадратных скобках.

a = [[1, 2, 0], [3, 4, 5]]
b = np.array([[1, 2, 0], [3, 4, 5]])
# Из второго одномерного массива достаем второй элемент:
print(a[1][1], b[1,1])  # вывод: 4 4

c = [[[10, 11], [12, 13]], [[14, 15], [16, 17]]]
d = np.array([[[10, 11], [12, 13]], [[14, 15], [16, 17]]])
# Из первого двумерного массива получаем второй одномерный,
# из него берем первое значение:
print(c[0][1][0], d[0,1,0])  # вывод: 12 12

В любом случае каждый следующий индекс указывает на более вложенную структуру.

Так же как для списков для массивов NumPy возможна обратная индексация (с конца).

a = np.array([10, 20, 30, 40, 50, 60])
print(a[-1], a[-2])  # вывод: 60 50

b = np.array([[10, 20, 30], [40, 50, 60]])
# Из второго с конца одномерного массива берем
# третий с конца элемент:
print(b[-2,-3])  # вывод: 10

c = np.array([[[10, 11], [12, 13]], [[14, 15], [16, 17]]])
# Из первого с конца двумерного массива
# получаем второй с конца одномерный,
# из него берем второе от начала значение:
print(c[-1,-2,1])  # вывод: 15

Срезы задаются идентично спискам — через двоеточие. В случае срезов от начала или до конца первый или второй индекс можно не указывать. Если второй индекс выходит за пределы массива, ошибки не будет (это работает и для списков).

a = np.array([10, 20, 30, 40, 50, 60])
print(a[1:3])
[20 30]
b = np.array([[1, 2, 0], [3, 4, 5]])
# Из всех вложенных одномерных берем срез
# из второго и третьего элемента:
print(b[:, 1:3])
[[2 0]
 [4 5]]
c = np.array([[[10, 11], [12, 13]], [[14, 15], [16, 17]]])
# Из первого двумерного массива из всех его одномерных
# получаем значения первых элементов:
print(c[0, :, 0:1])
[[10]
 [12]]

В последнем случае был получен двумерный массив из трехмерного, потому что срезы использовались не на трех уровнях. Сравните:

print(c[:1, :, 0:1])  # трехмерный массив
print(c[0, :, 0])  # одномерный массив
[[[10]
  [12]]]
[10 12]

При получении срезов из массивов NumPy третьим числом можно указывать шаг (может быть отрицательным):

a = np.array([10, 20, 30, 40, 50, 60])
print(a[::2])

b = np.array([[1, 2, 0, 8, 10],
              [3, 4, 5, 12, 14],
              [13, 14, 15, 22, 24],
              [100, 87, 19, 28, 35]])
print(b[1:3, 1::2])
[10 30 50]
[[ 4 12]
 [14 22]]

Когда строятся графики и диаграммы в Matplotlib, то данные для них берутся из разных массивов. Даже если для второй координаты значения вычисляются по формуле, все-равно при этом создается и временно хранился в памяти второй массив. Однако в ряде случаев взаимосвязанные данные удобнее сохранять в одной структуре. Так у нас могут быть не отдельные массивы для координат x и y, а один двумерный, в котором каждый вложенный — это координаты одной точки.

Поскольку в функции plot(), scatter() и подобные передаются отдельно значения для одной координаты и отдельно для другой, то, чтобы представить "упакованные" в одном массиве данные на графике, надо извлечь их по отдельности с помощью срезов:

import numpy as np
import matplotlib.pyplot as plt

points = np.array([[1, 12], [3, 19], [5, 17],
                   [6, 22], [8, 18], [9, 24]])
plt.plot(points[:, 0], points[:, 1], 'o-')

plt.grid()
plt.show()
Получение координат для графика Matplotlib из срезов массива NumPy