13

我在使用 Ipython - Numpy 时遇到问题。我想做以下操作:

x^T.x

公式x^T 对向量 x 进行转置操作。x 是从一个 txt 文件中提取的,其指令如下:

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

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

np.transpose(x)

并使用形状函数知道 x 的大小,我得到 x 和 x^T 的相同尺寸。Numpy 在每个维度之后给出带有 L 大写索引的大小。例如

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

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

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

谢谢!

4

7 回答 7

32

什么np.transpose是反转形状元组,即你给它一个 shape 数组(m, n),它返回一个 shape 数组(n, m),你给它一个 shape 数组(n,)......它返回你与 shape 相同的数组(n,)

您隐含的期望是 numpy 将您的 1D 向量作为 shape 的 2D 数组(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]])
于 2013-10-08T03:56:44.467 回答
9

正如其他人所解释的那样,转置不会像您希望的那样对一维数组“起作用”。您可能希望使用np.atleast_2d一致的标量产品定义:

def vprod(x):
    y = np.atleast_2d(x)
    return np.dot(y.T, y)
于 2013-10-08T12:22:06.127 回答
6

我有同样的问题,我使用 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 矩阵可能不是表示数据的最佳方式,但如果您要进行大量矩阵运算,那就太好了!

于 2015-12-04T03:58:58.990 回答
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吗?

于 2013-10-08T02:41:30.253 回答
1

这是两个向量的内积或外积,具体取决于您分配给它们的方向。以下是如何在不更改的情况下进行计算x

import numpy
x = numpy.array([1, 2, 3])
inner = x.dot(x)
outer = numpy.outer(x, x)
于 2015-12-04T04:18:41.143 回答
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^Tx(或 xx^T)应该给出标量。

于 2013-10-08T03:54:53.393 回答
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) 是解决方案。很快, [] 将向量转换为矩阵,将矩阵转换为更高维度的张量。

于 2018-08-28T14:02:07.260 回答