使用 numpy 的窗口互相关

问题描述

我有两个数据系列,它们彼此略微偏移。两者都包含需要尊重的 nan 值。因此我想自动对齐它们。我的想法是使用互相关和numpy数组来解决问题。下面的代码非常慢,我想加快速度,但作为非 Python 专家,我看不到任何改进的可能性。

这个想法是有一个基线和目标数组。该代码以窗口方式计算每个目标位置相对于基线的偏移量。对于每个窗口,计算数据点必须移动多少才能实现最佳对齐。可以对齐的第一个点在 window_size//2,最后一个basline.size-window_size//2

window_size = 50
N = 100
randN = 10

baseline = np.random.rand(N,)
target = np.random.rand(N,)

mask=np.zeros(N,dtype=bool)
mask[:randN] = True
np.random.shuffle(mask)
baseline[mask] = np.nan
np.random.shuffle(mask)
target[mask] = np.nan

stacked = np.column_stack((baseline,target))
stacked_windows = sliding_window_view(stacked,(window_size,2))

offset_np = np.zeros([stacked.shape[0],])
offset_np[:] = np.nan

for idx in range(stacked_windows.shape[0]):
  window = stacked_windows[idx]
  baseline_window_np = window.reshape(window_size,2)[:,0]
  target_window_np = window.reshape(window_size,1]
  #
  baseline_window_masked = ma.masked_invalid(baseline_window_np) 
  target_window_masked = ma.masked_invalid(target_window_np) 
  #
  cc_np = np.empty([window_size + 1,],dtype=np.float32)
  cc_np = np.zeros([window_size,])
  cc_np[:] = np.nan
  for lag in range(-int(window_size//2),int(window_size//2)):
    masked_tmp = ma.masked_invalid(shift_numpy(target_window_masked,lag))
    cc_np[lag+int(window_size//2)] = ma.corrcoef(baseline_window_masked,masked_tmp)[0,1]
  if not np.isnan(cc_np).all():
    offset_np[window_size//2+idx] = np.floor(window_size//2)-np.argmax(cc_np)
    
result_np = np.column_stack((stacked,offset_np))
result_df = df = pd.DataFrame(result_np,columns = ['baseline','target','offset'])

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)