np.vectorize функции, содержащей дот-произведение - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь выполнить продукт Matrix-Vector и добавляю скалярное число к постоянному вектору. Я хотел бы сделать это с четырьмя различными весами для этого вектора, поэтому я попытался векторизовать функцию. Теперь я получаю противоречивые измерения. Код выглядит следующим образом:

import numpy as np

M = np.random.rand(3,3)
d = np.random.rand(3)
Myfunc = lambda y,t: M.dot(y) + d*t
vFunc  = np.vectorize(Myfunc,excluded = ['y'])

y_0 = np.array([1,1,1])
c   = np.array([0.5,1,1.5])
print(vFunc(y_0,c))

Теперь это дает мне ошибку:

ValueError: operands could not be broadcast together with shapes (3,) (4,) 

И я не знаю почему. Насколько я понял, это должно дать мне три отдельных результата.

Ожидаемый результат будет следующим: если я вызываю функцию, где c является скаляром, я должен просто получить один вектор:

M.dot(y) + d*scalar

Если я назову его с вектором из трех элементов, я хочу получить список из трех векторов в качестве результата:

M.dot(y) + d*c1
M.dot(y) + d*c2
M.dot(y) + d*c3

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Полагаю, вы имели в виду следующее:

In [103]: M = np.arange(9).reshape([3, 3])

In [104]: y = np.arange(3)

In [105]: c = np.arange(3) + 1

In [106]: d = 4

In [107]: M @ y + (d * c)[:, None]
Out[107]:
array([[ 9, 18, 27],
       [13, 22, 31],
       [17, 26, 35]])
0 голосов
/ 11 января 2019

M.dot(y_0) + d*c должен дать вам ожидаемый результат.

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