[英]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.