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

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

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

Создание одномерного и двумерного ndarray через np.array

Единственная функция, которая нужна для старта — np.array(). Она принимает любую Python-последовательность и превращает её в ndarray.

Для одномерного массива передаём плоский список:

import numpy as np

a1 = np.array([10, 20, 30])
print(a1)
# [10 20 30]

Вывод уже отличается от Python-списка: нет запятых — это сигнал, что мы работаем с ndarray, а не с обычным list.

Для двумерного массива передаём вложенный список — список строк, где каждая строка сама является списком одинаковой длины:

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

NumPy интерпретирует внешний список как набор строк, а каждый внутренний список — как строку таблицы. Длины внутренних списков обязаны совпадать — иначе прямоугольной формы не получится.

Автоматический вывод dtype. NumPy смотрит на переданные значения и выбирает тип самостоятельно. Если все элементы — целые числа Python, получится целочисленный dtype. Стоит добавить хотя бы одно число с точкой — и весь массив становится вещественным:

a_int   = np.array([1, 2, 3])
a_float = np.array([1, 2, 3.0])   # одна точка меняет тип всего массива

print(a_int.dtype)    # целочисленный dtype, например int32 или int64 — зависит от платформы
print(a_float.dtype)  # float64

Это прямое следствие однородности: NumPy обязан выбрать один тип для всего массива, поэтому берёт наиболее широкий из присутствующих. Конкретная ширина целочисленного dtype при автоматическом выводе зависит от платформы и сборки NumPy — если вам нужен гарантированный тип, задайте его явно.

Если нужен конкретный тип — передаём его явно через параметр dtype:

a_i64 = np.array([1, 2, 3], dtype=np.int64)
a_f32 = np.array([1, 2, 3], dtype=np.float32)

print(a_i64.dtype)  # int64
print(a_f32.dtype)  # float32

Явное указание dtype полезно, когда важна воспроизводимость поведения на разных платформах, когда нужна экономия памяти или когда последующий код ожидает строго определённый тип.

Посмотрим на оба массива вместе и убедимся, что NumPy создал именно то, что ожидалось:

print(a1)        # [10 20 30]
print(type(a1))  # <class 'numpy.ndarray'>

print(a2)
# [[1 2 3]
#  [4 5 6]]
print(type(a2))  # <class 'numpy.ndarray'>

Оба объекта — экземпляры numpy.ndarray. Отсюда следует следующий вопрос: как узнать форму, количество измерений и общее число элементов уже созданного массива? Для этого у ndarray есть набор атрибутов, которые мы разберём в следующей секции.

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

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

О переписке

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

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

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