Python - более эффективный способ l oop через матрицы - PullRequest
1 голос
/ 29 февраля 2020

У меня есть

  • an (высота x ширина x 3) RGB-изображение img
  • a (256 x 256 x 256 ) матрица color_mapping отображение цветов
  • a (высота x ширина) матрица pixel_result , которую я хочу заполнить с помощью элементы, сопоставленные с color_mapping для каждого пикселя изображения

Как эффективно заполнить эту последнюю матрицу?

Пока что я просто пропустите все пиксели в для циклов , но мне интересно, есть ли более эффективный способ сделать это

for i in range(width):
    for j in range(height):
        pixel_result[j,i] = color_mapping[img[j,i,0],img[j,i,1],img[j,i,2]]

1 Ответ

1 голос
/ 29 февраля 2020

Вы можете реализовать это, подписав color_mapping:

pixel_result = color_mapping[<b>img[:,:,0], img[:,:,1], img[:,:,2]</b>]

Например, если проверить производительность с помощью:

>>> def f():
...   for i in range(width):
...     for j in range(height):
...         pixel_result[j,i] = color_mapping[img[j,i,0],img[j,i,1],img[j,i,2]]
... 
>>> def g():
...     pixel_result = color_mapping[img[:,:,0], img[:,:,1], img[:,:,2]]
>>> color_mapping = np.random.randn(256,256,256)

Затем для небольшого изображения: img = np.random.randint(0, 256, (12, 7, 3)), мы получаем:

>>> timeit(f, number=10000)
0.5247259399620816
>>> timeit(g, number=10000)
0.032307324931025505

Для больших изображений, таких как img = np.random.randint(0, 256, (1920, 1080, 3)), получаем:

>>> timeit(f, number=10)
18.934733690926805
>>> timeit(g, number=10)
0.5807857210747898

или для изображений 72 × 128:

>>> timeit(f, number=100)
0.6014469779329374
>>> timeit(g, number=100)
0.011570235947147012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...