Многомерный массив (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:
>>> x[1,2] # i.e., the element of x in the *second* row, *third* column, namely, 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 | Объект массива представляет многомерный, однородный массив элементов с фиксированным размером. |
Индексация массивов
Массивы можно индексировать, используя расширенный синтаксис срезов 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.
Массив считается выровненным, если смещения памяти для всех элементов и базовое смещение само по себе являются кратными 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 | Итератор по массиву в виде 1D. |
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 в 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 должны быть вставлены, чтобы сохранить порядок. |
ndarray.nonzero() | Возвращает индексы элементов, отличных от нуля. |
ndarray.compress(condition[, axis, out]) | Возвращает выбранные срезы этого массива по заданной оси. |
ndarray.diagonal([offset, axis1, axis2]) | Возвращает указанные диагонали. |
Вычисления
Многие из этих методов принимают аргумент axis. В таких случаях:
- Если axis равно None (по умолчанию), массив обрабатывается как одномерный, и операция выполняется над всем массивом. Это поведение также является по умолчанию, если self является нульмерным массивом или скалярным массивом. (Скалярный массив — это экземпляр типов/классов float32, float64 и т. д., а нульмерный массив — это экземпляр 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принимает только два аргумента. - Три оператора деления определены;
divиспользуется по умолчанию,truedivактивен, когда используется деление по PEP 3141. - Поскольку
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__(() -> Deep copy of array.) | Используется, если на массиве вызывается copy.deepcopy. |
ndarray.__reduce__() | Для сериализации. |
ndarray.__setstate__(version, shape, dtype, ...) | Для десериализации. |
Основные настройки:
ndarray.__new__((S, ...) | |
ndarray.__array__(...) | Возвращает либо новую ссылку на себя, если dtype не задан, либо новый массив заданного типа данных, если dtype отличается от текущего типа данных массива. |
ndarray.__array_wrap__(...) |
Настройка контейнера: (см. Индексирование)
END_OF_DOCUMENT_MARKER
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.10.1/reference/arrays.ndarray.html