Python: использование Tensordot для умножения матрицы на тензор х - PullRequest
0 голосов
/ 04 марта 2011

Привет, я умножаю тензор с матрицей следующим образом:

размеры

W: a x b x c

V: a x c

Я хочу, чтобы Z был таким, чтобы

Z[i]=dot(W[i],V[i])

Z имел размерность a x ( (b x c) . (c x 1)), поэтому (a x b)

Я пытался numpy.tensordot сделать это, но не смог.Может ли он делать то, что я хочу?Если нет, то как я могу сделать это БЕЗ петель.

В основном эквивалент

def f(W,V):    
    Z=[]    
    for i in range(len(W)):    
        Z.append(dot(W[i],V[i]))    
    return Z

Спасибо

edit: В частности, это достижимо с тензордо?

Ответы [ 2 ]

5 голосов
/ 05 марта 2011

np.einsum("abc,ac -> ab", w, v) * * 1004 import numpy as np def z_loop(w,v): # define it to check that `einsum()` gives necessary result z = np.empty(w.shape[:-1], dtype=w.dtype) for i in range(z.shape[0]): z[i,:] = np.dot(w[i,:], v[i,:]) return z w = np.random.uniform(size=(3,4,5)) v = np.random.uniform(size=w.shape[::2]) assert np.allclose(z_loop(w, v), np.einsum('abc,ac -> ab', w, v)) Возможно, есть более простые варианты (через dot(), .reshape()), но einsum() является наиболее очевидным для описания задачи. def z_dot(w, v): z = np.dot(w, v[:,...,np.newaxis]) z = z.reshape(z.shape[:-1]) return np.diagonal(z, axis2=-1).T assert np.allclose(z_dot(w, v), np.einsum('abc,ac -> ab', w, v))

2 голосов
/ 28 октября 2011

Как насчет

import numpy as np

a,b,c=3,5,6

r=np.random.random
W = r((a,b,c))
V = r((a,c))

Z = np.sum(W*V[:,np.newaxis,:],axis=2)

Не использует циклы или новые функции и должен быть достаточно быстрым.Сравнение с "z_loop" из поста Дж. Ф. Себастьяна:

print np.sum(np.abs(Z-z_loop(W,V)))

дает 4.99600361081e-16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...