Проблемы с производительностью при итерации массива numpy - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть 3D-массив изображений, например

[
    [
        [225, 0, 0],
        [225, 225, 0],
        ...
    ],
    [
        [225, 0, 0],
        [225, 225, 0],
        ...
    ],
    ...
]

Размер этого массива составляет 500x500x3, что составляет 750 000 элементов.Это простые вложенные циклы для итерации по массиву

for row in arr:
    for col in row:
        for elem in col:
            elem = (2 * elem / MAX_COLOR_VAL) - 1

Но для итерации требуется много времени (> 5 минут).

Я новичок в numpy, так что, возможно, яИтерируете массивы неправильно?Как я могу оптимизировать эти циклы?

1 Ответ

1 голос
/ 26 сентября 2019

Массивы Numpy не предназначены для выполнения итерации по элементам.Скорее всего, это будет даже медленнее , чем итерация по списку Python, поскольку это приведет к большому количеству переносов и разворачиваний элементов.

Массивы Numpy предназначены для обработки в основная часть .Так, например, вычислите поэлементную сумму двух матриц 1000 × 1000.

Если вы хотите умножить все элементы на 2, разделить их на MAX_COLOR_VAL и вычесть один из них, вы можете просто построитьновый массив с:

arr = (2 * arr.astype(float) / MAX_COLOR_VAL) - 1

Эта операция будет применена к всем элементам.

Примечание : обратите внимание, что если вы выполняете итерациюв массиве numpy вы не перебираете индексы, вы перебираете сами строки.Таким образом, row in for row in arr вернет двумерный массив, а не индекс двумерного массива.

...