无法从 'scipy.signal.signaltools' 导入名称“_centered”

Cannot import name '_centered' from 'scipy.signal.signaltools'

无法从 scipy 模块导入函数。

给出错误:

from scipy.signal.signaltools import _centered
Cannot import name '_centered' from 'scipy.signal.signaltools'

scipy.__version__
1.8.0

我在使用 statsmodels~=0.12.x 时遇到了同样的问题。将 statsmodels 包增加到版本 0.13.2,此导入问题已解决。

更新更多注释:

  • 之前:
    • 安装依赖于scipy
    • 的固定版本statsmodels==0.12.2
    • 有新 released scipy==1.8.0 - 2022-02-05
      • 安装的时候出现了这个问题:
    from statsmodels.tsa.seasonal import seasonal_decompose
  File "/usr/local/lib/python3.8/site-packages/statsmodels/tsa/seasonal.py", line 12, in <module>
    from statsmodels.tsa.filters.filtertools import convolution_filter
  File "/usr/local/lib/python3.8/site-packages/statsmodels/tsa/filters/filtertools.py", line 18, in <module>
    from scipy.signal.signaltools import _centered as trim_centered
ImportError: cannot import name '_centered' from 'scipy.signal.signaltools' (/usr/local/lib/python3.8/site-packages/scipy/signal/signaltools.py)
  • 之后:

    • 当升级 statsmodels 到可用的最新版本 0.13.2 发布 2022-02-08 时,它有效
  • 如果你使用的不是statsmodels而是依赖于scipy的其他包,请查看是否有可用的更新版本(在[=14发布后) =] 到 v.1.8.0)

如果您需要将特定版本的 statsmodels 0.12.x 与 scipy 1.8.0 一起使用,我有以下 hack。 基本上它只是 re-publishes 现有的(但私有的)_centered 函数作为已经导入到 RAM 中的模块的 public 属性。

这是一种解决方法,如果您可以简单地将依赖项升级到最新版本。仅当您被迫使用那些特定版本时才使用它。

import  scipy.signal.signaltools

def _centered(arr, newsize):
    # Return the center newsize portion of the array.
    newsize = np.asarray(newsize)
    currsize = np.array(arr.shape)
    startind = (currsize - newsize) // 2
    endind = startind + newsize
    myslice = [slice(startind[k], endind[k]) for k in range(len(endind))]
    return arr[tuple(myslice)]

scipy.signal.signaltools._centered = _centered

在 scipy 1.8.0 中,已弃用的形式

from scipy.signal.signaltools import _centered

应该变成

from scipy.signal._signaltools import _centered

注意signaltools前面的下划线

AndrejHan and ThomasCokelaer 所述,您需要升级到 statsmodels-0.13.2

$ pip install statsmodels --upgrade

$ python3 -m pip install statsmodels --upgrade

您的错误应该会消失