The following steps are several times faster than Francesco's approach for your pattern array:
In [7]: a[np.argmax(a['id'][None, :] == b[:, None], axis=1)]
Out[7]:
array([(0, 'H', 88.15726964130869), (3, 'H', 92.98550136344437),
(5, 'H', 128.05441039929008), (8, 'H', 111.13662092749307),
(12, 'H', 97.79700070323196), (13, 'H', 108.2841293816308),
(14, 'H', 64.41057325770373), (15, 'H', 91.44444608631304),
(16, 'H', 81.50506434964355), (18, 'H', 118.34835768605957)],
dtype=[('id', '<i4'), ('name', '|S1'), ('value', '<f8')])
In [8]: %timeit a[np.argmax(a['id'][None, :] == b[:, None], axis=1)]
100000 loops, best of 3: 11.6 us per loop
In [9]: %timeit indices = [i for i,id in enumerate(a['id']) if id in b]; a[indices]
10000 loops, best of 3: 66.9 us per loop
To understand how this works, take a look at this:
In [10]: a['id'][None, :] == b[:, None]
Out[10]:
array([[False, False, False, True, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False],
...
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, True]], dtype=bool)
b , a. np.argmax True , b a['id'].
, python. a b , bool . , np.argmax , , , a . , , .
Francesco , , , . this...