Хорошим инструментом общего назначения является прямое или «внешнее» сравнение между элементами двух массивов:
In [35]: y=np.arange(5)
In [36]: x=np.array([0,1,2])
In [37]: y[:,None]==x
Out[37]:
array([[ True, False, False],
[False, True, False],
[False, False, True],
[False, False, False],
[False, False, False]])
Это быстрое сравнение между каждым элементом y
и каждым элементом x
. В зависимости от ваших потребностей, вы можете уплотнить этот массив вдоль одной из осей:
In [38]: (y[:,None]==x).any(axis=1)
Out[38]: array([ True, True, True, False, False])
Предложенный комментарий in1d
. Я думаю, что это хорошая идея, чтобы посмотреть на его код. Он имеет несколько стратегий в зависимости от относительных размеров входов.
In [40]: np.in1d(y,x)
Out[40]: array([ True, True, True, False, False])
In [41]: np.array([True if item in x else False for item in y])
Out[41]: array([ True, True, True, False, False])
То, что быстрее всего, может зависеть от размера входов. Стартовые списки, ваше понимание списка может быть быстрее. Эта чистая версия списка является самой быстрой:
[True if item in (0,1,2) else False for item in (0,1,2,3,4)]
[item in (0,1,2) for item in (0,1,2,3,4)] # simpler