Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy的加窗互相关_Python_Python 3.x_Numpy_Statistics_Cross Correlation - Fatal编程技术网

Python 使用numpy的加窗互相关

Python 使用numpy的加窗互相关,python,python-3.x,numpy,statistics,cross-correlation,Python,Python 3.x,Numpy,Statistics,Cross Correlation,我有两个数据系列,它们之间有轻微的偏移。两者都包含需要尊重的nan值。因此,我想自动对齐它们。我的想法是使用互相关和numpy数组来解决这个问题。下面的代码非常慢,我想加快速度,但作为一名非python专家,我看不到任何改进的可能性 这个想法是要有一个基线和目标阵列。代码以窗口方式计算每个目标位置相对于基线的偏移量。对于每个窗口,计算数据点必须移动多少才能实现最佳对齐。第一个可以对齐的点位于window\u size//2,最后一个位于basline.size-window\u size//2

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

这个想法是要有一个基线和目标阵列。代码以窗口方式计算每个目标位置相对于基线的偏移量。对于每个窗口,计算数据点必须移动多少才能实现最佳对齐。第一个可以对齐的点位于
window\u size//2
,最后一个位于
basline.size-window\u 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,2)[:,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'])

我建议大家看看快速卷积方法。使用卷积定理,对于任何卷积运算,我建议使用
np.lib.stride\u技巧.as\u stride
来获得窗口,可以加快互相关速度。如果你有最新的numpy版本,你甚至可以使用
np.lib.stride\u tricks.slide\u window\u view
@Kevin我已经在使用
slide\u window\u view