Метод reset
Метод reset класса nditer сбрасывает внутреннее состояние итератора к начальному положению. Это позволяет повторно использовать уже созданный объект итератора для нового прохода по массиву без необходимости создания нового экземпляра. Метод полезен в ситуациях, когда требуется многократно итерироваться по одним и тем же данным с одинаковыми настройками.
Метод не принимает никаких параметров и не возвращает значения. После вызова reset итератор становится готовым к новому обходу с самого начала массива.
Синтаксис
iterator.reset()
Пример
Давайте создадим одномерный массив и итератор для него, а затем выполним два прохода с помощью метода reset:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
iterator = np.nditer(arr, flags=['c_index'])
# First pass
print("First pass:")
while not iterator.finished:
print(f"Index {iterator.index}: {iterator[0]}")
iterator.iternext()
# Reset iterator
iterator.reset()
# Second pass
print("\nSecond pass:")
while not iterator.finished:
print(f"Index {iterator.index}: {iterator[0]}")
iterator.iternext()
Результат выполнения кода:
"First pass:"
"Index 0: 1"
"Index 1: 2"
"Index 2: 3"
"Index 3: 4"
"Index 4: 5"
""
"Second pass:"
"Index 0: 1"
"Index 1: 2"
"Index 2: 3"
"Index 3: 4"
"Index 4: 5"
Пример
Рассмотрим использование reset с многомерным массивом и внешним циклом:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
iterator = np.nditer(arr, flags=['external_loop'], order='F')
# First iteration
print("First iteration:")
for x in iterator:
print(x)
# Reset and iterate again
iterator.reset()
print("\nSecond iteration:")
for x in iterator:
print(x)
Результат выполнения кода:
"First iteration:"
"[1 4]"
"[2 5]"
"[3 6]"
""
"Second iteration:"
"[1 4]"
"[2 5]"
"[3 6]"
Пример
Метод reset особенно полезен при работе с несколькими массивами и изменяемыми операндами. Рассмотрим пример с обновлением данных между проходами:
import numpy as np
arr = np.array([10, 20, 30])
iterator = np.nditer([arr, None], flags=['multi_index'],
op_flags=[['readonly'], ['writeonly', 'allocate']],
op_dtypes=['int64', 'int64'])
# First pass: double the values
for x, y in iterator:
y[...] = x * 2
iterator.operands[1].shape = arr.shape
result = iterator.operands[1]
print("Doubled array:", result)
# Reset and modify data
arr[:] = [100, 200, 300]
iterator.reset()
# Second pass: triple the new values
for x, y in iterator:
y[...] = x * 3
iterator.operands[1].shape = arr.shape
result = iterator.operands[1]
print("Tripled array:", result)
Результат выполнения кода:
"Doubled array: [20 40 60]"
"Tripled array: [300 600 900]"
Смотрите также
-
метод
iternext,
который переводит итератор на следующий элемент -
класс
nditer,
предоставляющий объект для эффективной итерации по массивам -
метод
enable_external_loop,
который включает режим внешнего цикла для итератора -
метод
remove_axis,
который удаляет ось из итерации