Многомерный массив (ndarray)
Объект ndarray представляет собой (обычно с фиксированным размером) многомерный контейнер элементов одного типа и размера. Количество измерений и элементов в массиве определяется его shape, который является tuple из N неотрицательных целых чисел, определяющих размеры каждого измерения. Тип элементов в массиве задается отдельным объектом типа данных (dtype), один из которых связан с каждым ndarray.
Как и в других контейнерных объектах Python, содержимое ndarray можно получить и изменить, используя индексацию или срезы массива (например, используя N целых чисел), а также методы и атрибуты объекта ndarray.
Разные ndarrays могут использовать одни и те же данные, так что изменения, внесённые в один ndarray, могут быть видны в другом. То есть, ndarray может быть «представлением» другого ndarray, и данные, на которые он ссылается, обрабатываются «базовым» ndarray. ndarray также могут быть представлениями памяти, принадлежащей Python strings или объектам, реализующим интерфейсы buffer или массив.
Пример
Двумерный массив размера 2x3, составленный из 4-байтовых целочисленных элементов:
>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)
<type '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]
Например, срезы могут создавать представления массива:
>>> 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) являются непрерывными, т.е. с одним сегментом, расположениями памяти, в которых к любой части блока памяти можно получить доступ с помощью некоторой комбинации индексов.
Хотя массив с непрерывной памятью по C-стилю и Fortran-стилю, который имеет соответствующие флаги, может быть обращён к указанным смещениям, фактические смещения могут быть другими. Это может произойти в двух случаях:
- Если
self.shape[k] == 1то для любого допустимого индексаindex[k] == 0. Это означает, что в формуле для смещенияи, следовательно,
и значение
= self.strides[k]произвольно. - Если у массива нет элементов (
self.size == 0) нет допустимого индекса, и смещения никогда не используются. Любой массив без элементов можно считать непрерывным по C-стилю и Fortran-стилю.
Пункт 1 означает, что self и self.squeeze() всегда имеют одинаковую непрерывность и значения флагов aligned. Это также означает, что даже многомерный массив может быть одновременно непрерывным по C-стилю и Fortran-стилю.
Массив считается выровненным, если смещения памяти для всех элементов и базовое смещение являются кратными self.itemsize. Понимание memory-alignment приводит к лучшей производительности на большинстве аппаратных платформ.
Примечание
Пункты (1) и (2) пока не применяются по умолчанию. Начиная с NumPy 1.8.0, они применяются последовательно только в том случае, если переменная окружения NPY_RELAXED_STRIDES_CHECKING=1 была определена при сборке NumPy. В конечном итоге это станет значением по умолчанию.
Вы можете проверить, был ли включён этот параметр при сборке вашего 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-строку байтов, содержащую сырые байты данных в массиве. |
| Создаёт Python-строку байтов, содержащую сырые байты данных в массиве. |
| Записывает массив в файл в виде текста или двоичных данных (по умолчанию). |
| Сохраняет копию массива в указанный файл в формате pickle. |
Возвращает строку pickle массива. | |
| Копия массива, преобразованного к указанному типу. |
| Меняет порядок байтов элементов массива |
| Возвращает копию массива. |
| Новый вид массива с теми же данными. |
| Возвращает поле данного массива как определённого типа. |
| Установка флагов массива 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-хмерный размерностью 3x3x3, суммируемый по каждой из трёх осей
>>> 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принимает только два аргумента. - Три оператора деления определены;
divактивен по умолчанию,truedivактивен, когда деление__future__включено. - Поскольку
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 в соответствии с PEP465. 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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/arrays.ndarray.html