Получить маску для похожих элементов в двух массивах и применить ее к третьему - PullRequest
1 голос
/ 03 апреля 2020

У меня есть массив чисел с плавающей запятой

x1 = [3418.008 3422.007 3424.007 3425.995 3428.026 3430.003 3539.979 3541.957
 3650.041 3654.06  3656.062 3658.066 3660.019 3662.024 3664.024 3666.041
 3667.985 3669.976 3672.009 3674.007 3767.969 3769.959 3771.959 3773.976
 3775.975 3777.974 3779.97  3781.993 3784.002 3785.993 3787.991 3789.998
 3791.997 3794.022 3882.009 3884.043 3886.036 3888.028 3890.007 3890.007
 3892.015 3894.018 3895.983 3897.987 3903.978]

и одного, разной длины, целых чисел

x2 = [2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 ... 3936 3937 3938 3939 3940 3941].

Они оба представляют времена, измеренные двумя разными инструментами при разной выборке тарифы. X2 также соответствует другой массив такой же длины,

y2 =[ 9.000e-04 -1.000e-03  4.000e-04 -2.000e-03  1.000e-04 -1.600e-03 ... 1.200e-03  3.100e-03 -1.000e-03  6.000e-04]

(который также содержит нули и отрицательные числа). Это представляет переменную величину, измеренную как функция времени x2.

Я хочу получить модифицированную версию y2 так, чтобы она содержала только элементы, соответствующие значениям x2, которые являются ближайшими к ближайшему элементу x1. Если ближайший к x1 элемент x2 отрицателен, равен нулю или их разность больше, чем epsilon, то соответствующее значение в y2_mod также следует удалить.

Полагаю, это означает применение некоторой маски к x2 - x1 , получить индексы для этого или, возможно, применить ту же маску к y2?

1 Ответ

1 голос
/ 03 апреля 2020

Редактировать: Я думаю, что я неправильно понял вопрос в первый раз, попробуйте это.

Чтобы найти ближайшие элементы, которые вы можете использовать np.meshgrid, чтобы перевести проблему в два измерения и получить матрицу расстояний между массивами:

xx1, xx2, = np.meshgrid(x1, x2)
dist = np.abs(xx1 - xx2)

idx = dist.argmin(axis=0)
x2_mod = x2[idx] # same shape as y2_mod
y2_mod = y2[idx] # same shape as x2_mod

Отсюда вы можете применить условия маскирования к вашим массивам на основе отрицательных значений и эпсилона:

mask = (y2_mod >= 0) & (dist.min(axis=0) < eps)

y2_mod[mask]

Из вашего последнего комментария об усреднении отрицательные значения:

# convolve your signal with an averaging kernel
kernel = [0.5, 0, 0.5]
avg = np.convolve(y2_mod, kernel, mode='same')

# apply boundary conditions (only consider one neighbor)
avg[[0, -1]] = y2_mod[[1, -2]]

# fill in the masked values
mask = y2_mod < 0
y2_mod[mask] = avg[mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...