2012-07-25 93 views
2

我目前正在通過計算機科學教科書中的一些概念。線性代數大量使用,他們在教科書中顯示的例子都使用Numpy。Numpy:乘以一個向量

一個表情特別讓我完全困惑,因爲它似乎是一個完全無用的表達。從教科書逐字複製,它說:

normalisers = sum(exp(outputs),axis=1)*ones((1,shape(outputs)[0]))

所以,我會刪除exp爲簡化起見(這是不相關的這裏的問題),這給了我們:

sum(outputs,axis=1)*ones((1,shape(outputs)[0]))

其中outputs是二維Numpy array(矩陣)。

據我所知,這只是求和outputs矩陣中的所有行,然後將得到的向量乘以所有元素的向量。那麼......這裏所有的乘法點都有什麼意義呢?它根本不會改變這些值。

這是教科書中的一個錯誤,還是我只是沒有看到如何乘以所有的值可能對這裏的值產生任何影響?在這一點上,我只對Numpy有些熟悉,所以我不確定我是不是誤解了這個表達式的一些含義。

+2

這是否會將結果從(dim,)向量更改爲(1,dim)矩陣..?雖然我不會那樣做! – jmetz 2012-07-25 16:30:58

+0

我認爲它可以在以後有所作爲,無論矩陣是(n,)還是(1,n)大小...... – jmetz 2012-07-25 16:35:59

回答

3

如mutzmatron在評論寫入,當outputs是一個數組,該乘法是從(n,)改變sum結果的形狀(1,n)的高度做作方式。快速和慣用的方式做到這一點是

sum(exp(outputs), axis=1).reshape(1, -1) 

與在課本中呈現的方式,這是可讀和可擴展性,因爲reshape需要恆定的,而不是線性的時間和內存。

然而,如果outputs不是數組但可怕的類型np.matrix的目的,其結果是完全不同的:(但隨後仍然,這是表達不同的操作的一個人爲的方式)

>>> outputs = np.matrix(outputs) 
>>> (sum(exp(outputs), axis=1) * ones((1,shape(outputs)[0]))).shape 
(10, 10)