2011-01-29 19 views
10
#compute first differences of 1d array 
from numpy import * 

x = arange(10) 
y = zeros(len(x)) 

for i in range(1,len(x)): 
    y[i] = x[i] - x[i-1] 
print y 

Powyższy kod działa, ale musi istnieć co najmniej jeden łatwy, pythoneski sposób, aby to zrobić bez konieczności użycia pętli for. Jakieś sugestie?różnice pierwszego rzędu wzdłuż danej osi w tablicy NumPy

+0

nie jest 'y == [1, ..., 1]'? :) – Elalfer

+1

@Elalfer Myślę, że po prostu używa 'arange()' jako przykładu. –

Odpowiedz

5

Tak, to dokładnie ten rodzaj operacji numpy w pętli, dla której został zaprojektowany. Musisz tylko nauczyć się układać właściwe plasterki tablic.

x = numpy.arange(10) 
y = numpy.zeros(x.shape) 

y[1:] = x[1:] - x[:-1] 

print y 
1
y = [item - x[i - 1] for i, item in enumerate(x[1:])] 

Jeśli chcesz uzyskać dostęp do danej pozycji indeksu podczas zapętlenie nad nim, enumerate() jest droga pythonowy. Ponadto, zrozumienie listy jest w tym przypadku bardziej czytelne.

Co więcej, nigdy nie powinieneś używać dzikiego importu (from numpy import *). Zawsze importuje więcej niż potrzebujesz i prowadzi do niepotrzebnej dwuznaczności. Zamiast tego po prostu import numpy lub importuj to, czego potrzebujesz, np.

from numpy import arange, zeros 
8

Co o:

diff(x) 
# array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 
5

kilka builtins NumPy będzie wykonać zadanie - w szczególności diff, ediff1d i gradientu.

podejrzewam ediff1d jest lepszym wyborem dla konkretnej obsady opisanej w PO - w przeciwieństwie do dwóch pozostałych, ediff1d jest acdtually skierowany/ogranicza się do tego konkretnego przypadku użycia - różnice czyli wzdłuż pierwszego rzędu pojedyncza oś (lub oś tablicy 1D).

>>> import numpy as NP 
>>> x = NP.random.randint(1, 10, 10) 
>>> x 
    array([4, 6, 6, 8, 1, 2, 1, 1, 5, 4]) 

>>> NP.ediff1d(x) 
    array([ 2, 0, 2, -7, 1, -1, 0, 4, -1]) 
2

Oto wzór Kiedyś dużo za chwilę:

from itertools import izip

d = [a-b for a,b in izip(x[1:],x[:-1])]

Powiązane problemy