簡體   English   中英

如何向量化以下python代碼?

[英]How to vectorize the following python code?

我正在嘗試使用Numpy和矢量化操作來使代碼段運行得更快,但我沒有成功找到解決方案。 如果有人有想法......謝謝。

這是帶循環的工作代碼:

y = np.zeros(len(tab))
for i in range(len(tab)):
    s =  0
    for n in range(len(coef[0])):
        s += coef[0][n] * ((a + b * np.dot(tab[i], vectors[n])) ** d)
    y[i] = s

哪里,

  • tab:numpy.array(N,M)
  • 矢量:numpy.array(P,M)
  • coef:numpy.array(1,P)
  • a,b,c:常數(a = 0,如果它更容易)

您可以使用基於np.einsum的方法和使用np.einsum matrix-multiplication with np.dot如下所示 -

# Calculate "((a + b * np.dot(tab[i], vectors[n])) ** d)" part
p1 = (a + b*np.einsum('ij,kj->ki',tab,vectors))**d

# Include "+= coef[0][n] *" part to get the final output
y_vectorized = np.dot(coef,p1)

運行時測試

數據集#1:

這是一個快速運行時測試,將原始循環方法與針對某些隨機值的建議方法進行比較 -

In [168]: N = 50
     ...: M = 50
     ...: P = 50
     ...: 
     ...: tab = np.random.rand(N,M)
     ...: vectors = np.random.rand(P,M)
     ...: coef = np.random.rand(1,P)
     ...: 
     ...: a = 3.233
     ...: b = 0.4343
     ...: c = 2.0483
     ...: d = 3
     ...: 

In [169]: %timeit original_approach(tab,vectors,coef,a,b,c,d)
100 loops, best of 3: 4.18 ms per loop

In [170]: %timeit proposed_approach(tab,vectors,coef,a,b,c,d)
10000 loops, best of 3: 136 µs per loop

數據集#2:

NMP150 ,運行時間為 -

In [196]: %timeit original_approach(tab,vectors,coef,a,b,c,d)
10 loops, best of 3: 37.9 ms per loop

In [197]: %timeit proposed_approach(tab,vectors,coef,a,b,c,d)
1000 loops, best of 3: 1.91 ms per loop

看起來很糟糕。 但這是你需要的嗎?

y = array([ sum( [coef[0][n] * ((a + b * np.dot(tab[i], vectors[n])) ** d) 
            for n in range(len(vectors[0]))] ) for i in range(len(tab)) ])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM