是否可以向量化/优化以下循环?
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
可以做什么?
答案 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
加速!