假設我有一個資料集
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
我正在嘗試撰寫一個 for 回圈,它將對資料集中的第三個和第四個數字求和,然后減去資料集中第一個和第二個數字的總和,然后移動到下一組四個(因此對第四個和第五個數字求和,然后從中減去第二個和第三個的總和),直到它到達最后一個數字,前面還有其他三個數字。問題是,我不知道如何做這兩件事。這是我所擁有的:
for n in a:
runsum = ((a[3] a[2]) - (a[0] a[1])) ... ((a[15] a[14]) - (a[13] a[12]))
print(runsum)
顯然,“...”不是我讓 for 回圈知道它應該向下移動資料集的方式,但我不確定如何使用它作為占位符。任何建議將不勝感激。
uj5u.com熱心網友回復:
我認為這就是你想要的:
[(w z)-(x y) for x,y,z,w in (a[i:i 4] for i in range(0,len(a),4))]
其中評估為 [4, 4, 4, 4]
uj5u.com熱心網友回復:
每 4 個位置回圈一次:
for i in range(0,len(a),4):
print((a[i 3] a[i 2])-(a[i] a[i 1]))
uj5u.com熱心網友回復:
這個問題的直接答案是使用for回圈并對所有必需的索引求和:
s = 0
for i in range(0, len(a) - 3):
s = a[i 2] a[i 3] - a[i] - a[i 1]
或者,作為理解:
sum(a[i 2] a[i 3] - a[i] - a[i 1] for i in range(0, len(a) - 3))
但是,如果您考慮在總和中添加和洗掉的元素,您會注意到大多數元素不參與結果,因為它們被添加和洗掉的次數相同。
例如,對于 [0..15] 范圍內的索引,這里是添加的索引:
[2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15]
減去這些指數:
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13]
可以看到中間有重疊,開頭和結尾有些不同。
你可以利用這一點,只總結這個差異:
s = -sum(a[:3]) - a[1] sum(a[-3:]) a[-2]
這將添加最后三個元素(最后兩個元素之前的元素),并減去前三個元素(第二個元素兩次)。這產生與 for 回圈相同的結果。
uj5u.com熱心網友回復:
嘗試這個:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
fragments = [a[i:i 4] for i in range(0, len(a), 4)]
result = sum([(f[2] f[1]) - (f[0] f[1]) for f in fragments])
print(result)
# 8
uj5u.com熱心網友回復:
a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
sum = 0
for i in range(1,int(len(a)/4) 1 ):
sum = sum ((a[i*4 -1] a[i*4 -2]) - (a[i*4 -4] a[i*4 -3]))
uj5u.com熱心網友回復:
您可以使用 sum 函式和步進下標 4:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
r = sum(a[2::4]) sum(a[3::4]) - sum(a[::4]) - sum(a[1::4])
print(r) #16
每個下標選取以下索引:
Indexes: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
Values: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
a[2::4) 3 7 11 15 sum=36
a[3::4] 4 8 12 16 sum=40 = 76
a[::4] 1 5 9 13 sum=28
a[1::4] 2 6 10 14 sum=32 - 60
----
16
或者,您可以從總和中減去負數的 2 倍
r = sum(a) - 2*( sum(a[::4]) sum(a[1::4]) )
另一種方法是從理解中添加,其中您對每組 4 的第 1/2 次取負值
r = sum((x,-x)[i%4<2] for i,x in enumerate(a))
uj5u.com熱心網友回復:
與麻木:
import numpy as np
# some sample data
np.random.seed(0)
a = np.random.randint(0, 10, 16)
print(a)
它給:
[5 0 3 3 7 9 3 5 2 4 7 6 8 8 1 6]
然后計算連續數之和之間的差:
out = a[2:-1] a[3:] - a[:-3] - a[1:-2]
print(out)
結果:
[ 1 7 10 2 -8 -5 -2 4 7 3 3 -5 -9]
或者,這給出了相同的結果:
out = np.convolve([1, 1, -1, -1], a, 'valid')
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348123.html
