使用numpy转置矢量

时间:2013-10-08 02:21:57

标签: numpy ipython transpose

我遇到了Ipython的问题 - Numpy。我想做以下操作:

x^T.x

x属于R ^ n,x ^ T对向量x进行转置操作。使用以下指令从txt文件中提取x:

x = np.loadtxt('myfile.txt')

问题是如果我使用转置功能

np.transpose(x)

并使用shape函数知道x的大小,我得到x和x ^ T的相同尺寸。 Numpy在每个尺寸后给出大小为L大写的指示。 e.g。

print x.shape
print np.transpose(x).shape

(3L, 5L)
(3L, 5L)

有人知道如何解决这个问题,并将x ^ T.x计算为矩阵乘积吗?

谢谢!

7 个答案:

答案 0 :(得分:29)

np.transpose做的是反转形状元组,即你给它添加一个形状(m, n)的数组,它返回一个形状为(n, m)的数组,你给它添加一个形状数组{ {1}} ...它会返回形状为(n,)的相同数组。

你暗中期待的是numpy将你的一维矢量作为形状(n,)的二维数组,将被转换为(1, n)向量。 Numpy不会自己做,但你可以告诉它你想要的,例如:

(n, 1)

答案 1 :(得分:7)

正如其他人所解释的那样,换位不会像你想要的那样“工作”一维阵列。 您可能希望使用np.atleast_2d来获得一致的标量产品定义:

def vprod(x):
    y = np.atleast_2d(x)
    return np.dot(y.T, y)

答案 2 :(得分:3)

我有同样的问题,我使用numpy矩阵来解决它:

# assuming x is a list or a numpy 1d-array 
>>> x = [1,2,3,4,5]

# convert it to a numpy matrix
>>> x = np.matrix(x)
>>> x
matrix([[1, 2, 3, 4, 5]])

# take the transpose of x
>>> x.T
matrix([[1],
        [2],
        [3],
        [4],
        [5]])

# use * for the matrix product
>>> x*x.T
matrix([[55]])
>>> (x*x.T)[0,0]
55

>>> x.T*x
matrix([[ 1,  2,  3,  4,  5],
        [ 2,  4,  6,  8, 10],
        [ 3,  6,  9, 12, 15],
        [ 4,  8, 12, 16, 20],
        [ 5, 10, 15, 20, 25]])

虽然使用numpy矩阵可能不是从编码角度表示数据的最佳方式,但如果你要进行大量的矩阵运算,它会非常好!

答案 3 :(得分:1)

对于初学者L来说,只是意味着类型是一个long int。这应该不是问题。您必须提供有关您的问题的其他信息,因为我无法使用简单的测试用例重现它:

In [1]: import numpy as np

In [2]: a = np.arange(12).reshape((4,3))

In [3]: a
Out[3]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

In [4]: a.T #same as np.transpose(a)
Out[4]:
array([[ 0,  3,  6,  9],
       [ 1,  4,  7, 10],
       [ 2,  5,  8, 11]])

In [5]: a.shape
Out[5]: (4, 3)

In [6]: np.transpose(a).shape
Out[6]: (3, 4)

您的特定情况可能会出现一些微妙的问题。您可以将正在阅读的文件内容发布到x吗?

答案 4 :(得分:1)

这是两个向量的内积或外积,具体取决于您指定给它们的方向。以下是如何计算而不更改x

import numpy
x = numpy.array([1, 2, 3])
inner = x.dot(x)
outer = numpy.outer(x, x)

答案 5 :(得分:0)

文件'myfile.txt'包含

等行
5.100000 3.500000 1.400000 0.200000 1
4.900000 3.000000 1.400000 0.200000 1

这是我运行的代码:

import numpy as np
data = np.loadtxt('iris.txt')
x = data[1,:]

print x.shape
print np.transpose(x).shape
print x*np.transpose(x)
print np.transpose(x)*x

我得到了结果

(5L,)
(5L,)
[ 24.01   9.     1.96   0.04   1.  ]
[ 24.01   9.     1.96   0.04   1.  ]

我希望最后两个结果中的一个是标量而不是向量,因为x ^ T.x(或x.x ^ T)应该给出一个标量。

答案 6 :(得分:0)

b = np.array([1, 2, 2])
print(b)
print(np.transpose([b]))
print("rows, cols: ", b.shape)
print("rows, cols: ", np.transpose([b]).shape)

结果

[1 2 2]
[[1]
 [2]
 [2]]
rows, cols:  (3,)
rows, cols:  (3, 1)

这里(3,)可以被认为是“(3,0)”。 但是,如果要矩阵A的转置,np.transpose(A)是解决方案。不久,[]将向量转换为矩阵,将矩阵转换为高维张量。