maximum_filter1d 在 scipy 中如何工作? cval、origin、mode 参数如何影响它?

问题描述

文档链接 https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.maximum_filter1d.html#r4df4f294a847-2

文档中给出的示例是,

>>> maximum_filter1d([2,8,4,1,9,1],size=3)
array([8,1])

我对这个函数的理解是它在元素上执行一个滑动窗口,窗口大小为 k [对于给定的例子,它是 3]

这意味着,

一个窗口 = max[2,0] => 8

第二个窗口 = max[8,4] => 8

第三个窗口 = max[0,1] => 4

第四个窗口 = max[4,9] => 9

第 5 个窗口 = max[1,9] => 9

第 6 个窗口 = max[9,0] => 9

第 7 个窗口 = max[9,1] => 9

8th window = max[0,2] => 0 [不确定,如何在边缘上对元素进行分组,但从文档来看,它认使用 "reflect" 模式,即我不确定它是如何改变原始数组的]

总结问题,

  • origin、cval、modemaximum_filter1d 参数中是什么意思?
  • maximum_filter1d 是如何工作的?

如果可能,请提供示例说明!

提前致谢!

祝您有美好的一天!

解决方法

边界条件

让我们以这个例子来阐述边界条件:

>>> input_arr = [1,6,1,9]
>>> output_arr = maximum_filter1d(input_array,size=3)
    array([1,9,9])

您之前的解释是正确的。但是,您不确定边界。它做了一些非常简单的事情,称为“反射”。让我解释一下: 让我们假设过滤器在开始处,即过滤器窗口的中心是输入数组中的第一个元素。所以它是input_arr[0] = 1。现在我们有了左边界,这意味着 input_arr[0] 的左边没有任何东西。但是,窗口的大小为 3。因此我们在 1 的右侧有一个值,即 0。 我们称之为array([1,0])。现在沿着值 1 反映这一点是 reflected_array = array([0,1])。但是,窗口的大小为 3,因此过滤器会将其设为 array([0,0])。因此,实际上第一个过滤器窗口是

第一个窗口 = max[0,0] => 1

同样,这种反射适用于最后一个窗口。在这种情况下,

最后一个窗口 = max[1,1] => 9

您已经知道的其余窗口,它是如何工作的。

起源条件

让我们举同样的例子。我们知道 origin 的默认值是 0,结果和之前一样:

>>> input_arr = [1,size=3,origin=0)
    array([1,9])

在我们的例子中,origin 可以采用三个可能的值,因为过滤器大小是 3。origin=0 的已知默认情况如我上面解释的那样工作。其他可能的值是 origin=-1,将窗口向右移动,origin=1,将窗口向左移动。

让我们通过一个新的输入数组(为了清晰起见进行了更改)来查看 origin=-1 情况。

>>> input_arr = [1,2,origin=-1)
    array([2,9])

在这种情况下,边界用 input_arr[1] = 0 反映。即,array([0,2]) 反映到 array([2,0])。因此,2 在第一个窗口之前。

第一个窗口 = max[2,0] => 2 input_arr[0] = 1 处的窗口中心

第二个窗口 = max[0,6] => 6 input_arr[1] = 0 处的窗口中心

请注意,在第二个窗口中,输入数组的中心向右移动了 1。

对于 origin=1

可以想到类似的逻辑

剩余

cval :这只是允许您在开始之前填充值。在这种情况下它不会使用这种特殊的边界条件。您可以输入任何值,您的过滤器会将其与边界值进行比较。

mode:我们看到默认是“reflect”。您可以通过更改模式来更改此边界条件。

建议

自己针对不同的场景尝试不同的案例,以进一步巩固这个概念。我尽我最大的努力去解释。我认为当您自己尝试更多案例并玩转价值观时,您会学到更多。