使用numpy进行向量化时,排序是一个不错的选择:
>>> s = np.argsort(b)
>>> s[np.searchsorted(b, a, sorter=s)]
array([0, 1, 2, 1, 1, 2, 1], dtype=int64)
如果您的数组a有m个元素,b有n个元素,则排序将是O(n log n),搜索将是O(m log n),这不错。基于字典的解决方案应该是摊销线性的,但如果数组不是很大,Python中的循环可能会使它们比这慢。广播解决方案具有二次复杂度,它们只对非常小的数组更快。
以下是使用您的示例进行的一些计时:
In [3]: %%timeit
...: s = np.argsort(b)
...: np.take(s, np.searchsorted(b, a, sorter=s))
...:
100000 loops, best of 3: 4.16 µs per loop
In [5]: %%timeit
...: my_dict = dict(zip(b, range(len(b))))
...: np.vectorize(my_dict.get)(a)
...:
10000 loops, best of 3: 29.9 µs per loop
In [7]: %timeit (np.arange(b.size)*(a==b[:,newaxis]).T).sum(axis=-1)
100000 loops, best of 3: 18.5 µs per loop