Многомерный массив (ndarray)
ndarray — это (обычно имеющий фиксированный размер) многомерный контейнер элементов одного типа и размера. Количество измерений и элементов в массиве определяется его shape, которое является tuple из N неотрицательных целых чисел, задающих размеры каждого измерения. Тип элементов в массиве задаётся отдельным ndarray — одним из тех, что ассоциированы с каждым ndarray.
Как и другие контейнерные объекты в Python, содержимое ndarray можно получить и изменить, используя индексацию или срезы массива (например, с помощью N целых чисел), а также через методы и атрибуты ndarrays.
Разные ndarray могут использовать одни и те же данные, так что изменения, внесённые в один strings, могут быть видны и в другом. То есть, ndarray может быть «видом» другого ndarray, и данные, к которым он ссылается, обслуживаются «базовым» ndarray. Ndarray также могут быть представлениями памяти, принадлежащей Python-строкам или объектам, реализующим интерфейсы buffer или
>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)
<class 'numpy.ndarray'>
>>> x.shape
(2, 3)
>>> x.dtype
dtype('int32')
. Пример
Двумерный массив размером 2 x 3, состоящий из 4-байтовых целочисленных элементов:
>>> # The element of x in the *second* row, *third* column, namely, 6. >>> x[1, 2] 6
К массиву можно обращаться, используя синтаксис, похожий на контейнеры Python:
>>> y = x[:,1]
>>> y
array([2, 5])
>>> y[0] = 9 # this also changes the corresponding element in x
>>> y
array([9, 5])
>>> x
array([[1, 9, 3],
[4, 5, 6]])
Например, ndarray могут создавать представления массива:
ndarray Создание массивов
Новые массивы можно создавать, используя процедуры, описанные в array[selection], а также с помощью низкоуровневого конструктора ndarray.
| Объект массива представляет собой многомерный однородный массив элементов фиксированного размера. |
Индексация массивов
Массивы можно индексировать, используя расширенный синтаксис срезов Python, ndarray. Похожий синтаксис также используется для доступа к полям в strides.
См. также
Внутреннее расположение памяти ndarray
Экземпляр класса = self.shape[j] состоит из непрерывного одномерного сегмента компьютерной памяти (принадлежащей массиву или другому объекту), объединённого со схемой индексации, которая отображает N целых чисел в местоположение элемента в блоке. Диапазоны, в которых могут изменяться индексы, задаются Contiguous arrays массива. Сколько байтов занимает каждый элемент и как интерпретируются байты, определяет single-segment arrays , связанный с массивом.
Сегмент памяти по своей сути одномерен, и существует много различных схем упорядочения элементов N-мерного массива в одномерном блоке. NumPy гибкий, и объекты self.shape[k] == 1 могут использовать любую схему индексации с шагом. В схеме с шагом индекс N-мерный \((n_0, n_1, ..., n_{N-1})\) соответствует смещению (в байтах):
от начала блока памяти, связанного с массивом. Здесь \(s_k\) — целые числа, которые определяют index[k] == 0 массива. = self.strides[k] порядок (используемый, например, в языке Fortran и в Matlab) и self.size == 0 порядок (используемый в C) являются просто специфическими типами схемы с шагом и соответствуют памяти, к которой можно обратиться с помощью шагов:
где \(d_j\) self.
Оба порядка C и Fortran являются self.squeeze(), т.е. односегментными, расположениями памяти, в которых каждый фрагмент блока памяти может быть обращён с помощью некоторой комбинации индексов.
Примечание
aligned и self.itemsize являются синонимами и используются взаимозаменяемо на протяжении всей документации.
Хотя массив C- и Fortran-стиля, который имеет соответствующие флаги, может быть обращён с указанными шагами, фактические шаги могут отличаться. Это может произойти в двух случаях:
- Если
memory-alignment, то для любого допустимого индексаNPY_RELAXED_STRIDES_CHECKING=0. Это означает, что в формуле для смещения \(n_k = 0\) и, следовательно, \(s_k n_k = 0\) и значение \(s_k\)NPY_RELAXED_STRIDES_DEBUG=1является произвольным. - Если массив не имеет элементов (
np.ones((10,1), order='C').flags.f_contiguous) , то нет допустимого индекса, и шаги никогда не используются. Любой массив без элементов может считаться непрерывным в стилях C и Fortran.
Пункт 1. означает, что True и self.strides[-1] == self.itemsize всегда имеют одинаковую непрерывность и значения флагов self.strides[0] == self.itemsize. Это также означает, что даже многомерный массив может быть одновременно C- и Fortran-стилями непрерывным.
Массив считается выровненным, если смещения памяти для всех элементов и само базовое смещение кратны ndarrays. Понимание ndarray.flags приводит к лучшей производительности на большинстве аппаратных платформ.
Примечание
Пункты (1) и (2) в настоящее время могут быть отключены переменной среды времени компиляции ndarray.shape, которая была установлена по умолчанию до NumPy 1.10. Пользователям не нужно это делать. ndarray.strides может быть использован для поиска ошибок, когда неправильно полагаются на шаги в коде расширений C (см. предупреждение ниже).
Вы можете проверить, была ли эта опция включена при создании вашей NumPy, посмотрев значение ndarray.ndim. Если это ndarray.data, то проверка шагов NumPy ослаблена.
Предупреждение
В общем случае неверно, что ndarray.size для C-непрерывных массивов или ndarray.itemsize для Fortran-непрерывных массивов верно.
Данные в новом ndarray.nbytes находятся в ndarray.base (C) порядке, если не указано иное, но, например, dtype часто создают представления в другой схеме.
Примечание
Некоторые алгоритмы в NumPy работают с произвольно шаговыми массивами. Однако некоторые алгоритмы требуют массивов с одним сегментом. Когда в такие алгоритмы передаётся массив с неравномерными шагами, автоматически создаётся копия.
Атрибуты массива
Атрибуты массива отражают информацию, которая является неотъемлемой частью самого массива. Как правило, обращение к массиву через его атрибуты позволяет получить и порой установить внутренние свойства массива без создания нового массива. Доступные атрибуты являются основными частями массива, и только некоторые из них могут быть осмысленно изменены без создания нового массива. Информация по каждому атрибуту приведена ниже.
Структура памяти
Следующие атрибуты содержат информацию о структуре памяти массива:
Информация о расположении памяти массива. | |
Кортеж размеров массива. | |
Кортеж байтов для шага в каждом измерении при обходе массива. | |
Количество измерений массива. | |
Объект буфера Python, указывающий на начало данных массива. | |
Количество элементов в массиве. | |
Длина одного элемента массива в байтах. | |
Общее количество байтов, занимаемых элементами массива. | |
Базовый объект, если память взята из другого объекта. |
Тип данных
См. также
Объект типа данных, связанный с массивом, можно найти в атрибуте dtype:
Тип данных элементов массива. |
Другие атрибуты
Транспонированный массив. | |
Вещественная часть массива. | |
Мнимая часть массива. | |
Итератор по массиву в 1-D формате. | |
Объект для упрощения взаимодействия массива с модулем ctypes. |
Интерфейс массивов
См. также
Сторона 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, ptp, put, ravel, real, repeat, reshape, round, searchsorted, sort, squeeze, std, sum, swapaxes, take, trace, transpose, var.
Преобразование массивов
| Скопировать элемент массива в стандартный Python-скаляр и вернуть его. |
Вернуть массив в виде вложенного списка Python-скаляров глубиной | |
| Вставить скаляр в массив (скаляр приводится к типу данных массива, если это возможно). |
| Алиас совместимости для |
| Создать Python-байты, содержащие сырые данные байтов в массиве. |
| Записать массив в файл как текст или двоичные данные (по умолчанию). |
| Сохранить пикл массива в указанный файл. |
Возвращает пикл массива в виде строки. | |
| Копия массива, приведённого к указанному типу. |
| Поменять байты элементов массива |
| Возвращает копию массива. |
| Новый вид массива с теми же данными. |
| Возвращает поле данного массива как определённого типа. |
| Установить флаги массива WRITEABLE, ALIGNED, (WRITEBACKIFCOPY и UPDATEIFCOPY), соответственно. |
| Заполнить массив скалярным значением. |
Изменение формы массива
Для reshape, resize и transpose единственный аргумент кортежа можно заменить n целыми числами, которые будут интерпретироваться как n-кортеж.
| Возвращает массив, содержащий те же данные с новой формой. |
| Изменить форму и размер массива на месте. |
| Возвращает представление массива с переставленными осями. |
| Возвращает представление массива с осями |
| Возвращает копию массива, сжатую в одну размерность. |
| Возвращает сплюснутый массив. |
| Удалить оси длиной один из |
Выбор и обработка элементов
Для методов массива, принимающих ключевое слово axis, оно по умолчанию равно None. Если axis равно None, то массив обрабатывается как одномерный. Любое другое значение axis представляет собой размерность, по которой должно происходить действие.
| Возвращает массив, образованный из элементов |
| Установить |
| Повторять элементы массива. |
| Использовать массив индексов для построения нового массива из набора выборов. |
| Сортировать массив на месте. |
| Возвращает индексы, которые отсортируют этот массив. |
| Переупорядочивает элементы в массиве таким образом, что значение элемента в позиции kth находится в позиции, в которой оно находилось бы в отсортированном массиве. |
| Возвращает индексы, которые бы разделили этот массив. |
| Найти индексы, куда следует вставить элементы v, чтобы сохранить порядок. |
Возвращает индексы элементов, которые не равны нулю. | |
| Возвращает выбранные срезы этого массива вдоль заданной оси. |
| Возвращает указанные диагонали. |
Расчёт
Многие из этих методов принимают аргумент с именем 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()):
self != 0 |
Примечание
Проверка истинности значения массива вызывает 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. |
Примечание
Операторы матриц @ и @= были введены в Python 3.5 вслед за PEP 465, а оператор @ был введен в NumPy 1.10.0. Дополнительную информацию можно найти в документации по matmul.
Специальные методы
Для стандартных функций библиотеки:
Используется, если вызывается | |
| Используется, если вызывается |
Для сериализации. | |
| Для десериализации. |
Базовая настройка:
| Создаёт и возвращает новый объект. |
| Возвращает либо новую ссылку на self, если dtype не указан, либо новый массив указанного типа данных, если dtype отличается от текущего типа данных массива. |
Настройка контейнера: (см. Индексирование)
Возвращает len(self). | |
| Возвращает self[key]. |
| Устанавливает self[key] в значение value. |
| Возвращает key in self. |
Преобразование; операции int(), float() и complex(). Они работают только с массивами, содержащими один элемент, и возвращают соответствующий скаляр.
| |
| |
Строковые представления:
Возвращает str(self). | |
Возвращает repr(self). |
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/arrays.ndarray.html