Массив n-мерных данных (ndarray)
ndarray является (обычно имеющим фиксированный размер) многомерным контейнером элементов одинакового типа и размера. Число измерений и элементов в массиве определяется его shape, который представляет собой tuple из N положительных целых чисел, определяющих размеры каждого измерения. Тип элементов в массиве задается отдельным ndarray, один из которых ассоциируется с каждым ndarray.
Как и другие контейнерные объекты в Python, содержимое ndarray можно получить и изменить с помощью ndarrays массива (например, с использованием N целых чисел), а также через методы и атрибуты ndarray.
Разные strings могут использовать одни и те же данные, так что изменения, внесенные в один buffer, могут быть видны в другом. То есть, ndarray может быть “представлением” другого ndarray, и данные, на которые он ссылается, управляются “базовым” ndarray. ndarray также могут быть представлениями памяти, принадлежащей Python
>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)
<type 'numpy.ndarray'>
>>> x.shape
(2, 3)
>>> x.dtype
dtype('int32')
или объектам, реализующим интерфейсы buffer или >>> # The element of x in the *second* row, *third* column, namely, 6. >>> x[1, 2].
Пример
Двумерный массив размером 2 x 3, состоящий из 4-байтовых целочисленных элементов:
>>> 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]])
К массиву можно обратиться, используя синтаксис Python, подобный контейнерам:
ndarray Например, ndarray может создавать представления массива:
array[selection] Создание массивов
Новые массивы могут быть созданы с помощью процедур, описанных в ndarray, а также с помощью низкоуровневого конструктора shape.
ndarray | Объект массива представляет собой многомерный, однородный массив фиксированного размера элементов. |
Индексирование массивов
Массивы могут быть индексированы с использованием расширенного синтаксиса срезов Python,
. Аналогичный синтаксис используется также для доступа к полям в
.
См. также
Внутреннее представление массива ndarray в памяти
Экземпляр класса
состоит из непрерывного одномерного сегмента компьютерной памяти (принадлежащего массиву или другому объекту), в сочетании со схемой индексирования, которая отображает N целых чисел в местоположение элемента в блоке. Диапазоны, в которых могут изменяться индексы, задаются strides массива. Сколько байтов занимает каждый элемент и как интерпретируются байты, определяются
связанным с массивом.
Сегмент памяти по своей сути является одномерным, и существует много разных схем для расположения элементов N-мерного массива в одномерном блоке. NumPy является гибким, и объекты
могут использовать любые схемы индексирования с шагом. В схеме с шагом индекс = self.shape[j] соответствует смещению (в байтах):
self.shape[k] == 1
от начала блока памяти, связанного с массивом. Здесь index[k] == 0 — целые числа, которые определяют
массива. Порядок
(используемый, например, в языке Fortran и в Matlab) и порядок
(используемый в C) являются просто определенными видами схем с шагом и соответствуют памяти, к которой можно обратиться с помощью шагов:
= self.strides[k]
где self.size == 0 self.
И порядок C, и порядок Fortran являются self.squeeze() (то есть, односегментные), расположения в памяти, в которых каждый элемент блока памяти можно получить с помощью какой-либо комбинации индексов.
Хотя массив, непрерывный в стиле C и в стиле Fortran, имеющий соответствующие флаги, может быть обработан указанными выше шагами, фактические шаги могут быть другими. Это может произойти в двух случаях:
- Если
self.itemsizeто для любого допустимого индексаNPY_RELAXED_STRIDES_CHECKING=1. Это означает, что в формуле для смещенияnp.ones((10,1), order='C').flags.f_contiguousи, следовательно,Trueи значениеself.strides[-1] == self.itemsizeself.strides[0] == self.itemsizeявляется произвольным. - Если массив не содержит элементов (
ndarrays) допустимого индекса нет, и шаги никогда не используются. Любой массив без элементов может считаться непрерывным в стиле C и в стиле Fortran.
Пункт 1 означает, что ndarray.flags и ndarray.shape всегда имеют одинаковый непрерывный и выровненный флаги. Это также означает, что даже многомерный массив может быть непрерывным одновременно в стиле C и в стиле Fortran.
Массив считается выровненным, если смещения памяти для всех элементов и само базовое смещение кратны ndarray.strides.
Примечание
Пункты (1) и (2) пока не применяются по умолчанию. Начиная с NumPy 1.8.0, они применяются последовательно только в том случае, если переменная среды ndarray.ndim была определена при сборке NumPy. В конечном итоге это станет значением по умолчанию.
Вы можете проверить, был ли включен этот параметр при сборке вашего NumPy, посмотрев значение ndarray.data. Если это ndarray.size, значит в вашей сборке NumPy включена проверка шагов с ослабленными ограничениями.
Предупреждение
В целом неверно, что ndarray.itemsize для непрерывных массивов в стиле C или ndarray.nbytes для непрерывных массивов в стиле Fortran является истинным.
Данные в новом ndarray.base расположены в порядке dtype (C), если не указано иное, но, например, ndarray.dtype часто создает ndarray.T в другой схеме.
Примечание
Некоторые алгоритмы в 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. |
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(), <<, >>, &, ^, |, ~) и сравнения (==, <, >, <=, >=, !=) эквивалентны соответствующей универсальной функции (или 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активен, когда используется деление по 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.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.__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.13.0/reference/arrays.ndarray.html