Правильный способ импорта из подмодулей scipy - PullRequest
1 голос
/ 21 апреля 2020

У меня возникли проблемы с пониманием того, почему следующие способы доступа к 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 непосредственно в прошлом, где он работал нормально.

1 Ответ

2 голосов
/ 21 апреля 2020

Согласно этот блестящий ответ:

В Python модули должны быть импортированы, прежде чем они станут доступны. import logging импортирует только модуль регистрации. Случается, что регистрация представляет собой пакет с субмодулями, но эти субмодули по-прежнему не загружаются автоматически. Итак, вам нужно явно импортировать logging.handlers, прежде чем вы сможете получить к нему доступ.

Если вам интересно, почему это выглядит, иногда вам не нужны эти дополнительные импорты: некоторые пакеты импортируют некоторые или все свои подмодули когда они импортируются - просто выполняя эти импорта в их init .py файлах. В других случаях это может быть что-то еще, что вы импортируете, также импортированные logging.handlers. Неважно, какой фрагмент кода выполняет импорт; пока что-то в вашем процессе импортирует logging.handlers, прежде чем вы получите к нему доступ, оно будет там. И иногда модуль, который выглядит как пакет, на самом деле не один, как os и os.path. os не является пакетом, он просто импортирует правильный другой модуль (для вашей платформы) и называет его path, просто чтобы вы могли получить к нему доступ как 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 на разреженной матрице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...