2016-07-29 20 views

Odpowiedz

14
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.)

+0

I nie sądzę, że to działa, dostaję komunikat o błędzie: AttributeError: „lista” obiekt nie ma atrybutu „kopia” – Pedro

+0

@Pedro: To dlatego, że używasz listy zamiast tablicy. Pomimo notacji pytania, 'np.cumsum' zwraca tablicę. – user2357112

+0

Tak, to było to! – Pedro

5

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) 
1

Mój ulubiony:

orig = np.r_[z[0], np.diff(z)] 
1

Jeśli chcesz zachować z, można użyć np.ediff1d:

x = np.ediff1d(z, to_begin=z[0])