阿罗哈!
我有两个代码块,一个可以工作,另一个不会。唯一的区别是我不使用的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'
提前致谢!
答案 0 :(得分:12)
这是因为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
时才有效。
来自reference:
当使用任何机制(例如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
file for numpy
,您会看到matlib
没有导入。
如果您想知道命名空间如何通过顺利复制;
matlib
source code运行此命令以复制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)行导入)。
答案 1 :(得分:4)
您永远不会使用npm
,但您确实使用np.matlib
,因此您可以将第二个导入行更改为:
import numpy.matlib
或者您可以按原样保留第二个导入行,而是使用:
P1 = npm.identity(V.shape[1], dtype=int)
答案 2 :(得分:2)
您是否有理由不使用np.identity
?
P1 = np.identity(V.shape[1], dtype=int)
此模块包含numpy命名空间中的所有函数,以及以下替换函数,它们返回矩阵而不是ndarrays。
除非您坚持使用2d np.matrix
子类,否则最好坚持使用常规ndarray
版本。
(其他人指出,导入原因是基于__init__
的{{1}}规范。numpy
导入了大部分但不是所有子模块。它不会自动导入导入的使用频率较低。这是一种礼貌的说法,numpy
)