Индексация и срезы массивов 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()