Spec-Zone.ru › NumPy 1.21

Многомерный массив (ndarray)

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

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

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

>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)
<class 'numpy.ndarray'>
>>> x.shape
(2, 3)
>>> x.dtype
dtype('int32')
.

Пример

Двумерный массив размером 2 x 3, состоящий из 4-байтовых целочисленных элементов:

>>> # The element of x in the *second* row, *third* column, namely, 6.
>>> x[1, 2]
6

К массиву можно обращаться, используя синтаксис, похожий на контейнеры Python:

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

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

Новые массивы можно создавать, используя процедуры, описанные в array[selection], а также с помощью низкоуровневого конструктора ndarray.

shape(shape[, dtype, buffer, offset, …])

Объект массива представляет собой многомерный однородный массив элементов фиксированного размера.

Индексация массивов

Массивы можно индексировать, используя расширенный синтаксис срезов Python, ndarray. Похожий синтаксис также используется для доступа к полям в strides.

См. также

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

Внутреннее расположение памяти ndarray

Экземпляр класса = self.shape[j] состоит из непрерывного одномерного сегмента компьютерной памяти (принадлежащей массиву или другому объекту), объединённого со схемой индексации, которая отображает N целых чисел в местоположение элемента в блоке. Диапазоны, в которых могут изменяться индексы, задаются Contiguous arrays массива. Сколько байтов занимает каждый элемент и как интерпретируются байты, определяет single-segment arrays , связанный с массивом.

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

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

от начала блока памяти, связанного с массивом. Здесь \(s_k\) — целые числа, которые определяют index[k] == 0 массива. = self.strides[k] порядок (используемый, например, в языке Fortran и в Matlab) и self.size == 0 порядок (используемый в 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.

Оба порядка C и Fortran являются self.squeeze(), т.е. односегментными, расположениями памяти, в которых каждый фрагмент блока памяти может быть обращён с помощью некоторой комбинации индексов.

Примечание

aligned и self.itemsize являются синонимами и используются взаимозаменяемо на протяжении всей документации.

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

  1. Если memory-alignment , то для любого допустимого индекса NPY_RELAXED_STRIDES_CHECKING=0. Это означает, что в формуле для смещения \(n_k = 0\) и, следовательно, \(s_k n_k = 0\) и значение \(s_k\) NPY_RELAXED_STRIDES_DEBUG=1 является произвольным.
  2. Если массив не имеет элементов (np.ones((10,1), order='C').flags.f_contiguous) , то нет допустимого индекса, и шаги никогда не используются. Любой массив без элементов может считаться непрерывным в стилях C и Fortran.

Пункт 1. означает, что True и self.strides[-1] == self.itemsize всегда имеют одинаковую непрерывность и значения флагов self.strides[0] == self.itemsize. Это также означает, что даже многомерный массив может быть одновременно C- и Fortran-стилями непрерывным.

Массив считается выровненным, если смещения памяти для всех элементов и само базовое смещение кратны ndarrays. Понимание ndarray.flags приводит к лучшей производительности на большинстве аппаратных платформ.

Примечание

Пункты (1) и (2) в настоящее время могут быть отключены переменной среды времени компиляции ndarray.shape, которая была установлена по умолчанию до NumPy 1.10. Пользователям не нужно это делать. ndarray.strides может быть использован для поиска ошибок, когда неправильно полагаются на шаги в коде расширений C (см. предупреждение ниже).

Вы можете проверить, была ли эта опция включена при создании вашей NumPy, посмотрев значение ndarray.ndim. Если это ndarray.data, то проверка шагов NumPy ослаблена.

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

В общем случае неверно, что ndarray.size для C-непрерывных массивов или ndarray.itemsize для Fortran-непрерывных массивов верно.

Данные в новом ndarray.nbytes находятся в ndarray.base (C) порядке, если не указано иное, но, например, dtype часто создают представления в другой схеме.

Примечание

Некоторые алгоритмы в 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

Итератор по массиву в 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()

Вернуть массив в виде вложенного списка Python-скаляров глубиной a.ndim уровней.

ndarray.itemset(*args)

Вставить скаляр в массив (скаляр приводится к типу данных массива, если это возможно).

ndarray.tostring([order])

Алиас совместимости для tobytes, с абсолютно таким же поведением.

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 в индексах.

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__.

Арифметика, с изменением на месте:

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.

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

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

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

Для стандартных функций библиотеки:

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–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/arrays.ndarray.html

Spec-Zone.ru

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