Массив 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-мерности
соответствует смещению (в байтах):

от начала блока памяти, связанного с массивом. Здесь
— целые числа, которые задают strides массива. column-major порядок (например, используемый в языке Fortran и в Matlab) и row-major порядок (используемый в C) — это всего лишь особые виды схем со смещением и соответствуют памяти, к которой можно обратиться с помощью смещений:

где
= self.itemsize * self.shape[j].
Как порядок C, так и порядок Fortran являются contiguous, т.е. single-segment, макетами памяти, в которых к любому элементу блока памяти можно обратиться с помощью некоторой комбинации индексов.
Хотя массив, являющийся непрерывным в стиле C или Fortran, у которого установлены соответствующие флаги, может быть обращён с указанными смещениями, фактические смещения могут отличаться. Это может произойти в двух случаях:
- Если
self.shape[k] == 1, то для любого допустимого индексаindex[k] == 0. Это означает, что в формуле для смещения
и, следовательно,
, а значение
= self.strides[k]произвольно. - Если массив не содержит элементов (
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