import numpy as np
n, k = 30, 40
U = np.random.random((n, n, k))
K = np.random.random((n, n, n))
def using_loops(U, K):
S = np.empty((n, n, n))
for i in xrange(n):
temp = np.zeros((n, n))
for j in xrange (n):
if j != i:
temp += np.dot(U[j], U[j].T)
S[i] = np.dot(temp, K[i])
return S
def using_einsum(U, K):
uut = np.einsum('ijk,ilk->ijl', U, U)
total = uut.sum(axis=0)
total = total - uut
S = np.einsum('ijk,ikl->ijl', total, K)
return S
此測試一些using_loops
和using_einsum
產生相同的結果。
In [260]: np.allclose(using_loops(U, K), using_einsum(U, K))
Out[260]: True
這表明using_einsum更快;快多少取決於n
和k
大小:
In [262]: %timeit using_loops(U, K)
100 loops, best of 3: 17.1 ms per loop
In [263]: %timeit using_einsum(U, K)
1000 loops, best of 3: 1.92 ms per loop
在一般情況下,當你看到產品的總和,有一個很好的機會, np.einsum 會產生一個比較快的方法結果。它幾乎肯定會打敗 Python for-loops。
對於xrange(n)中的j和j!= i'應該引發了一個SyntaxError。你的意思是把它分成一個'for-loop'和一個'if-statement'? – unutbu 2014-11-25 02:59:30
@unutbu是的你是對的,我的意思是'對於xrange(n)中的j:if j!= i:'但是我在語法上犯了一個錯誤,我想知道有沒有更好的方法來做到這一點〜 – AnnabellChan 2014-11-25 05:58:01