Spec-Zone.ru › NumPy 1.12

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

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

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

Различные ndarrays могут использовать одни и те же данные, так что изменения, внесённые в один ndarray, могут быть видны в другом. То есть, ndarray может быть «видом» другого ndarray, и данные, к которым он ссылается, обрабатываются базовым массивом «base». 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 и 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 Итератор по массиву в 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() Возвращает массив как (возможно, вложенный) список.
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, то массив рассматривается как одномерный массив. Любое другое значение 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-мерный массив размером 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<
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 принимает только два аргумента.
  • Три оператора деления определены; div активен по умолчанию, truediv активен, когда используется деление по __future__.
  • Поскольку ndarray — встроенный тип (написанный на C), специальные методы __r{op}__ не определены напрямую.
  • Функции, используемые для реализации многих арифметических специальных методов для массивов, могут быть изменены с помощью set_numeric_ops.

Арифметические операции (in-place):

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

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

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

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

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

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

Базовая настройка:

ndarray.__new__((S, ...)
ndarray.__array__(...) Возвращает либо новую ссылку на себя, если 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–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.12.0/reference/arrays.ndarray.html

Spec-Zone.ru

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