N-мерный массив (ndarray)#

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

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

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

Пример

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

>>> import numpy as np
>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)

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

Например slicing может создавать представления массива:

>>> y = x[:,1]
>>> y
array([2, 5], dtype=int32)
>>> y[0] = 9 # this also changes the corresponding element in x
>>> y
array([9, 5], dtype=int32)
>>> x
array([[1, 9, 3],
       [4, 5, 6]], dtype=int32)

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

Новые массивы могут быть созданы с использованием процедур, подробно описанных в Процедуры создания массивов, а также с использованием низкоуровневого ndarray конструктор:

ndarray(форма[, тип_данных, буфер, смещение, ...])

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

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

Массивы можно индексировать с использованием расширенного синтаксиса срезов 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 массива. The column-major порядок (используется, например, в языке Fortran и в Matlab) и row-major схемы порядка (используемые в 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 значение flags. Это также означает, что даже многомерный массив может быть C-стильным и Fortran-стильным непрерывным одновременно.

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

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

Он делает не обычно считают, что self.strides[-1] == self.itemsize для C-стиля смежных массивов или self.strides[0] == self.itemsize для массивов с фортрановским стилем смежности является истиной.

Данные в новом ndarrays находится в row-major (C) порядок, если не указано иное, но, например, базовое срезывание массива часто производит представления в другой схеме.

Примечание

Некоторые алгоритмы в NumPy работают с массивами с произвольными шагами. Однако некоторые алгоритмы требуют односегментных массивов. Когда в такие алгоритмы передается массив с нерегулярными шагами, автоматически создается копия.

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

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

Расположение в памяти#

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

ndarray.flags

Информация о расположении памяти массива.

ndarray.shape

Кортеж размерностей массива.

ndarray.strides

Кортеж байтов для шага в каждом измерении при обходе массива.

ndarray.ndim

Количество измерений массива.

ndarray.data

Объект буфера Python, указывающий на начало данных массива.

ndarray.size

Количество элементов в массиве.

ndarray.itemsize

Длина одного элемента массива в байтах.

ndarray.nbytes

Общее количество байтов, потребляемых элементами массива.

ndarray.base

Базовый объект, если память взята из другого объекта.

Тип данных#

Смотрите также

Объекты типов данных

Объект типа данных, связанный с массивом, можно найти в dtype attribute:

ndarray.dtype

Тип данных элементов массива.

Другие атрибуты#

ndarray.T

Вид транспонированного массива.

ndarray.real

Действительная часть массива.

ndarray.imag

Мнимая часть массива.

ndarray.flat

Одномерный итератор по массиву.

Интерфейс массива#

__array_interface__

Python-сторона интерфейса массива

__array_struct__

Сторона C интерфейса массива

ctypes интерфейс внешних функций#

ndarray.ctypes

Объект для упрощения взаимодействия массива с модулем ctypes.

Методы массива#

An ndarray объект имеет много методов, которые работают с массивом или на нём, обычно возвращая результат в виде массива. Эти методы кратко объяснены ниже. (В документации каждого метода есть более полное описание.)

Для следующих методов также существуют соответствующие функции в numpy: all, any, argmax, argmin, argpartition, argsort, choose, clip, compress, copy, cumprod, cumsum, diagonal, imag, max, mean, min, nonzero, partition, prod, put, ravel, real, repeat, reshape, round, searchsorted, sort, squeeze, std, sum, swapaxes, take, trace, transpose, var.

Преобразование массива#

ndarray.item(*args)

Скопировать элемент массива в стандартный скаляр Python и вернуть его.

ndarray.tolist()

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

ndarray.tobytes([order])

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

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

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

ndarray.dump(файл)

Сохранить 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 соответственно.

ndarray.fill(значение)

Заполнить массив скалярным значением.

Манипуляция формой#

Для reshape, resize и transpose единственный аргумент-кортеж может быть заменён на n целые числа, которые будут интерпретироваться как n-кортеж.

ndarray.reshape(a.reshape)

Возвращает массив с теми же данными, но новой формой.

ndarray.resize(a.resize)

Изменение формы и размера массива на месте.

ndarray.transpose(*axes)

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

ndarray.swapaxes(axis1, axis2, /)

Вернуть представление массива с axis1 и axis2 поменяны местами.

ndarray.flatten([order])

Возвращает копию массива, сведённую в одно измерение.

ndarray.ravel([order])

Возвращает сглаженный массив.

ndarray.squeeze([axis])

Удалить оси длиной один из a.

Выбор и манипуляция элементами#

Для методов массива, принимающих ось ключевое слово, по умолчанию равно None. Если ось None, тогда массив обрабатывается как одномерный массив. Любое другое значение для ось представляет измерение, вдоль которого должна выполняться операция.

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

Сортировать массив на месте.

ndarray.argsort([axis, kind, order, stable])

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

ndarray.partition(kth[, axis, kind, order])

Частично сортирует элементы в массиве таким образом, что значение элемента в k-й позиции находится в позиции, в которой оно было бы в отсортированном массиве.

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

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

Вычисление#

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

  • Если ось является None (по умолчанию), массив обрабатывается как 1-D массив, и операция выполняется над всем массивом. Это поведение также является умолчанием, если self — это 0-мерный массив или скаляр массива. (Скаляр массива — это экземпляр типов/классов float32, float64 и т.д., тогда как 0-мерный массив — это экземпляр ndarray, содержащий ровно один скаляр массива.)

  • Если ось является целым числом, то операция выполняется по заданной оси (для каждого одномерного подмассива, который может быть создан вдоль заданной оси).

Пример ось аргумент

Трехмерный массив размером 3 x 3 x 3, суммированный по каждой из его трех осей:

>>> import numpy as np
>>> 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. Чтобы избежать переполнения, может быть полезно выполнить редукцию с использованием типа данных большего размера.

Для нескольких методов необязательный выход аргумент также может быть предоставлен, и результат будет помещен в указанный выходной массив. выход аргумент должен быть ndarray и имеют одинаковое количество элементов. Может иметь другой тип данных, в этом случае будет выполнено приведение типов.

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

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

ndarray.argmax([axis, out, keepdims])

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

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

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

ndarray.argmin([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

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__(/)

True если self иначе False

Примечание

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

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

Арифметика:

ndarray.__add__(value, /)

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

ndarray.__sub__(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<

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@значение.

Примечание

Матричные операторы @ и @= были введены в Python 3.5 после PEP 465должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN @ оператор был введён в 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], *, [, copy])

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

ndarray.__array_wrap__(array[, context[, ...)

Возвращает представление array с тем же типом, что и self.

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

ndarray.__len__(/)

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

ndarray.__getitem__(key, /)

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

ndarray.__setitem__(key, value, /)

Установить self[key] в значение.

ndarray.__contains__(key, /)

Возвращает ключ в self.

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

Строковые представления:

ndarray.__str__(/)

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

ndarray.__repr__(/)

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

Вспомогательный метод для типизации:

ndarray.__class_getitem__($cls, item, /)

ndarray[shape, dtype]