Массив n-мерный (ndarray)
Массив ndarray — это (обычно имеющий фиксированный размер) многомерный контейнер элементов одного типа и размера. Число измерений и элементов в массиве определяются его shape, который является tuple из N неотрицательных целых чисел, определяющих размеры каждого измерения. Тип элементов в массиве определяется отдельным объектом типа данных (dtype), один из которых связан с каждым ndarray.
Как и другие контейнерные объекты в Python, содержимое ndarray может быть обработано и изменено путём индексирования или среза массива (например, используя N целых чисел), а также посредством методов и атрибутов ndarray.
Разные ndarrays могут совместно использовать одни и те же данные, так что изменения, внесённые в одном ndarray, могут быть видны в другом. То есть, ndarray может быть “представлением” другого ndarray, и за данные, на которые он ссылается, отвечает “базовый” массив. Ndarray также могут быть представлениями памяти, принадлежащей Python strings или объектам, реализующим интерфейсы buffer или массива.
Пример
Двумерный массив размером 2x3, составленный из 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])
>>> y[0] = 9 # this also changes the corresponding element in x
>>> y
array([9, 5])
>>> x
array([[1, 9, 3],
[4, 5, 6]])
Создание массивов
Новые массивы можно создавать, используя процедуры, описанные в процедурах создания массивов, а также с помощью конструктора ndarray низкого уровня:
| Объект массива представляет собой многомерный однородный массив элементов фиксированного размера. |
Индексирование массивов
Массивы можно индексировать, используя расширенный синтаксис срезов Python, array[selection]. Аналогичный синтаксис также используется для доступа к полям в структурированном типе данных.
См. также
Внутреннее расположение памяти в ndarray
Экземпляр класса ndarray состоит из непрерывного одномерного сегмента компьютерной памяти (принадлежащего массиву или какому-либо другому объекту), совместно с схемой индексирования, которая отображает N целых чисел на местоположение элемента в блоке. Диапазоны, в которых индексы могут изменяться, задаются shape массива. Количество байт, занимаемых каждым элементом, и интерпретация этих байт определяются объектом типа данных, связанным с массивом.
Сегмент памяти по своей природе одномерный, и существует множество схем для размещения элементов N-мерного массива в одномерном блоке. NumPy гибкий, и ndarray объекты могут поддерживать любые индексирующие схемы с шагами. В схеме с шагами индекс N-мерного массива соответствует смещению (в байтах):
от начала блока памяти, связанного с массивом. Здесь, являются целыми числами, которые определяют
strides массива. Столбцевый порядок (используемый, например, в языке Fortran и в Matlab) и строчный порядок (используемый в C) — это всего лишь особые виды схем со смещениями и соответствуют памяти, к которой можно получить доступ по этим смещениям:
где
= self.shape[j].
И C-, и Fortran-порядок являются непрерывными (contiguous), то есть имеющими структуру из одного сегмента, макеты памяти, в которых любой фрагмент блока памяти можно получить по некоторому сочетанию индексов.
Примечание
Contiguous arrays и single-segment arrays являются синонимами и используются взаимозаменяемо в документации.
Хотя массив, являющийся непрерывным в стиле C и Fortran, у которого установлены соответствующие флаги, может быть обращён с помощью указанных выше смещений, фактические смещения могут быть другими. Это может произойти в двух случаях:
- Если
self.shape[k] == 1тогда для любого допустимого индексаindex[k] == 0. Это означает, что в формуле для смещенияи таким образом
и значение
= self.strides[k]является произвольным. - Если в массиве нет элементов (
self.size == 0) нет допустимого индекса, и смещения никогда не используются. Любой массив без элементов может рассматриваться как непрерывный в стиле C и Fortran.
Пункт 1. означает, что self и self.squeeze() всегда имеют одинаковую непрерывность и aligned значение флага.
Массив считается выровненным, если смещения памяти для всех элементов и само базовое смещение кратны self.itemsize. Понимание memory-alignment приводит к лучшей производительности на большинстве устройств.
Примечание
Пункты (1) и (2) в настоящее время могут быть отключены переменной среды времени компиляции NPY_RELAXED_STRIDES_CHECKING=0, которая была по умолчанию до NumPy 1.10. Пользователям это делать не нужно. NPY_RELAXED_STRIDES_DEBUG=1 можно использовать для поиска ошибок, когда некорректно полагаются на смещения в коде C-расширения (см. предупреждение ниже).
Вы можете проверить, был ли этот параметр включен при построении NumPy, посмотрев значение np.ones((10,1),
order='C').flags.f_contiguous. Если это True, то у вашего NumPy включена проверка смещений с ослабленными ограничениями.
Предупреждение
В общем случае неверно, что self.strides[-1] == self.itemsize для непрерывных массивов в стиле C или self.strides[0] == self.itemsize для непрерывных массивов в стиле Fortran является истинным.
Данные в новом ndarrays находятся в строчном (C) порядке, если не указано иное, но, например, основной срез массива часто создаёт представления в другой схеме.
Примечание
Некоторые алгоритмы в NumPy работают с произвольно смещёнными массивами. Однако некоторые алгоритмы требуют массивов с одним сегментом. Если в таких алгоритмы передаётся массив с нерегулярными смещениями, автоматически создаётся копия.
Атрибуты массива
Атрибуты массива отражают информацию, которая является внутренней для самого массива. Обычно доступ к массиву через его атрибуты позволяет получать и иногда устанавливать внутренние свойства массива без создания нового массива. Выставленные атрибуты являются основными частями массива, и только некоторые из них могут быть осмысленно изменены без создания нового массива. Ниже приведена информация о каждом атрибуте.
Макет памяти
Следующие атрибуты содержат информацию о расположении памяти в массиве:
Информация о структуре размещения массива в памяти. | |
Кортеж размерностей массива. | |
Кортеж байтов, которые нужно перешагнуть в каждом измерении при прохождении по массиву. | |
Количество измерений массива. | |
Объект буфера Python, указывающий на начало данных массива. | |
Количество элементов в массиве. | |
Длина одного элемента массива в байтах. | |
Общее количество байтов, занимаемых элементами массива. | |
Базовый объект, если память взята из другого объекта. |
Тип данных
См. также
Объект типа данных, связанный с массивом, можно найти в атрибуте dtype:
Тип данных элементов массива. |
Другие атрибуты
Транспонированный массив. | |
Действительная часть массива. | |
Мнимая часть массива. | |
Итератор по массиву в виде одномерного массива. | |
Объект для упрощения взаимодействия массива с модулем 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 bytes, содержащий сырые байты данных из массива. |
| Записывает массив в файл в виде текста или двоичных данных (по умолчанию). |
| Сохраняет pickle массива в указанный файл. |
Возвращает pickle массива в виде строки. | |
| Копия массива, преобразованная к указанному типу. |
| Меняет порядок байтов элементов массива. |
| Возвращает копию массива. |
| Новая интерпретация массива с теми же данными. |
| Возвращает поле данного массива как определённого типа. |
| Устанавливает флаги массива WRITEABLE, ALIGNED, (WRITEBACKIFCOPY и UPDATEIFCOPY) соответственно. |
| Заполняет массив скалярным значением. |
Изменение формы
Для reshape, resize и transpose единственный кортеж аргументов может быть заменён на n целых числа, которые будут интерпретироваться как n-кортеж.
| Возвращает массив, содержащий те же данные с новой формой. |
| Изменяет форму и размер массива на месте. |
| Возвращает представление массива с переставленными осями. |
| Возвращает представление массива с осями |
| Возвращает копию массива, сжатого в одну размерность. |
| Возвращает сплюснутый массив. |
| Удаляет оси длиной 1 из |
Выбор и изменение элементов
Для методов массива, принимающих ключевое слово 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__.
Арифметические операции (in-place):
| Возвращает self+=value. |
| Возвращает self-=value. |
| Возвращает self*=value. |
| Возвращает self/=value. |
| Возвращает self//=value. |
| Возвращает self%=value. |
| Возвращает self**=value. |
| Возвращает self<<=value. |
| Возвращает self>>=value. |
| Возвращает self&=value. |
| Возвращает self|=value. |
| Возвращает self^=value. |
Предупреждение
Операции in-place выполнят вычисления с точностью, определяемой типом данных двух операндов, но молча понизит точность результата (при необходимости), чтобы он поместился обратно в массив. Таким образом, для вычислений с разной точностью 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 в соответствии с PEP465. NumPy 1.10.0 имеет предварительную реализацию @ в целях тестирования. Дополнительную документацию можно найти в документации matmul.
Специальные методы
Для стандартных функций Python:
Используется, если вызывается | |
| Используется, если вызывается |
Для сериализации. | |
| Для десериализации. |
Базовая настройка:
| Создает и возвращает новый объект. |
| Возвращает либо новую ссылку на self, если dtype не задан, либо новый массив с указанным типом данных, если dtype отличается от текущего типа данных массива. |
Настройка контейнера: (см. Индексирование)
Возвращает len(self). | |
| Возвращает self[key]. |
| Устанавливает self[key] в значение value. |
| Возвращает key in self. |
Преобразования; операции int(), float() и complex(). Они работают только с массивами, содержащими один элемент, и возвращают соответствующее скалярное значение.
| |
| |
Представления в виде строк:
Возвращает str(self). | |
Возвращает repr(self). |
© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/arrays.ndarray.html