Массив n-мерных данных (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)
<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:
ndarray(shape[, dtype, buffer, offset, …]) | Объект массива представляет собой многомерный однородный массив фиксированного размера элементов. |
Индексирование массивов
Массивы могут быть индексированы с использованием расширенного синтаксиса срезов 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 работают с произвольно шаговыми массивами. Однако некоторые алгоритмы требуют односегментных массивов. Когда в такие алгоритмы передаётся массив с нерегулярными шагами, автоматически создаётся копия.
Атрибуты массивов
Атрибуты массивов отражают информацию, присущую самому массиву. Как правило, доступ к массиву через его атрибуты позволяет получить, а иногда и установить внутренние свойства массива без создания нового массива. Возможные атрибуты — это основные части массива, и только некоторые из них можно осмысленно изменить без создания нового массива. Ниже приведена информация по каждому атрибуту.
Структура памяти
Следующие атрибуты содержат информацию о структуре памяти массива:
ndarray.flags | Информация о структуре памяти массива. |
ndarray.shape | Кортеж размеров массива. |
ndarray.strides | Кортеж байтов для перехода по каждому измерению при обходе массива. |
ndarray.ndim | Число измерений массива. |
ndarray.data | Объект буфера Python, указывающий на начало данных массива. |
ndarray.size | Число элементов в массиве. |
ndarray.itemsize | Длина одного элемента массива в байтах. |
ndarray.nbytes | Общее количество байтов, потребляемых элементами массива. |
ndarray.base | Базовый объект, если память взята из другого объекта. |
Тип данных
См. также
Объект типа данных, связанный с массивом, можно найти в атрибуте dtype:
ndarray.dtype | Тип данных элементов массива. |
Другие атрибуты
ndarray.T | Транспонированный массив. |
ndarray.real | Вещественная часть массива. |
ndarray.imag | Мнимая часть массива. |
ndarray.flat | Итератор по массиву в виде 1D. |
ndarray.ctypes | Объект для упрощения взаимодействия массива с модулем ctypes. |
Интерфейс массива
См. также
__array_interface__ | Сторона Python интерфейса массива |
__array_struct__ | Сторона C интерфейса массива |
ctypes интерфейс внешних функций
ndarray.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.
Преобразование массивов
ndarray.item(*args) | Копирует элемент массива в стандартный скаляр Python и возвращает его. |
ndarray.tolist() | Возвращает массив в виде вложенного списка Python скаляров глубиной a.ndim уровней. |
ndarray.itemset(*args) | Вставляет скаляр в массив (скаляр преобразуется к типу данных массива, если это возможно). |
ndarray.tostring([order]) | Создаёт строку Python, содержащую сырые байты данных массива. |
ndarray.tobytes([order]) | Создаёт строку Python, содержащую сырые байты данных массива. |
ndarray.tofile(fid[, sep, format]) | Записывает массив в файл в текстовом или двоичном формате (по умолчанию). |
ndarray.dump(file) | Выгружает пикл массива в указанный файл. |
ndarray.dumps() | Возвращает пикл массива в виде строки. |
ndarray.astype(dtype[, order, casting, …]) | Копия массива, преобразованного к заданному типу. |
ndarray.byteswap([inplace]) | Меняет байты элементов массива местами. |
ndarray.copy([order]) | Возвращает копию массива. |
ndarray.view([dtype, type]) | Новая интерпретация массива с теми же данными. |
ndarray.getfield(dtype[, offset]) | Возвращает поле заданного массива как определённого типа. |
ndarray.setflags([write, align, uic]) | Устанавливает флаги массива WRITEABLE, ALIGNED, (WRITEBACKIFCOPY и UPDATEIFCOPY) соответственно. |
ndarray.fill(value) | Заполняет массив скалярным значением. |
Изменение формы массива
Для reshape, resize и transpose единственный кортеж аргументов можно заменить на n целых чисел, которые будут интерпретированы как n-кортеж.
ndarray.reshape(shape[, order]) | Возвращает массив с теми же данными, но новой формой. |
ndarray.resize(new_shape[, refcheck]) | Изменяет форму и размер массива на месте. |
ndarray.transpose(*axes) | Возвращает представление массива с переставленными осями. |
ndarray.swapaxes(axis1, axis2) | Возвращает представление массива с переставленными осями axis1 и axis2. |
ndarray.flatten([order]) | Возвращает копию массива, свёрнутого в одну размерность. |
ndarray.ravel([order]) | Возвращает сплюснутый массив. |
ndarray.squeeze([axis]) | Удаляет одномерные элементы из формы a. |
Выбор и изменение элементов
Для методов массивов, принимающих ключевое слово axis, оно по умолчанию равно None. Если axis равно None, то массив обрабатывается как одномерный массив. Любое другое значение axis представляет размерность, вдоль которой должна происходить операция.
ndarray.take(indices[, axis, out, mode]) | Возвращает массив, образованный из элементов a по заданным индексам. |
ndarray.put(indices, values[, mode]) | Устанавливает a.flat[n] = values[n] для всех n в indices. |
ndarray.repeat(repeats[, axis]) | Повторяет элементы массива. |
ndarray.choose(choices[, out, mode]) | Использует массив индексов для построения нового массива из набора вариантов. |
ndarray.sort([axis, kind, order]) | Сортирует массив на месте. |
ndarray.argsort([axis, kind, order]) | Возвращает индексы, которые отсортировали бы этот массив. |
ndarray.partition(kth[, axis, kind, order]) | Переупорядочивает элементы в массиве таким образом, что значение элемента в позиции kth находится в позиции, в которой оно находилось бы в отсортированном массиве. |
ndarray.argpartition(kth[, axis, kind, order]) | Возвращает индексы, которые разделили бы этот массив. |
ndarray.searchsorted(v[, side, sorter]) | Находит индексы, куда элементы v должны быть вставлены, чтобы сохранить порядок. |
ndarray.nonzero() | Возвращает индексы элементов, которые не равны нулю. |
ndarray.compress(condition[, axis, out]) | Возвращает выбранные срезы этого массива вдоль заданной оси. |
ndarray.diagonal([offset, axis1, axis2]) | Возвращает указанные диагонали. |
Вычисления
Многие из этих методов принимают аргумент axis. В таких случаях:
- Если axis равно None (по умолчанию), массив обрабатывается как одномерный, и операция выполняется по всему массиву. Это поведение также является по умолчанию, если self является 0-мерным массивом или скаляром массива. (Скаляр массива — это экземпляр типов/классов float32, float64 и т. д., а 0-мерный массив — это экземпляр ndarray, содержащий ровно один скаляр массива.)
- Если axis — целое число, операция выполняется по данной оси (для каждого одномерного подмассива, который можно создать вдоль данной оси).
Пример аргумента axis
Трехмерный массив размером 3 x 3 x 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 и иметь такое же количество элементов. Он может иметь другой тип данных, в этом случае будет выполнено приведение типов.
ndarray.max([axis, out, keepdims, initial, …]) | Возвращает максимальное значение по заданной оси. |
ndarray.argmax([axis, out]) | Возвращает индексы максимальных значений по заданной оси. |
ndarray.min([axis, out, keepdims, initial, …]) | Возвращает минимальное значение по заданной оси. |
ndarray.argmin([axis, out]) | Возвращает индексы минимальных значений по заданной оси массива a. |
ndarray.ptp([axis, out, keepdims]) | Значение пик-к-пик (максимум - минимум) по заданной оси. |
ndarray.clip([min, max, out]) | Возвращает массив, значения которого ограничены [min, max]. |
ndarray.conj() | Комплексно-сопряжённые все элементы. |
ndarray.round([decimals, out]) | Возвращает a с каждым элементом, округлённым до заданного количества десятичных знаков. |
ndarray.trace([offset, axis1, axis2, dtype, out]) | Возвращает сумму по диагоналям массива. |
ndarray.sum([axis, dtype, out, keepdims, …]) | Возвращает сумму элементов массива по заданной оси. |
ndarray.cumsum([axis, dtype, out]) | Возвращает кумулятивную сумму элементов по заданной оси. |
ndarray.mean([axis, dtype, out, keepdims]) | Возвращает среднее значение элементов массива по заданной оси. |
ndarray.var([axis, dtype, out, ddof, keepdims]) | Возвращает дисперсию элементов массива по заданной оси. |
ndarray.std([axis, dtype, out, ddof, keepdims]) | Возвращает стандартное отклонение элементов массива по заданной оси. |
ndarray.prod([axis, dtype, out, keepdims, …]) | Возвращает произведение элементов массива по заданной оси. |
ndarray.cumprod([axis, dtype, out]) | Возвращает кумулятивное произведение элементов по заданной оси. |
ndarray.all([axis, out, keepdims]) | Возвращает True, если все элементы равны True. |
ndarray.any([axis, out, keepdims]) | Возвращает True, если любой из элементов a равен True. |
Арифметические, матричные умножения и операции сравнения
Арифметические и операции сравнения для ndarrays определены как поэлементные операции и, как правило, возвращают объекты ndarray в качестве результатов.
Каждая арифметическая операция (+, -, *, /, //, %, divmod(), ** или pow(), <<, >>, &, ^, |, ~) и сравнения (==, <, >, <=, >=, !=) эквивалентна соответствующей универсальной функции (или ufunc) в NumPy. Более подробная информация представлена в разделе Универсальные функции.
Операторы сравнения:
ndarray.__lt__(self, value, /) | Возвращает self<value. |
ndarray.__le__(self, value, /) | Возвращает self<=value. |
ndarray.__gt__(self, value, /) | Возвращает self>value. |
ndarray.__ge__(self, value, /) | Возвращает self>=value. |
ndarray.__eq__(self, value, /) | Возвращает self==value. |
ndarray.__ne__(self, value, /) | Возвращает self!=value. |
Логическое значение массива (bool):
ndarray.__bool__(self, /) | self != 0 |
Примечание
Проверка истинности массива вызывает ndarray.__bool__, что вызывает ошибку, если количество элементов в массиве больше 1, так как истинность таких массивов неоднозначна. Используйте .any() и .all() вместо этого, чтобы быть ясными в таких случаях. (Если количество элементов равно 0, массив оценивается как False.)
Унарные операции:
ndarray.__neg__(self, /) | -self |
ndarray.__pos__(self, /) | +self |
ndarray.__abs__(self) | |
ndarray.__invert__(self, /) | ~self |
Арифметические операции:
ndarray.__add__(self, value, /) | Возвращает self+value. |
ndarray.__sub__(self, value, /) | Возвращает self-value. |
ndarray.__mul__(self, value, /) | Возвращает self*value. |
ndarray.__truediv__(self, value, /) | Возвращает self/value. |
ndarray.__floordiv__(self, value, /) | Возвращает self//value. |
ndarray.__mod__(self, value, /) | Возвращает self%value. |
ndarray.__divmod__(self, value, /) | Возвращает divmod(self, value). |
ndarray.__pow__(self, value[, mod]) | Возвращает pow(self, value, mod). |
ndarray.__lshift__(self, value, /) | Возвращает self< |
ndarray.__rshift__(self, value, /) | Возвращает self>>value. |
ndarray.__and__(self, value, /) | Возвращает self&value. |
ndarray.__or__(self, value, /) | Возвращает self|value. |
ndarray.__xor__(self, value, /) | Возвращает self^value. |
Примечание
- Любой третий аргумент функции
powигнорируется, так как функцияufuncпринимает только два аргумента. - Все три оператора деления определены;
divиспользуется по умолчанию,truedivактивируется при использовании деления по типу__future__. - Так как
ndarrayявляется встроенным типом (написанным на C), специальные методы__r{op}__не определены напрямую. - Функции, используемые для реализации многих специальных арифметических методов для массивов, могут быть изменены с помощью
__array_ufunc__.
Арифметические операции (in-place):
ndarray.__iadd__(self, value, /) | Возвращает self+=value. |
ndarray.__isub__(self, value, /) | Возвращает self-=value. |
ndarray.__imul__(self, value, /) | Возвращает self*=value. |
ndarray.__itruediv__(self, value, /) | Возвращает self/=value. |
ndarray.__ifloordiv__(self, value, /) | Возвращает self//=value. |
ndarray.__imod__(self, value, /) | Возвращает self%=value. |
ndarray.__ipow__(self, value, /) | Возвращает self**=value. |
ndarray.__ilshift__(self, value, /) | Возвращает self<<=value. |
ndarray.__irshift__(self, value, /) | Возвращает self>>=value. |
ndarray.__iand__(self, value, /) | Возвращает self&=value. |
ndarray.__ior__(self, value, /) | Возвращает self|=value. |
ndarray.__ixor__(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 на результат.
Умножение матриц:
ndarray.__matmul__(self, value, /) | Возвращает self@value. |
Примечание
Операторы матричного умножения @ и @= были введены в Python 3.5 в соответствии с PEP465. NumPy 1.10.0 имеет предварительную реализацию @ в тестовых целях. Дополнительную информацию можно найти в документации к matmul.
Специальные методы
Для функций стандартной библиотеки:
ndarray.__copy__() | Используется, если вызывается copy.copy для массива. |
ndarray.__deepcopy__() | Используется, если вызывается copy.deepcopy для массива. |
ndarray.__reduce__() | Для сериализации. |
ndarray.__setstate__(state, /) | Для десериализации. |
Основная настройка:
ndarray.__new__(\*args, \*\*kwargs) | Создает и возвращает новый объект. |
ndarray.__array__() | Возвращает ссылку на себя, если тип данных не задан, или новый массив указанного типа данных, если тип данных отличается от текущего. |
ndarray.__array_wrap__() |
Настройка контейнера: (см. Индексирование)
ndarray.__len__(self, /) | Возвращает len(self). |
ndarray.__getitem__(self, key, /) | Возвращает self[key]. |
ndarray.__setitem__(self, key, value, /) | Устанавливает self[key] в значение value. |
ndarray.__contains__(self, key, /) | Возвращает key in self. |
Преобразование; операции int, float и complex. Они работают только с массивами, содержащими один элемент, и возвращают соответствующее скалярное значение.
ndarray.__int__(self) | |
ndarray.__float__(self) | |
ndarray.__complex__() |
Строковые представления:
ndarray.__str__(self, /) | Возвращает str(self). |
ndarray.__repr__(self, /) | Возвращает repr(self). |
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/arrays.ndarray.html