导入numpy和导入numpy as np的区别

34
我了解尽可能使用时应该使用的概念。
import numpy as np

这有助于避免由于命名空间引起的任何冲突,但我注意到尽管下面的命令有效,

import numpy.f2py as myf2py

以下内容不包括在内

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

可以有人请解释一下吗?


1
@roippi,你尝试过退出Python并重新进入,然后只需执行import numpy,然后执行numpy.f2py吗?在我的情况下,它也会抛出一个错误。 - aha
2
导入一个模块并不会导入子模块。无论是否已经导入了numpy本身,您都需要显式地导入numpy.f2py模块。 - alecbz
5个回答

22
numpy 是顶级包名称,执行 import numpy 不会导入子模块 numpy.f2py
当你执行 import numpy 时,它会创建一个指向 numpy 的链接,但是 numpy 并没有进一步链接到 f2py。链接是在执行 import 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

这里是 import numpy.f2pyimport numpy.f2py as myf2py 之间的区别:

  • import numpy.f2py
    • numpy 放入本地符号表(指向 numpy),并且 numpy 链接到 numpy.f2py
    • 可以访问 numpynumpy.f2py
  • import numpy.f2py as myf2py
    • myf2py 放入本地符号表(指向 numpy.f2py)
    • 它的父级 numpy 没有添加到本地符号表中,因此无法直接访问 numpy

18
import as

语法是在PEP 221中引入的,并且在那里得到了很好的文档记录。

当您通过

import numpy

numpy包绑定到本地变量numpy。使用import as语法只是允许您将导入绑定到自己选择的本地变量名称(通常是为了避免名称冲突,缩短冗长的模块名称或标准化访问具有兼容API的模块)。

因此,

import numpy as np

等同于,

import numpy
np = numpy
del numpy

当试图理解这个机制时,值得记住的是import numpy实际上意味着import numpy as numpy

当导入一个子模块时,您必须引用完整的父模块名称,因为导入机制发生在本地变量作用域之上。例如:

import numpy as np
import numpy.f2py   # OK
import np.f2py      # ImportError

我对你声称“尽可能使用import numpy as np”的说法也有所争议。这主要是出于历史原因,大多数人非常快地厌倦了在每个操作前面加前缀numpy。它从未为我阻止过名称冲突(程序员的懒惰实际上表明了使用np会更容易导致冲突的可能性更高)。
最后,为了补充我的论述,这里介绍两个有趣的import as机制的用途,你应该知道:

1. 长子模块导入

import scipy.ndimage.interpolation as warp
warp.affine_transform(I, ...)

2. 兼容的API

try:
    import pyfftw.interfaces.numpy_fft as fft
except:
    import numpy.fft as fft
# call fft.ifft(If) with fftw or the numpy fallback under a common name

2
这是一种语言特性。 f2py 是模块 numpy 的一个子包,必须单独加载。
此功能允许:
- 您仅从 numpy 中加载所需的包,加快执行速度。 - f2py 的开发人员与另一个子包的开发人员具有命名空间分离。
请注意,import numpy.f2py 或其变体 import numpy.f2py as myf2py 仍在加载父模块 numpy
话虽如此,当您运行时:
import numpy as np
np.f2py

你收到了一个 AttributeError,因为f2py不是numpy的属性,因为包numpy__init__()没有在其范围内声明任何关于子包f2py的内容。


当你使用import numpy.f2py as myf2py时,如何访问其父级numpy?似乎import numpy.f2py允许您访问其父级numpy,但是import numpy.f2py as myf2py不允许。 - aha
你没有访问它,因为你决定不使用numpy中的任何内容,而且你只关心使用子包。这类似于使用from foo import bar:名称foo将无法访问。请参见文档第一个示例后面的注释,链接 - gg349

1

numpy.f2py实际上是numpy的一个子模块,因此必须与numpy分开导入。正如aha之前所说:

当您执行import numpy时,它会创建一个指向numpy的链接,但numpy没有进一步链接到f2py。当您执行import numpy.f2py时,链接才建立。

当您调用语句import numpy as np时,您将短语"numpy"缩短为"np",以使您的代码更易于阅读。它还有助于避免命名空间问题。(tkinter和ttk就是一个很好的例子,当你遇到这个问题时,UI看起来非常不同。)


1

这是一篇比较旧的帖子,但我想补充一些其他人提供的解释。

numpy(参见git存储库)包含各种子包,其中之一是f2py,其他子包包括core、ma等。

如果您参考numpy包中的init.py文件,它会导入如下内容:

from . import core etc 

但这对于f2py子包没有任何影响。这就是为什么像这样的语句:

import numpy as np
np.f2py

不会工作,但是

import numpy as np
np.core

将会工作。


最直接的答案,提供了机制。与4或7年前一样有用。 - Don Slowik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接