如果我只是从numpy模块引用它,为什么我必须从numpy导入它

时间:2017-01-24 01:05:35

标签: python numpy

阿罗哈!

我有两个代码块,一个可以工作,另一个不会。唯一的区别是我不使用的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'

提前致谢!

3 个答案:

答案 0 :(得分:12)

简答

这是因为numpy.matlibnumpy的可选子包,必须单独导入。

此功能的原因可能是:

  • 特别是对于numpynumpy.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

导入内容的选择取决于模块目录中模块各自的__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