Вопрос в том, как сделать так, чтобы это было не очень неэффективно.Я вижу, что два подхода
используют словарь, чтобы поиск был быстрым.numpy
Массивы являются изменяемыми и поэтому не могут быть хешируемыми, поэтому вам придется преобразовывать их, например, в кортежи для использования со словарем.
Используйте широковещательную рассылку для проверки value_list
против каждого «ключа» в key_list
векторизованным способом.Это по крайней мере выведет циклы for из Python, но вам все равно придется сравнивать каждое значение с каждым ключом.
Здесь я также предполагаю, что только key_list
имеет уникальные «ключи».
Вот как вы могли бы сделать первый подход:
value_list = np.array([[2,2,3],[255,243,198],[2,2,3],[50,35,3]])
key_list = np.array([[2,2,3],[255,243,198],[50,35,3]])
key_map = {tuple(key): i for i, key in enumerate(key_list)}
result = np.array([key_map[tuple(value)] for value in value_list])
result # array([0, 1, 0, 2])
А вот второй:
result = np.where((key_list[None] == value_list[:, None]).all(axis=-1))[1]
result # array([0, 1, 0, 2])
Какой способ быстрее может зависетьна размер key_list
и value_list
.Я бы выбрал для вас оба типа массивов типичных размеров.
РЕДАКТИРОВАТЬ - как отмечалось в комментариях, второе решение выглядит не совсем корректным, но я не уверен, что делает его неудачным.Попробуйте вместо этого использовать первое решение.