[英]Why do I have to “from module import” with the email module in python?
[英]Why do I have to import this from numpy if I am just referencing it from the numpy module
阿罗哈!
我有两个代码块,一个可以工作,另一个不会。 唯一的区别是我不使用的numpy模块的注释代码行。 当我从不引用“npm”时,为什么我需要导入该模型?
此命令有效:
import numpy as np
import numpy.matlib as npm
V = np.array([[1,2,3],[4,5,6],[7,8,9]])
P1 = np.matlib.identity(V.shape[1], dtype=int)
P1
此命令不起作用:
import numpy as np
#import numpy.matlib as npm
V = np.array([[1,2,3],[4,5,6],[7,8,9]])
P1 = np.matlib.identity(V.shape[1], dtype=int)
P1
上面得到了这个错误:
AttributeError: 'module' object has no attribute 'matlib'
提前致谢!
这是因为numpy.matlib
是numpy
的可选子包,必须单独导入。
此功能的原因可能是:
numpy
, numpy.matlib
子模块重新定义numpy
的函数来返回矩阵而不是ndarrays,这是一个许多人可能不想要的可选功能 当你导入numpy
而没有子包matlib
,Python会寻找.matlib
作为numpy
包的一个属性。 如果没有导入numpy.matlib
该属性尚未分配给numpy
(请参阅下面的讨论)
如果你想知道为什么np.matlib.identity
工作而不必使用关键字npm
,那是因为当你导入子模块matlib
,父模块numpy
(在你的情况下命名为np
)将被赋予一个属性matlib
,这是绑定到子模块。 这只适用于您首先定义numpy
。
来自参考 :
当使用任何机制(例如,importlib API,import或import-from语句或内置import ())加载子模块时,绑定将放置在父模块的命名空间中,并附加到子模块对象。
要导入的内容的选择取决于模块目录中模块各自的__init__.py
文件。 您可以使用dir()
函数查看相应模块定义的名称。
>> import numpy
>> 'matlib' in dir(numpy)
# False
>> import numpy.matlib
>> 'matlib' in dir(numpy)
# True
或者,如果您直接查看__init__.py
文件以获取numpy
您将看到matlib
没有导入。
如果你想知道命名空间是如何顺利复制的;
matlib
源代码运行此命令以复制numpy
命名空间:
import numpy as np # (1)
...
# need * as we're copying the numpy namespace
from numpy import * # (2)
...
__all__ = np.__all__[:] # copy numpy namespace # (3)
第(2)行, from numpy import *
尤为重要。 因此,您会注意到如果您只是导入numpy.matlib
您仍然可以使用所有numpy
模块而无需导入numpy
!
如果没有第(2)行,第(3)行中的命名空间副本只会附加到子模块。 有趣的是,由于第(3)行,你仍然可以做这样一个有趣的命令。
import numpy.matlib
numpy.matlib.np.matlib.np.array([1,1])
这是因为np.__all__
附着到np
的numpy.matlib
(其经管线(1)导入)。
你从不使用npm
但你确实使用了np.matlib
,所以你可以将你的第二个导入行改为:
import numpy.matlib
或者您可以按原样保留第二个导入行,而是使用:
P1 = npm.identity(V.shape[1], dtype=int)
你有没有理由不使用np.identity
?
P1 = np.identity(V.shape[1], dtype=int)
该模块包含numpy命名空间中的所有函数,具有以下替换函数,这些函数返回矩阵而不是ndarrays。
除非你坚持使用2d np.matrix
子类,否则你最好坚持使用常规的ndarray
版本。
(其他人已经指出,导入为什么是基于numpy
的__init__
规范numpy
导入大部分,但不是所有子模块。它不自动导入的子模块使用次数较少。这是一种礼貌的说法, You don't really need this module
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.