Spec-Zone.ru › NumPy 1.11

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

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

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

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

Пример

Двумерный массив размером 2 x 3, состоящий из целочисленных элементов размером 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 Объект массива представляет собой многомерный однородный массив фиксированного размера элементов.

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

Массивы можно индексировать, используя расширенный синтаксис срезов Python, array[selection]. Аналогичный синтаксис также используется для доступа к полям в structured array.

См. также

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

Внутренняя структура памяти 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 массива. column-major порядок (например, используемый в языке Fortran и в Matlab) и row-major порядок (используемый в C) — это всего лишь особые виды схем со смещением и соответствуют памяти, к которой можно обратиться с помощью смещений:

s_k^{\mathrm{column}} = \prod_{j=0}^{k-1} d_j ,
\quad  s_k^{\mathrm{row}} = \prod_{j=k+1}^{N-1} d_j .

где d_j = self.itemsize * self.shape[j].

Как порядок C, так и порядок Fortran являются contiguous, т.е. single-segment, макетами памяти, в которых к любому элементу блока памяти можно обратиться с помощью некоторой комбинации индексов.

Хотя массив, являющийся непрерывным в стиле 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``and ``self.squeeze() всегда имеют один и тот же тип непрерывности и aligned значения флагов. Это также означает, что даже многомерный массив может быть одновременно непрерывным в стиле C и Fortran.

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

Примечание

Пункты (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 находятся в row-major (C) порядке, если не указано иное, но, например, базовый срез массива часто создаёт views в другой схеме.

Примечание

Некоторые алгоритмы в 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 То же, что self.transpose(), за исключением того, что self возвращается, если self.ndim < 2.
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() Возвратить массив как (возможно, вложенный) список.
ndarray.itemset(*args) Вставить скаляр в массив (скаляр приводится к типу данных массива, если это возможно)
ndarray.tostring([order]) Построить Python-строку байтов, содержащую сырые байты данных в массиве.
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 и 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, массив обрабатывается как одномерный, и операция выполняется над всем массивом. Это поведение также является по умолчанию, если self является 0-мерным массивом или скаляром массива. (Скаляр массива — это экземпляр типов/классов float32, float64 и т. д., а 0-мерный массив — это экземпляр ndarray, содержащий ровно один скаляр массива.)

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

ndarray.take(indices[, axis, out, mode]) Возвращает массив, сформированный из элементов a по заданным индексам.
ndarray.put(indices, values[, mode]) Установить a.flat[n] = values[n] для всех n в indices.
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
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.argmax([axis, out]) Возвращает индексы максимальных значений вдоль заданной оси.
ndarray.min([axis, out, keepdims]) Возвращает минимальное значение вдоль заданной оси.
ndarray.argmin([axis, out]) Возвращает индексы минимальных значений вдоль заданной оси массива a.
ndarray.ptp([axis, out]) Значение от пика до пика (максимум - минимум) вдоль заданной оси.
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(), <<, >>, &, ^, |, ~), и сравнений (==, <, >, <=, >=, !=) эквивалентны соответствующим universal function (или ufunc короче) в Numpy. Более подробную информацию см. в разделе Универсальные функции.

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

ndarray.__lt__ x.__lt__(y) <==> x<y
ndarray.__le__ x.__le__(y) <==> x<=y
ndarray.__gt__ x.__gt__(y) <==> x>y
ndarray.__ge__ x.__ge__(y) <==> x>=y
ndarray.__eq__ x.__eq__(y) <==> x==y
ndarray.__ne__ x.__ne__(y) <==> x!=y

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

ndarray.__nonzero__ x.__nonzero__() <==> x != 0

Примечание

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

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

ndarray.__neg__ x.__neg__() <==> -x
ndarray.__pos__ x.__pos__() <==> +x
ndarray.__abs__() <==> abs(x)
ndarray.__invert__ x.__invert__() <==> ~x

Арифметические:

ndarray.__add__ x.__add__(y) <==> x+y
ndarray.__sub__ x.__sub__(y) <==> x-y
ndarray.__mul__ x.__mul__(y) <==> x*y
ndarray.__div__ x.__div__(y) <==> x/y
ndarray.__truediv__ x.__truediv__(y) <==> x/y
ndarray.__floordiv__ x.__floordiv__(y) <==> x//y
ndarray.__mod__ x.__mod__(y) <==> x%y
ndarray.__divmod__(y) <==> divmod(x, y)
ndarray.__pow__(y[, z]) <==> pow(x, y[, z])
ndarray.__lshift__ x.__lshift__(y) <==> x<<y
ndarray.__rshift__ x.__rshift__(y) <==> x>>y
ndarray.__and__ x.__and__(y) <==> x&y
ndarray.__or__ x.__or__(y) <==> x|y
ndarray.__xor__ x.__xor__(y) <==> x^y

Примечание

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

Арифметические операции, присваивание:

ndarray.__iadd__ x.__iadd__(y) <==> x+=y
ndarray.__isub__ x.__isub__(y) <==> x-=y
ndarray.__imul__ x.__imul__(y) <==> x*=y
ndarray.__idiv__ x.__idiv__(y) <==> x/=y
ndarray.__itruediv__ x.__itruediv__(y) <==> x/y
ndarray.__ifloordiv__ x.__ifloordiv__(y) <==> x//y
ndarray.__imod__ x.__imod__(y) <==> x%=y
ndarray.__ipow__ x.__ipow__(y) <==> x**=y
ndarray.__ilshift__ x.__ilshift__(y) <==> x<<=y
ndarray.__irshift__ x.__irshift__(y) <==> x>>=y
ndarray.__iand__ x.__iand__(y) <==> x&=y
ndarray.__ior__ x.__ior__(y) <==> x|=y
ndarray.__ixor__ x.__ixor__(y) <==> x^=y

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

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

Примечание

Операторы матриц @ и @= были введены в Python 3.5 в соответствии с PEP465. В NumPy 1.10 имеется предварительная реализация @ в целях тестирования. Дополнительную документацию см. в документации matmul.

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

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

ndarray.__copy__([order]) Возвращает копию массива.
ndarray.__deepcopy__(() -> Глубокая копия массива.) Используется, если на массив вызывается copy.deepcopy.
ndarray.__reduce__() Для сериализации.
ndarray.__setstate__(version, shape, dtype, ...) Для десериализации.

Основные настройки:

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

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

ndarray.__len__() <==> len(x)
ndarray.__getitem__ x.__getitem__(y) <==> x[y]
ndarray.__setitem__ x.__setitem__(i, y) <==> x[i]=y
ndarray.__getslice__ x.__getslice__(i, j) <==> x[i:j]
ndarray.__setslice__ x.__setslice__(i, j, y) <==> x[i:j]=y
ndarray.__contains__ x.__contains__(y) <==> y in x

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

ndarray.__int__() <==> int(x)
ndarray.__long__() <==> long(x)
ndarray.__float__() <==> float(x)
ndarray.__oct__() <==> oct(x)
ndarray.__hex__() <==> hex(x)

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

ndarray.__str__() <==> str(x)
ndarray.__repr__() <==> repr(x)

© 2008–2016 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.11.0/reference/arrays.ndarray.html

Spec-Zone.ru

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