Многомерный массив (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]])
могут создавать представления массива: >>> 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, имеющий соответствующие флаги, может быть обработан с помощью вышеприведенных смещений, фактические смещения могут быть иными. Это может произойти в двух случаях:
- Если
self.shape[k] == 1то для любого допустимого индексаindex[k] == 0. Это означает, что в формуле для смещенияи, следовательно,
и значение
= self.strides[k]произвольно. - Если массив не имеет элементов (
self.size == 0) нет допустимого индекса, и смещения никогда не используются. Любой массив без элементов может считаться непрерывным в стиле C и Fortran.
Пункт 1. означает, что self и self.squeeze() всегда имеют одинаковые значения непрерывности и флагов выравнивания. Это также означает, что даже многомерный массив может быть одновременно непрерывным по стилю C и Fortran.
Массив считается выровненным, если смещения памяти для всех элементов и базовое смещение сами являются кратными self.itemsize.
Примечание
Пункты (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 | То же, что и self.transpose(), за исключением того, что self возвращается, если self.ndim < 2. |
ndarray.real | Вещественная часть массива. |
ndarray.imag | Мнимая часть массива. |
ndarray.flat | Итератор по массиву в 1-D формате. |
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() | Возвращает массив в виде (возможно, вложенного) списка. |
ndarray.itemset(*args) | Вставляет скаляр в массив (скаляр преобразуется в тип данных массива, если это возможно). |
ndarray.tostring([order]) | Создаёт объект Python bytes, содержащий байты данных массива в сыром виде. |
ndarray.tobytes([order]) | Создаёт объект Python bytes, содержащий байты данных массива в сыром виде. |
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 в индексах. |
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 должны быть вставлены в a, чтобы сохранить порядок. |
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.argmax([axis, out]) | Возвращает индексы максимальных значений вдоль заданной оси. |
ndarray.min([axis, out, keepdims]) | Возвращает минимальное значение вдоль заданной оси. |
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.__nonzero__ |
Примечание
Проверка истинности массива вызывает ndarray.__nonzero__, которая вызывает ошибку, если количество элементов в массиве больше 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.__div__ | |
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активен, когда используется деление по стандарту PEP 3141. - Так как
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.__idiv__ | |
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__(memo, /) | Используется, если функция copy.deepcopy вызывается для массива. |
ndarray.__reduce__() | Для сериализации. |
ndarray.__setstate__(state, /) | Для десериализации. |
Настройка базовых параметров:
ndarray.__new__($type, *args, **kwargs) | Создаёт и возвращает новый объект. |
ndarray.__array__(|dtype) | Возвращает либо новую ссылку на себя, если dtype не задан, либо новый массив заданного типа данных, если dtype отличается от текущего типа данных массива. |
ndarray.__array_wrap__(obj) |
Настройка контейнера: (см. Индексирование)
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. |
Преобразования; операции complex, int, long, float, oct, и hex. Они работают только с массивами, содержащими один элемент, и возвращают соответствующее скалярное значение.
ndarray.__int__(self) | |
ndarray.__long__ | |
ndarray.__float__(self) | |
ndarray.__oct__ | |
ndarray.__hex__ |
Строковые представления:
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.16.1/reference/arrays.ndarray.html