Spec-Zone.ru › NumPy 1.19

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

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

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

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

Пример

Двумерный массив размером 2 х 3, состоящий из 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]])
может создать представления массива:

>>> 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]. Аналогичный синтаксис также используется для доступа к полям в d_j.

См. также

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

Внутренняя структура памяти 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 являются d_j, то есть, имеют односегментную структуру памяти, в которой к любому фрагменту блока памяти можно обратиться с помощью некоторой комбинации индексов.

Примечание

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 значения. Это также означает, что даже многомерный массив может быть одновременно непрерывным в стиле C и Fortran.

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

Примечание

Некоторые алгоритмы в 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, содержащий сырые байты данных в массиве.

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

Возвращает индексы минимальных значений по заданной оси массива 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<

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 в NumPy принимает только два аргумента.
  • Так как 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.

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

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

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

Spec-Zone.ru

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