在numpy中矩阵和1d阵列之间的点积

时间:2014-10-16 00:29:32

标签: python numpy matrix

我需要在numpy中执行两个矩阵的点积。但是,其中一个实际上在每行中具有相同的值。类似的东西:

array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])

出于优化目的,我只将一列存储为1d数组。

有没有办法来计算这个和通常的2d矩阵之间的点积没有必须明确创建上面的矩阵?

2 个答案:

答案 0 :(得分:4)

当您执行两个数组的点积时,您将计算第一个数组的每一行的点积与第二个数组的每一列。如果你的矢量矩阵(MTFIAV)是点积的第一个操作数,很容易看出你可以将点积的重复值分解,并对结果进行单次乘法。总结第二个数组的每一列:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> aa = np.repeat(a, 5).reshape(len(a), -1)
>>> aa
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])

>>> np.dot(aa, b)
array([[  0,   0,   0,   0],
       [ 40,  45,  50,  55],
       [ 80,  90, 100, 110]])
>>> np.outer(a, b.sum(axis=0))
array([[  0,   0,   0,   0],
       [ 40,  45,  50,  55],
       [ 80,  90, 100, 110]])

如果您的MTFIAV是第二个操作数,则不难看出结果也是MTFIAV,并且可以通过向量计算第一个操作数的点积来获得其向量表示:

>>> c = np.arange(12).reshape(4, 3)

>>> np.dot(c, aa)
array([[ 5,  5,  5,  5,  5],
       [14, 14, 14, 14, 14],
       [23, 23, 23, 23, 23],
       [32, 32, 32, 32, 32]])
>>> np.dot(c, a)
array([ 5, 14, 23, 32])

答案 1 :(得分:3)

如果你有一个数组:

a = np.array([0, 1, 2])

表示像:

这样的矩阵
>>> np.repeat(a[:,np.newaxis], 5, 1)
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])

你想要一个带有矩阵m的点积:

m = np.arange(5*4).reshape(5,4)

你可以使用:

a[:,np.newaxis] * np.sum(m, axis=0)