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

Python 如果我只是从numpy模块引用它,为什么我必须从numpy导入它,python,numpy,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

你好

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

提前谢谢

您从未使用过
npm
,但确实使用了
np.matlib
,因此您可以将第二个导入行更改为:

import numpy.matlib
或者,您可以保留第二条导入线,但改用:

P1 = npm.identity(V.shape[1], dtype=int)
简短回答 这是因为
numpy.matlib
numpy
的可选子包,必须单独导入

此功能的原因可能是:

  • 特别是对于
    numpy
    numpy.matlib
    子模块重新定义了
    numpy
    的函数,以返回矩阵而不是ndarray,这是许多人可能不想要的可选功能
  • 更一般地说,加载父模块而不加载许多用户可能不经常需要的可能缓慢加载的模块
  • 可能是名称空间分离
如果只导入
numpy
而不导入子包
matlib
,那么Python将查找
.matlib
作为
numpy
包的属性。如果未导入
numpy.matlib
,则未将此属性分配给
numpy
(请参阅下面的讨论)

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

从:

当使用任何机制(例如importlib API、import或import from语句或内置的import())加载子模块时,会在父模块的命名空间中放置到子模块对象的绑定

导入和\uuuu初始化\uuuuuu.py 导入内容的选择由模块目录中模块各自的
\uuuu init\uuuuu.py
文件决定。您可以使用
dir()
函数查看各个模块定义的名称

>> import numpy

>> 'matlib' in dir(numpy)
# False

>> import numpy.matlib

>> 'matlib' in dir(numpy)
# True
或者,如果直接查看,您将看到没有导入
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)行,numpy import*中的
尤为重要。因此,您会注意到,如果只导入
numpy.matlib
,您仍然可以使用所有
numpy
模块,而无需导入
numpy

如果没有第(2)行,第(3)行中的名称空间副本将只附加到子模块。有趣的是,由于第(3)行的原因,您仍然可以执行这样一个有趣的命令


这是因为
np.\uuuu all\uuuu
附加到
numpy.matlib
np
(通过第(1)行导入)

是否有理由不使用
np.identity

P1 = np.identity(V.shape[1], dtype=int)
此模块包含numpy名称空间中的所有函数,以及以下返回矩阵而不是Ndarray的替换函数

除非您与2d
np.matrix
子类结为一体,否则最好还是使用常规的
ndarray
版本


(其他人指出,导入原因是基于
numpy
numpy
\uuuu init\uuuuuuu
规范导入的大部分,但不是其所有子模块。它不自动导入的子模块使用频率较低。这是一种礼貌的说法,
您并不真正需要此模块

“此命令不起作用“不是有效的问题陈述。它怎么不起作用?它是否给出了错误的结果?它有例外吗?错误消息的存在有一个原因:为您提供错误原因的线索。如果你把它们排除在外,你只是浪费了程序员的时间,他们仔细地写下了错误消息,也浪费了我们的时间([[1,2,3],[4,5,6],[7,8,9])--->5 P1=np.matlib.identity(V.shape[1],dtype=int)6 P1 AttributeError:“module”对象没有属性“matlib”。这是一个常见的习惯用法。默认情况下,包不会导入可选的子包。在使用它之前,您必须先导入。但是您确实引用了
np.matlib
,只是不使用别名
npm
(这是可选的)关于子包的注释帮助我理解了为什么会出现错误。谢谢!你是对的,我应该使用它,现在就是。只是想知道它为什么会出现错误。感谢注释!编辑:更正了我在为什么可以使用函数
np.matlib.identity()方面犯的错误
而不必使用
npm
名称和命名空间。
P1 = np.identity(V.shape[1], dtype=int)