【发布时间】:2021-11-11 19:48:58
【问题描述】:
我有以下 for 循环,它在三个相同长度的 numpy 数组上运行:
n = 100
a = np.random.random(n)
b = np.random.random(n)
c = np.random.random(n)
valid = np.empty(n)
for i in range(n):
valid[i] = np.any(a[i] > b[i:] + c[i:].cumsum())
有没有办法用一些向量化的 numpy 操作来替换这个 for 循环?
例如,因为我只关心a[i] 是否大于b[i:] 中的任何值,所以我可以执行np.minimum.accumulate(b[::-1])[::-1],它在每个索引及以后获取b 的最小值,然后将其与a 像这样:
a > np.minimum.accumulate(b[::-1])[::-1]
但我仍然需要一种将c[i:].cumsum() 向量化为单个数组计算的方法。
【问题讨论】:
-
我认为不能将 cumsum 向量化。但是你可以通过列表理解来加快速度:
valid = np.array([np.any(a[i] > b[i:] + c[i:].cumsum()) for i in range(n)]) -
@Nathan。当然可以
-
@MadPhysicist 我没有看到支持投票的答案;)
-
@Nathan。被AFK。将发布五分之一
-
@Nathan。现在发布。享受
标签: python numpy vectorization cumulative-sum minimum