0

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

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

过滤器现在似乎可以像步幅设置为大小一样工作 // 2. 如何调整代码以使过滤器的步幅不是大小的一半?

4

1 回答 1

1

你似乎误解了uniform_filter正在做的事情。

在这种情况下,它会创建一个数组,用以为中心的大小块的平均值b替换 every 。所以,像:a[i]10a[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之前的数据只是之后数据的反映。最后也是如此。

另请注意,b使用与 相同的类型a。在ais 为整数类型的示例中,平均值也会以整数计算,这可能会导致一些精度损失。

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

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()

示例图

于 2020-09-02T12:18:11.647 回答