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

El código anterior funciona, pero debe haber al menos una forma sencilla y pitonesca de hacerlo sin tener que usar un ciclo for. ¿Alguna sugerencia?diferencias de primer orden a lo largo de un eje determinado en la matriz NumPy

+0

no es 'y == [1, ..., 1]'? :) – Elalfer

+1

@Elalfer Creo que solo está usando 'arange()' como ejemplo. –

Respuesta

5

Sí, este es exactamente el tipo de operaciones de numpy elementwise para las que está diseñado. Solo necesita aprender a tomar las porciones correctas de las matrices.

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

Si necesita acceder al índice de un elemento de bucle, mientras que sobre ella, enumerate() es la forma Pythonic. Además, una lista de comprensión es, en este caso, más legible.

Además, nunca debe usar importaciones salvajes (from numpy import *). Siempre importará más de lo que necesita y conduce a una ambigüedad innecesaria. Más bien, solo import numpy o importe lo que necesita, p.

from numpy import arange, zeros 
8

¿Qué hay de:

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

varios órdenes internas NumPy harán el trabajo - en particular, diff, ediff1d y gradiente.

Sospecho ediff1d es la mejor opción para el reparto específico descrito en la OP - a diferencia de los otros dos, ediff1d se dirige acdtually/limitada a este caso de uso específico - diferencias es decir, de primer orden a lo largo de un solo eje (o eje de una matriz 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

Aquí hay un patrón utilicé mucho durante un tiempo:

from itertools import izip

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

Cuestiones relacionadas