使用numpy对向量进行转置
我和Ipython-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)
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)