包含点积的函数的np.vectorize

时间:2019-01-10 21:20:31

标签: python numpy vectorization

我试图执行一个矩阵向量乘积,并将一个标量乘以一个常数向量。我想在该向量上使用四个不同的权重来执行此操作,因此我尝试对函数进行向量化。现在,我得到了矛盾的尺寸。 代码如下:

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

如果我用c是三个元素的向量来调用它,我想要一个三个向量的列表作为结果:

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

2 个答案:

答案 0 :(得分:0)

M.dot(y_0) + d*c应该会给您预期的结果。

答案 1 :(得分:0)

我相信您的意思是:

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]])