Spec-Zone.ru › NumPy 1.15

Массив N-мерный (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:

ndarray(shape[, dtype, buffer, offset, …]) Объект массива представляет собой многомерный однородный массив фиксированного размера элементов.

Индексирование массивов

Массивы могут быть индексированы с помощью расширенного синтаксиса срезов Python, array[selection]. Аналогичный синтаксис также используется для доступа к полям в структурированном массиве.

См. также

Индексирование массивов.

Внутренняя структура памяти массива ndarray

Экземпляр класса ndarray состоит из непрерывного одномерного сегмента компьютерной памяти (принадлежащего массиву или какому-либо другому объекту), комбинированного со схемой индексирования, которая отображает N целых чисел в расположение элемента в блоке. Диапазоны, в которых индексы могут изменяться, задаются shape массива. Количество байтов, занимаемых каждым элементом, и способ интерпретации байтов определяется объектом типа данных, связанным с массивом.

Сегмент памяти по своей сути одномерен, и существует много различных схем для организации элементов N-мерного массива в одномерный блок. NumPy гибкий, и объекты ndarray могут поддерживать любую схему индексирования со смещениями. В схеме со смещениями индекс N-мерный (n_0, n_1, ..., n_{N-1}) соответствует смещению (в байтах):

n_{\mathrm{offset}} = \sum_{k=0}^{N-1} s_k n_k

от начала блока памяти, связанного с массивом. Здесь, s_k — целые числа, которые задают strides массива. Схемы постолбцового (например, используемого в языке Fortran и в Matlab) и построчного порядка (используемого в C) — это просто особые виды схемы со смещениями, соответствующие памяти, которая может быть обращена с помощью смещений:

s_k^{\mathrm{column}} = \mathrm{itemsize} \prod_{j=0}^{k-1} d_j ,
\quad  s_k^{\mathrm{row}} = \mathrm{itemsize} \prod_{j=k+1}^{N-1} d_j .

где d_j = self.shape[j].

И C-, и Fortran-стили являются непрерывными, то есть односегментными, макеты памяти, в которых каждая часть блока памяти может быть обработана какой-либо комбинацией индексов.

Хотя массив с непрерывной памятью в стиле C и Fortran, имеющий соответствующие флаги, может быть обработан с помощью указанных смещений, фактические смещения могут отличаться. Это может произойти в двух случаях:

  1. Если self.shape[k] == 1 , то для любого допустимого индекса index[k] == 0. Это означает, что в формуле для смещения n_k = 0 и, следовательно, s_k n_k = 0 и значение s_k = self.strides[k] является произвольным.
  2. Если массив не содержит элементов (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 активен, когда используется деление в стиле Python 3. __future__
  • Поскольку ndarray — встроенный тип (написанный на C), специальные методы __r{op}__ не определены напрямую.
  • Функции, используемые для реализации многих арифметических специальных методов для массивов, можно изменить с помощью set_numeric_ops.

Арифметика, операторы присваивания:

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.

Предупреждение

Операции на месте выполняют вычисление с точностью, определяемой типом данных двух операндов, но при этом молчаливо понижают точность результата (при необходимости), чтобы он соответствовал типу массива. Таким образом, при вычислениях с разной точностью 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 документации.

Специальные методы

Для стандартных библиотек Python:

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.15.4/reference/arrays.ndarray.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API