
En el análisis de señales y series temporales, una de las tareas más comunes es medir la similitud entre dos conjuntos de datos. Este proceso, conocido como correlación cruzada, es fundamental para identificar patrones recurrentes, determinar retrasos entre señales o realizar comparaciones en áreas como el procesamiento de audio, meteorología y finanzas. Sin embargo, calcular la correlación cruzada puede ser complicado, especialmente cuando se manejan grandes volúmenes de datos. Afortunadamente, en NumPy existe la función np.correlate()
con la que se simplifica esta tarea.
En esta entrada, se explicará qué es la correlación cruzada, cómo utilizar np.correlate()
para calcularla y se presentarán ejemplos prácticos que demuestran su utilidad.
Tabla de contenidos
Definición de la correlación cruzada
La correlación cruzada (también conocida como covarianza cruzada) es una medida matemática que evalúa la similitud entre dos señales o series temporales considerando un desplazamiento temporal (o lag). Permitiendo determinar si una señal y está alienada con otra x. Siendo una medida que se utiliza habitualmente para detectar patrones, analizar sincronización y estudiar relaciones temporales entre señales.
Matemáticamente, la correlación cruzada entre dos señales x e y se define como: R(\tau) = \sum_{i=0}^{n-1} x[i] \cdot y[i+\tau], donde:
- R(\tau): Representa el valor de la correlación cruzada para un desplazamiento \tau.
- \tau: Es el desplazamiento (lag) aplicado a la señal y.
- x[i]: Es el elemento i-ésimo de la señal x.
- y[i+\tau]: Es el elemento i+\tau-ésimo de la señal y, desplazado por \tau.
Un valor alto de R(\tau) indica una fuerte alineación entre las dos señales en el desplazamiento temporal (o lag) \tau.

¿Por qué es importante la correlación cruzada?
La correlación cruzada es una herramienta clave para:
- Identificar retrasos entre señales: Por ejemplo, encontrar el desfase entre señales en comunicación o radar.
- Detectar patrones recurrentes: Analizar similitudes en datos de audio, climatología o finanzas.
- Evaluar la sincronización de sistemas: Por ejemplo, en control de procesos o análisis de redes.
Calcular la correlación cruzada con np.correlate()
en NumPy
La función np.correlate()
de NumPy permite calcular fácilmente la correlación cruzada entre dos arrays, siendo un método eficiente para el análisis de señales y series temporales.
Sintaxis básica de np.correlate()
La sintaxis de la función np.correlate()
es:
np.correlate(x, y, mode='valid')
Los principales parámetros de esta función son:
x
: Primer array o señal de entrada.y
: Segundo array o señal con la que se comparará.mode
: Define cómo se calcula el tamaño del resultado. Puede tomar los siguientes valores:valid
(por defecto): Calcula la correlación cruzada considerando únicamente los valores para los que ambas señales se solapan completamente. El resultado es un array más pequeño que las señales originales.same
: Devuelve un resultado del mismo tamaño que el array más grande, centrando el cálculo de la correlación.full
: Calcula la correlación cruzada completa, incluyendo todos los desplazamientos posibles, tanto positivos como negativos. El resultado de esta opción es el array más largo posible.
Ejemplo básico de correlación cruzada
Supongamos que se desea calcular la similitud entre dos señales simples. La implementación con np.correlate()
sería:
import numpy as np # Definimos dos señales x = np.array([1, 2, 3]) y = np.array([0, 1, 0.5]) # Calculamos la correlación cruzada result = np.correlate(x, y, mode='full') print(result)
[0.5 2. 3.5 3. 0. ]
En este ejemplo, el resultado, [0.5, 2, 3.5, 3, 0]
, representa la similitud entre x y y en cada posible desplazamiento. Por ejemplo:
- El primer valor (
0.5
) corresponde al solapamiento cuando y está desplazado completamente a la derecha. - El valor central (
3.5
) indica el solapamiento máximo, donde ambas señales están perfectamente alineadas. - Los últimos valores corresponden a desplazamientos donde y se ha movido completamente hacia la izquierda.
¿Cómo seleccionar el modo adecuado?
El parámetro mode
define la cantidad de información que se desea analizar:
- Para obtener resultados compactos y precisos, con las señales solapándose completamente se debe usar
valid
. - Por otro lado, si se necesita un resultado con el mismo tamaño que la señal mayor, centrando los valores se debe usar
same
. - Finalmente, para obtener toda la información posible, incluidos los desplazamientos extremos, lo cual es útil para identificar desfases entre señales se debe recurrir a
full
.
Un enfoque que se puede utilizar para adaptar el cálculo de la correlación cruzada a las necesidades específicas de cada análisis.
Ejemplos prácticos de correlación cruzada con np.correlate()
en NumPy
A continuación, se muestran tres aplicaciones prácticas donde se calcula la correlación cruzada con np.correlate()
. Mostrando cómo esta herramienta puede ser utilizada en diferentes contextos.
Detección de retrasos entre señales
Supongamos que se dispone de registros de temperatura de dos estaciones meteorológicas y se desea determinar si existe un retraso (lag) entre ambas medidas. El código para realizar este análisis seria como el siguiente:
import numpy as np # Señales de temperatura de las estaciones station1 = np.array([15, 18, 21, 20, 19]) station2 = np.array([21, 20, 19, 15, 18]) # Calcular la correlación cruzada lag_correlation = np.correlate(station1, station2, mode='full') # Determinar el desplazamiento (lag) con mayor correlación max_lag = np.argmax(lag_correlation) - (len(station2) - 1) print(f"Desplazamiento con mayor correlación: {max_lag}")
Desplazamiento con mayor correlación: 0
En este ejemplo:
- El desplazamiento (
max_lag
) indica cuántos intervalos hay entre las señales para que estén más alineadas. - Este resultado se obtiene al identificar el lag que maximiza la correlación cruzada, lo que implica encontrar el punto donde las señales tienen la mayor similitud al desplazarse una respecto a la otra.
- Por ejemplo, si el desplazamiento es negativo, significa que la segunda señal está adelantada respecto a la primera; si es positivo, está retrasada.
Este análisis es particularmente útil en meteorología para:
- Identificar retrasos en patrones climáticos entre estaciones ubicadas en diferentes regiones.
- Analizar cómo un evento climático en una región puede influir en otra después de un cierto período de tiempo.
Para profundizar, se podría graficar la correlación cruzada para observar cómo varía la similitud con el desplazamiento:
import matplotlib.pyplot as plt # Ejes para el desplazamiento lags = np.arange(-len(station2) + 1, len(station1)) # Graficar la correlación cruzada plt.plot(lags, lag_correlation) plt.title("Correlación cruzada entre señales") plt.xlabel("Desplazamiento (Lag)") plt.ylabel("Correlación") plt.grid(True) plt.show()
Este gráfico proporciona una representación visual que facilita identificar el desplazamiento óptimo.

Identificación de patrones en series temporales
Supóngase ahora que se están analizando datos de ventas semanales de un producto y se desea determinar cómo estas ventas están relacionadas con una campaña publicitaria realizada durante el mismo período. En este supuesto se puede usar la correlación cruzada para identificar patrones y evaluar si existe una respuesta significativa a la campaña en momentos específicos.
import numpy as np # Ventas semanales y datos de la campaña publicitaria sales = np.array([100, 200, 300, 400, 500]) # Ventas semanales ad_campaign = np.array([0, 1, 0.5, 0, 1]) # Intensidad de la campaña # Calcular la correlación cruzada pattern_correlation = np.correlate(sales, ad_campaign, mode='same') print("Correlación con campaña publicitaria:", pattern_correlation)
Correlación con campaña publicitaria: [350. 600. 850. 500. 650.]
El resultado de la correlación cruzada indica cómo las ventas responden a la campaña en diferentes intervalos temporales:
- Los valores positivos altos sugieren una fuerte relación entre las ventas y la campaña en un desplazamiento específico.
- Si la correlación máxima ocurre en un desplazamiento negativo, indica que las ventas reaccionaron antes de la campaña, posiblemente debido a expectativas generadas por publicidad previa.
- Si ocurre en un desplazamiento positivo, sugiere que la respuesta a la campaña fue posterior, reflejando un retraso en el impacto.
Este tipo de análisis es útil en diversos contextos:
- Marketing: Para determinar el momento más efectivo para lanzar promociones en relación con las campañas.
- Economía: Analizar cómo las políticas económicas afectan ciertos indicadores financieros.
- Comercio: Evaluar cómo las ofertas o eventos promocionales influyen en el comportamiento del consumidor.
Visualización para un análisis más claro
Se pueden graficar los resultados de la correlación cruzada para identificar más fácilmente el momento de mayor impacto:
import matplotlib.pyplot as plt # Generar los desplazamientos (lags) lags = np.arange(-(len(ad_campaign)//2), len(ad_campaign)//2 + 1) # Graficar la correlación cruzada plt.stem(lags, pattern_correlation, use_line_collection=True) plt.title("Correlación cruzada: Ventas y campaña publicitaria") plt.xlabel("Desplazamiento (Lag)") plt.ylabel("Correlación") plt.grid(True) plt.show()
El gráfico mostrará los valores de correlación en función del desplazamiento. El desplazamiento con el valor más alto representa el intervalo óptimo en el que las ventas están más alineadas con la intensidad de la campaña.
Esta herramienta no solo identifica patrones, sino que también ayuda a tomar decisiones informadas, cómo ajustar el cronograma de futuras campañas o analizar la efectividad de estrategias pasadas.

Procesamiento de señales de audio
En el procesamiento de audio, la correlación cruzada es una técnica esencial para detectar similitudes entre fragmentos de sonido. Esto es útil en aplicaciones como la identificación de ecos, el análisis de ruido recurrente, y la detección de retrasos entre señales (por ejemplo, en sistemas de audio multicanal).
Supongamos que se dispone de dos señales de audio, y se quiere medir cuán similares son en función del tiempo:
import numpy as np # Señales de audio signal1 = np.sin(np.linspace(0, np.pi, 100)) # Primera señal (onda sinusoidal) signal2 = np.sin(np.linspace(0, np.pi, 100) + np.pi/4) # Segunda señal desplazada en fase # Calcular la correlación cruzada audio_correlation = np.correlate(signal1, signal2, mode='full') # Obtener el desplazamiento con máxima correlación lags = np.arange(-(len(signal1)-1), len(signal1)) max_lag = lags[np.argmax(audio_correlation)] print(f"Desplazamiento con máxima correlación: {max_lag}")
Desplazamiento con máxima correlación: 20
El resultado se puede interpretar como:
- Desplazamiento con máxima correlación: Indica cuánto se deben ajustar las señales en el tiempo para que estén alineadas.
- Valores altos de correlación: Sugieren que las señales son similares en ese desplazamiento. En este ejemplo, un valor alto podría indicar que el segundo fragmento es una versión retrasada o adelantada de la primera.
Este tipo de análisis es de gran utilidad en diferentes contextos como:
- Eliminación de ecos: Determinar el tiempo de retardo para eliminar ecos en grabaciones.
- Análisis de ruido: Detectar patrones repetitivos de ruido para filtrarlos eficientemente.
- Sincronización de señales: Alinear canales de audio en sistemas multicanal o aplicaciones de mezcla de sonido.
Visualización para un análisis más claro
Para comprender mejor los resultados, se puede graficar la correlación cruzada y destacar el desplazamiento con máxima similitud:
import matplotlib.pyplot as plt # Graficar la correlación cruzada plt.plot(lags, audio_correlation) plt.axvline(x=max_lag, color='red', linestyle='--', label=f"Máxima correlación (lag={max_lag})") plt.title("Correlación cruzada entre señales de audio") plt.xlabel("Desplazamiento (Lag)") plt.ylabel("Correlación") plt.legend() plt.grid(True) plt.show()
El gráfico mostrará una curva con picos, donde el pico más alto representa el desplazamiento óptimo. En este ejemplo, si el máximo ocurre en un lag negativo, significa que la segunda señal está adelantada respecto a la primera. Si es positivo, indica un retraso.

Reflexión final
Estos ejemplos muestran cómo np.correlate()
se puede aplicar en distintos campos, desde meteorología hasta marketing y procesamiento de audio, siendo una herramienta importante para analizar similitudes y relaciones entre señales.
Consejos y consideraciones
Antes de calcular la correlación cruzada con NumPy, es importante tener en cuenta los siguientes aspectos clave para obtener resultados más precisos y útiles:
- Normalización de señales
La normalización es crucial para hacer que los resultados sean más interpretables, especialmente cuando las señales tienen diferentes escalas o unidades. Normalizar ajusta los datos a una media de 0 y una desviación estándar de 1:
# Normalización de señales x_norm = (x - np.mean(x)) / np.std(x) y_norm = (y - np.mean(y)) / np.std(y) # Cálculo de correlación cruzada normalizada correlation = np.correlate(x_norm, y_norm, mode='full')
Por qué es importante: Esto garantiza que los picos en la correlación sean debidos únicamente a la similitud entre las señales, y no a diferencias en magnitudes absolutas.
- Eficiencia en señales grandes
Para señales de gran tamaño, considera usar herramientas optimizadas comoscipy.signal.correlate
, que pueden manejar cálculos de correlación cruzada de manera más eficiente:
from scipy.signal import correlate # Correlación cruzada optimizada optimized_correlation = correlate(x, y, mode='full')
Cuándo usarlo: Si estás trabajando con señales extensas o realizando múltiples cálculos, esta alternativa puede reducir significativamente los tiempos de procesamiento.
- Visualización para análisis detallado
Graficar la correlación cruzada es fundamental para identificar fácilmente patrones, picos de similitud y desplazamientos (lags) entre señales:
import matplotlib.pyplot as plt plt.plot(correlation) plt.title("Correlación cruzada entre señales") plt.xlabel("Desplazamiento (Lag)") plt.ylabel("Correlación") plt.grid(True) plt.show()
Beneficio: Una visualización clara puede revelar relaciones ocultas entre señales, como retrasos o periodicidad.
Conclusiones
La correlación cruzada es una herramienta importante para analizar similitudes y relaciones temporales entre señales. Usar np.correlate()
facilita este cálculo de manera eficiente y directa, mientras que su combinación con técnicas de normalización, optimización y visualización mejora la precisión y la comprensión de los resultados.
Entre las aplicaciones de la correlación cruzada se puede destacar:
- Procesamiento de señales: Identificación de retrasos, ecos o ruido recurrente.
- Análisis financiero: Comparación de series temporales como precios de activos o indicadores económicos.
- Ciencia de datos: Detección de patrones o relaciones ocultas en grandes conjuntos de datos.
Deja una respuesta