为什么scipy导入空间工作,而scipy.spatial在导入scipy后不起作用?

时间:2014-01-12 05:40:58

标签: python scipy

我想在我的代码中使用scipy.spatial.distance.cosine。如果我执行spatialimport scipy.spatial之类的操作,我可以导入from scipy import spatial子模块,但如果我只是import scipy调用scipy.spatial.distance.cosine(...)会导致以下错误:{{ 1}}。

第二种方法有什么问题?

3 个答案:

答案 0 :(得分:19)

导入包不会自动导入子模块。您需要明确导入子模块。

例如,import xml不会导入子模块xml.dom

>>> import xml
>>> xml.dom
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dom'
>>> import xml.dom
>>> xml.dom
<module 'xml.dom' from 'C:\Python27\lib\xml\dom\__init__.pyc'>

os.path这样的例外。 (os模块本身将子模块导入其命名空间)

>>> import os
>>> os.path
<module 'ntpath' from 'C:\Python27\lib\ntpath.pyc'>

答案 1 :(得分:7)

那是因为scipy是,而不是模块。导入包时,实际上并未在其中加载模块,因此package.module会导致错误。

然而,import package.module可以工作,因为它加载模块而不是包。

这是大多数import语句的标准行为,但也有一些例外。

以下是Python 3中urllib的相同案例:

>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '__path__', 'error', 'parse', 'request', 'response']

请参阅?那里没有子模块。要访问其子模块,我们要求子模块:

>>> import urllib.request
>>> 

希望这个简单的解释有所帮助!

答案 2 :(得分:-1)

使用scipy版本1.2.1解决此问题......