Быстрый способ применить массив сопоставления для всех элементов в массиве NumPy? - PullRequest
0 голосов
/ 29 ноября 2018

Сейчас у меня есть код, который в основном выглядит следующим образом:

for x in range(img.shape[0]):
    for y in range(image.shape[1]):
        output[x,y] = map[ input[x,y] ]

, где output, input и map - все это массивы numpy (map - размер 256, все - тип uint8).

Это работает, но медленно.Циклы, подобные этому, должны быть в C. Вот для чего numpy.

Есть ли функция numpy (или функция cv2, я ее уже импортирую), которая будет делать это?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы ищете np.take, который так же прост, как map.take(input).И это, и решение Eelco намного быстрее, чем ваше;это примерно на 70 процентов быстрее, чем система Eelco, хотя ваш пробег может варьироваться, и для input.shape >> (1e4, 1e4) вам понадобится лучшее решение.

Для начала вам нужно воспользоваться [Производительностью различных методов индексирования, даже сnumba] ( Производительность различных простых способов индексирования, также с numba ), в которых подробно описываются различные связанные с производительностью факты для этой общей проблемы ( т.е. как мы используем один k -мерный массив для индексации какого-либо другого n -мерного массива не просто тривиальными способами.

Если у вас установлено что-то вроде Anaconda, вы можете попробовать использовать Numba до jit np.ndarray.take(...) и посмотрите, сколько производительности можно купить.Ссылка выше объясняет это также.

0 голосов
/ 29 ноября 2018

Как насчет?

output = map[input]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...