向量化和矩阵减法的优化

时间:2018-10-20 18:02:33

标签: numpy vectorization

是否可以向量化/优化以下循环?

In [33]: a = np.arange(10000 * 700).reshape([10000, 700])

In [34]: b = np.arange(1000 * 700).reshape([1000, 700])

In [35]: c = np.empty([b.shape[0], a.shape[0]])

In [36]: for i in range(b.shape[0]):
    ...:     c[i] = np.argsort(np.linalg.norm(a - b[i], axis=1))
    ...: 

编辑:

我相信以下方法应该有效:

d = np.argsort(np.linalg.norm(a[:, None] - b, axis=2), axis=1)

但是我得到MemoryError的{​​{1}}。我的方向正确吗?关于a[:, None] - b可以做什么?

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用cdist-

$ git -C software/zemke-rhyne rev-list -n 1 @
cb69287a3540054ff85cd14199cf36b4b5098c1a

pairwise_distances等效的一个-

from scipy.spatial.distance import cdist

cdist(b,a).argsort(axis=1)

给定样本数据的时间-

from sklearn.metrics import pairwise_distances

pairwise_distances(b,a).argsort(1)

In [201]: %%timeit # original solution ...: c = np.empty([b.shape[0], a.shape[0]],dtype=int) ...: for i in range(b.shape[0]): ...: c[i] = np.argsort(np.linalg.norm(a - b[i], axis=1)) 1 loop, best of 3: 40.6 s per loop In [202]: %timeit pairwise_distances(b,a).argsort(1) 1 loop, best of 3: 384 ms per loop 加速!