两个矩阵的 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 次循环)