数组中

时间:2017-02-09 09:00:40

标签: python arrays algorithm

给出以下数组:

tab = [80,12,14,5,70,9,26,30,8,12,16,15]

我想计算大小为4的所有可能序列的总和如下:

S1=80+12+14+5=111
S2=12+14+5+70 =101
S3=14+5+70+9 =98
....

我已经在python上实现了一个简短的程序来执行此操作并且效率不高:

import numpy as np


tab= np.array([80,12,14,5,70,9,26,30,8,12,16,15])
tab_size=tab.size
n=tab_size
s=0
seq_len=5
for i in range (0,n-(seq_len-1),1):
    print("index i ",i)
    for k in range(i+1,(seq_len+i),1):
            print ("index k ", k)
            tab[i]=tab[i]+tab[k]
            s=s+1
print(s)         
tab

结果如下:

array([111, 101,  98, 110, 135,  73,  76,  66,  51,  12,  16,  15])

我注意到每个元素将参与总和操作4次,这是不好的。 你有什么有效的想法吗?
我想补充一点,序列大小不固定,在这个例子中只有4。 提前谢谢

6 个答案:

答案 0 :(得分:5)

  • 计算S1后,您只需添加70并减去80即可获得S2
  • 计算S2后,您只需添加9并减去12即可获得S3
  • ...

这样,您就可以避免使用每个元素4次。

答案 1 :(得分:3)

试试这个,

print [sum(item) for item in [tab[n:n+4] for n in range(0, len(tab))] if len(item) == 4]
# Result [111, 101, 98, 110, 135, 73, 76, 66, 51]

答案 2 :(得分:2)

使用sumenumerate函数的简短解决方案:

tab = [80,12,14,5,70,9,26,30,8,12,16,15]
sums = [sum(tab[i:i+4]) for i, v in enumerate(tab) if i+4 <= len(tab)]

print(sums)

输出:

[111, 101, 98, 110, 135, 73, 76, 66, 51]

要归待的最后“4项”后续序列为8,12,16,15(给出51

答案 3 :(得分:1)

我认为你可以使用这种方法:

tab = [80,12,14,5,70,9,26,30,8,12,16,15]

for i in range(len(tab) - 3):
    summation = sum(tab[i:i+4])
    print(summation)

答案 4 :(得分:1)

另一种方法是将累积总和保持在当前指数并减去累积和4指数,

tab = [80,12,14,5,70,9,26,30,8,12,16,15]
cumulative_sum = [0]*(len(tab)+1)
ret = []
for i in xrange(len(tab)):
    cumulative_sum[i+1] = cumulative_sum[i] + tab[i]
    if i >= 3:
      ret.append(cumulative_sum[i+1] - cumulative_sum[i-3])

到位版本(没有cumulativeSum列表并将其存储在tab中),

tab = [0] + [80,12,14,5,70,9,26,30,8,12,16,15]
ret = []
for i in xrange(1, len(tab)):
    tab[i] += tab[i-1]
    if i >= 4:
      ret.append(tab[i] - tab[i-4])

它有效,因为它跟踪每个索引的累积总和。因此,对于任何索引,可以使用n找到以该索引结尾的长度cumulativeSum[index] - cumulativeSum[index-n]的序列总和

答案 5 :(得分:1)

如果你想使用numpy

A=np.array([80, 12, 14, 5, 70, 9, 26, 30, 8, 12, 16, 15])
print reduce(lambda x,y: x + [sum(y)], np.array(zip(A,A[1:],A[2:],A[3:])).tolist(),[])

输出

  

[111,101,98,110,135,73,76,66,51]