Jeśli mam z = cumsum([ 0, 1, 2, 6, 9 ])
, co daje mi z = [ 0, 1, 3, 9, 18 ]
, w jaki sposób mogę wrócić do pierwotnej tablicy [ 0, 1, 2, 6, 9 ]
?Jaka jest odwrotność funkcji numpy cumsum?
Odpowiedz
z[1:] -= z[:-1].copy()
Krótkie i słodkie, bez powolnych pętli Pythona. Widzimy wszystkie oprócz pierwszego elementu (z[1:]
) i wszystkie oprócz ostatniego (z[:-1]
) i odejmujemy elementwise. Kopia gwarantuje, że odejmujemy oryginalne wartości elementów zamiast wartości, które obliczamy. (On NumPy 1.13 and up można pominąć wezwanie copy
.)
Można użyć np.diff
obliczyć elementy 1...N
które odbędzie różnicę między dowolnymi dwoma elementami. Jest to przeciwieństwo cumsum
. Jedyna różnica polega na tym, że diff
nie zwróci pierwszego elementu, ale pierwszy element jest taki sam w oryginale i cumsum
, więc ponownie używamy tej wartości.
orig = np.insert(np.diff(z), 0, z[0])
Zamiast insert
, można również użyć np.concatenate
orig = np.concatenate((np.array(z[0]).reshape(1,), np.diff(z)))
Możemy też po prostu skopiować i zastąpić elementy 1...N
orig = z.copy()
orig[1:] = np.diff(z)
Mój ulubiony:
orig = np.r_[z[0], np.diff(z)]
Jeśli chcesz zachować z
, można użyć np.ediff1d
:
x = np.ediff1d(z, to_begin=z[0])
I nie sądzę, że to działa, dostaję komunikat o błędzie: AttributeError: „lista” obiekt nie ma atrybutu „kopia” – Pedro
@Pedro: To dlatego, że używasz listy zamiast tablicy. Pomimo notacji pytania, 'np.cumsum' zwraca tablicę. – user2357112
Tak, to było to! – Pedro