如果超过限制,则重置cumsum(python)

2024-05-19 08:11:14 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的numpy代码段将返回输入数组的cumsum,每次遇到NaN时,它都会重置。在

v = np.array([1., 1., 1., np.nan, 1., 1., 1., 1., np.nan, 1.])
n = np.isnan(v)
a = ~n
c = np.cumsum(a)
d = np.diff(np.concatenate(([0.], c[n])))
v[n] = -d
result = np.cumsum(v)

以类似的方式,如果累计数超过某个值,使用向量化熊猫或numpy操作,我如何计算一个累计值重置?在

例如,限值=5,in=[1,1,1,1,1,1,1,1,1,1,1],out=[1,2,3,4,5,1,2,3,4,5]


Tags: numpy代码段np方式diff数组resultnan
1条回答
网友
1楼 · 发布于 2024-05-19 08:11:14

如果数组中的数字都是正数,那么使用cumsum()和模运算符可能是最简单的:

>>> a = np.array([1,1,1,1,1,1,1,1,1,1])
>>> limit = 5
>>> x = a.cumsum() % limit
>>> x
array([1, 2, 3, 4, 0, 1, 2, 3, 4, 0])

然后,您可以将任何零值设置回限制,以获得所需的数组:

^{pr2}$

这里有一个使用Pandas的expanding_apply方法的通用解决方案。(我没有做过广泛的测试…)

首先定义一个修改的cumsum函数:

import pandas as pd

def cumsum_limit(x):
    q = np.sum(x[:-1])
    if q > 0:
        q = q%5
    r = x[-1]
    if q+r <= 5:
        return q+r
    elif (q+r)%5 == 0:
        return 5
    else:
        return (q+r)%5

a = np.array([1,1,1,1,1,1,1,1,1,1]) # your example array

将函数应用于数组,如下所示:

>>> pd.expanding_apply(a, lambda x: cumsum_limit(x))
array([ 1.,  2.,  3.,  4.,  5.,  1.,  2.,  3.,  4.,  5.])

以下是应用于另一个更有趣系列的函数:

>>> s = pd.Series([3, -8, 4, 5, -3, 501, 7, -100, 98, 3])
>>> pd.expanding_apply(s, lambda x: cumsum_limit(x)) 
0     3
1    -5
2    -1
3     4
4     1
5     2
6     4
7   -96
8     2
9     5
dtype: float64

相关问题 更多 >

    热门问题