Метод enable_external_loop класса nditer
Метод enable_external_loop класса nditer
включает режим внешнего цикла при итерации по массивам.
В этом режиме итератор возвращает целые фрагменты данных
вместо отдельных элементов, что позволяет выполнять операции
над блоками данных за один раз и повышает производительность.
Метод принимает один необязательный параметр keep_axis,
который определяет, следует ли сохранять оси при внешнем цикле.
По умолчанию параметр равен False, что означает,
что внешний цикл будет выполняться по всем осям.
Синтаксис
nditer.enable_external_loop([keep_axis])
Пример
Создадим итератор для двумерного массива и включим внешний цикл:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
it = np.nditer(arr, flags=['external_loop'])
for x in it:
print(x)
Результат выполнения кода:
[1 2 3 4 5 6]
Пример
Используем внешний цикл с сохранением осей для многомерного массива:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
it = np.nditer(arr, flags=['external_loop'], op_flags=['readwrite'])
it.enable_external_loop(keep_axis=True)
for x in it:
print(x)
Результат выполнения кода:
[[1 2 3]
[4 5 6]]
Пример
Применим внешний цикл для выполнения операций над блоками данных:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
it = np.nditer(arr, flags=['external_loop'], op_flags=['readwrite'])
it.enable_external_loop()
for x in it:
x *= 2
print(arr)
Результат выполнения кода:
[[ 2 4 6]
[ 8 10 12]]
Пример
Сравним скорость работы с внешним и без внешнего цикла:
import numpy as np
import time
arr = np.arange(1000000).reshape(1000, 1000)
# Without external loop
start = time.time()
it = np.nditer(arr, op_flags=['readwrite'])
for x in it:
x += 1
time1 = time.time() - start
# With external loop
start = time.time()
it = np.nditer(arr, flags=['external_loop'], op_flags=['readwrite'])
it.enable_external_loop()
for x in it:
x += 1
time2 = time.time() - start
print(time1 > time2)
Результат выполнения кода:
True
Смотрите также
-
класс
nditer,
который создает итератор для многомерных массивов -
метод
iternext,
который переходит к следующему элементу в итераторе -
метод
remove_axis,
который удаляет ось из итерации -
метод
reset,
который сбрасывает итератор в начальное состояние