Синтаксис для импорта модулей scipy и sklearn - PullRequest
0 голосов
/ 12 января 2019

Я использую (только стандарты) Win10, Anaconda-2018.12, Python-3.7, MKL-2019.1, mkl-service-1.1.2, Jupyter ipython-7.2. см. Здесь, например. Мне интересно, почему следующий синтаксис работает для import операторов с модулями numpy, но не работает для scipy или sklearn модулей:

import scipy as sp
import numpy as np
A = np.random.random_sample((3, 3)) + np.identity(3)
b = np.random.rand((3))
x = sp.sparse.linalg.bicgstab(A,b)

> AttributeError                            Traceback (most recent call
> last) <ipython-input-1-35204bb7c2bd> in <module>()
>       3 A = np.random.random_sample((3, 3)) + np.identity(3)
>       4 b = np.random.rand((3))
> ----> 5 x = sp.sparse.linalg.bicgstab(A,b)
> AttributeError: module 'scipy' has no attribute 'sparse'

или со склеарном

import sklearn as sk
iris = sk.datasets.load_iris()

> AttributeError                            Traceback (most recent call
> last) <ipython-input-2-f62557c44a49> in <module>()
>       2 import sklearn as sk
> ----> 3 iris = sk.datasets.load_iris() AttributeError: module 'sklearn' has no attribute 'datasets

Этот синтаксис, тем не менее, работает (но для редких команд он не очень прост):

import sklearn.datasets as datasets
iris = datasets.load_iris()

и

from scipy.sparse.linalg import bicgstab as bicgstab
x = bicgstab(A,b)
x[0]

array([ 0.44420803, -0.0877137 , 0.54352507])

Что это за проблема? Может ли это быть устранено с разумными усилиями?

1 Ответ

0 голосов
/ 12 января 2019

«проблема»

Поведение, с которым вы сталкиваетесь, на самом деле является особенностью Scipy, хотя на первый взгляд это может показаться ошибкой. Некоторые из подпакетов scipy довольно большие и имеют много участников. Таким образом, чтобы избежать задержки при запуске import scipy (а также сэкономить на использовании системной памяти), структура scipy структурирована таким образом, что большинство подпакетов не импортируются автоматически. Вы можете прочитать все об этом в документах прямо здесь .

Исправление

Вы можете обойти очевидную проблему, немного поработав над стандартным синтаксисом / семантикой Python import:

import numpy as np

A = np.random.random_sample((3, 3)) + np.identity(3)
b = np.random.rand((3))

import scipy as sp

# this won't work, raises AttributeError
# x = sp.sparse.linalg.bicgstab(A,b)

import scipy.sparse.linalg

# now that same line will work
x = sp.sparse.linalg.bicgstab(A,b)
print(x)
# output: (array([ 0.28173264,  0.13826848, -0.13044883]), 0)

Как правило, если вызов sp.pkg_x.func_y вызывает AttributeError, вы можете исправить это, добавив строку до следующего вида:

import scipy.pkg_x

Конечно, это предполагает, что scipy.pkg_x является допустимым подпакетом scipy для начала.

...