numpy.nditer#
- класс numpy.nditer(op, флаги=None, op_flags=None, op_dtypes=None, порядок='K', приведение типов='safe', op_axes=None, itershape=None, buffersize=0)[источник]#
Эффективный многомерный итератор для перебора массивов. Чтобы начать использовать этот объект, см. вводное руководство по итерации массивов.
- Параметры:
- opndarray или последовательность array_like
Массив(ы) для итерации.
- флагипоследовательность str, опционально
Флаги для управления поведением итератора.
bufferedвключает буферизацию, когда требуется.c_indexравен 1 или меньше, тесты будут просто показывать информационные сообщения о запущенных тестах; но если он больше 1, тесты также будут предоставлять предупреждения об отсутствующих тестах. Поэтому если вы хотите запустить каждый тест и получать сообщения о том, какие модули не имеют тестов: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позволяет итерацию по ссылочным типам, таким как массивы объектов.reduce_okпозволяет итерироватьreadwriteоперанды, которые транслируются, также известные как редукционные операнды.zerosize_okпозволяетitersizeравным нулю.
- op_flagsсписок списков строк, опционально
Это список флагов для каждого операнда. Как минимум, один из
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), необязательно
Требуемый тип(ы) данных операндов. Если копирование или буферизация включены, данные будут преобразованы в/из их исходных типов.
- порядок{‘C’, ‘F’, ‘A’, ‘K’}, опционально
Управляет порядком итерации. 'C' означает порядок C, 'F' — порядок Fortran, 'A' — порядок 'F', если все массивы являются смежными в стиле Fortran, в противном случае порядок 'C', а 'K' означает как можно ближе к порядку, в котором элементы массива появляются в памяти. Это также влияет на порядок памяти элементов
allocateоперанды, так как они выделены для совместимости с порядком итерации. По умолчанию 'K'.- приведение типов{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, опционально
Управляет тем, какое преобразование типов данных может произойти при создании копии или буферизации. Установка этого значения в 'unsafe' не рекомендуется, так как это может негативно повлиять на накопления.
'no' означает, что типы данных не должны преобразовываться вообще.
'equiv' означает, что разрешены только изменения порядка байтов.
‘safe’ означает, что разрешены только преобразования, которые могут сохранить значения.
'same_kind' означает, что разрешены только безопасные преобразования или преобразования внутри одного типа, например, из float64 в float32.
‘unsafe’ означает, что могут быть выполнены любые преобразования данных.
- op_axesсписок списков целых чисел, опционально
Если предоставлен, представляет собой список целых чисел или None для каждого операнда. Список осей для операнда — это отображение от измерений итератора к измерениям операнда. Значение -1 может быть размещено для записей, что приводит к тому, что это измерение обрабатывается как
newaxis.- itershapeкортеж целых чисел, необязательный
Желаемая форма итератора. Это позволяет
allocateоперанды с размерностью, отображенной op_axes, не соответствующей размерности другого операнда, чтобы получить значение, не равное 1 для этой размерности.- buffersizeint, необязательный
При включенном буферизации управляет размером временных буферов. Установите 0 для значения по умолчанию.
Примечания
nditerзаменяетflatiter. Реализация итератора заnditerтакже доступен через C API NumPy.Python-интерфейс предоставляет два интерфейса итерации: один следует протоколу итератора Python, а другой отражает C-стиль do-while. Нативный подход Python лучше в большинстве случаев, но если вам нужны координаты или индекс итератора, используйте C-стиль.
Примеры
Вот как мы могли бы написать
iter_addфункция, используя протокол итератора Python:>>> import numpy as np
>>> 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кортеж dtype(s)
Типы данных значений, предоставленных в
value. Это может быть отличаться от типов данных операндов, если включено буферизация. Действительно только до закрытия итератора.- завершеноbool
Завершена ли итерация по операндам или нет.
- has_delayed_bufallocbool
Если True, итератор был создан с
delay_bufallocflag, и функция 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[Срез]
- shapeкортеж целых чисел
Кортеж формы, форма итератора.
- значение
Значение
operandsна текущей итерации. Обычно это кортеж скаляров массива, но если флагexternal_loopиспользуется, это кортеж одномерных массивов.
Методы
close()Разрешить все семантики обратной записи в операндах, доступных для записи.
copy()Получить копию итератора в его текущем состоянии.
Вывести текущее состояние
nditerэкземпляр и отладочную информацию в stdout.Когда "external_loop" не использовался при создании, но требуется, это изменяет итератор, чтобы он вел себя так, как если бы флаг был указан.
iternext()Проверить, остались ли итерации, и выполнить одну внутреннюю итерацию без возврата результата.
remove_axis(i, /)Удаляет ось i из итератора.
Когда был указан флаг "multi_index", это удаляет его, позволяя оптимизировать внутреннюю структуру итерации дальше.
reset()Сбросить итератор в исходное состояние.