Многомерный массив (ndarray)
ndarray представляет собой (обычно имеющий фиксированный размер) многомерный контейнер элементов одного типа и размера. Количество измерений и элементов в массиве определяется его shape, которое является tuple из N неотрицательных целых чисел, определяющих размеры каждого измерения. Тип элементов в массиве определяется отдельным объектом типа данных (dtype), один из которых связан с каждым ndarray.
Как и другие контейнерные объекты в Python, содержимое ndarray можно получить и изменить, используя индексацию или срезы массива (например, с помощью N целых чисел), а также через методы и атрибуты ndarray.
Разные ndarrays могут совместно использовать одни и те же данные, поэтому изменения, внесенные в один ndarray, могут быть видны в другом. То есть, ndarray может быть «представлением» другого ndarray, и за данные, на которые он ссылается, отвечает «базовый» ndarray. ndarray также могут быть представлениями памяти, принадлежащей Python strings или объектам, реализующим buffer или интерфейсы .
Пример
Двумерный массив размером 2 х 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])
>>> y[0] = 9 # this also changes the corresponding element in x
>>> y
array([9, 5])
>>> x
array([[1, 9, 3],
[4, 5, 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 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 значения. Это также означает, что даже многомерный массив может быть одновременно непрерывным в стиле C и Fortran.
Массив считается выровненным, если смещения памяти для всех элементов и базовое смещение сами по себе являются кратными 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, содержащий сырые байты данных в массиве. |
| Записать массив в файл в виде текста или двоичных данных (по умолчанию). |
| Записать пикл массива в указанный файл. |
Возвращает пикл массива в виде строки. | |
| Копия массива, приведённая к указанному типу. |
| Поменять байты элементов массива. |
| Возвращает копию массива. |
| Новый вид массива с теми же данными. |
| Возвращает поле данного массива как определённый тип. |
| Устанавливает флаги массива WRITEABLE, ALIGNED, (WRITEBACKIFCOPY и UPDATEIFCOPY), соответственно. |
| Заполнить массив скалярным значением. |
Изменение формы
Для reshape, resize и transpose единственный кортеж аргумента может быть заменён на n целые числа, которые будут интерпретированы как n-кортеж.
| Возвращает массив, содержащий те же данные с новой формой. |
| Изменить форму и размер массива на месте. |
| Возвращает представление массива с переставленными осями. |
| Возвращает представление массива с осями |
| Возвращает копию массива, сжатого в одно измерение. |
| Возвращает уплощенный массив. |
| Удалить одномерные элементы из формы |
Выборка и обработка элементов
Для методов массива, принимающих ключевое слово axis, оно по умолчанию равно None. Если axis равно None, то массив обрабатывается как одномерный. Любое другое значение axis представляет измерение, по которому должно происходить действие.
| Возвращает массив, сформированный из элементов |
| Установить |
| Повторить элементы массива. |
| Используйте массив индексов для создания нового массива из набора вариантов. |
| Сортировать массив на месте. |
| Возвращает индексы, которые отсортируют этот массив. |
| Переупорядочивает элементы в массиве таким образом, что значение элемента в позиции kth находится в позиции, в которой он бы находился в отсортированном массиве. |
| Возвращает индексы, которые разделили бы этот массив. |
| Найти индексы, где элементы v должны быть вставлены в a, чтобы сохранить порядок. |
Возвращает индексы элементов, отличных от нуля. | |
| Возвращает выбранные срезы этого массива вдоль заданной оси. |
| Возвращает указанные диагонали. |
Вычисление
Многие из этих методов принимают аргумент с именем axis. В таких случаях,
- Если axis равен None (по умолчанию), массив рассматривается как одномерный, и операция выполняется над всем массивом. Это поведение также является по умолчанию, если self является массивом размерности 0 или скаляром массива. (Скаляр массива — это экземпляр типов/классов float32, float64 и т. д., тогда как массив размерности 0 — это экземпляр 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< |
| Возвращает self>>value. |
| Возвращает self&value. |
| Возвращает self|value. |
| Возвращает self^value. |
Примечание
- Любой третий аргумент функции
powигнорируется, так как функцияufuncв NumPy принимает только два аргумента. - Так как
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.
Специальные методы
Для стандартных функций Python:
Используется, если функция | |
Используется, если функция | |
Для сериализации. | |
| Для десериализации. |
Базовая настройка:
| Создает и возвращает новый объект. |
Возвращает либо новую ссылку на 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.19/reference/arrays.ndarray.html