在numpy中计算矩阵和一维数组的点积

4

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

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

为了优化,我只将一列存储为一维数组。 有没有一种方法可以计算这个数组和一个通常的二维矩阵之间的点积,而不必显式地创建上述矩阵?
2个回答

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

谢谢,但我想避免创建完整矩阵,因为这会更慢。 - erickrf
使用完整矩阵的代码只是为了显示结果是正确的。对于两种排序方式,第二次调用产生的结果与使用完整矩阵的调用相同,而无需创建它。 - Jaime

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)

谢谢,这正是我所需要的。我还发现a.reshape(len(a), 1)比使用np.newaxis更快(至少在300个维度下)。 - erickrf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接