繁体   English   中英

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

[英]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.matlibnumpy的可选子包,必须单独导入。

此功能的原因可能是:

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM