【问题标题】:How to vectorize a dot product of one matrix for every row of another?如何为另一个矩阵的每一行矢量化一个矩阵的点积?
【发布时间】:2017-07-24 03:31:09
【问题描述】:

如果我有一个矩阵 A,我想得到 A 与 B 的每一行的点积。

import numpy as np

a = np.array([[1.0, 2.0],
              [3.0, 4.0]])

b = np.array([[1.0, 1.0],
              [2.0, 2.0],
              [3.0, 3.0]])

如果目标是手动(或循环):

c = np.array([np.dot(a, b[0])])
c = np.append(c, [np.dot(a, b[1])], axis=0)
c = np.append(c, [np.dot(a, b[2])], axis=0)

print(c)

c = [[  3.   7.]
     [  6.  14.]
     [  9.  21.]]

【问题讨论】:

  • 第二列是什么?
  • 我没有关注这个问题,第二栏是什么?

标签: performance python-2.7 numpy vectorization array-broadcasting


【解决方案1】:

使用np.dot 进行一些转置和矩阵乘法 -

a.dot(b.T).T
b.dot(a.T)

np.einsum -

np.einsum('ij,kj->ki',a,b)

np.tensordot -

np.tensordot(b,a,axes=((1,1)))

运行时测试-

In [123]: a = np.random.rand(2000, 2000)
     ...: b = np.random.rand(3000, 2000)
     ...: 

In [124]: %timeit a.dot(b.T).T
     ...: %timeit b.dot(a.T)
     ...: %timeit np.einsum('ij,kj->ki',a,b)
     ...: %timeit np.tensordot(b,a,axes=((1,1)))
     ...: 
1 loops, best of 3: 234 ms per loop
10 loops, best of 3: 169 ms per loop
1 loops, best of 3: 7.59 s per loop
10 loops, best of 3: 170 ms per loop

【讨论】:

  • 如此优雅和简单。现在我要亲自动手来了解为什么会这样。
  • 这个einsum是怎么回事?
  • @PaulPanzer Just dot products 擅长求和。 einsum 仅在我们需要保持一个或多个轴对齐时才起作用,而不是这里的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2020-01-06
  • 2021-08-09
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多