Extragerea valorilor originale din valorile sumelor cumulate (Revizuirea codului, Python, Începător, Analiză Comparativă)

aamir23 a intrebat.

Scriam o funcție în python pentru a extrage valorile originale, având în vedere o listă care conține valorile sumelor cumulate. De exemplu –

Given : cumulative_sum = [1, 3, 6, 10, 15, 21, 28, 36, 45]
Output : [1, 2, 3, 4, 5, 6, 7, 8, 9]

Am venit cu două funcții A & B și sunt în căutarea de feedback cu privire la ele, în special folosind xrange() vs enumerate().

import numpy as np
cumulative = np.cumsum(range(1,10))

def A(cumulative):
    output = [0] * len(cumulative)
    for i in xrange(len(cumulative)-1):
        output[-(i+1)] = cumulative[-(i+1)] - cumulative[-(i+2)]
    output[0] = cumulative[0]
return output

def B(cumulative):
    output = [0] * len(cumulative)
    for i,e in reversed(list(enumerate(cumulative))):
        output[i]=cumulative[i] - cumulative[i-1]
    output[0]=cumulative[0]
return output

2 răspunsuri
Barry

Ambele nu sunt grozave. B este foarte complicat, ceea ce nu este necesar. A are această negație suplimentară:

output[-(i+1)] = cumulative[-(i+1)] - cumulative[-(i+2)]

Puteai să folosești doar indici pozitivi (de ce să iterezi înapoi oricum?):

output[i+1] = cumulative[i+1] - cumulative[i]

Cred că un astfel de lucru este cel mai bine realizat cu itertools. În special, există o funcție pairwise rețetă:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

Care se traduce direct în ceea ce vrem să facem:

def C(cumulative):
    yield cumulative[0]
    for a, b in pairwise(cumulative):
        yield b-a

Aceasta returnează un generator, în loc de o listă, dar generatoarele sunt de obicei mult mai utile oricum. Consider că această abordare face mult mai explicit ceea ce se face de fapt: se obține primul element și apoi diferența de perechi dintre celelalte elemente.

Neeratyoy Mallik

Numpy’s element-wise subtraction poate fi folosit pentru a valorifica operațiunea pairwise prin deplasarea sumei cumulative.

import numpy as np

x = np.arange(1, 10)     # desired output in OP
x_cumsum = np.cumsum(x)  # given in OP

x_cumsum_shifted = np.insert(np.delete(x_cumsum, -1), 0, 0)

_x = x_cumsum - x_cumsum_shifted  # the desired output in OP

De exemplu, dacă x_cumsum = [a, a+b, a+b+c, a+b+c+d],
și x_cumsum_shifted = [0, a, a+b, a+b+c],
prin urmare, x_cumsum - x_cumsum_shifted = [a, b, c, d].