PyEMD:实践指南

作者:袖梨 2026-09-11

如果把PyEMD放进候选清单,不能只看热度;它的定位是经验模态分解(EMD)方法的Python实现。对日常自动化任务来说,输入边界、依赖和失败处理如果不清楚就很难稳定复用往往决定它能否落地,不能只用安装成功来判断。试跑可以从用一项范围明确的真实任务完成最小试跑开始,并把配置时间、输出质量、异常信息和维护痕迹写进验收记录。对愿意先做小范围验证并复查原始文档的团队来说,这个仓库值得继续验证;只求即装即用的人则要先看维护成本。

PyEMD

友情链接

  • 在线文档:https://pyemd.readthedocs.org
  • 问题跟踪器:https://github.com/laszukdawid/pyemd/issues
  • 源代码存储库:https://github.com/laszukdawid/pyemd

简介

经验模式的Python实现 分解(EMD)。该软件包包含多个 EMD 变体和 打算及时交付更多。

最近的变化

  • [2025-11 v1.9] 迁移到 uvnox 进行构建和测试
  • [2025-11 v1.8] 核心性能提升18% EMD

EMD 变体

  • 合奏 EMD (EEMD),
  • “完整合奏 EMD” (CEEMDAN)
  • 普通 EMD 的不同设置和配置。
  • 图像分解(EMD2D & BEMD)(实验性,不支持)
  • 即时编译EMD (JitEMD)

PyEMD 允许您对包络线、停止标准使用不同的样条线 和极值插值。

可用样条

  • 自然立方(默认
  • 点三次
  • 厄米立方
  • 秋马
  • PChip
  • 线性

可用的停止标准

  • 柯西收敛(默认
  • 固定迭代次数
  • 连续原始IMF的数量

极值检测

  • 离散极值(默认
  • 抛物线插值

安装

注意:可下载包名为 emd-signal

PyPi(推荐)

安装软件包的最快方法是通过 pip

pip install EMD-signal

或者使用 uv 你可以这样做

uv add emd-signal
#or
# uv pip install EMD-signal

通过这种方式,您可以安装在 PyPi 上托管的 PyEMD 的最新稳定版本。

康达

PyEMD(如 emd-signal)可通过 conda-forge 通道用于 Conda

conda install -c conda-forge emd-signal

来源:https://anaconda.org/conda-forge/emd-signal

从源头

如果您只想使用 EMD 及其变体,安装 PyEMD 的最佳方法是通过 pip。 但是,如果您想要最新版本的 PyEMD,无论如何您可能需要自己下载代码并构建包。 该源是公开可用的,并托管在 GitHub 上。 要下载代码,您可以转到源代码页并单击 Code -> Download ZIP,或使用 git 命令行

git clone https://github.com/laszukdawid/PyEMD

使用命令行从源安装包:

python3 -m pip install .

进入git创建的PyEM目录后。

从源代码安装 PyEMD 的更快方法是在同一命令中使用 pipgit 来完成:

python3 -m pip install git+https://github.com/laszukdawid/PyEMD.git

但请注意,这会将其安装在您当前的环境中。如果您正在处理多个项目,或与他人共享资源,我们建议使用 虚拟环境。 如果您想让安装可编辑,请使用 pip 的 -e 标志

示例

更详细的示例包含在 文档 或 在 PyEMD/examples.

EMD

在大多数情况下,默认设置就足够了。只需导入 EMD 并通过 您向实例或 emd() 方法发出的信号。

from PyEMD import EMD
import numpy as np

s = np.random.random(100)
emd = EMD()
IMFs = emd(s)

下图是根据输入生成的: $S(t) = cos(22 pi t^2) + 6t^2$

EEMD

使用 Ensemble EMD (EEMD) 的最简单情况是导入 EEMD 并 将您的信号传递给实例或 eemd() 方法。

Windows:请不要跳过 if __name__ == "__main__" 部分。

from PyEMD import EEMD
import numpy as np

if __name__ == "__main__":
    s = np.random.random(100)
    eemd = EEMD()
    eIMFs = eemd(s)

CEEMDAN

与之前的方法一样,还有一种使用 CEEMDAN 的简单方法。

Windows:请不要跳过 if __name__ == "__main__" 部分。

from PyEMD import CEEMDAN
import numpy as np

if __name__ == "__main__":
    s = np.random.random(100)
    ceemdan = CEEMDAN()
    cIMFs = ceemdan(s)

可视化

该软件包包含一个简单的可视化助手,可以帮助 e.g. 处理时间序列和瞬时频率。

import numpy as np
from PyEMD import EMD, Visualisation

t = np.arange(0, 3, 0.01)
S = np.sin(13*t + 0.2*t**1.4) - np.cos(3*t)

# Extract imfs and residue
# In case of EMD
emd = EMD()
emd.emd(S)
imfs, res = emd.get_imfs_and_residue()

# In general:
#components = EEMD()(S)
#imfs, res = components[:-1], components[-1]

vis = Visualisation()
vis.plot_imfs(imfs=imfs, residue=res, t=t, include_residue=True)
vis.plot_instant_freq(t, imfs=imfs)
vis.show()

实验性的

JitEMD

即时(JIT)编译的EMD是EMD的一个版本,它超出了非常大的信号 或多次重复使用同一个实例。强烈建议用于 Jupyter 笔记本通过修改输入而不是方法本身进行实验。

JIT 的问题是编译发生在第一次执行时,它可以是 相当昂贵。对于小信号,或者只执行一次分解,额外的时间 编译将明显大于分解,从而使其性能降低。

请参阅文档了解更多信息,或参阅 示例 了解如何使用该代码。 这是实验性的,因为它的价值仍然值得怀疑,而且作者(我)并不精通 在 JIT 优化中,因此可能会犯错误。

欢迎任何反馈。如果有兴趣,很乐意改进。有问题请开票 和建议。

要在 PyEMD 中启用 JIT,请使用 jit 选项 i.e 进行安装。

pip install EMD-signal[jit]

EMD2D/BEMD

不幸的是,这是实验性的,我们不能保证输出是有意义的。 最简单的用途是将图像作为单色 numpy 2D 数组传递。样本为 对于其他模块,可以使用实例的默认设置,或者更明确地说, 使用 emd2d() 方法。

from PyEMD.EMD2d import EMD2D  #, BEMD
import numpy as np

x, y = np.arange(128), np.arange(128).reshape((-1,1))
img = np.sin(0.1*x)*np.cos(0.2*y)
emd2d = EMD2D()  # BEMD() also works
IMFs_2D = emd2d(img)

F.A.Q

为什么EEMD/CEEMDAN这么慢?

不幸的是,这就是他们的本性。他们每次都会多次执行 EMD 并稍微修改版本。添加的噪声可能会导致产生许多极值,从而降低自然三次样条的性能。有关如何处理该问题的一些调整,请参阅文档中的 加速技巧。

相关文章

精彩推荐