首页 > 解决方案 > 获取两个数组中相似元素的掩码并将其应用于第三个数组

问题描述

我有一组花车

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 的修改版本,使其仅包含与最接近 x1 最接近元素的 x2 值对应的元素。如果与 x1 最接近的 x2 元素为负数、零或它们的差值大于 epsilon,则 y2_mod 中的对应值也应删除。

我想这意味着对 x2 到 x1 应用某种掩码,获取它的索引,或者可能对 y2 应用相同的掩码?

标签: pythonarraysnumpy

解决方案


编辑: 我想我第一次误解了这个问题,试试这个。

要找到最接近的元素,您可以使用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

从这里您可以根据负值和 epsilon 将屏蔽条件应用于您的数组:

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]

推荐阅读