【发布时间】:2023-04-01 08:40:01
【问题描述】:
假设一个数组a.shape == (N, M) 和一个向量v.shape == (N,)。目标是从a 的每个元素 中减去abs 的abs 和v 的argmin - 也就是说,
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 有一个vectorized implementation,它更快,但占用O(M*N^2) 内存,在实践中是不可接受的。计算仍然在 CPU 上完成,所以最好的办法似乎是在 C 中实现 for 循环作为扩展,但也许 Numpy 已经实现了这个逻辑。
是吗?是否有任何可用的 Numpy 函数有效地实现上述?
【问题讨论】:
-
@Gulzar for 循环是,但我的矢量化实现复制了
aN次,为v中的每个元素复制一个副本。添加它以供参考。 -
如果
v中有两个候选人与a[i,j]等距怎么办。如果我们选择一个而不是另一个有关系吗? -
@Divakar 不,随便选一个。如果你打算实现这个,我怀疑你可以用 Python 管理一些东西,除非 Numpy 公开了 C 工具;我可以(如果在此处找不到任何内容,最终会)在 C 或 C++ 中打开一个关于此的代码审查问题。
-
@Divakar 好吧,200k 代表 - 我可能会大吃一惊。
-
是的,这是你的惊喜 - stackoverflow.com/a/64526158。
标签: python python-3.x performance numpy for-loop