繁体   English   中英

从 scipy 子模块导入的正确方法

[英]Proper way to import from scipy submodules

我无法理解为什么以下访问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 中,需要先导入模块才能访问它们。 import logging 仅导入 logging 模块。 碰巧日志记录是带有子模块的 package,但这些子模块仍未自动加载。 因此,您需要先显式导入 logging.handlers 才能访问它。

如果您想知道为什么有时您不需要这些额外的导入:某些包在导入时会导入部分或全部子模块——只需在它们的init .py 文件中进行这些导入即可。 在其他情况下,可能是您导入的其他内容,也导入了 logging.handlers。 导入哪一段代码并不重要; 只要您的流程中的某些内容在您访问它之前导入 logging.handlers,它就会在那里。 有时一个看起来像 package 的模块真的不是一个,比如 os 和 os.path。 os 不是 package,它只是导入正确的其他模块(适用于您的平台)并将其称为路径,以便您可以作为 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM