2

我有一个 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,),所以转置它什么都不做。

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

4

4 回答 4

3

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

f[1, :, np.newaxis]

产生你想要的单列二维数组。放在np.newaxis冒号之前会给出一个单行二维数组。

于 2013-10-24T10:48:22.737 回答
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]])
于 2013-10-24T12:59:38.893 回答
0

如果您希望各个切片保留它们的“矩阵性”,那么您应该将 f 转换为 numpy.matrix,它保留了矩阵性。

 fm = numpy.matrix(f)

然后

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

将返回一个 nxn 矩阵

于 2013-10-24T13:11:26.997 回答
0

按照公认的答案,我更喜欢使用 None而不是np.newaxis,这对我的口味来说有点冗长。例如,

f[:,None]

做同样的事情f[:,np.newaxis]

于 2014-06-27T00:31:00.007 回答