2013-10-24 188 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]的功能是一样的。