简短答案
这是因为
numpy.matlib它的一个可选子包
numpy必须单独导入。
使用此功能的原因可能是:
- 特别是对于
numpy
,numpy.matlib
子模块重新定义numpy
函数以返回矩阵而不是ndarrays,这是许多人可能不希望使用的可选功能 - 更一般而言,加载父模块而不加载许多用户可能并不经常需要的潜在加载缓慢的模块
- 可能是名称空间分离
当您导入时
numpy没有子包时
matlib,Python将寻找
.matlib该
numpy包的属性。
numpy没有导入,尚未分配此属性
numpy.matlib(请参见下面的讨论)
子模块和绑定
如果您想知道为什么
np.matlib.identity无需使用关键字就可以工作
npm,那是因为在导入子模块时
matlib,将为父模块
numpy(以
np您的情况命名)提供一个
matlib绑定到子模块的属性。这只有在您首先定义时才有效
numpy。
从参考:
当使用任何机制(例如importlib API,import或import-from语句或内置 import
())加载子模块时,在父模块的名称空间中将绑定到子模块对象。
导入和__init__.py
导入内容的选择
__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 namespacefrom 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__附加到的
npof
numpy.matlib(它是通过行(1)导入的)。



