Многомерный массив (ndarray)
Массив ndarray представляет собой (обычно с фиксированным размером) многомерный контейнер элементов одного типа и размера. Количество измерений и элементов в массиве определяется его shape, который является tuple из N неотрицательных целых чисел, определяющих размеры каждого измерения. Тип элементов в массиве определяется отдельным объектом типа данных (dtype), каждый из которых связан с каждым ndarray.
Как и другие контейнерные объекты в Python, содержимое массива ndarray может быть обработано и изменено путем индексирования или среза массива (используя, например, N целых чисел), а также через методы и атрибуты массива ndarray.
Разные ndarrays могут совместно использовать одни и те же данные, так что изменения, внесенные в одном ndarray, могут быть видны в другом. То есть, ndarray может быть «просмотром» другого ndarray, а за данными, на которые он ссылается, отвечает «базовый» ndarray. ndarray также могут быть представлениями памяти, принадлежащей Python strings или объектам, реализующим интерфейсы memoryview или массива.
Пример
Двумерный массив размером 2 x 3, состоящий из 4-байтовых целочисленных элементов:
>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)
<class 'numpy.ndarray'>
>>> x.shape
(2, 3)
>>> x.dtype
dtype('int32')
К массиву можно обратиться с помощью синтаксиса, подобного контейнерам Python:
>>> # The element of x in the *second* row, *third* column, namely, 6. >>> x[1, 2] 6
Например, срезы могут создавать представления массива:
>>> y = x[:,1]
>>> y
array([2, 5], dtype=int32)
>>> y[0] = 9 # this also changes the corresponding element in x
>>> y
array([9, 5], dtype=int32)
>>> x
array([[1, 9, 3],
[4, 5, 6]], dtype=int32)
Создание массивов
Новые массивы могут быть созданы с помощью процедур, описанных в процедурах создания массивов, а также с помощью низкоуровневого конструктора ndarray:
| Объект массива представляет собой многомерный однородный массив элементов фиксированного размера. |
Индексирование массивов
Массивы можно индексировать с помощью расширенного синтаксиса срезов Python, array[selection]. Аналогичный синтаксис также используется для доступа к полям в структурированном типе данных.
См. также
Внутреннее расположение памяти ndarray
Экземпляр класса ndarray состоит из непрерывного одномерного сегмента компьютерной памяти (принадлежащей массиву или другому объекту), совместно с схемой индексирования, которая отображает N целых чисел в положение элемента в блоке. Диапазоны, в которых могут изменяться индексы, задаются shape массива. Размер байтов каждого элемента и способ интерпретации байтов определяются связанным с массивом объектом типа данных.
Сегмент памяти изначально одномерный, и существует множество схем для размещения элементов N-мерного массива в одномерном блоке. NumPy гибкий, и объекты ndarray могут адаптироваться к любой схеме индексирования со смещением. В схеме со смещением N-мерный индекс \((n_0, n_1, ..., n_{N-1})\) соответствует смещению (в байтах):
от начала блока памяти, связанного с массивом. Здесь \(s_k\) — целые числа, которые задают strides массива. Порядок следования столбцов (используемый, например, в языке Fortran и в Matlab) и порядок следования строк (используемый в C) — это просто частные случаи схемы со смещением, и соответствуют памяти, к которой можно обратиться с помощью смещений:
где \(d_j\) = self.shape[j].
Оба порядка (C и Fortran) являются непрерывными, то есть имеют односегментную структуру памяти, в которой к каждой части блока памяти можно обратиться с помощью некоторой комбинации индексов.
Примечание
Непрерывные массивы и односегментные массивы — синонимы и используются взаимозаменяемо в документации.
Хотя массив, непрерывный в стиле C или Fortran, у которого установлены соответствующие флаги, может быть обработано с указанными выше смещениями, фактические смещения могут быть другими. Это может произойти в двух случаях:
- Если
self.shape[k] == 1то для любого допустимого индексаindex[k] == 0. Это означает, что в формуле для смещения \(n_k = 0\) и, следовательно, \(s_k n_k = 0\) и значение \(s_k\)= self.strides[k]произвольное. - Если массив не имеет элементов (
self.size == 0) допустимого индекса нет, и смещения никогда не используются. Любой массив без элементов может считаться непрерывным в стиле C и Fortran.
Пункт 1 означает, что self и self.squeeze() всегда имеют одинаковую непрерывность и aligned значения флагов. Это также означает, что даже многомерный массив может быть одновременно непрерывным в стиле C и Fortran.
Массив считается выровненным, если смещения памяти для всех элементов и само базовое смещение кратны self.itemsize. Понимание выравнивания памяти приводит к лучшему быстродействию на большинстве аппаратных платформ.
Предупреждение
В общем случае self.strides[-1] == self.itemsize для непрерывных массивов в стиле C или self.strides[0] == self.itemsize для непрерывных массивов в стиле Fortran неверно.
Данные в новом массиве ndarrays имеют порядок строк (C), если не указано иное, но, например, основной срез массива часто создает представления в другой схеме.
Примечание
Некоторые алгоритмы в NumPy работают с произвольно смещёнными массивами. Однако некоторые алгоритмы требуют односегментных массивов. Когда в такие алгоритмы передается массив с произвольным смещением, автоматически создаётся копия.
Атрибуты массива
Атрибуты массива отражают информацию, которая присуща самому массиву. Обычно доступ к массиву через его атрибуты позволяет получить и иногда установить внутренние свойства массива без создания нового массива. Открытые атрибуты являются основными частями массива, и только некоторые из них могут быть осмысленно сброшены без создания нового массива. Информация по каждому атрибуту приведена ниже.
Макет памяти
Следующие атрибуты содержат информацию о макете памяти массива:
Информация о макете памяти массива. | |
Кортеж измерений массива. | |
Кортеж байтов, которые нужно пропустить в каждом измерении при прохождении по массиву. | |
Количество измерений массива. | |
Объект буфера Python, указывающий на начало данных массива. | |
Количество элементов в массиве. | |
Длина одного элемента массива в байтах. | |
Общее количество байтов, занимаемых элементами массива. | |
Базовый объект, если память взята из другого объекта. |
Тип данных
См. также
Объект типа данных, связанный с массивом, можно найти в атрибуте dtype:
Тип данных элементов массива. |
Другие атрибуты
Представление транспонированного массива. | |
Вещественная часть массива. | |
Мнимая часть массива. | |
Итератор по массиву в 1-D формате. |
Интерфейс массива
См. также
Сторона Python интерфейса массива | |
Сторона C интерфейса массива |
ctypes интерфейс внешних функций
Объект для упрощения взаимодействия массива с модулем ctypes. |
Методы массивов
Объект ndarray имеет множество методов, которые действуют на массив или с ним, обычно возвращая массив в результате. Эти методы кратко описаны ниже. (Полное описание содержится в документации каждого метода.)
Для следующих методов также существуют соответствующие функции в numpy: all, any, argmax, argmin, argpartition, argsort, choose, clip, compress, copy, cumprod, cumsum, diagonal, imag, max, mean, min, nonzero, partition, prod, put, ravel, real, repeat, reshape, round, searchsorted, sort, squeeze, std, sum, swapaxes, take, trace, transpose, var.
Преобразование массивов
| Копирует элемент массива в стандартный скаляр Python и возвращает его. |
Возвращает массив в виде вложенного списка Pythonских скаляров до глубины | |
| Синоним для |
| Создаёт строку Python с сырыми байтовыми данными массива. |
| Записывает массив в файл как текст или двоичные данные (по умолчанию). |
| Сохраняет пикл массива в указанный файл. |
Возвращает строку пикла массива. | |
| Копия массива, преобразованного к указанному типу. |
| Меняет порядок байтов элементов массива. |
| Возвращает копию массива. |
| Новый вид массива с теми же данными. |
| Возвращает поле данного массива как определённого типа. |
| Устанавливает флаги массива WRITEABLE, ALIGNED, WRITEBACKIFCOPY соответственно. |
| Заполняет массив скалярным значением. |
Изменение формы массива
Для reshape, resize и transpose единственный кортеж аргумента может быть заменён на n целых чисел, которые будут интерпретированы как n-кортеж.
| Возвращает массив, содержащий те же данные с новой формой. |
| Изменяет форму и размер массива на месте. |
| Возвращает представление массива с транспонированными осями. |
| Возвращает представление массива с осями |
| Возвращает копию массива, сжатого в одно измерение. |
| Возвращает уплощённый массив. |
| Удаляет оси длины один из |
Выбор и обработка элементов
Для методов массива, принимающих ключевое слово axis, оно по умолчанию равно None. Если axis равно None, массив обрабатывается как одномерный. Любое другое значение axis определяет размерность, по которой должно выполняться действие.
| Возвращает массив, образованный элементами |
| Устанавливает |
| Повторяет элементы массива. |
| Использует массив индексов для построения нового массива из набора вариантов. |
| Сортирует массив на месте. |
| Возвращает индексы, которые отсортировали бы этот массив. |
| Частично сортирует элементы в массиве таким образом, что значение элемента в позиции k находится в позиции, в которой оно находилось бы в отсортированном массиве. |
| Возвращает индексы, которые бы разделили этот массив. |
| Находит индексы, куда элементы v следует вставить в массив a, чтобы сохранить порядок. |
Возвращает индексы элементов, отличных от нуля. | |
| Возвращает выбранные срезы этого массива вдоль заданной оси. |
| Возвращает указанные диагонали. |
Вычисления
Многие из этих методов принимают аргумент axis. В таких случаях,
- Если axis равно None (по умолчанию), массив обрабатывается как одномерный, и операция выполняется над всем массивом. Это поведение также является по умолчанию, если self является массивом нулевой размерности или скаляром массива. (Скаляр массива — это экземпляр типов/классов float32, float64 и т. д., а массив нулевой размерности — это экземпляр ndarray, содержащий ровно один скаляр массива.)
- Если axis является целым числом, операция выполняется по данной оси (для каждого одномерного подмассива, который можно создать вдоль заданной оси).
Пример аргумента axis
Трехмерный массив размером 3 x 3 x 3, суммированный по каждой из трёх осей
>>> x = np.arange(27).reshape((3,3,3))
>>> x
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> x.sum(axis=0)
array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
>>> # for sum, axis is the first keyword, so we may omit it,
>>> # specifying only its value
>>> x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]]),
array([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]]),
array([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]]))
Параметр dtype задаёт тип данных, по которому должна выполняться операция редукции (например, суммирование). Тип данных редукции по умолчанию — такой же, как тип данных self. Для предотвращения переполнения может быть полезно выполнить редукцию с использованием более крупного типа данных.
Для нескольких методов также можно указать необязательный аргумент out, и результат будет помещён в выходной массив. Аргумент out должен быть ndarray и иметь такое же количество элементов. Он может иметь другой тип данных, в этом случае будет выполнено приведение.
| Возвращает максимальное значение вдоль заданной оси. |
| Возвращает индексы максимальных значений вдоль заданной оси. |
| Возвращает минимальное значение вдоль заданной оси. |
| Возвращает индексы минимальных значений вдоль заданной оси. |
| Возвращает массив, значения которого ограничены |
Комплексно сопрягает все элементы. | |
| Возвращает |
| Возвращает сумму по диагоналям массива. |
| Возвращает сумму элементов массива по заданной оси. |
| Возвращает кумулятивную сумму элементов по заданной оси. |
| Возвращает среднее значение элементов массива по заданной оси. |
| Возвращает дисперсию элементов массива по заданной оси. |
| Возвращает стандартное отклонение элементов массива по заданной оси. |
| Возвращает произведение элементов массива по заданной оси. |
| Возвращает кумулятивное произведение элементов по заданной оси. |
| Возвращает True, если все элементы имеют значение True. |
| Возвращает True, если любой из элементов |
Арифметические, операции умножения матриц и сравнения
Арифметические и операции сравнения на ndarrays определены как поэлементные операции и обычно возвращают объекты ndarray в качестве результатов.
Каждая из арифметических операций (+, -, *, /, //, %, divmod(), ** или pow(), <<, >>, &, ^, |, ~ или сравнения (==, <, >, <=, >=, !=) эквивалентна соответствующей универсальной функции (или ufunc для краткости) в NumPy. Для получения дополнительной информации см. раздел Универсальные функции.
Операторы сравнения:
| Возвращает self<value. |
| Возвращает self<=value. |
| Возвращает self>value. |
| Возвращает self>=value. |
| Возвращает self==value. |
| Возвращает self!=value. |
Логическое значение массива (bool()):
True, если self, иначе False |
Примечание
Проверка истинности массива вызывает ndarray.__bool__, что вызывает ошибку, если количество элементов в массиве больше 1, потому что истинностное значение таких массивов неоднозначно. Используйте .any() и .all() вместо этого, чтобы однозначно указать, что подразумевается в таких случаях. (Если количество элементов равно 0, массив оценивается как False.)
Унарные операции:
-self | |
+self | |
| |
~self |
Арифметические операции:
| Возвращает self+value. |
| Возвращает self-value. |
| Возвращает self*value. |
| Возвращает self/value. |
| Возвращает self//value. |
| Возвращает self%value. |
| Возвращает divmod(self, value). |
| Возвращает pow(self, value, mod). |
| Возвращает self<<value. |
| Возвращает self>>value. |
| Возвращает self&value. |
| Возвращает self|value. |
| Возвращает self^value. |
Примечание
- Любой третий аргумент для
powигнорируется, так как лежащая в основеufuncпринимает только два аргумента. - Поскольку
ndarrayявляется встроенным типом (написанным на C), специальные методы__r{op}__не определены непосредственно. - Функции, вызываемые для реализации многих арифметических специальных методов для массивов, могут быть изменены с помощью
__array_ufunc__.
Арифметические операции, выполняемые на месте:
| Возвращает self+=value. |
| Возвращает self-=value. |
| Возвращает self*=value. |
| Возвращает self/=value. |
| Возвращает self//=value. |
| Возвращает self%=value. |
| Возвращает self**=value. |
| Возвращает self<<=value. |
| Возвращает self>>=value. |
| Возвращает self&=value. |
| Возвращает self|=value. |
| Возвращает self^=value. |
Предупреждение
Операции на месте выполняют вычисления с точностью, определяемой типом данных двух операндов, но при этом результат неявно понижается (при необходимости), чтобы он мог поместиться в массив. Поэтому для вычислений с разной точностью A {op}=
B может отличаться от A = A {op} B. Например, предположим a = ones((3,3)). Тогда a += 3j отличается от a = a +
3j: хотя оба они выполняют одно и то же вычисление, a += 3 преобразует результат, чтобы он поместился обратно в a, в то время как a = a + 3j привязывает имя a к результату.
Умножение матриц:
| Возвращает self@value. |
Специальные методы
Для стандартных функций:
Используется, если к массиву применяется | |
| Используется, если к массиву применяется |
Для сериализации. | |
| Для десериализации. |
Основные настройки:
| |
| Для параметра |
| Возвращает представление |
Настройка контейнера: (см. Индексирование)
Возвращает len(self). | |
| Возвращает self[key]. |
| Устанавливает self[key] в значение value. |
| Возвращает key in self. |
Преобразование; операции int(), float() и complex(). Они работают только с массивами, содержащими один элемент, и возвращают соответствующее скалярное значение.
| |
| |
Представления строк:
Возвращает str(self). | |
Возвращает repr(self). |
Утилитарный метод для типизации:
| Возвращает параметризованную оболочку вокруг типа |
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/arrays.ndarray.html