2013-10-24 189 views
2

我有一個5x5陣列的數組,我想矩陣乘一個行的轉置與另一行。矩陣乘數組與Numpy

import numpy as np 
a = np.array([1, 4, 6, 4, 1]) 
b = np.array([-1, -2, 0, 2, 1]) 
c = np.array([-1, 2, 0, -2, 1]) 
d = np.array([-1, 0, 2, 0, -1]) 
e = np.array([1, -4, 6, -4, 1]) 
f = np.vstack([a, b, c, d, e]) 

result = np.dot(f[1, :].T, f[1, :]) 

我以爲這會工作,但顯然

f[1, :].T 

最終成爲

[-1, -2, 0, 2, 1] 

而不是

[[-1] 
[-2] 
[ 0] 
[ 2] 
[ 1]] 

np.dot對待它像一個真正的點produc而不是做矩陣乘法。

我發現名單切片,其中一個指標是一個整數,且其他所有: S按一個減小尺寸,從而使的f[1, :]形狀不是(1, 5)(5,)等調換它什麼都不做。

我已經能夠使用f[1, :].reshape((1, 5))工作,但是有沒有更好的方法來做到這一點?我是否錯過了一種獲得轉置的簡單方法,而無需重新塑造它?

回答

3

您可以使用np.newaxis在切片時添加尺寸,以補償否則會丟失的尺寸。

f[1, :, np.newaxis] 

產生你想要的單列二維數組。在冒號之前放置np.newaxis會產生一個單行二維數組。

1

對於numpy數組,有這種行爲通常是有利的,爲了避免這種情況,你總是可以使用numpy矩陣類。

>>> f = np.matrix(f) 
>>> f 
matrix([[ 1, 4, 6, 4, 1], 
     [-1, -2, 0, 2, 1], 
     [-1, 2, 0, -2, 1], 
     [-1, 0, 2, 0, -1], 
     [ 1, -4, 6, -4, 1]]) 

>>> f[1,:].T 
matrix([[-1], 
     [-2], 
     [ 0], 
     [ 2], 
     [ 1]]) 

>>> np.dot(f[1, :].T, f[1, :]) 
matrix([[ 1, 2, 0, -2, -1], 
     [ 2, 4, 0, -4, -2], 
     [ 0, 0, 0, 0, 0], 
     [-2, -4, 0, 4, 2], 
     [-1, -2, 0, 2, 1]]) 

由於這是矩陣類*將表示矩陣乘法,因此,你可以簡單地使用:

f[1,:].T * f[1,:] 

你也可能要考慮np.outer對於這種操作的:

>>> np.outer(f[1,:],f[1,:]) 
array([[ 1, 2, 0, -2, -1], 
     [ 2, 4, 0, -4, -2], 
     [ 0, 0, 0, 0, 0], 
     [-2, -4, 0, 4, 2], 
     [-1, -2, 0, 2, 1]]) 
0

如果你想要單個切片保留他們的「矩陣」,那麼你應該將f投射到numpy.matrix,這保留了矩陣性。

fm = numpy.matrix(f) 

然後

numpy.dot(fm[1,:].T,fm[1,:]) 

將返回n×n的矩陣

+0

這正是我發佈的,爲什麼重做這個? – Daniel

+0

簡單,我們幾乎同時提交了答案。 – Paul

0

繼接受的答案,我更喜歡使用None,而不是np.newaxis,這是我的口味有點冗長。例如,

f[:,None] 

f[:,np.newaxis]的功能是一樣的。