我需要在numpy中执行两个矩阵的点积。但是其中一个矩阵实际上每行的值都相同。类似于:
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2]])
为了优化,我只将一列存储为一维数组。 有没有一种方法可以计算这个数组和一个通常的二维矩阵之间的点积,而不必显式地创建上述矩阵?
>>> 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])
如果您有一个数组:
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