标签: cumsum

Python中的高效求和

我正在尝试在Python中有效地计算求和的总和:

WolframAlpha能够计算出过高的 n 值:sum 的总和

我有两种方法:for循环方法和np.sum方法。我认为 np.sum 方法会更快。然而,它们在 n 很大之前都是相同的,之后 np.sum 会出现溢出错误并给出错误的结果。

我正在尝试找到计算这个总和的最快方法。

import numpy as np
import time

def summation(start,end,func):
    sum=0
    for i in range(start,end+1):
        sum+=func(i)
    return sum

def x(y):
    return y

def x2(y):
    return y**2

def mysum(y):
    return x2(y)*summation(0, y, x)

n=100

# method #1
start=time.time()
summation(0,n,mysum)
print('Slow method:',time.time()-start)

# method #2
start=time.time()
w=np.arange(0,n+1)
(w**2*np.cumsum(w)).sum()
print('Fast method:',time.time()-start)
Run Code Online (Sandbox Code Playgroud)

python performance sum cumsum

32
推荐指数
3
解决办法
5599
查看次数

在numpy数组上执行反向累积和

任何人都可以推荐一种方法在numpy数组上进行反向累积求和吗?

其中'反向累积金额'定义如下(我欢迎对此程序的名称进行任何更正):

如果

x = np.array([0,1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

然后

np.cumsum(x)
Run Code Online (Sandbox Code Playgroud)

array([0,1,3,6,10])
Run Code Online (Sandbox Code Playgroud)

但是,我想得到

array([10,10,9,7,4]
Run Code Online (Sandbox Code Playgroud)

有谁能建议这样做的方法?

python arrays numpy cumsum

31
推荐指数
3
解决办法
2万
查看次数

计算每个ID(组)内的累积总和

使用数据框:

df <- data.frame(id = rep(1:3, each = 5)
                 , hour = rep(1:5, 3)
                 , value = sample(1:15))
Run Code Online (Sandbox Code Playgroud)

我想添加一个匹配的累积和列id:

df
   id hour value csum
1   1    1     7    7
2   1    2     9   16
3   1    3    15   31
4   1    4    11   42
5   1    5    14   56
6   2    1    10   10
7   2    2     2   12
8   2    3     5   17
9   2    4     6   23
10  2    5     4   27
11  3    1     1 …
Run Code Online (Sandbox Code Playgroud)

r cumsum

30
推荐指数
4
解决办法
2万
查看次数

计算列表的累积总和,直到出现零

我有一个(长)列表,其中0和1随机出现:

list_a = [1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

我想得到list_b

我可以按如下方式实现:

list_b = []
for i, x in enumerate(list_a):
    if x == 0:
        list_b.append(x)
    else:
        sum_value = 0
        for j in list_a[i::-1]:
            if j != 0:
                sum_value += j
            else:
                break
        list_b.append(sum_value)
print(list_b)
Run Code Online (Sandbox Code Playgroud)

但实际列表的长度很长.

所以,我想改进高速代码.(如果不可读)

我改变了这样的代码:

from itertools import takewhile
list_c = [sum(takewhile(lambda x: x != 0, list_a[i::-1])) …
Run Code Online (Sandbox Code Playgroud)

python binary performance list cumsum

22
推荐指数
4
解决办法
3958
查看次数

我怎样才能在熊猫群中使用cumsum?

我有

df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']})

  id   stuff  val
0  A      12    1
1  B   23232    2
2  A      13   -3
3  C    1234    1
4  D    3235    5
5  B    3236    6
6  C  732323   -2
Run Code Online (Sandbox Code Playgroud)

我想val为每个运行一些id,所以所需的输出如下所示:

  id   stuff  val  cumsum
0  A      12    1   1
1  B   23232    2   2
2  A      13   -3   -2
3  C    1234    1   1
4  D    3235    5   5
5 …
Run Code Online (Sandbox Code Playgroud)

python group-by dataframe pandas cumsum

21
推荐指数
1
解决办法
1万
查看次数

Pandas数据帧 - 运行与重置的总和

我想计算给定列中的运行总和(当然不使用循环).需要注意的是,我有另一列指定何时将运行总和重置为该行中存在的值.最佳解释如下:

   reset  val   desired_col
0      0    1   1
1      0    5   6
2      0    4   10
3      1    2   2
4      1   -1   -1
5      0    6   5
6      0    4   9
7      1    2   2
Run Code Online (Sandbox Code Playgroud)

desired_col 是我想要计算的值.

python multiple-columns dataframe pandas cumsum

19
推荐指数
1
解决办法
5518
查看次数

NumPy/SciPy中的广义累积函数?

在numpy或scipy(或其他一些库)中是否存在将cumsum和cumprod的概念概括为任意函数的函数.例如,考虑(理论)函数

cumf( func, array) 
Run Code Online (Sandbox Code Playgroud)

func是一个接受两个浮点数的函数,并返回一个浮点数.特殊情况

lambda x,y: x+y 
Run Code Online (Sandbox Code Playgroud)

lambda x,y: x*y 
Run Code Online (Sandbox Code Playgroud)

分别是cumsum和cumprod.例如,如果

func = lambda x,prev_x: x^2*prev_x 
Run Code Online (Sandbox Code Playgroud)

我将它应用于:

cumf(func, np.array( 1, 2, 3) )
Run Code Online (Sandbox Code Playgroud)

我想要

np.array( 1, 4, 9*4 )
Run Code Online (Sandbox Code Playgroud)

python numpy scipy cumsum

18
推荐指数
2
解决办法
2214
查看次数

Cumsum在NaN重置

如果我有一个1或NaN的pandas.core.series.Series命名ts如下:

3382   NaN
3381   NaN
...
3369   NaN
3368   NaN
...
15     1
10   NaN
11     1
12     1
13     1
9    NaN
8    NaN
7    NaN
6    NaN
3    NaN
4      1
5      1
2    NaN
1    NaN
0    NaN
Run Code Online (Sandbox Code Playgroud)

我想计算这个系列的cumsum但它应该在NaN的位置重置(设置为零),如下所示:

3382   0
3381   0
...
3369   0
3368   0
...
15     1
10     0
11     1
12     2
13     3
9      0
8      0
7      0
6      0
3      0
4      1
5      2 …
Run Code Online (Sandbox Code Playgroud)

python numpy pandas cumsum

16
推荐指数
4
解决办法
5638
查看次数

numpy cumsum函数的反函数是什么?

如果我有z = cumsum( [ 0, 1, 2, 6, 9 ] ),这给了我z = [ 0, 1, 3, 9, 18 ],我怎么能回到原来的阵列[ 0, 1, 2, 6, 9 ]

python numpy cumsum

16
推荐指数
4
解决办法
3172
查看次数

有条件的cumsum与重置

我有一个数据框,数据框已按需要排序,但现在我想在组中"切片".

此组的最大累计值应为10.当累计值> 10时,它应重置累计总和并重新开始

library(dplyr)
id <- sample(1:15)
order <- 1:15
value  <- c(4, 5, 7, 3, 8, 1, 2, 5, 3, 6, 2, 6, 3, 1, 4)
df  <- data.frame(id, order, value)
df
Run Code Online (Sandbox Code Playgroud)

这是我正在寻找的输出(我是"手动"完成的)

cumsum_10  <- c(4, 9, 7, 10, 8, 9, 2, 7, 10, 6, 8, 6, 9, 10, 4)
group_10 <- c(1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7)
df1  <- data.frame(df, cumsum_10, group_10)
df1
Run Code Online (Sandbox Code Playgroud)

所以我遇到了两个问题

  1. 如何创建一个累积变量,每当它超过上限时重置(在这种情况下为10)
  2. 如何计算/分组每个组

对于第一部分,我尝试了group_by和cumsum的一些组合而没有运气

df1 <- …
Run Code Online (Sandbox Code Playgroud)

r reset cumsum dplyr

13
推荐指数
4
解决办法
1651
查看次数

标签 统计

cumsum ×10

python ×8

numpy ×4

pandas ×3

dataframe ×2

performance ×2

r ×2

arrays ×1

binary ×1

dplyr ×1

group-by ×1

list ×1

multiple-columns ×1

reset ×1

scipy ×1

sum ×1