【问题标题】:Proper way to import from scipy submodules从 scipy 子模块导入的正确方法
【发布时间】:2020-04-21 08:40:28
【问题描述】:

我无法理解为什么以下访问scipy.sparse.linalg.norm 的方法分别有效和无效:

(base) ➜  ~ ipython
Python 3.7.4 (default, Aug 13 2019, 20:35:49) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from scipy import sparse                                                                                                               

In [2]: sparse.linalg.norm                                                                                                                     
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-bfa688e1c7b4> in <module>
----> 1 sparse.linalg.norm

AttributeError: module 'scipy.sparse' has no attribute 'linalg'

In [3]: from scipy.sparse.linalg import norm                                                                                                   

In [4]: import scipy; scipy.__version__                                                                                                        
Out[4]: '1.4.1'

谁能解释一下?

另外,我想我记得过去直接使用过 sparse.linalg.norm,它工作得很好。

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    this精彩回答:

    在 Python 中,需要先导入模块才能访问它们。 import logging 仅导入 logging 模块。碰巧的是 logging 是一个带有子模块的包,但这些子模块仍然是 不会自动加载。因此,您需要显式导入 logging.handlers 才能访问它。

    如果您想知道为什么有时您不需要这些 额外的导入:一些包导入它们的部分或全部子模块 当它们被导入时——只需在它们的 init.py 文件。在其他情况下,可能是您导入的其他内容,也导入了 logging.handlers。哪个没关系 一段代码进行导入;只要你的过程中有一些东西 在您访问它之前导入 logging.handlers,它会在那里。和 有时看起来像一个包的模块实际上不是一个,比如 os 和 os.path。 os 不是一个包,它只是导入正确的其他包 模块(适用于您的平台)并将其称为路径,以便您可以访问 它作为 os.path。

    因此,如果我们深入研究scipy.sparse 并查看它的__init__.py,我们会发现它们在加载基本模块时没有导入子模块。这是执行导入的代码块:

    from __future__ import division, print_function, absolute_import
    
    # Original code by Travis Oliphant.
    # Modified and extended by Ed Schofield, Robert Cimrman,
    # Nathan Bell, and Jake Vanderplas.
    
    import warnings as _warnings
    
    from .base import *
    from .csr import *
    from .csc import *
    from .lil import *
    from .dok import *
    from .coo import *
    from .dia import *
    from .bsr import *
    from .construct import *
    from .extract import *
    from ._matrix_io import *
    
    # For backward compatibility with v0.19.
    from . import csgraph
    

    所以对于你的问题,你所要做的就是:

    from scipy.sparse import linalg
    

    然后在稀疏矩阵上调用linalg.norm

    【讨论】:

    • 谢谢,还有一个问题:为什么在使用from scipy.sparse import linalg 之后可以调用sparse.linalg.norm
    • @P.Camilleri 因为它是模块内部的方法。该模块知道它包含的方法,这类似于为什么在从 scipy 导入 sparse 时可以使用sparse.rand
    • 嗯,不完全是因为from scipy import sparse 没有按我的意思使用。所以我希望linalg.norm 可以工作,但不一定是sparse.linalg.norm
    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2018-08-05
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多