使用numpy对向量进行转置

使用numpy对向量进行转置,numpy,ipython,transpose,Numpy,Ipython,Transpose,我和Ipython-Numpy有问题。我要执行以下操作: x^T.x 使用和x^T对向量x进行转置操作。x是从txt文件中提取的,其说明如下: x = np.loadtxt('myfile.txt') 问题是如果我使用转置函数 np.transpose(x) 使用形状函数知道x的大小,我得到了x和x^T的相同尺寸。Numpy给出了每个尺寸后带有L大写标记的尺寸。e、 g print x.shape print np.transpose(x).shape (3L, 5L) (3L, 5L)

我和Ipython-Numpy有问题。我要执行以下操作:

x^T.x
使用和x^T对向量x进行转置操作。x是从txt文件中提取的,其说明如下:

x = np.loadtxt('myfile.txt')
问题是如果我使用转置函数

np.transpose(x)
使用形状函数知道x的大小,我得到了x和x^T的相同尺寸。Numpy给出了每个尺寸后带有L大写标记的尺寸。e、 g

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

(3L, 5L)
(3L, 5L)
有人知道如何解决这个问题,并将x^T.x计算为矩阵积吗


谢谢大家!

对于初学者来说,
L
仅仅意味着类型是一个长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

文件“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)应该给出标量。

转置所做的是反转形状元组,也就是说,你给它一个形状数组
(m,n)
,它返回一个形状数组
(n,m)
,你给它一个形状数组
(n,)
。。。它返回相同的数组,其形状为
(n,)

您隐含的期望是numpy将1D向量作为二维形状数组
(1,n)
,该数组将被转换为
(n,1)
向量。Numpy不会自己这么做,但你可以告诉它这就是你想要的,例如:

>>> a = np.arange(4)
>>> a
array([0, 1, 2, 3])
>>> a.T
array([0, 1, 2, 3])
>>> a[np.newaxis, :].T
array([[0],
       [1],
       [2],
       [3]])

正如其他人所解释的,换位不会像您希望的那样对一维数组“起作用”。 您可能希望使用
np.至少\u 2d
来获得一致的标量产品定义:

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

我也有同样的问题,我用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矩阵可能不是表示数据的最佳方式,但如果您要执行大量矩阵操作,这将非常好

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

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

[1 2 2]
[[1]
 [2]
 [2]]
rows, cols:  (3,)
rows, cols:  (3, 1)
这里(3,)可以被认为是“(3,0)”。
然而,如果你想要矩阵a的转置,np。转置(a)就是解决方案。简而言之,[]将向量转换为矩阵,将矩阵转换为高维张量

你可以通过
np.dot(x,x)
获得你想要的东西。numpy中的
*
运算符表示元素乘法,而不是矩阵乘法。这不是答案,应该作为对问题的编辑。两点:(1)最初你说
numpy
没有改变
(3L,5L)
数组的形状,这非常令人惊讶,但是
(5L,)
保持为
(5L,)
并不令人惊讶;它是一个一维对象,它的转置就是它本身。你原来的报告有误吗?(2)
x*np.转置(x)
是两个一维数组的元素乘法,因此是一个一维数组。有人知道这是为什么吗:
x[:,无]
OP使用的实际代码在中给出。
[1 2 2]
[[1]
 [2]
 [2]]
rows, cols:  (3,)
rows, cols:  (3, 1)