两个矩阵的 row-wise 范数的向量化 speed-up
Vectorization speed-up for row-wise norms of two matrixes
基本上,我有两个矩阵A和B,我想要C(矩阵旁边标记的维度),计算如下:
下面的公式是我现在做的。我利用了一些广播,但我仍然有一个循环。我对 Python 很陌生所以也许我错了,但我有一种预感可以消除这个循环。谁能分享一些想法?
编辑:2018-04-27 09:48:28
根据要求,例如:
In [5]: A
Out[5]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [6]: B
Out[6]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
In [7]: C = np.zeros ((B.shape[0], A.shape[0]))
In [8]: for m in range (B.shape[0]):
...: C[m] = np.sum (np.square (B[m] - A), axis=1).flatten ()
...:
In [9]: C
Out[9]:
array([[ 0., 8., 32., 72., 128.],
[ 8., 0., 8., 32., 72.],
[ 32., 8., 0., 8., 32.],
[ 72., 32., 8., 0., 8.]])
这似乎以一些额外的内存为代价工作:
C = ((B[:, :, None] - A.T)**2).sum(axis=1)
测试:
import numpy
D = 10
N = 20
M = 30
A = numpy.random.rand(N, D)
B = numpy.random.rand(M, D)
C = numpy.empty((M, N))
时间:
for m in range(M):
C[m] = numpy.sum((B[m, :] - A)**2, axis=1)
每个循环 514 µs ± 13.7 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)
C2 = ((B[:, :, None] - A.T)**2).sum(axis=1)
每个循环 53.6 µs ± 529 ns(7 次运行的平均值 ± 标准偏差,每次 10000 次循环)
基本上,我有两个矩阵A和B,我想要C(矩阵旁边标记的维度),计算如下:
下面的公式是我现在做的。我利用了一些广播,但我仍然有一个循环。我对 Python 很陌生所以也许我错了,但我有一种预感可以消除这个循环。谁能分享一些想法?
编辑:2018-04-27 09:48:28 根据要求,例如:
In [5]: A
Out[5]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [6]: B
Out[6]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
In [7]: C = np.zeros ((B.shape[0], A.shape[0]))
In [8]: for m in range (B.shape[0]):
...: C[m] = np.sum (np.square (B[m] - A), axis=1).flatten ()
...:
In [9]: C
Out[9]:
array([[ 0., 8., 32., 72., 128.],
[ 8., 0., 8., 32., 72.],
[ 32., 8., 0., 8., 32.],
[ 72., 32., 8., 0., 8.]])
这似乎以一些额外的内存为代价工作:
C = ((B[:, :, None] - A.T)**2).sum(axis=1)
测试:
import numpy
D = 10
N = 20
M = 30
A = numpy.random.rand(N, D)
B = numpy.random.rand(M, D)
C = numpy.empty((M, N))
时间:
for m in range(M):
C[m] = numpy.sum((B[m, :] - A)**2, axis=1)
每个循环 514 µs ± 13.7 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)
C2 = ((B[:, :, None] - A.T)**2).sum(axis=1)
每个循环 53.6 µs ± 529 ns(7 次运行的平均值 ± 标准偏差,每次 10000 次循环)