这是因为numpy.matlib
它的一个可选子包numpy
必须单独导入。
使用此功能的原因可能是:
当您导入时numpy
没有子包时matlib
,Python将寻找.matlib
该numpy
包的属性。numpy
没有导入,尚未分配此属性numpy.matlib
(请参见下面的讨论)
如果您想知道为什么np.matlib.identity
无需使用关键字就可以工作npm
,那是因为在导入子模块时matlib
,将为父模块numpy
(以np
您的情况命名)提供一个matlib
绑定到子模块的属性。这只有在您首先定义时才有效numpy
。
从参考:
当使用任何机制(例如importlib API,import或import-from语句或内置 ())加载子模块时,在父模块的名称空间中将绑定到子模块对象。
导入内容的选择__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
of numpy.matlib
(它是通过行(1)导入的)。