在脚本中导入numpy语句

时间:2014-05-09 12:38:10

标签: python matlab python-2.7 numpy

我是一名matlab程序员,并且已经涉足各种各样的东西。 python中的一个非常基本的概念/事物,我还没有涉及到from和import语句。

当我从bitarray模块导入bitarray时(我正确地说这个吗?)使用示例1)当我想在后面的脚本中使用它们时,我只是调用它的方法。但是,当我导入numpy我不能使用2)中显示的代码,因为它抛出一个错误,我必须使用3)中的语句然后键入np。在使用任何方法之前,这是有道理的。我也可以使用我在下面4)中显示的similer语法导入bitarray .......为什么2)在1)时不起作用?我正在祈祷一个简单的解释:) .....

1)

from bitarray import bitarray

2)

from numpy import numpy

3)

import numpy as np

4)

import bitarray as pp

2 个答案:

答案 0 :(得分:3)

这是由于bitarraynumpy之间的不同包结构造成的;具体来说,一个包含一个与模块本身同名的对象,另一个不包含。

bitarray模块包含一个名为bitarray的类(类似地,对于该示例,标准库中的datetime模块包含datetime类)。因此,以下内容是等效的:

from bitarray import bitarray
ba = bitarray(...)

import bitarray
ba = bitarray.bitarray(...)

在前者我们import bitarray直接从模块进入当前命名空间;在后者中,我们将整个模块导入为bitarray,并需要通过指定模块命名空间来访问该类。

相比之下,numpy不包含名为numpy的对象,因此

from numpy import numpy 

不起作用。


as是分开的;这简单地允许您为您要导入的任何内容提供别名,因此以下任何一种都可以正常工作:

import numpy as np
a = np.array(...)

from bitarray import bitarray as pp
b = pp(...)

import bitarray as pp
b = pp.bitarray(...)

如上面的mauve条评论,您可以使用*"通配符导入"导入所有内容,所以:

from numpy import *
from bitarray import *

会将两个模块中的每个顶级名称导入当前名称空间。之后,例如

a = array(...)
b = bitarray(...)

两者都可以。但是,这是not recommended,因为它通常是一个坏主意 - 例如,numpy contains a definition of all如果导入所有内容,它将影响同名的内置函数。

此外,对于任何阅读代码的人(包括您的更高版本!)来说,要弄清楚所使用的类和函数来自何处都会变得更加困难。比较:

from numpy import *
from random import *

a = choice([1, 2, 3]) # which module did choice come from?
b = all(x == y for x in l) # is this numpy's all or the built-in?

更清楚:

import numpy as np
import random

a = random.choice([1, 2, 3]) # clearly from random
b = all(x == y for x in l) # must be the built-in, not np.all()

答案 1 :(得分:1)

1)如果bitarray bitarray中的功能名称,那么它就完美了有效。

2)这没有意义,因为numpy没有名为numpy的函数。

3)这很好,因为您正在导入库并为其分配别名。

4)这也很好,因为你只需要在别名下导入。