gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:18:30 27 4
gpt4 key购买 nike

你好!

我有两个代码块,一个可以工作,一个不能。唯一的区别是我不使用的 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(请参阅下面的讨论)

子模块和绑定(bind)

如果您想知道为什么 np.matlib.identity 无需使用关键字 npm 即可工作,那是因为当您导入子模块 matlib ,父模块 numpy(在您的例子中名为 np)将被赋予一个属性 matlib,该属性绑定(bind)到子模块模块。这仅在您首先定义 numpy 时有效。

来自reference :

When a submodule is loaded using any mechanism (e.g. importlib APIs, the import or import-from statements, or built-in import()) a binding is placed in the parent module’s namespace to the submodule object.

导入和 __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) 行中的 namespace 副本将仅附加到子模块。有趣的是,由于第 (3) 行,您仍然可以执行这样一个有趣的命令。

import numpy.matlib               
numpy.matlib.np.matlib.np.array([1,1])

这是因为 np.__all__ 附加到 numpy.matlibnp(通过第 (1) 行导入) .

关于python - 如果我只是从 numpy 模块引用它,为什么我必须从 numpy 导入它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com