矩阵乘以Numpy的数组

时间:2013-10-24 10:34:48

标签: python arrays numpy matrix

我有一个5x5的数组数组,我试图将一行的转置与另一行相乘。

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将它视为真正的点积而不是矩阵乘法。

我发现列表切片,其中一个索引是一个整数而所有其他索引都是: s,因此f[1, :]的形状不是(1, 5)而是{{(5,) 1}}所以转置它什么都不做。

我已经能够使用f[1, :].reshape((1, 5))让它工作了,但是有更好的方法吗?我是否错过了一种简单的方法来获得转置而无需重塑它?

4 个答案:

答案 0 :(得分:3)

您可以使用np.newaxis在切片时添加尺寸,以补偿否则会丢失的尺寸。

f[1, :, np.newaxis]

生成所需的单列2D数组。将np.newaxis放在冒号之前会产生单行2D数组。

答案 1 :(得分: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]])

答案 2 :(得分:0)

如果您希望各个切片保留其“矩阵性”,那么您应该将f转换为numpy.matrix,这样可以保留矩阵性。

 fm = numpy.matrix(f)

然后

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

将返回nxn矩阵

答案 3 :(得分:0)

根据接受的答案,我更喜欢使用None代替np.newaxis,这对我的口味来说有点冗长。例如,

f[:,None]

f[:,np.newaxis]完全相同。