首页 > 解决方案 > 过滤数据时出现内存错误

问题描述

我正在实现一个 filtfilt 过滤器,但我收到了 MemoryError。我尝试了两台不同的计算机,但错误仍然存​​在。

  File "C:\Users\UserName\lib\site-packages\scipy\signal\signaltools.py", line 3129, in filtfilt
    zi = lfilter_zi(b, a)
  File "C:\Users\UserName\lib\site-packages\scipy\signal\signaltools.py", line 2689, in lfilter_zi
    IminusA = np.eye(n - 1) - linalg.companion(a).T
  File "C:\Users\UserName\lib\site-packages\numpy\lib\twodim_base.py", line 201, in eye
    m = zeros((N, M), dtype=dtype, order=order)
MemoryError

任何线索如何解决这个问题?我的数据不是那么大(长度为 3011723 的一维数组)。我在 python win63 上使用 Pycharm。我将非常感谢您的帮助。

这是发生错误的示例代码:

from numpy import arange, random
from scipy.signal import kaiserord, firwin, filtfilt

fs = 1000
data = random.uniform(size=3011723)

nyq_rate = fs / 2.0

# The desired width of the transition from pass to stop, relative to the Nyquist rate
width = 0.1/nyq_rate

# The desired attenuation in the stop band, in dB.
ripple_db = 100.0

# Compute the order and Kaiser parameter for the FIR filter.
N, beta = kaiserord(ripple_db, width)

# Use firwin with a Kaiser window to create a lowpass FIR filter.
taps = firwin(N, 300/nyq_rate, window=('kaiser', beta), pass_zero=True)

# Use lfilter to filter x with the FIR filter.
filtered_data = filtfilt(taps, 1.0, data)

最好的,DTake

标签: pythonnumpyscipyout-of-memory

解决方案


scipy.signal.filtfilt尝试计算伴随矩阵时会出现您的问题。对于中间计算,它会创建一个大小为 的数组,大小(3011723, 3011723)约为72563 GB。很明显,它装不下内存。

除了减少样本量,我没有看到任何其他选择。


推荐阅读