Я пытаюсь создать «маску» для numpy.array, указав определенные критерии. Python даже имеет хороший синтаксис для чего-то вроде этого:
>> A = numpy.array([1,2,3,4,5])
>> A > 3
array([False, False, False, True, True])
Но если у меня есть список критериев вместо диапазона:
>> A = numpy.array([1,2,3,4,5])
>> crit = [1,3,5]
Я не могу этого сделать:
>> A in crit
Я должен сделать что-то на основе понимания списка, например:
>> [a in crit for a in A]
array([True, False, True, False, True])
Что правильно.
Теперь проблема в том, что я работаю с большими массивами, а приведенный выше код работает очень медленно. Есть ли более естественный способ выполнить эту операцию, которая могла бы ускорить ее?
РЕДАКТИРОВАТЬ: я смог получить небольшое ускорение, превратив крит в сет.
EDIT2: для тех, кому интересно:
Подход Джуни:
1000 петель, лучшее из 3: 102 мкс на петлю
numpy.in1d:
1000 циклов, лучшее из 3: 1,33 мс на цикл
EDIT3: только что снова протестировано с B = randint (10, размер = 100)
Подход Джуни:
1000 циклов, лучшее из 3: 2,96 мс на цикл
numpy.in1d:
1000 циклов, лучшее из 3: 1,34 мс на цикл
Заключение : Используйте numpy.in1d (), если B не очень маленький.