Сочетание скалярной индексации и булево, как представляется, болеть вашей скоростью:
In [706]: %%timeit
...: Y=np.zeros((4,3,4))
...: for i in range(256):
...: Y[f(i), X==i]+=1
...:
100 loops, best of 3: 12.5 ms per loop
In [722]: %%timeit
...: Y=np.zeros((4,3,4))
...: for i in range(256):
...: I,J=np.where(X==i)
...: Y[f(i),I,J] = 1
...:
100 loops, best of 3: 8.55 ms per loop
Это код для
X=np.arange(12,dtype=np.uint8).reshape(3,4)
def f(i):
return i%4
В этом случае f(i)
не является основным временем потребитель:
In [718]: timeit K=[f(i) for i in range(256)]
10000 loops, best of 3: 120 µs per loop
но получать X==i
индексы медленно
In [720]: timeit K=[X==i for i in range(256)]
1000 loops, best of 3: 1.29 ms per loop
In [721]: timeit K=[np.where(X==i) for i in range(256)]
100 loops, best of 3: 2.73 ms per loop
Нам нужно пересмотреть X==i
часть из картирование, а не часть f(i)
.
=====================
Сведение последние 2 измерения помогает;
In [780]: %%timeit
...: X1=X.ravel()
...: Y=np.zeros((4,12))
...: for i in range(256):
...: Y[f(i),X1==i]=1
...: Y.shape=(4,3,4)
...:
100 loops, best of 3: 3.16 ms per loop
Не могли бы вы использовать реализацию func 'f'? – Divakar
Ммм это не легко поделиться, потому что это очень специфическая функция проблемы, но это функция, которая не требует времени для выполнения, и ничто в ней не может быть использовано для ускорения всего процесса. Это может быть примерно так: def f (x): v [x] где v = np.random.randint (4, size = (256,)) – dhokas