这是一个使用
np.bincount
处理通用元素数量的NumPy方法 -
pd.Series(np.bincount(np.arange(s1.size)//3, s1))
示例运行 -
In [42]: s1 = pd.Series([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 9, 5])
In [43]: pd.Series(np.bincount(np.arange(s1.size)//3, s1))
Out[43]:
0 3.0
1 6.0
2 9.0
3 12.0
4 14.0
dtype: float64
如果我们真的渴望性能,并且序列长度可以被窗口长度整除,我们可以使用s1.values
获取对序列的视图,然后进行reshape
,最后使用np.einsum
进行求和,代码如下 -
pd.Series(np.einsum('ij->i',s.values.reshape(-1,3)))
使用与@Nickil Maveli的帖子
相同的基准数据集进行计时 -
In [140]: s = pd.Series(np.repeat(np.arange(10**5), 3))
In [141]: %timeit pd.Series(np.add.reduceat(s.values, np.arange(0, s.shape[0], 3)))
100 loops, best of 3: 2.07 ms per loop
In [142]: %timeit pd.Series(s.values.reshape(-1,3).sum(1))
100 loops, best of 3: 2.03 ms per loop
In [143]: %timeit pd.Series(np.einsum('ij->i',s.values.reshape(-1,3)))
1000 loops, best of 3: 1.04 ms per loop
%timeit pd.Series(s.values.reshape(-1,3).sum(1))
。 - Divakarnp.einsum
确实是最快的。做得好! - Nickil Maveli