Выполните серию внешних продуктов, используя tracedot в scipy - PullRequest
4 голосов
/ 25 февраля 2011

Чтобы выполнить внешнее произведение между двумя векторами в Python (scipy / numpy), вы можете использовать внешнюю функцию или просто использовать точку следующим образом:

In [76]: dot(rand(2,1), rand(1,2))
Out[76]: 
array([[ 0.43427387,  0.5700558 ],
       [ 0.19121408,  0.2509999 ]])

Теперь вопрос в том, что у меня есть список векторов (или два списка ...), и я хочу вычислить все внешние произведения, создав список квадратных матриц. Как мне это легко сделать? Я полагаю, что Tensordot может это сделать, но как?

Ответы [ 2 ]

5 голосов
/ 26 февраля 2011

Третий (и самый простой в обобщении) способ вычисления внешних продуктов - это вещание.

Некоторые 3-векторы (векторы на рядах):

import numpy as np
x = np.random.randn(100, 3)
y = np.random.randn(100, 3)

Наружный продукт:

from numpy import newaxis
xy = x[:,:,newaxis] * y[:,newaxis,:]

# 10th matrix
print xy[10]
print np.outer(x[10,:], y[10,:])
1 голос
/ 02 марта 2015

Собственно ответ предоставлен пв.неверно, так как результирующий массив xy будет иметь форму (100,3,3).Правильное вещание выглядит следующим образом:

import numpy as np
from numpy import newaxis
x = np.random.randn(100, 3)
y = np.random.randn(100, 3)

xy =  x[:,newaxis, :,newaxis] * y[newaxis,:,newaxis,:] 

Полученный массив xy теперь имеет форму (100,100,3,3) и содержит перекрестные произведения всех пар 3-векторов в x и y:

for i,a in enumerate(x):
    for j,b in enumerate(y):
        if not np.alltrue(np.outer(a,b) == xy[i,j]): print("The code is wrong")

не выводит:)

...