我正在尝试在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) 任何人都可以推荐一种方法在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)
有谁能建议这样做的方法?
使用数据框:
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) 我有一个(长)列表,其中0和1随机出现:
list_a = [1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
我想得到list_b
如果出现0,则在列表中保留0
list_b = [1, 2, 3, 0, 1, 2, 0, 1, 0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)我可以按如下方式实现:
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) 我有
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) 我想计算给定列中的运行总和(当然不使用循环).需要注意的是,我有另一列指定何时将运行总和重置为该行中存在的值.最佳解释如下:
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 是我想要计算的值.
在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) 如果我有一个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) 如果我有z = cumsum( [ 0, 1, 2, 6, 9 ] ),这给了我z = [ 0, 1, 3, 9, 18 ],我怎么能回到原来的阵列[ 0, 1, 2, 6, 9 ]?
我有一个数据框,数据框已按需要排序,但现在我想在组中"切片".
此组的最大累计值应为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)
所以我遇到了两个问题
对于第一部分,我尝试了group_by和cumsum的一些组合而没有运气
df1 <- …Run Code Online (Sandbox Code Playgroud)