2013-10-08 5 views
7

У меня проблема с Ipython - Numpy. Я хочу сделать следующую операцию:Транспонирование вектора с использованием numpy

x^T.x 

с й, принадлежащей R^п и х^Т операция транспонирования на вектор х. х извлекаются из текстового файла с инструкцией:

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

Проблема заключается в том, что если я использую функцию транспонирования

np.transpose(x) 

и использует функцию формы, чтобы знать размер х, я получаю одинаковые размеры для x и x^T. Numpy дает размер с индексом L в верхнем регистре после каждого измерения. например

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

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

Кто-нибудь знает, как это решить, и вычислите x^T.x в качестве матричного продукта?

Спасибо!

+0

Кто-нибудь знает, почему это работает: 'х [:, None]' – zehelvion

+0

Фактический код, используемый OP дается в [ответить ниже] (http://stackoverflow.com/a/19238811/1647894). –

ответ

6

Как объяснено другими, транспозиция не будет «работать», как вы хотите, чтобы для 1D массивов. Вы можете использовать np.atleast_2d иметь совместимую скалярное определение продукта:

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

Для начала 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?

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. ] 

I ожидал бы, что один из двух последних результатов будет скаляром вместо вектора, так как x^Tx (или xx^T) должен дать скаляр.

+0

Вы можете получить то, что вам нужно, как «np.dot (x, x)». Оператор '*' в numpy представляет собой умножение по элементам, а не матричное умножение. – Jaime

+1

Это не ответ, и вместо этого вы должны быть сделаны как изменение своего вопроса. Два момента: (1) Первоначально вы сказали, что 'numpy' не меняет форму массива' (3L, 5L) ', что было очень удивительно, но не удивительно, что' (5L,) ' остается как '(5L,)'; это 1-D объект, и его транспонирование само по себе. Был ли ваш исходный отчет ошибкой? (2) 'x * np.transpose (x)' является элементарным умножением двух 1-D массивов и, следовательно, 1-D массива. – DSM

24

Что np.transpose делает обратный кортеж формы, т.е. вы кормите его массив формы (m, n), он возвращает массив формы (n, m), вы кормите его массив формы (n,) ... и он возвращает вам тот же массив форма (n,).

То, что вы неявно ожидаете, заключается в том, что numpy принимает ваш 1D-вектор в виде 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]]) 
1

Я была такая же проблема, я использовал 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 матрицы не может быть лучший способ представить ваши данные с точки зрения кодирования, это очень хорошо, если вы собираетесь выполнять множество матричных операций!

1

Это либо внутреннее, либо внешнее произведение двух векторов, в зависимости от ориентации, которую вы им назначаете. Вот как рассчитать либо без изменения x.

import numpy 
x = numpy.array([1, 2, 3]) 
inner = x.dot(x) 
outer = numpy.outer(x, x) 
Смежные вопросы