標索引和布爾值的組合出現傷害你的速度:
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