Умножить вектор на транспонирование другого вектора в numpy? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть 2 вектора, технически представленные как векторы-строки, например: (numpy)

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

Я хочу вычислить (a*b^{T}), поэтому a умножается на b транспонировать, как можно это может быть достигнуто в python / numpy?

Выполнение только a*b не должно привести к правильному результату, поскольку они оба являются горизонтальными векторами.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020
In [345]: a = np.array([1, 2, 3]) 
     ...: b = np.array([4, 5, 6])                                                                    

В numpy существуют различные способы «умножения» двух одномерных массивов:

Поэлементно:

In [346]: a * b                                                                                      
Out[346]: array([ 4, 10, 18])

Внутреннее или скалярное произведение:

In [347]: np.dot(a,b)                                                                                
Out[347]: 32
In [348]: a@b                                                                                        
Out[348]: 32
In [349]: np.inner(a,b)                                                                              
Out[349]: 32
In [356]: Out[346].sum()     # or sum of the elementwise products                                                                           
Out[356]: 32

Внешний продукт:

In [350]: np.outer(a,b)                                                                              
Out[350]: 
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])
In [351]: a[:,None] * b                                                                              
Out[351]: 
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])

np.transpose меняет местами существующие оси, но не добавляет ни одной. Изменение формы или индексирование с помощью np.newaxis/None делает следующее:

In [352]: a[:,None]       #  a.reshape(3,1)                                                                                 
Out[352]: 
array([[1],
       [2],
       [3]])
In [353]: a * b[:,None]              # transpose of [351]                                                                
Out[353]: 
array([[ 4,  8, 12],
       [ 5, 10, 15],
       [ 6, 12, 18]])

Точечное / матричное произведение с (3,1) b дает результат в форме (1,) (сравните со скаляром в [ 347]:

In [354]: np.dot(a ,b[:,None])                                                                       
Out[354]: array([32])

Или поставьте точку (1,3) над (3,1), чтобы получить результат (1,1):

In [355]: np.dot(a[None,:] ,b[:,None])                                                               
Out[355]: array([[32]])
0 голосов
/ 05 августа 2020

Вы ищете:

a.dot(b)

или

a@b

вывод:

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