Python 导入numpy和导入numpy作为np的区别

Python 导入numpy和导入numpy作为np的区别,python,numpy,Python,Numpy,我理解在可能的情况下应该使用 import numpy as np 这有助于避免名称空间引起的任何冲突。但我注意到,虽然下面的命令有效 import numpy.f2py as myf2py 以下内容不适用 import numpy as np np.f2py #throws no module named f2py 有人能解释一下吗?numpy是顶级包名,执行导入numpy不会导入子模块numpy.f2py 当您执行导入numpy时,它会创建一个指向numpy的链接,但是numpy不会进

我理解在可能的情况下应该使用

import numpy as np
这有助于避免名称空间引起的任何冲突。但我注意到,虽然下面的命令有效

import numpy.f2py as myf2py
以下内容不适用

import numpy as np
np.f2py #throws no module named f2py

有人能解释一下吗?

numpy是顶级包名,执行
导入numpy
不会导入子模块
numpy.f2py


当您执行导入numpy时,它会创建一个指向
numpy
的链接,但是
numpy
不会进一步链接到
f2py
。当您执行导入numpy.f2py时,将建立链接

在上述代码中:

import numpy as np # np is an alias pointing to numpy, but at this point numpy is not linked to numpy.f2py
import numpy.f2py as myf2py # this command makes numpy link to numpy.f2py. myf2py is another alias pointing to numpy.f2py as well
以下是
导入numpy.f2py
将numpy.f2py作为myf2py导入之间的区别:

  • import numpy.f2py
    • numpy放入本地符号表(指向numpy),numpy链接到numpy.f2py
    • numpynumpy.f2py都可以访问
  • 将numpy.f2py导入为myf2py
    • my2py放入本地符号表(指向numpy.f2py)
    • 其父numpy未添加到本地符号表中。因此,您不能直接访问numpy

numpy.f2py实际上是
numpy
的子模块,因此必须与numpy分开导入。如前所述:

当您导入numpy时,它会创建一个指向numpy的链接,但是 numpy没有进一步链接到f2py。链接在您创建时建立 是否导入numpy.f2py


当您调用语句
import numpy as np
时,您将短语“numpy”缩短为“np”,以使代码更易于阅读。它还有助于避免名称空间问题。(tkinter和ttk是一个很好的例子,说明了当您遇到问题时会发生什么。UI看起来非常不同。)

这是一种语言功能
f2py
是模块
numpy
的子包,必须单独加载

此功能允许:

  • 您可以从
    numpy
    仅加载所需的包,从而加快执行速度
  • f2py
    的开发人员需要将命名空间与另一个子包的开发人员分离
但是请注意,
import numpy.f2py
或其变体
import numpy.f2py as myf2py
仍在加载父模块
numpy

当你跑的时候

import numpy as np
np.f2py

您会收到一个
AttributeError
,因为
f2py
不是
numpy
的属性,因为
的包
numpy
没有在其范围内声明关于子包
f2py
的任何内容
导入为
语法是在中引入的,并且在那里有很好的文档记录

通过导入模块时

import numpy
numpy包绑定到局部变量
numpy
import-as
语法只允许您将导入绑定到所选的本地变量名(通常是为了避免名称冲突、缩短详细的模块名称,或标准化对具有兼容API的模块的访问)

因此,

相当于,

import numpy
np = numpy
del numpy
当试图理解这个机制时,需要记住,
import numpy
实际上意味着
import numpy as numpy

导入子模块时,必须引用完整的父模块名称,因为导入机制发生在比局部变量范围更高的级别。i、 e

import numpy as np
import numpy.f2py   # OK
import np.f2py      # ImportError
我也不同意你的说法,即“在可能的情况下,应该[将numpy作为np导入]”。这样做是出于历史原因,主要是因为人们很快就厌倦了用
numpy
作为每个操作的前缀。对我来说,它从未阻止过名称冲突(程序员的懒惰实际上意味着与
np
发生冲突的可能性更高)

最后,为了完善我的演示,这里有两个关于导入为
机制的有趣用法,您应该注意:

1.长子导入 2.兼容API
好吧,这是一篇很老的帖子,但这是我的2美分,比其他人提供的解释多

numpy(参考git repository)包有不同的子包,f2py是其中之一,其他的是作为核心,ma等

如果在numpy包中引用init.py,则它具有如下导入:

from . import core etc 
但它没有任何f2py子包的导入。 这就是为什么一份声明

import numpy as np
np.f2py
不起作用,但是

import numpy as np
np.core

将起作用。

@roippi您是否已尝试退出python并输入它,然后执行
导入numpy
然后执行
numpy.f2py
?在我的例子中,导入模块不会导入子模块,这会引发一个错误。无论是否/如何导入
numpy
模块本身,都需要显式导入
numpy.f2py
模块。当您将numpy.f2py导入为myf2py
时,如何访问其父numpy?似乎
import numpy.f2py
允许您访问其父级
numpy
,但是
import numpy.f2py as myf2py
不允许您访问它,因为您决定不使用
numpy
中的任何内容,并且只关心使用子包。这类似于使用foo导入栏中的
:名称
foo
将无法访问。请参见文档第一个示例后的注释,
from . import core etc 
import numpy as np
np.f2py
import numpy as np
np.core