Атрибуты массива NumPy
В этой главе мы изучим некоторые базовые атрибуты массивов NumPy.
Число измерений массива NumPy называется его рангом. Ранг — это число осей, то есть число измерений массива.
Одномерный массив имеет ранг 1, двумерный массив имеет ранг 2 и так далее.
В NumPy каждое измерение массива называется осью, которая также является измерением.
Например, двумерный массив можно рассматривать как «одномерный массив, состоящий из одномерных массивов»: каждый элемент внешнего массива сам является одномерным массивом.
Здесь ось 0 соответствует направлению самого внешнего массива, ось 1 соответствует направлению внутреннего массива, и так далее.
Число осей — ранг — это число измерений массива.
Многие функции NumPy поддерживают параметр axis.
Для двумерного массива axis=0 означает работу вдоль оси 0, то есть операцию над каждым столбцом; axis=1 означает работу вдоль оси 1, то есть операцию над каждой строкой.
Ниже на примере двумерного массива с формой (2, 3) мы наглядно покажем направления двух осей и значения атрибутов:
axis указывает, «в каком направлении сжимать», а не «по какой строке/столбцу»: суммирование вдоль axis=0 сжимает несколько строк в одну строку, поэтому результатом является сумма каждого столбца.
Пример
a = np.array([[1, 2, 3], [4, 5, 6]])
# Суммирование вдоль axis 0: сжатие по строкам, суммирование каждого столбца
print(a.sum(axis=0))
# Суммирование вдоль axis 1: сжатие по столбцам, суммирование каждой строки
print(a.sum(axis=1))
Результат вывода:
[5 7 9] [ 6 15]
Интерактивная демонстрация ниже позволяет более наглядно показать направление суммирования двух осей. Нажимайте кнопки для переключения:
a.sum(axis=0) → [5 7 9], сжать элементы каждого столбца вдоль axis 0 в одно числоК более важным атрибутам объекта ndarray в массивах NumPy относятся:
| Attribute | Описание |
|---|---|
ndarray.ndim | Ранг массива, то есть число измерений или число осей массива. |
ndarray.shape | Размеры массива, представляющие размер массива по каждой оси. Для двумерного массива (матрицы) они представляют количество строк и столбцов. |
ndarray.size | Общее количество элементов в массиве, равноеndarray.shapeпроизведению размеров каждой оси в shape. |
ndarray.dtype | Тип данных элементов в массиве. |
ndarray.itemsize | Размер каждого элемента в массиве в байтах. |
ndarray.flags | Содержит информацию о расположении в памяти, например, является ли хранилище непрерывным в стиле C или Fortran, доступно ли оно только для чтения и т. д. |
ndarray.real | Действительная часть каждого элемента в массиве (если тип элемента — комплексный). |
ndarray.imag | Мнимая часть каждого элемента в массиве (если тип элемента — комплексный). |
ndarray.data | Буфер, который фактически хранит элементы массива, обычно доступ к нему осуществляется через индексацию, и этот атрибут не используется напрямую. |
ndarray.ndim
ndarray.ndim используется для получения числа измерений массива (т. е. числа осей), которое является рангом.
Пример
a = np.arange(24)
print(a.ndim) # теперь a имеет только одно измерение
# Используйте reshape, чтобы изменить его размер, превратив его в 2 страницы, 4 строки и 3 столбца
b = a.reshape(2, 4, 3) # b теперь имеет три измерения
print(b.ndim)
Результат вывода:
1 3
ndarray.shape
ndarray.shape представляет размерности массива и возвращает кортеж. Длина этого кортежа — это количество размерностей, то есть свойство ndim (ранг).
Например, shape двумерного массива представляет его «количество строк» и «количество столбцов».
Порядок элементов кортежа shape согласуется с порядком осей: элемент с индексом 0 — это размер оси 0 (количество строк), а элемент с индексом 1 — размер оси 1 (количество столбцов).
Пример
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)
Результат вывода:
(2, 3)
ndarray.shape также можно использовать для изменения размера массива.
Пример
a = np.array([[1, 2, 3], [4, 5, 6]])
a.shape = (3, 2)
print(a)
Результат вывода:
[[1 2] [3 4] [5 6]]
NumPy также предоставляет функцию reshape для изменения размера массивов.
Пример
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape(3, 2)
print(b)
Результат вывода:
[[1 2] [3 4] [5 6]]
Разница между двумя методами: прямое присваивание значения a.shape изменяет сам массив a на месте; тогда как a.reshape(3, 2) возвращает новый объект массива (обычно использующий те же данные, что и a), а сам a остаётся неизменным.
ndarray.size
ndarray.size возвращает общее количество элементов в массиве, равное произведению размеров каждой оси в shape.
Пример
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape) # shape равен (2, 3)
print(a.size) # Общее количество элементов: 2 × 3 = 6
Результат вывода:
(2, 3) 6
ndarray.dtype
ndarray.dtype возвращает тип данных элементов массива.
Объект dtype содержит такую информацию, как имя типа и разрядность элемента. Например, int64 представляет 64-битное целое число, а float32 — 32-битное число с плавающей запятой.
Пример
# Списки целых чисел по умолчанию создают массив int64 (в Windows по умолчанию int32)
a = np.array([1, 2, 3])
print(a.dtype)
# При создании можно явно указать тип данных с помощью параметра dtype
b = np.array([1, 2, 3], dtype=np.float32)
print(b.dtype)
Результат вывода:
int64 float32
ndarray.real и ndarray.imag
ndarray.real и ndarray.imag возвращают соответственно действительную и мнимую части каждого элемента массива; в основном используются, когда тип элементов — комплексный.
Пример
# Создание комплексного массива, тип по умолчанию — complex128
a = np.array([1+2j, 3+4j, 5+6j])
print(a.real) # Действительная часть каждого элемента
print(a.imag) # Мнимая часть каждого элемента
Результат вывода:
[1. 3. 5.] [2. 4. 6.]
ndarray.itemsize
ndarray.itemsize возвращает размер каждого элемента массива в байтах.
Например, для массива с типом элементов float64 значение атрибута itemsize равно 8 (float64 занимает 64 бита, а каждые 8 бит — это 1 байт, поэтому 64 ÷ 8 = 8 байт).
В качестве другого примера: для массива с типом элементов int32 значение атрибута itemsize равно 4 (32 ÷ 8).
Произведение size и itemsize — это общее количество байтов, занимаемых данными массива, что является значением атрибута ndarray.nbytes.
Пример
# Тип dtype массива — int8, каждый элемент занимает 1 байт
x = np.array([1, 2, 3, 4, 5], dtype=np.int8)
print(x.itemsize)
# Тип dtype массива — float64, каждый элемент занимает 8 байт
y = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print(y.itemsize)
Результат вывода:
1 8
ndarray.flags
ndarray.flags возвращает информацию о памяти объекта ndarray, включая следующие атрибуты:
| Attribute | Описание |
|---|---|
| C_CONTIGUOUS (C) | Данные находятся в единой непрерывной области памяти в стиле C. |
| F_CONTIGUOUS (F) | Данные находятся в единой непрерывной области памяти в стиле Fortran. |
| OWNDATA (O) | Массив владеет используемой им памятью, а не заимствует её у других объектов. |
| WRITEABLE (W) | Область данных может быть записана; установка этого значения в False делает данные доступными только для чтения. |
| ALIGNED (A) | Данные и все элементы правильно выровнены в соответствии с требованиями аппаратного обеспечения. |
| WRITEBACKIFCOPY (X) | Этот массив является копией другого массива; когда этот массив освобождается, его содержимое будет записано обратно в исходный массив. |
Устаревший UPDATEIFCOPY (U) — это старое название WRITEBACKIFCOPY. В NumPy 1.14 он был объявлен устаревшим и полностью удалён начиная с NumPy 2.0, поэтому теперь его не следует использовать.
C_CONTIGUOUS и F_CONTIGUOUS описывают порядок, в котором одни и те же данные располагаются в памяти. Для одного и того же двумерного массива существуют два типичных способа хранения:
Пример
x = np.array([1, 2, 3, 4, 5])
print(x.flags)
Результат вывода:
C_CONTIGUOUS : True F_CONTIGUOUS : True OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : FalseДругие расширения