如何在scipy中使用统一过滤器设置不同的步幅?

问题描述

我正在使用以下代码对我的数据运行统一过滤器:

from scipy.ndimage.filters import uniform_filter
a = np.arange(1000)
b = uniform_filter(a,size=10)

过滤器现在可以正常工作,就像将步幅设置为// 2一样。 如何调整代码,使过滤器的步幅不超过过滤器大小的一半?

解决方法

您似乎误解了uniform_filter在做什么。

在这种情况下,它将创建一个数组b,该数组将每个a[i]替换为以10为中心的大小为a[i]的块的平均值。因此,类似:

for i in range(0,len(a)):  # for the 1D case
   b[i] = mean(a[i-10//2:i+10//2]

请注意,这将尝试访问索引范围在0..1000之外的值。在默认情况下,uniform_filter假设位置0之前的数据只是其后数据的反映。最后也是类似的。

还要注意,ba使用相同的类型。在a是整数类型的示例中,均值也将以整数计算,这可能会导致精度降低。

下面是一些代码和图表来说明正在发生的事情:

import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage.filters import uniform_filter

fig,axes = plt.subplots(ncols=2,figsize=(15,4))

for ax in axes:
    if ax == axes[1]:
        a = np.random.uniform(-1,1,50).cumsum()
        ax.set_title('random curve')
    else:
        a = np.arange(50,dtype=float)
        ax.set_title('values from 0 to 49')
    b = uniform_filter(a,size=10)

    ax.plot(a,'b-')
    ax.plot(-np.arange(0,10)-1,a[:10],'b:') # show the reflection at the start
    ax.plot(50 + np.arange(0,10),a[:-11:-1],'b:') # show the reflection at the end
    ax.plot(b,'r-')
plt.show()

example plot