在脚本中导入numpy语句

1 投票
2 回答
3032 浏览
提问于 2025-04-18 05:59

我是一名使用Matlab的程序员,也偶尔用Python做一些事情。Python中有一个非常基础的概念,就是关于from和import语句的用法,我还没有完全搞明白。

当我从bitarray模块中导入bitarray时(我这样说对吗?),在后面的代码中我只需要直接调用它的方法就可以了,像例子1那样。但是,当我导入numpy时,例子2中的代码就会报错,我必须使用例子3中的语句,然后在使用它的方法之前加上np.,这样才行,这样理解是没问题的。我也可以用类似的语法导入bitarray,像例子4那样……为什么例子2不工作,而例子1却可以呢?我希望能有个简单的解释 :)

1)

from bitarray import bitarray

2)

from numpy import numpy

3)

import numpy as np

4)

import bitarray as pp

2 个回答

1

1) 如果 bitarray 是库 bitarray 中的一个 函数 名字,那这样用是完全可以的。

2) 这不太合理,因为 numpy 里没有叫 numpy 的函数。

3) 这样做是没问题的,因为你是在导入一个库,并给它起了个别名。

4) 这样做也没问题,因为你同样是在用别名导入。

3

这是因为 bitarraynumpy 的包结构不同;具体来说,一个包里有一个和模块同名的对象,而另一个没有。

bitarray 模块里有一个叫 bitarray 的类,(类似的,标准库里的 datetime 模块也包含一个 datetime 类)。所以下面这两种写法是等价的:

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

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

在第一种情况下,我们是直接从模块中把 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(...)

都能正常工作。不过,这种做法 不推荐,因为通常来说这是个坏主意——例如,numpy 里有一个 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()

撰写回答