numpy.nditer
- classnumpy.nditer(op, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', op_axes=None, itershape=None, buffersize=0)[source]
-
Эффективный многомерный итератор для итерации по массивам. Для начала работы с этим объектом см. вводное руководство по итерации массивов.
- Параметры:
-
- opndarray или последовательность array_like
-
Массив(ы) для итерации.
- flagsпоследовательность str, необязательно
-
Флаги для управления поведением итератора.
-
bufferedвключает буферизацию при необходимости. -
c_indexотслеживает индекс в порядке C. -
f_indexотслеживает индекс в порядке Fortran. -
multi_indexотслеживает многомерный индекс или кортеж индексов по одному для каждой размерности итерации. -
common_dtypeприводит все операнды к общему типу данных с копированием или буферизацией по необходимости. -
copy_if_overlapзаставляет итератор определять, есть ли перекрытие между операндами чтения и записи, и создавать временные копии по необходимости, чтобы избежать перекрытия. Возможны ложноположительные результаты (необходимое копирование) в некоторых случаях. -
delay_bufallocоткладывает выделение буферов до вызова reset(). Позволяетallocateоперандам быть инициализированными перед копированием их значений в буферы. -
external_loopзаставляетvaluesбыть одномерными массивами с несколькими значениями вместо нульмерных. -
grow_innerпозволяет делать размеры массиваvalueбольше размера буфера, когда используются какbuffered, так иexternal_loop. -
rangedпозволяет ограничить итератор поддиапазоном значений iterindex. -
refs_okвключает итерацию по типам ссылок, таким как массивы object. -
reduce_okвключает итерацию поreadwriteоперандам, которые транслируются, также известным как операнды сокращения. -
zerosize_okпозволяетitersizeбыть равным нулю.
-
- op_flagsсписок списков str, необязательно
-
Это список флагов для каждого операнда. По меньшей мере, один из
readonly,readwrite, илиwriteonlyдолжен быть указан.-
readonlyуказывает, что операнд будет только считываться. -
readwriteуказывает, что операнд будет считываться и записываться. -
writeonlyуказывает, что операнд будет только записываться. -
no_broadcastпредотвращает трансляцию операнда. -
contigпринудительно делает данные операнда непрерывными. -
alignedпринудительно выравнивает данные операнда. -
nboпринудительно устанавливает порядок байтов операнда в родной. -
copyпозволяет создавать временную только для чтения копию, если это необходимо. -
updateifcopyпозволяет создавать временную копию для чтения и записи, если это необходимо. -
allocateзаставляет массив выделяться, если он None в параметреop. -
no_subtypeпредотвращает использование подтипа операндомallocate. -
arraymaskуказывает, что этот операнд является маской для выбора элементов при записи в операнды со флагом ‘writemasked’. Итератор это не проверяет, но при записи из буфера обратно в массив, он копирует только те элементы, которые указаны этой маской. -
writemaskedуказывает, что будут записываться только элементы, где выбранный операндarraymaskравен True. -
overlap_assume_elementwiseможет использоваться для обозначения операндов, которые обращаются только в порядке итерации, чтобы разрешить менее консервативное копирование, когда присутствуетcopy_if_overlap.
-
- op_dtypesdtype или кортеж dtype(s), необязательно
-
Требуемый тип данных операндов. Если копирование или буферизация включены, данные будут преобразованы в/из их оригинальных типов.
- order{‘C’, ‘F’, ‘A’, ‘K’}, необязательно
-
Управляет порядком итерации. ‘C’ означает порядок C, ‘F’ — Fortran, ‘A’ — порядок ‘F’, если все массивы имеют порядок Fortran, в противном случае — порядок ‘C’, а ‘K’ — как можно ближе к порядку появления элементов массива в памяти. Это также влияет на порядок памяти элементов
allocateоперандов, поскольку они выделены для совместимости с порядком итерации. По умолчанию — ‘K’. - casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, необязательно
-
Управляет типом преобразования данных при создании копии или буферизации. Установка этого значения в ‘unsafe’ не рекомендуется, так как это может негативно повлиять на аккумулирование.
- ‘no’ означает, что типы данных не должны преобразовываться совсем.
- ‘equiv’ означает, что допускаются только изменения порядка байтов.
- ‘safe’ означает, что допускаются только преобразования, которые могут сохранить значения.
- ‘same_kind’ означает, что допускаются только безопасные преобразования или преобразования внутри одного вида, например, float64 в float32.
- ‘unsafe’ означает, что любые преобразования данных могут быть выполнены.
- op_axesсписок списков int, необязательно
-
Если предоставлено, это список int или None для каждого операнда. Список осей для операнда — отображение из размерностей итератора в размерности операнда. Значение -1 может быть помещено для элементов, что приведет к обработке этой размерности как
newaxis. - itershapeкортеж int, необязательно
-
Желаемая форма итератора. Это позволяет
allocateоперандам с размерностью, отображенной op_axes, не соответствующей размерности другого операнда, получить значение, отличное от 1 для этой размерности. - buffersizeint, необязательно
-
Когда включена буферизация, контролирует размер временных буферов. Устанавливается в 0 для значения по умолчанию.
Примечания
nditerзаменяетflatiter. Реализация итератора заnditerтакже доступна в NumPy C API.Python-экспозиция предоставляет два интерфейса итерации, один из которых следует протоколу Python-итератора, а другой — зеркалит шаблон C-стиля do-while. В большинстве случаев предпочтительнее подход на чистом Python, но если вам нужны координаты или индекс итератора, используйте шаблон C-стиля.
Примеры
Вот как мы можем написать функцию
iter_add, используя протокол Python-итератора:>>> def iter_add_py(x, y, out=None): ... addop = np.add ... it = np.nditer([x, y, out], [], ... [['readonly'], ['readonly'], ['writeonly','allocate']]) ... with it: ... for (a, b, c) in it: ... addop(a, b, out=c) ... return it.operands[2]
Вот та же функция, но в соответствии со стилем C:
>>> def iter_add(x, y, out=None): ... addop = np.add ... it = np.nditer([x, y, out], [], ... [['readonly'], ['readonly'], ['writeonly','allocate']]) ... with it: ... while not it.finished: ... addop(it[0], it[1], out=it[2]) ... it.iternext() ... return it.operands[2]
Вот пример функции внешнего произведения:
>>> def outer_it(x, y, out=None): ... mulop = np.multiply ... it = np.nditer([x, y, out], ['external_loop'], ... [['readonly'], ['readonly'], ['writeonly', 'allocate']], ... op_axes=[list(range(x.ndim)) + [-1] * y.ndim, ... [-1] * x.ndim + list(range(y.ndim)), ... None]) ... with it: ... for (a, b, c) in it: ... mulop(a, b, out=c) ... return it.operands[2]
>>> a = np.arange(2)+1 >>> b = np.arange(3)+1 >>> outer_it(a,b) array([[1, 2, 3], [2, 4, 6]])Вот пример функции, которая действует как ufunc «лямбда»:
>>> def luf(lamdaexpr, *args, **kwargs): ... '''luf(lambdaexpr, op1, ..., opn, out=None, order='K', casting='safe', buffersize=0)''' ... nargs = len(args) ... op = (kwargs.get('out',None),) + args ... it = np.nditer(op, ['buffered','external_loop'], ... [['writeonly','allocate','no_broadcast']] + ... [['readonly','nbo','aligned']]*nargs, ... order=kwargs.get('order','K'), ... casting=kwargs.get('casting','safe'), ... buffersize=kwargs.get('buffersize',0)) ... while not it.finished: ... it[0] = lamdaexpr(*it[1:]) ... it.iternext() ... return it.operands[0]>>> a = np.arange(5) >>> b = np.ones(5) >>> luf(lambda i,j:i*i + j/2, a, b) array([ 0.5, 1.5, 4.5, 9.5, 16.5])
Если используются флаги операндов
"writeonly"или"readwrite", операнды могут быть представлениями исходных данных со флагомWRITEBACKIFCOPY. В этом случаеnditerдолжен использоваться как менеджер контекста или методnditer.closeдолжен вызываться перед использованием результата. Временные данные будут записаны обратно в исходные данные при вызове функции__exit__, но не раньше:>>> a = np.arange(6, dtype='i4')[::-2] >>> with np.nditer(a, [], ... [['writeonly', 'updateifcopy']], ... casting='unsafe', ... op_dtypes=[np.dtype('f4')]) as i: ... x = i.operands[0] ... x[:] = [-1, -2, -3] ... # a still unchanged here >>> a, x (array([-1, -2, -3], dtype=int32), array([-1., -2., -3.], dtype=float32))Важно отметить, что после выхода из итератора висячие ссылки (например,
xв примере) могут или не могут совместно использовать данные с исходными даннымиa. Если семантика записи была активна, т. е. еслиx.base.flags.writebackifcopyравноTrue, то выход из итератора разорвёт связь междуxиa, запись вxбольше не будет влиять наa. Если семантика записи неактивна, тогдаx.dataпо-прежнему будет указывать на какую-то частьa.data, и запись в одну из них будет влиять на другую.Управление контекстом и метод
closeпоявились в версии 1.15.0.
- Атрибуты:
-
- dtypesкортеж из типов данных
-
Типы данных значений, предоставляемых в
value. Они могут отличаться от типов данных операндов, если включено буферирование. Действительно только до закрытия итератора. - finishedbool
-
Указывает, завершена или нет итерация по операндам.
- has_delayed_bufallocbool
-
Если True, итератор был создан с флагом
delay_bufalloc, и на нём ещё не вызывалась функция reset(). - has_indexbool
-
Если True, итератор был создан с флагом
c_indexили флагомf_index, и свойствоindexможет быть использовано для его получения. - has_multi_indexbool
-
Если True, итератор был создан с флагом
multi_index, и свойствоmulti_indexможет быть использовано для его получения. - index
-
Когда использовался флаг
c_indexилиf_index, это свойство предоставляет доступ к индексу. Вызывает ValueError, если обращение осуществляется иhas_indexравно False. - iterationneedsapibool
-
Указывает, требует ли итерация доступа к Python API, например, если один из операндов является массивом объектов.
- iterindexint
-
Индекс, соответствующий порядку итерации.
- itersizeint
-
Размер итератора.
- itviews
-
Структурированные представления
operandsв памяти, соответствующие переупорядоченному и оптимизированному шаблону доступа к итератору. Действительно только до закрытия итератора. - multi_index
-
Когда использовался флаг
multi_index, это свойство предоставляет доступ к индексу. Вызывает ValueError, если доступ осуществляется, иhas_multi_indexравно False. - ndimint
-
Размерность итератора.
- nopint
-
Количество операндов итератора.
-
operandsкортеж из операндов -
operands[
Slice] - shapeкортеж целых чисел
-
Кортеж формы, форма итератора.
- value
-
Значение
operandsна текущей итерации. Обычно это кортеж из скаляров массивов, но если используется флагexternal_loop, это кортеж одномерных массивов.
Методы
close()Обработка всех семантик записи для изменяемых операндов.
copy()Получение копии итератора в его текущем состоянии.
Вывод текущего состояния экземпляра
nditerи отладочной информации в stdout.Если "external_loop" не использовался при создании, но желателен, это изменяет итератор, чтобы он вел себя так, как будто флаг был указан.
iternext()Проверка наличия оставшихся итераций и выполнение одной внутренней итерации без возврата результата.
remove_axis(i, /)Удаляет ось
iиз итератора.Если был указан флаг "multi_index", это удаляет его, позволяя оптимизировать внутреннюю структуру итерации.
reset()Сброс итератора в исходное состояние.
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.nditer.html