convert the dictionary to an array and use np.take :
Na=1000 #array Nd = 10**4 #dict data=randint(0,Nd,(Na,Na)) dic=dict(zip(range(Nd),randint(0,Nd,Nd))) dicarray=np.array(list(dic.values()))
This is usually much faster:
In [3]: %timeit np.array([[dic[x] for x in line] for line in data]) 1 loops, best of 3: 2.27 s per loop In [4]: %timeit dicarray.take(data) 10 loops, best of 3: 24.4 ms per loop
BM
source share