Spec-Zone.ru › NumPy 1.18

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

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

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)

Сохраняет копию массива в указанный файл в формате 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])

Удаляет одноразмерные элементы из формы 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-хмерный размерностью 3x3x3, суммируемый по каждой из трёх осей

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

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

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

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.

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

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

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

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

Spec-Zone.ru

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