Что вызывает ошибку формы в numpy .dot при умножении вектора на матрицу? - PullRequest
0 голосов
/ 30 мая 2020
a= [1, 2, 3, 2.5]
b= [[0.2, 0.8, -0.5, 1.0],
    [0.5, -0.91, 0.26, -0.5],
    [-0.26, -0.27, 0.17, 0.87]]

print(np.dot(b,a))
print(np.dot(a,b))

Почему печатается первая строка, а вторая строка вызывает ошибку выравнивания формы?

"ValueError: фигуры (4,) и (3,4) не выровнены: 4 (dim 0)! = 3 (dim 0)"

Что вычисляет numpy пытается это вызовет эту ошибку?

Примечание. Я понимаю матричное умножение.

Спасибо за любую помощь, которую вы можете оказать!

Edit - Исправлены некоторые имена переменных

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Ваш пример - это один случай из документации np.dot:

dot(a, b, out=None)

Dot product of two arrays. Specifically,

- If `a` is an N-D array and `b` is a 1-D array, it is a sum product over
  the last axis of `a` and `b`.

В нем не указан случай для a 1-D и b ND.

In [106]: a= np.array([1, 2, 3, 2.5]) 
     ...: b= np.array([[0.2, 0.8, -0.5, 1.0], 
     ...:     [0.5, -0.91, 0.26, -0.5], 
     ...:     [-0.26, -0.27, 0.17, 0.87]])                                               
In [107]: a.shape, b.shape                                                               
Out[107]: ((4,), (3, 4))
In [108]: np.dot(b, a)                                                                   
Out[108]: array([ 2.8  , -1.79 ,  1.885])

в обозначении einsum, обратите внимание на общий индекс j (последняя ось обеих)

In [109]: np.einsum('ij,j->i', b, a)                                                     
Out[109]: array([ 2.8  , -1.79 ,  1.885])

a может быть 1d, но он соединен со вторым и последним измерением b, поэтому мы транспонировали его для сопоставления (4,) с (4,3):

In [113]: np.einsum('i,ij', a, b.T)                                                      
Out[113]: array([ 2.8  , -1.79 ,  1.885])
In [114]: np.dot(a,b.T)                                                                  
Out[114]: array([ 2.8  , -1.79 ,  1.885])

@, matmul описывает случай массива 1d иначе, но результат то же:

- If the first argument is 1-D, it is promoted to a matrix by
  prepending a 1 to its dimensions. After matrix multiplication
  the prepended 1 is removed.
- If the second argument is 1-D, it is promoted to a matrix by
  appending a 1 to its dimensions. After matrix multiplication
  the appended 1 is removed.

In [117]: b@a                                                                            
Out[117]: array([ 2.8  , -1.79 ,  1.885])
In [118]: a@b.T                                                                          
Out[118]: array([ 2.8  , -1.79 ,  1.885])
0 голосов
/ 30 мая 2020

a - вектор (возможно, матрица (1,4), но вам, возможно, следует изменить ее форму)

b - это матрица (3,4)

, поэтому вы можете сделать только ( 3,4) x (4,1) или (1,4) x (4,3)

пробовать веса * inputs.T или respahe вводы

пробовать вводы * weights.T

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