你可以用numpy向量化整個事物。我已經建立的該隨機數據集(近似)12000個索引0和199999999,和隨機浮點數的0和1之間在同樣長的列表之間:
indices = np.unique(np.random.randint(2e8,size=(12000,)))
values = np.random.rand(len(indices))
然後我構建總窗口大小2*win+1
的索引數組圍繞每個indices
,以及多少有助於通過該點的移動平均的對應陣列的:
win = 10
avg_idx = np.arange(-win, win+1) + indices[:, None]
avg_val = np.tile(values[:, None]/(2*win+1), (1, 2*win+1))
所有剩下是搞清楚重複指數和增加的貢獻的移動平均值一起:
unique_idx, _ = np.unique(avg_idx, return_inverse=True)
mov_avg = np.bincount(_, weights=avg_val.ravel())
您現在可以得到指數在其中,例如列表移動平均超過0.5時,如:
unique_idx[mov_avg > 0.5]
至於性能,第一次打開上述代碼到一個函數:
def sparse_mov_avg(idx, val, win):
avg_idx = np.arange(-win, win+1) + idx[:, None]
avg_val = np.tile(val[:, None]/(2*win+1), (1, 2*win+1))
unique_idx, _ = np.unique(avg_idx, return_inverse=True)
mov_avg = np.bincount(_, weights=avg_val.ravel())
return unique_idx, mov_avg
這裏有一些定時幾個窗口大小,對所描述的測試數據在開始處:
In [2]: %timeit sparse_mov_avg(indices, values, 10)
10 loops, best of 3: 33.7 ms per loop
In [3]: %timeit sparse_mov_avg(indices, values, 100)
1 loops, best of 3: 378 ms per loop
In [4]: %timeit sparse_mov_avg(indices, values, 1000)
1 loops, best of 3: 4.33 s per loop
也許將數據轉換爲可用程序可以理解的格式會更有意義。數據轉換最可能比複雜分析和結果可視化更容易實現。 – Wilbert 2013-05-02 08:44:03