Многомерные массивы в NumPy. Создание, размерность, форма и обход
Создано: 24.11.2025
До сих пор мы работали только с одномерными массивами. Однако в NumPy можно создавать двумерные, трехмерные и т.д. Рассмотрим варианты создания таковых с помощью функции array:
import numpy as np a = np.array([[1, 2, 3], [10, 20, 30]]) b = np.array([[[1, 2], [3, 4], [5, 6]], [[10, 20], [30, 40], [50, 60]]])
Переменной a присваивается двумерный массив, состоящий из двух одномерных, каждый длинной в три элемента. Таких вложенных одномерных массивов могло быть больше, внешний при этом оставался бы все-равно двумерным.
Переменной b присваивается трехмерный массив, состоящий из двух двумерных, каждый из которых состоит из трех одномерных в два элемента.
Многомерные массивы также принадлежат классу ndarray, как и одномерные. Если мы захотим их вывести на экран, то библиотека NumPy передаст их в функцию print() в табличном виде.
print(a, end='\n\n') print(b)
[[ 1 2 3] [10 20 30]] [[[ 1 2] [ 3 4] [ 5 6]] [[10 20] [30 40] [50 60]]]
Двумерный массив представляет собой таблицу, каждая строка которой — это очередной вложенный одномерный массив. Количество столбцов определяется длиной этих одномерных массивов.
Трехмерный массив представляет собой стопку таблиц одинаковой формы. Каждая таблица — это отдельно взятый двумерный массив.
Вместо стопки таблиц можно представить ящик, в который сложены таблицы. И если речь зайдет о четырехмерном массиве, то ящики будут находиться в комнатах. Так в здании (сам 4D-массив как объект) может находиться 10 комнат с ящиками.
Размерность массива (1D, 2D, 3D и т.д.) проверяется с помощью свойства ndim. Так в нашем случае a.ndim вернет 2, b.ndim будет равно 3. С помощью аттрибута shape узнают форму массива:
print(a.shape) print(b.shape)
(2, 3) (2, 3, 2)
Показано, что первый массив состоит из двух вложенных массивов, каждый из которых по три элемента. Второй массив состоит из двух вложенных, каждый из которых по три элемента, но эти элементы не простые, а сами состоят из двух элементов. Может быть проще "читать" с конца. Тогда получается, что первый массив состоит из трех элементов в строке, а всего строк — две. Второй массив состоит из двух элементов в строке, строк в таблице три, а количество таблиц — две.
Частой задачей является обход массивов, то есть итерация по их элементам. Если мы передадим трехмерный массив в цикл for, то, очевидно, на каждой его итерации получим вложенный двумерный.
for i in b: print(i)
[[1 2] [3 4] [5 6]] [[10 20] [30 40] [50 60]]
Тогда, чтобы извлекать каждый элемент отдельно, необходима конструкция из вложенных циклов for:
for table in b: for row in table: for item in row: print(item, end=' ')
1 2 3 4 5 6 10 20 30 40 50 60
Однако в библиотеке NumPy есть функция nditer, которая облегчает получение отдельных значений (вывод будет таким же, как в примере выше):
for i in np.nditer(b): print(i, end=' ')
Кроме этого, имеется аналог enumerate языка Python — функция ndenumerate, которая на каждой итерации возвращает как значение элемента, так и его индекс:
for index, value in np.ndenumerate(b): print(index, value)
(0, 0, 0) 1 (0, 0, 1) 2 (0, 1, 0) 3 (0, 1, 1) 4 (0, 2, 0) 5 (0, 2, 1) 6 (1, 0, 0) 10 (1, 0, 1) 20 (1, 1, 0) 30 (1, 1, 1) 40 (1, 2, 0) 50 (1, 2, 1) 60
Здесь мы видим особенности индексации массивов в NumPy. Подробнее об этом будет сказано в следующем уроке. Пока же вернемся к вопросу создания многомерных массивов в NumPy.
Их мы можем создавать не только с помощью array(). Таким функциям как empty, ones, zeros можно передавать кортеж, который задает форму массива, а не одно число, обозначающее количество элементов в одномерном.
a = np.empty((4, 3), dtype='i1') print(a)
[[ 64 59 -64] [-125 -22 113] [ 0 0 16] [-104 42 46]]
Из готовых одномерных массивов, созданных, в том числе, с помощью arange и linspace, получить многомерный можно с помощью метода reshape.
b = np.linspace(0, 100, 42).reshape(2, 3, 7) print(b.round(1))
[[[ 0. 2.4 4.9 7.3 9.8 12.2 14.6] [ 17.1 19.5 22. 24.4 26.8 29.3 31.7] [ 34.1 36.6 39. 41.5 43.9 46.3 48.8]] [[ 51.2 53.7 56.1 58.5 61. 63.4 65.9] [ 68.3 70.7 73.2 75.6 78. 80.5 82.9] [ 85.4 87.8 90.2 92.7 95.1 97.6 100. ]]]