首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在scipy中用均匀滤波器设置不同的步长?

如何在scipy中用均匀滤波器设置不同的步长?
EN

Stack Overflow用户
提问于 2020-09-01 21:12:07
回答 1查看 182关注 0票数 0

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

代码语言:javascript
运行
复制
from scipy.ndimage.filters import uniform_filter
a = np.arange(1000)
b = uniform_filter(a, size=10)

滤镜现在的工作方式就好像一个步幅被设置为// 2。如何调整代码使滤镜的步幅不是大小的一半?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-02 20:18:12

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

在本例中,它创建了一个数组b,将每个a[i]替换为以a[i]为中心的大小为10的块的平均值。所以,就像这样:

代码语言:javascript
运行
复制
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之前的数据只是位置0之后的数据的反映。在最后也是如此。

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

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

代码语言:javascript
运行
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63688390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档