查找数组中3个连续数字的总和

时间:2017-02-26 17:58:50

标签: python arrays numpy

我必须在Python中编写一个函数,它打印出数组中3个连续数字的总和,例如,如果数组具有以下值:[10, 20, 30, 40, 50]它应该添加前3个数字{{ 1}}然后(10 + 20 + 30)然后(20 + 30 + 40)依此类推,直到50为最后一个值。

我添加所有数字的代码如下:

(30 + 40 + 50)

以下函数使用上面提到的sum_interval定义来计算3个连续数字的总和:

def sum_interval(values, start, stop):
    N = len(values)
    terms = np.zeros(N)

    for i in np.arange(start, stop + 1, 1):
        terms[i] = values[i]

        ans = np.sum(terms)

    return ans

arr = np.array([10, 20, 30, 40, 50])
print(sum_interval(arr, 2, 4))
  

预期输出:def sum_triplets(values): N = len(values) terms = np.zeros(N) for i in range(0, N, 1): terms[i] = sum_interval(values, i, N-1) return terms arr = np.array([10, 20, 30, 40, 50]) print(sum_triplets(arr))

     

我得到的输出:[60, 90, 120, 90, 50]

4 个答案:

答案 0 :(得分:6)

如果您已经在使用阵列,那么您也可以选择直接的NumPy解决方案。一种方法是使用np.convolve通过输入数组乘以所需窗口大小的数组并求和。

np.convolve(arr, np.ones(3, dtype=np.int), mode='valid')

<强>演示

>>> arr
array([10, 20, 30, 40, 50])

>>> np.convolve(arr, np.ones(3, dtype=np.int), mode='valid')
array([ 60,  90, 120])

如果您已经开始使用Python解决方案,那么您应该避免使用当前方法中的中间阵列存储 - 在这种情况下,Willem为您提供了一个很好的答案。

答案 1 :(得分:2)

我不明白为什么你这么复杂:你可以简单地使用切片

def sum_triplets(values):
    result = []
    for i in range(len(values)):
        result.append(sum(values[i:i+3]))
    return result

(为切片部分添加了粗体字)

你甚至可以用列表理解将它放在单行中:

def sum_triplets(values):
    return [sum(values[i:i+3]) for i in range(len(values))]

答案 2 :(得分:-1)

library(Unicode)

italic_i <- u_char_inspect(u_char_from_name("MATHEMATICAL ITALIC SMALL I"))["Char"]
label1 <- paste("P(", italic_i, ")=8", italic_i, sep="")
label2 <- paste("A(", italic_i, ")=1+4", italic_i, "(", italic_i, "-1)", sep="")

i <- 1:(8*365/7)
d <- data.frame(i=i,p=p(i),a=sapply(i,a))
d <- melt(d, id.vars='i')
p <- ggplot(d, aes(i, value, linetype=variable)) +
  geom_hline(yintercept=700^2) +
  geom_line() +
  scale_linetype_manual(values=c(2,1)) +
  #geom_point() +
  scale_x_continuous(breaks=(0:20)*365/7, labels=0:20) +
  #scale_y_continuous(breaks=c(0,700^2), labels=c(0,expression(L^2)))
  scale_y_sqrt() +
  #scale_y_log10() +
  annotate('text', 8*365/7, 1e3, label=label1, hjust=1, size=3) +
  annotate('text', 8*365/7, 2.5e5, label=label2, hjust=1, size=3)
print(p + theme_classic())

答案 3 :(得分:-2)

sum_triplets函数中,替换以下行:

terms[i] = sum_interval(values, i, N-1)

terms[i] = sum_interval(values, i, min(N-1,i+2))