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
- numpy和numpy.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