2016-12-14 104 views
1

我一直在嘗試矢量化以下代碼的循環。 (編輯評論)向量化numpy循環

M, N, F = 10, 50, 30 
ts = np.linspace(0.001,3,M) 
v = np.random.rand(N,1) 
A = np.random.rand(N,N) 
D = np.zeros(shape=(N,N,M)) 
for i, t in enumerate(ts): 
    for x in range(0,N): 
     for y in range(x,N): 
     D[x,y,i] = np.sum(np.exp(-t * v[0:F]) * A[x,0:F] * A[y,0:F]) 
     D[y,x,i] = D[x,y,i] 

我一直在閱讀其他問題,但無法弄清楚如何在這裏應用它。

對此提出建議?

+0

請加'''ts''','''v'''一個最小的例子,和''' A'''和'''F'''。 – wwii

+0

循環是否按照你想要的方式工作? – wwii

+0

'nf'和'F'是什麼? – Khris

回答

1

下面是使用和matrix-multiplicationbroadcasting組合的量化方法與np.dot -

# Get r,c indices corresponding to indices along dim-0,1 for o/p 
r,c = np.triu_indices(N) 
vals = (A[r,:F] * A[c,:F]).dot(np.exp(v[:nf,None]*(-ts))) 

# Initialize o/p array and assign values 
out = np.empty(shape=(N,N,M)) 
out[r,c,:] = vals 
out[c,r,:] = vals 
+0

不幸的是,我得到一個MemoryError,但無論如何感謝:) – user3658307

+0

@ user3658307是的,如果你正在使用非常大的數組粘貼代碼,因爲矢量化東西需要同時載入大量的東西。 – Divakar