据我所知,如果可能,应该使用
import numpy as np
这有助于防止由命名空间引起的任何冲突。但我注意到,虽然下面的命令有效但
import numpy.f2py as myf2py
以下不
import numpy as np
np.f2py #throws no module named f2py
有人可以解释一下吗?
答案 0 :(得分:19)
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.f2py
和import numpy.f2py as myf2py
:
import numpy.f2py
import numpy.f2py as myf2py
答案 1 :(得分:13)
在PEP 221中引入了import as
语法,并在那里有详细记录。
通过
导入模块时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
我也断言你的断言“在可能的情况下应该[导入numpy as np]”。这是出于历史原因而完成的,主要是因为人们很快就会为每个操作添加numpy
前缀。它从来没有阻止我的名字冲突(程序员的懒惰实际上表明与np
发生碰撞的概率更高)
最后,为了完善我的曝光,这里有两个你应该注意的import as
机制的有趣用法:
import scipy.ndimage.interpolation as warp
warp.affine_transform(I, ...)
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 :(得分:2)
这是一种语言功能。 f2py
是模块numpy
的子包,必须单独加载。
此功能允许:
numpy
加载所需的软件包,加快执行速度。f2py
的开发人员将命名空间与另一个子包的开发人员分开。但请注意,import numpy.f2py
或其变体import numpy.f2py as myf2py
仍在加载父模块numpy
。
说,当你运行
import numpy as np
np.f2py
您收到AttributeError
,因为f2py
不是numpy
的属性,因为包__init__()
的{{1}}未在其范围内声明任何内容关于子包numpy
。
答案 3 :(得分:1)
numpy.f2py
实际上是numpy
的子模块,因此必须与numpy分开导入。正如aha之前所说:
当你导入numpy时,它会创建一个指向numpy的链接,但是 numpy与f2py没有进一步联系。当你建立链接 请导入numpy.f2py
当你致电语句import numpy as np
时,你缩短了短语" numpy"到" np"使您的代码更容易阅读。它还有助于避免名称空间问题。 (tkinter和ttk是当你遇到这个问题时会发生什么的一个很好的例子.UI看起来非常不同。)
答案 4 :(得分:0)
这是一个相当古老的帖子,但这是我对其他人提供的解释的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
会奏效。