Атрибуты массива NumPy

В этой главе мы изучим некоторые базовые атрибуты массивов NumPy.

Число измерений массива NumPy называется его рангом. Ранг — это число осей, то есть число измерений массива.

Одномерный массив имеет ранг 1, двумерный массив имеет ранг 2 и так далее.

В NumPy каждое измерение массива называется осью, которая также является измерением.

Например, двумерный массив можно рассматривать как «одномерный массив, состоящий из одномерных массивов»: каждый элемент внешнего массива сам является одномерным массивом.

Здесь ось 0 соответствует направлению самого внешнего массива, ось 1 соответствует направлению внутреннего массива, и так далее.

Число осей — ранг — это число измерений массива.

Многие функции NumPy поддерживают параметр axis.

Для двумерного массива axis=0 означает работу вдоль оси 0, то есть операцию над каждым столбцом; axis=1 означает работу вдоль оси 1, то есть операцию над каждой строкой.

Ниже на примере двумерного массива с формой (2, 3) мы наглядно покажем направления двух осей и значения атрибутов:

axis = 1: horizontal arrow axis = 1 (axis 1) Horizontal direction, along each row axis = 0: vertical arrow axis = 0 (axis 0) Vertical direction, along each column Column index Column 0 Column 1 Column 2 Row index Row 0 Row 1 2×3 grid 1 2 3 4 5 6 Dashed-line association between rows and the shape card shape description card shape = (2, 3) 2 → length of axis 0 (number of rows) 3 → length of axis 1 (number of columns) Bottom attribute summary ndim = 2 (number of axes, i.e., rank) · size = 2 × 3 = 6 (total number of elements)

axis указывает, «в каком направлении сжимать», а не «по какой строке/столбцу»: суммирование вдоль axis=0 сжимает несколько строк в одну строку, поэтому результатом является сумма каждого столбца.

Пример

import numpy as np

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]

Интерактивная демонстрация ниже позволяет более наглядно показать направление суммирования двух осей. Нажимайте кнопки для переключения:

↓↓↓
1
2
3
4
5
6
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 используется для получения числа измерений массива (т. е. числа осей), которое является рангом.

Пример

import numpy as np

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 (количество столбцов).

Пример

import numpy as np

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

Результат вывода:

(2, 3)

ndarray.shape также можно использовать для изменения размера массива.

Пример

import numpy as np

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

Результат вывода:

[[1 2]
 [3 4]
 [5 6]]

NumPy также предоставляет функцию reshape для изменения размера массивов.

Пример

import numpy as np

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.

Пример

import numpy as np

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-битное число с плавающей запятой.

Пример

import numpy as np

# Списки целых чисел по умолчанию создают массив 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 возвращают соответственно действительную и мнимую части каждого элемента массива; в основном используются, когда тип элементов — комплексный.

Пример

import numpy as np

# Создание комплексного массива, тип по умолчанию — 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.

Пример

import numpy as np

# Тип 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 описывают порядок, в котором одни и те же данные располагаются в памяти. Для одного и того же двумерного массива существуют два типичных способа хранения:

Left: C language style (row-major) C language style (row-major) Store row 0 completely, then row 1 123 456 Storage order indices: by row 1~6 1 2 3 4 5 6 Expand sequentially by row Memory: 1 2 3 4 5 6 123 456 1 2 3 4 5 6 012 345 Memory addresses (left to right) C_CONTIGUOUS : True Right: Fortran language style (column-major) Fortran language style (column-major) Store column 0 completely, then column 1 123 456 Storage order indices: by column 1~6 1 2 3 4 5 6 Expand sequentially by column Memory: 1 4 2 5 3 6 142 536 1 2 3 4 5 6 012 345 Memory addresses (left to right) F_CONTIGUOUS : True Bottom description NumPy arrays are stored in C language style (row-major) by default

Пример

import numpy as np

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
Другие расширения