Быстрее извлекать элементы из словаря - PullRequest
2 голосов
/ 20 июня 2020

У меня есть словарь, содержащий сопоставление цветового кода с индексом класса, например:

color_to_class_idx = {(0, 0, 0) : 0, (180, 120, 120): 1, (80, 50, 50): 2, (140, 140, 140): 3, (4, 250, 7): 4, (150, 6, 51): 5, (0, 102, 200): 6, (233, 255, 7): 7, (255, 31, 0): 8, (120, 120, 120): 9}

Теперь у меня есть список значений цветового кода, например:

list_ = [(0, 0, 0) , (80, 50, 50), (255, 255, 255)]

Я хотел бы получить еще один список с class_idx. Обратите внимание, что в list_ могут быть цветовые коды, которых нет в клавишах color_to_class_idx. В этих случаях он должен иметь значение по умолчанию (например, 0). Итак, окончательный результат будет выглядеть так - [0, 2, 0]

list_ может быть размером 345600. Так что скорость для меня имеет значение. Вот моя реализация:

values = np.array([color_to_cls_idx.get(key, 0) for key in segmented_img_list])

Но это медленно.

TIA

1 Ответ

1 голос
/ 20 июня 2020

Вы можете сделать немного лучше (примерно на 50%?), Преобразовав большую часть ваших структур данных в Numpy массивы. Вот массив значений словаря, адресованных по цветовым координатам. Обратите внимание, что все элементы, которые не обновляются явно: 0:

lookup = np.zeros((256, 256, 256), dtype=int)
for i in color_to_class_idx:
    lookup[i] = color_to_class_idx[i]

Вот массив результатов:

result = np.zeros(len(segmented_img_list))

А вот поиск l oop:

for i,key in enumerate(segmented_img_list):
    result[i] = lookup[key]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...