你可以用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