Форма массива (shape) — это кортеж целых чисел, который описывает размер массива по каждому измерению.

Для numpy.ndarray shape отвечает на вопрос:
сколько измерений у массива и сколько элементов в каждом из них.

Примеры:

1D массив:

a = np.array([1, 2, 3, 4])
a.shape        # (4,)

Один измерение, 4 элемента.

2D массив:

b = np.array([[1, 2, 3],
              [4, 5, 6]])
b.shape        # (2, 3)

Две строки и три столбца.

3D массив:

c = np.zeros((2, 3, 4))
c.shape        # (2, 3, 4)

Два блока, в каждом 3 строки по 4 элемента.

Важно, что:
– длина shape = ndim (число измерений)
– произведение всех чисел в shape = size (общее число элементов)

Форма — это метаданные, а не данные. Изменение формы (если не меняется size) не требует копирования памяти.

Пример:

a = np.arange(6)     # shape (6,)
b = a.reshape(2, 3)  # shape (2, 3)

a и b указывают на один и тот же буфер памяти.

Форма жёстко определяет допустимые операции:
– поэлементные операции требуют совместимых форм
– матричное умножение требует согласованных осей
– broadcasting опирается именно на shape

Практическое понимание:
shape — это не «как массив выглядит», а как интерпретировать линейный участок памяти как многомерную структуру.