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

How does maximum_filter1d work in scipy? How does cval, origin, mode parameter affect it?

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

文档中给出的例子是,

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

我对该函数的理解是,它在 window 大小为 k 的元素上执行滑动 window [对于给定的示例,它是 3]

这意味着,

1st window = max[2,8,0] => 8

第二个 window = 最大[8,0,4] => 8

3th window = max[0,4,1] => 4

4th window = max[4,1,9] => 9

5th window = max[1,9,9] => 9

第 6 window = 最大值[9,9,0] => 9

7th window = max[9,0,1] => 9

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

总结问题,

如果可能,请举例说明!

提前致谢!

祝你有愉快的一天!

边界条件

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

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

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

1st window = max[0,1,0] => 1

同样,这种反射对最后一个 window 也有效。在这种情况下,

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

剩下的windows你已经知道了,它是如何工作的。

原始条件

我们举同样的例子。我们知道 origin 的默认值为 0,结果与之前相同:

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

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

让我们以 origin=-1 案例的新输入数组(为清楚起见进行了更改)的示例来看一下。

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

在这种情况下,边界反映为input_arr[1] = 0。即,array([0,2]) 反映到 array([2,0])。因此,2 在第一个 window.

之前

1st window = max[2,1,0] => 2 for window center在 input_arr[0] = 1

2nd window = max[0,2,6] => 6 for window center在 input_arr[1] = 0

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

对于origin=1

也可以想到类似的逻辑

剩余

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

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

建议

自己尝试不同场景下的不同案例,进一步巩固这个概念。我尽我所能解释。我想当你自己尝试更多案例并玩弄价值观时,你会学到更多。