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 есть набор атрибутов, которые мы разберём в следующей секции.
