2016-11-19 4 views
0

Если мне нужно массивы X (X имеет n строк и k столбцов), а Y (Y имеет n строк и q столбцов), как мне умножить два в векторной форме, так что я получаю массив Z со следующими характеристиками:Множественное умножение массива Python

Z[0]=X[:,0]*Y 
Z[1]=X[:,1]*Y 
Z[2]=X[:,2]*Y 
... 
Z[K-1]=X[:,k-1]*Y 
Z[K]=X[:,k]*Y 

for c in range(X.shape[1]): 
    Z[c]=X[:,c].dot(Y) 
+1

Что окончательная форма 'Z'? (К,)? (K, Q)? Вы суммируете размер 'n'? Подробности пожалуйста. Может быть даже небольшой пример 2x3x4, поэтому мы уверены, что понимаем вас. – hpaulj

+0

Конечная форма Z равна (k, q). Я попробую опубликовать версию цикла, если это может помочь. – 1nsg

+0

См. Версию цикла, добавленную выше. – 1nsg

ответ

2

Из вашего описания, и почти не думая:

Z=np.einsum('nk,nq->kq',X,Y) 

Я мог бы также написать его np.dot, с транспонированной или два. np.dot ли матрица сумма за последний тусклый 1-го и 2-го до последнего 2-го

Z = np.dot(X.T, Y) 

=================

In [566]: n,k,q=2,3,4 
In [567]: X=np.arange(n*k).reshape(n,k) 
In [568]: Y=np.arange(n*q).reshape(n,q) 
In [569]: Z=np.einsum('nk,nq->kq',X,Y) 
In [570]: Z 
Out[570]: 
array([[12, 15, 18, 21], 
     [16, 21, 26, 31], 
     [20, 27, 34, 41]]) 
In [571]: Z1=np.empty((k,q)) 
In [572]: Z1=np.array([X[:,c].dot(Y) for c in range(k)]) 
In [573]: Z1 
Out[573]: 
array([[12, 15, 18, 21], 
     [16, 21, 26, 31], 
     [20, 27, 34, 41]]) 
In [574]: X.T.dot(Y) 
Out[574]: 
array([[12, 15, 18, 21], 
     [16, 21, 26, 31], 
     [20, 27, 34, 41]]) 
Смежные вопросы