我有一个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))
让它工作了,但是有更好的方法吗?我是否错过了一种简单的方法来获得转置而无需重塑它?
答案 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]
完全相同。