Python - взаимная корреляция двух сигналов с NaN внутри

1

Я получил два сигнала S1 и S2 (два массива значений), и я хотел бы знать, является ли S1 тем же сигналом, что и S2, но сдвинут (графическое представление будет одинаковым для S1 и S2, но S1 будет перемещено вправо или оставил)

Проблема заключается в следующем: My scipy.interpolate.interp1d содержит интерполяцию scipy.interpolate.interp1d, и эта функция scipy.interpolate.interp1d значения NaN в массивы.

Когда я пытаюсь соотнести S1 и S2 с NaN внутри, корреляционная матрица всегда [NaN, NaN, NaN,..., NaN, NaN, NaN]

Моя цель: 1) Обнаружить, если S1 и S2 - один и тот же сигнал (если корреляция выше определенного порога, я буду считать, что они являются одним и тем же сигналом). 2) Если есть, обнаружите смещение между ними, вы сможете удалить его

Чтобы проиллюстрировать мой алгоритм, я создал простой код

import numpy as np
from scipy.signal import correlate

norm = np.linalg.norm

x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])

corr = correlate(x, y)

print(corr/(norm(x)*norm(y)))

Здесь корреляционная функция - scipy.signal.correlate но я пробовал с np.correlate тоже, и я получил те же результаты

Из сообщения stackoverflow я пробовал так:

x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])

normx = norm(x[~np.isnan(x)])
normy = norm(y[~np.isnan(y)])

maskx = np.ma.array(x, mask=np.isnan(x))
masky = np.ma.array(y, mask=np.isnan(y))

corr = correlate(maskx, masky)

Но у меня все еще есть значения NaN.

Есть ли что-то, что я делаю неправильно?

  • 0
    дайте мне знать, если мой ответ поможет
Теги:
numpy
math
scipy

1 ответ

0

Если какой-либо из сигналов содержит NaN, то retusrn будет все NaN.


Используйте это, чтобы сначала удалить nans, а затем использовать функцию корреляции:

x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])

x = x[~np.isnan(x)]
y = y[~np.isnan(y)]

corr = np.corrcoef(x, y)

#corrcoef returns the normalised covariance matrix so you want the [1,0] or [0,1] element of this matrix
print(corr[1,0])
#1.0
  • 0
    Спасибо за ваш ответ, я пытаюсь выяснить, что возвращает np.corrcoef и почему я предпочитаю эту функцию больше, чем np.correlate, вы можете объяснить немного?
  • 0
    numpy.correlate - это numpy.correlate корреляция двух одномерных последовательностей. С другой стороны, numpy.corrcoef возвращает коэффициенты корреляции Пирсона и момента произведения. Вы можете использовать любое измерение, которое вы хотите. В своем ответе я просто продемонстрировал, как избавиться от NaNs

Ещё вопросы

Сообщество Overcoder
Наверх
Меню