Spec-Zone.ru › NumPy 1.20

Массив n-мерный (ndarray)

Массив ndarray — это (обычно имеющий фиксированный размер) многомерный контейнер элементов одного типа и размера. Число измерений и элементов в массиве определяются его shape, который является tuple из N неотрицательных целых чисел, определяющих размеры каждого измерения. Тип элементов в массиве определяется отдельным объектом типа данных (dtype), один из которых связан с каждым ndarray.

Как и другие контейнерные объекты в Python, содержимое ndarray может быть обработано и изменено путём индексирования или среза массива (например, используя N целых чисел), а также посредством методов и атрибутов ndarray.

Разные ndarrays могут совместно использовать одни и те же данные, так что изменения, внесённые в одном ndarray, могут быть видны в другом. То есть, ndarray может быть “представлением” другого ndarray, и за данные, на которые он ссылается, отвечает “базовый” массив. Ndarray также могут быть представлениями памяти, принадлежащей Python strings или объектам, реализующим интерфейсы buffer или массива.

Пример

Двумерный массив размером 2x3, составленный из 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]])

Создание массивов

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

Примечание

Contiguous arrays и single-segment arrays являются синонимами и используются взаимозаменяемо в документации.

Хотя массив, являющийся непрерывным в стиле 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() всегда имеют одинаковую непрерывность и aligned значение флага.

Массив считается выровненным, если смещения памяти для всех элементов и само базовое смещение кратны 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 работают с произвольно смещёнными массивами. Однако некоторые алгоритмы требуют массивов с одним сегментом. Если в таких алгоритмы передаётся массив с нерегулярными смещениями, автоматически создаётся копия.

Атрибуты массива

Атрибуты массива отражают информацию, которая является внутренней для самого массива. Обычно доступ к массиву через его атрибуты позволяет получать и иногда устанавливать внутренние свойства массива без создания нового массива. Выставленные атрибуты являются основными частями массива, и только некоторые из них могут быть осмысленно изменены без создания нового массива. Ниже приведена информация о каждом атрибуте.

Макет памяти

Следующие атрибуты содержат информацию о расположении памяти в массиве:

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

Итератор по массиву в виде одномерного массива.

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])

Псевдоним совместимости для tobytes, с абсолютно идентичным поведением.

ndarray.tobytes([order])

Создаёт объект Python bytes, содержащий сырые байты данных из массива.

ndarray.tofile(fid[, sep, format])

Записывает массив в файл в виде текста или двоичных данных (по умолчанию).

ndarray.dump(file)

Сохраняет pickle массива в указанный файл.

ndarray.dumps()

Возвращает pickle массива в виде строки.

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])

Удаляет оси длиной 1 из 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 должны быть вставлены для сохранения порядка.

ndarray.nonzero()

Возвращает индексы элементов, которые не равны нулю.

ndarray.compress(condition[, axis, out])

Возвращает выбранные срезы этого массива вдоль данной оси.

ndarray.diagonal([offset, axis1, axis2])

Возвращает указанные диагонали.

Вычисление

Многие из этих методов принимают аргумент, названный axis. В таких случаях,

  • Если axis равен None (по умолчанию), массив обрабатывается как одномерный, и операция выполняется над всем массивом. Это поведение также является по умолчанию, если self является нульмерным массивом или скаляром массива. (Скаляр массива — это экземпляр типов/классов float32, float64 и т. д., а нульмерный массив — это экземпляр 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 и иметь то же количество элементов. Он может иметь другой тип данных, в этом случае будет выполнено приведение.

ndarray.max([axis, out, keepdims, initial, …])

Возвращает максимальное значение по заданной оси.

ndarray.argmax([axis, out])

Возвращает индексы максимальных значений по заданной оси.

ndarray.min([axis, out, keepdims, initial, …])

Возвращает минимальное значение по заданной оси.

ndarray.argmin([axis, out])

Возвращает индексы минимальных значений по заданной оси.

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, where])

Возвращает среднее значение элементов массива по заданной оси.

ndarray.var([axis, dtype, out, ddof, …])

Возвращает дисперсию элементов массива по заданной оси.

ndarray.std([axis, dtype, out, ddof, …])

Возвращает стандартное отклонение элементов массива по заданной оси.

ndarray.prod([axis, dtype, out, keepdims, …])

Возвращает произведение элементов массива по заданной оси.

ndarray.cumprod([axis, dtype, out])

Возвращает кумулятивное произведение элементов по заданной оси.

ndarray.all([axis, out, keepdims, where])

Возвращает True, если все элементы равны True.

ndarray.any([axis, out, keepdims, where])

Возвращает True, если любой из элементов a равен True.

Арифметические, матричные умножения и операции сравнения

Арифметические и операции сравнения на ndarrays определены как поэлементные операции и, как правило, возвращают объекты ndarray в качестве результатов.

Каждая из арифметических операций (+, -, *, /, //, %, divmod(), ** или pow(), <<, >>, &, ^, |, ~ ) и сравнения (==, <, >, <=, >=, != ) эквивалентна соответствующей универсальной функции (или ufunc для краткости) в NumPy. Для получения дополнительной информации см. раздел Универсальные функции.

Операторы сравнения:

ndarray.__lt__(value, /)

Возвращает self<value.

ndarray.__le__(value, /)

Возвращает self<=value.

ndarray.__gt__(value, /)

Возвращает self>value.

ndarray.__ge__(value, /)

Возвращает self>=value.

ndarray.__eq__(value, /)

Возвращает self==value.

ndarray.__ne__(value, /)

Возвращает self!=value.

Логическое значение массива (bool()):

ndarray.__bool__(/)

self != 0

Примечание

Проверка истинности массива вызывает ndarray.__bool__, что приводит к ошибке, если количество элементов в массиве больше 1, потому что истинностное значение таких массивов неоднозначно. Используйте .any() и .all() вместо этого, чтобы чётко указать, что подразумевается в таких случаях. (Если количество элементов равно 0, массив оценивается как False.)

Унарные операции:

ndarray.__neg__(/)

-self

ndarray.__pos__(/)

+self

ndarray.__abs__(self)

ndarray.__invert__(/)

~self

Арифметика:

ndarray.__add__(value, /)

Возвращает self+value.

ndarray.__sub__(value, /)

Возвращает self-value.

ndarray.__mul__(value, /)

Возвращает self*value.

ndarray.__truediv__(value, /)

Возвращает self/value.

ndarray.__floordiv__(value, /)

Возвращает self//value.

ndarray.__mod__(value, /)

Возвращает self%value.

ndarray.__divmod__(value, /)

Возвращает divmod(self, value).

ndarray.__pow__(value[, mod])

Возвращает pow(self, value, mod).

ndarray.__lshift__(value, /)

Возвращает self<<value.

ndarray.__rshift__(value, /)

Возвращает self>>value.

ndarray.__and__(value, /)

Возвращает self&value.

ndarray.__or__(value, /)

Возвращает self|value.

ndarray.__xor__(value, /)

Возвращает self^value.

Примечание

  • Любой третий аргумент функции pow игнорируется, так как базовая функция ufunc принимает только два аргумента.
  • Так как ndarray — встроенный тип (написанный на C), специальные методы __r{op}__ не определены напрямую.
  • Функции, используемые для реализации многих арифметических специальных методов для массивов, можно изменить с помощью __array_ufunc__.

Арифметические операции (in-place):

ndarray.__iadd__(value, /)

Возвращает self+=value.

ndarray.__isub__(value, /)

Возвращает self-=value.

ndarray.__imul__(value, /)

Возвращает self*=value.

ndarray.__itruediv__(value, /)

Возвращает self/=value.

ndarray.__ifloordiv__(value, /)

Возвращает self//=value.

ndarray.__imod__(value, /)

Возвращает self%=value.

ndarray.__ipow__(value, /)

Возвращает self**=value.

ndarray.__ilshift__(value, /)

Возвращает self<<=value.

ndarray.__irshift__(value, /)

Возвращает self>>=value.

ndarray.__iand__(value, /)

Возвращает self&=value.

ndarray.__ior__(value, /)

Возвращает self|=value.

ndarray.__ixor__(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__(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__(*args, **kwargs)

Создает и возвращает новый объект.

ndarray.__array__([dtype], /)

Возвращает либо новую ссылку на self, если dtype не задан, либо новый массив с указанным типом данных, если dtype отличается от текущего типа данных массива.

ndarray.__array_wrap__(obj)

Настройка контейнера: (см. Индексирование)

ndarray.__len__(/)

Возвращает len(self).

ndarray.__getitem__(key, /)

Возвращает self[key].

ndarray.__setitem__(key, value, /)

Устанавливает self[key] в значение value.

ndarray.__contains__(key, /)

Возвращает key in self.

Преобразования; операции int(), float() и complex(). Они работают только с массивами, содержащими один элемент, и возвращают соответствующее скалярное значение.

ndarray.__int__(self)

ndarray.__float__(self)

ndarray.__complex__

Представления в виде строк:

ndarray.__str__(/)

Возвращает str(self).

ndarray.__repr__(/)

Возвращает repr(self).

© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/arrays.ndarray.html

Spec-Zone.ru

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