我遇到了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计算为矩阵乘积吗?
谢谢!
答案 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)是解决方案。不久,[]将向量转换为矩阵,将矩阵转换为高维张量。