我必须在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]
答案 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))