【问题标题】:How can I vectorize this simple algorithm with numpy?如何用 numpy 对这个简单的算法进行矢量化?
【发布时间】:2012-11-30 21:24:59
【问题描述】:

或者像这样的真正迭代算法是不可矢量化的?

s += 使用可以用 cumsum 向量化,但总和的下限是有问题的。

是否有一些奇特的方式来使用滞后或移位?

s = 0
for (time, usage) in timeseries:
    s += usage
    s = max(s-rate, 0)
    new_timeseries[time] = s

我试探了一会儿,但什么也想不出来。

【问题讨论】:

    标签: python numpy time-series vectorization


    【解决方案1】:

    先将timeseries 放入一个数组中。假设timeseries 的值为my_array。那么,

    import numpy as np
    s = np.cumsum(my_array) - rate
    s[s < 0] = 0
    new_timeseries = s 
    

    更新:这是不对的。当s 增量低于速率时,它不考虑将cumsum 归零。您可以使用导数找到cumsum 低于速率的点:

    In [1]: dd = np.diff(np.cumsum(my_array))
    In [2]: dd < rate
    Out[3]: array([ True, False, True, False, False, True, True,  
                    True, True, False, True, False, True, False,
                    True, True, True, False, False], dtype=bool)
    

    但是,这不会“重置”cumsum。可以沿着这些索引搜索并在“Trues”块中执行cumsum,但我不确定它是否会比您的循环更有效。

    【讨论】:

    • 这似乎是不正确的。它高估了s &lt; rate sums 之后的总和。
    • @J.F.Sebastian,你说得对,我错过了那部分。甚至我最近的编辑也不对。
    • usage 总是 > 0,我应该提到。 np.diff(np.cumsum(a)) = 否?这似乎并不完整(您在回答中承认)。我以前没见过 np.diff,不过谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多