矩阵向量差的有效元素 argmin

假设一个数组a.shape == (N, M)和一个向量v.shape == (N,)。目标是计算argmin从每个元素中减去abs的- 也就是说,va


out = np.zeros(N, M)

for i in range(N):

    for j in range(M):

        out[i, j] = np.argmin(np.abs(a[i, j] - v))

我通过进行了矢量化实现np.matlib.repmat,它速度更快,但需要O(M*N^2)内存,这在实践中是不可接受的。计算仍然在 CPU 上完成,因此最好的选择似乎是在 C 中实现 for 循环作为扩展,但也许 Numpy 已经实现了这种逻辑。

可以?有任何可用的 Numpy 函数可以有效地实现上述功能吗?


临摹微笑
浏览 119回答 1
1回答

素胚勾勒不出你

受到 的启发this post,我们可以利用np.searchsorted-def find_closest(a, v):    sidx = v.argsort()    v_s = v[sidx]    idx = np.searchsorted(v_s, a)    idx[idx==len(v)] = len(v)-1    idx0 = (idx-1).clip(min=0)        m = np.abs(a-v_s[idx]) >= np.abs(v_s[idx0]-a)    m[idx==0] = 0    idx[m] -= 1    out = sidx[idx]    return out更多性能。numexpr在大型数据集上进行提升:import numexpr as nedef find_closest_v2(a, v):    sidx = v.argsort()    v_s = v[sidx]    idx = np.searchsorted(v_s, a)    idx[idx==len(v)] = len(v)-1    idx0 = (idx-1).clip(min=0)        p1 = v_s[idx]    p2 = v_s[idx0]    m = ne.evaluate('(idx!=0) & (abs(a-p1) >= abs(p2-a))', {'p1':p1, 'p2':p2, 'idx':idx})    idx[m] -= 1    out = sidx[idx]    return out时间安排设置 :N,M = 500,100000a = np.random.rand(N,M)v = np.random.rand(N)In [22]: %timeit find_closest_v2(a, v)4.35 s ± 21.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)In [23]: %timeit find_closest(a, v)4.69 s ± 173 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python