2011-01-29 11 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 

I lavori di codice di cui sopra ma ci deve essere almeno un modo facile Pythonesque per fare questo senza dover utilizzare un ciclo. Eventuali suggerimenti?differenze di primo ordine lungo un asse determinato in NumPy matrice

+0

non è 'y == [1, ..., 1]'? :) – Elalfer

+1

@Elalfer Penso che stia usando semplicemente 'arange()' come esempio. –

risposta

5

Sì, questo è esattamente il tipo di operazioni di comando loop numpy elementwise. Hai solo bisogno di imparare a prendere le giuste fette degli array.

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:])] 

Se è necessario accedere al indice di un elemento, mentre loop su di esso, enumerate() è il modo Pythonic. Inoltre, una comprensione delle liste è, in questo caso, più leggibile.

Inoltre, non utilizzare mai le importazioni selvagge (from numpy import *). Importerà sempre più del necessario e causerà inutili ambiguità. Piuttosto, solo import numpy o importa ciò che ti serve, ad es.

from numpy import arange, zeros 
8

Che dire:

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

diversi comandi incorporati numpy farà il lavoro - in particolare, diff, ediff1d, e gradiente.

Sospetto ediff1d è la scelta migliore per il getto specifico descritto nel PO - differenza degli altri due, ediff1d è acdtually diretta/limitata a questo specifico caso d'uso - differenze esempio, del primo ordine lungo un singolo asse (o asse di una matrice 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

Ecco un modello che ho usato un sacco per un po ':

from itertools import izip

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

Problemi correlati