NumPy: массивы, форма и индексация

ndarray: создание из последовательностей и атрибуты структуры

Содержание курса

Атрибуты структуры массива: shape, ndim, size, dtype

Когда массив уже создан, нужно уметь быстро ответить на три вопроса: какова его форма, сколько у него измерений и сколько в нём элементов. Плюс — какой у него тип данных. Для этого у любого ndarray есть четыре атрибута: shape, ndim, size и dtype.

Возьмём массивы из предыдущего примера и считаем все четыре атрибута:

import numpy as np

a1 = np.array([10, 20, 30], dtype=np.int64)
a2 = np.array([[1, 2, 3],
               [4, 5, 6]], dtype=np.int64)

print(a1.shape, a1.ndim, a1.size, a1.dtype)
# (3,) 1 3 int64

print(a2.shape, a2.ndim, a2.size, a2.dtype)
# (2, 3) 2 6 int64

В этом примере dtype=np.int64 задан явно, поэтому последнее поле вывода одинаково на любой платформе. Всё остальное (shape, ndim, size) одинаково на любой платформе.

shape — кортеж целых чисел, по одному числу на каждое измерение. Для a1 это (3,): одно измерение, три элемента в нём. Запятая после 3 не опечатка — она нужна, чтобы Python понял, что это кортеж из одного элемента, а не просто число в скобках. Для a2 это (2, 3): две строки и три столбца.

ndim — количество измерений, то есть длина кортежа shape. У a1 — 1, у a2 — 2. Это число совпадает с глубиной вложенности списков, которые вы передавали в np.array: плоский список → ndim=1, список списков → ndim=2.

size — общее количество элементов в массиве. Для a1: 3. Для a2: 2 × 3 = 6. Ключевое соотношение: size всегда равен произведению всех чисел из shape. Это не совпадение, а определение: форма массива однозначно задаёт количество его элементов.

print(a2.shape[0] * a2.shape[1])  # 6
print(a2.size)                    # 6 — одно и то же

dtype — тип данных всех элементов. Если нужен гарантированный тип вне зависимости от платформы — задайте его явно:

a_i64 = np.array([[1, 2, 3],
                  [4, 5, 6]], dtype=np.int64)
print(a_i64.dtype)   # int64
print(a_i64.shape)   # (2, 3)

a_f32 = np.array([[1, 2, 3],
                  [4, 5, 6]], dtype=np.float32)
print(a_f32.dtype)   # float32
print(a_f32.shape)   # (2, 3)

Меняется только тип хранения, но не структура. shape, ndim и size остаются теми же при любом dtype.

Четыре атрибута вместе дают полное описание структуры массива: shape говорит, как именно он устроен по измерениям; ndim — сколько таких измерений; size — сколько клеток в этой «сетке» всего; dtype — что лежит в каждой клетке. Эта четвёрка понадобится постоянно: когда будете проверять результат операции, передавать массив в функцию или отлаживать несовпадение размерностей.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения и доступны преподавателям курса. Чтобы попросить преподавателя подключиться, отправьте обращение из диалога.

Проверка решения остаётся отдельным действием.