2016-11-01 61 views
3

我是新來的numpy,但不是python。有一個關於numpy辦法做到這一點的問題,可以考慮:線性方程的Numpy語法

編輯:修正功能**

def _my_function(weights, features, bias): 
    # the pure python way 
    value = 0. 
    for i in range(len(weights)): 
     value += (weights[i]*features[i]) 

    return value+bias 

什麼是numpy的方式做到這一點?

回答

1

如果weigthsfeatures大小相同的numpy的陣列,可以實現elementwise乘法:

values = np.sum(weights * features + bias) 

如果要避免增加偏壓到產品陣列的每個元素,可以做

values = np.sum(weights * features) + bias * weights.size 

你甚至可以使用Python的內置sum功能:

values = sum(weights * features + bias) 

values = sum(weights * features) + bias * weights.size 

之所以這樣工作原理是,表達式weights * featuresweights * features + bias都是臨時numpy的陣列,其是可迭代沿着其第一尺寸並且因此可以被傳遞給sum

時序

我跑的IPython以下定時測試:

%timeit weights.dot(features) 
The slowest run took 145.86 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000000 loops, best of 3: 649 ns per loop 

%timeit np.sum(weights * features) 
The slowest run took 17.09 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 2.83 µs per loop 

使用ndarray.dot是五倍量級比在產品使用np.sum更快。但是,警告表明,在您第一次運行代碼時,這可能不正確。 0.649μs* 145.86 =94.66μs,而2.83μs* 17.09 =48.36μs。

+0

這個答案是正確的,也是很好的,但最重要的答案在一個點上有更多的細節,包括複雜性解決方案 –

+0

我並不反對'dot'在這裏是更好的解決方案,但你是什麼意思的「複雜性解決方案」? –

+0

我已經添加了關於哪些方法可以更好地執行的評論 –

3

方法1:使用dot-productnp.dot -

weights.dot(features) + bias*len(weights) 

方法2:引進來np.einsum執行sum-reduction -

np.einsum('i,i->',weights,features) + bias*len(weights) 

我想辦法#1人做得更好。

+0

性能有什麼不同? –

+0

對不起,我在第一篇文章中弄錯了方程。你是否回答基於編輯的變化? –

+0

你在哪裏看到矩陣乘法? –