Dada una lista de números, ¿cómo se encuentran las diferencias entre cada ( i
) -ésimo elemento y su ( i+1
) -ésimo?
¿Es mejor usar una lambda
expresión o quizás una lista de comprensión?
Por ejemplo:
Dada una lista t=[1,3,6,...]
, el objetivo es encontrar una lista v=[2,3,...]
porque 3-1=2
, 6-3=3
, etc.
[abs(j-i) for i,j in zip(t, t[1:])]
list(itertools.starmap(operator.sub, zip(t[1:], t)))
(después de importaritertools
yoperator
).list(map(operator.sub, t[1:], t[:-1]))
servirá.Las otras respuestas son correctas, pero si está haciendo un trabajo numérico, es posible que desee considerar numpy. Usando numpy, la respuesta es:
fuente
np.diff([2,4,9])
sería[2,5]
zip
versión?Si no desea utilizar
numpy
nizip
, puede utilizar la siguiente solución:fuente
Puede usar
itertools.tee
yzip
para generar el resultado de manera eficiente:O usando en su
itertools.islice
lugar:También puede evitar usar el
itertools
módulo:Todas estas soluciones funcionan en un espacio constante si no necesita almacenar todos los resultados y admitir iterables infinitos.
A continuación, se muestran algunos microevaluaciones de las soluciones:
Y las otras soluciones propuestas:
Tenga en cuenta que:
zip(L[1:], L)
es equivalente azip(L[1:], L[:-1])
ya quezip
ya termina en la entrada más corta, sin embargo, evita una copia completa deL
.numpy.diff
es lento porque primero tiene que convertir el archivolist
andarray
. Obviamente, si comienzas con unndarray
será mucho más rápido:fuente
islice(seq, 1, None)
lugar deislice(seq, 1, len(seq))
hacerlo funcionar con iterables infinitosUsando el
:=
operador de morsa disponible en Python 3.8+:fuente
Sugeriría usar
esto es simple y fácil de leer.
Pero si quieres
v
tener la misma longitud quet
entonceso
FYI: esto solo funcionará para listas.
para matrices numpy
fuente
Un enfoque funcional:
Usando generador:
Usando índices:
fuente
Okay. Creo que encontré la solución adecuada:
fuente
Solución con límites periódicos
A veces, con la integración numérica, querrá diferenciar una lista con condiciones de contorno periódicas (por lo que el primer elemento calcula la diferencia con el último. En este caso, la función numpy.roll es útil:
Soluciones con cero antepuesto
Otra solución numpy (solo para completar) es usar
Esto funciona como numpy.diff, pero solo en un vector (aplana la matriz de entrada). Ofrece la posibilidad de anteponer o añadir números al vector resultante. Esto es útil cuando se manejan campos acumulados que a menudo es el caso de los flujos en las variables meteorológicas (por ejemplo, lluvia, calor latente, etc.), ya que desea una lista resultante de la misma longitud que la variable de entrada, con la primera entrada intacta.
Entonces escribirías
Por supuesto, también puede hacer esto con el comando np.diff, en este caso, aunque debe anteponer cero a la serie con la palabra clave anteponer:
Todas las soluciones anteriores devuelven un vector que tiene la misma longitud que la entrada.
fuente
Mi manera
fuente
enumerate
es un desperdicio porque no estás usandovalue
. Ver stackoverflow.com/a/16714453/832230