【问题标题】:Importing numpy statement in script在脚本中导入 numpy 语句
【发布时间】:2014-06-27 05:01:51
【问题描述】:

我是一名 matlab 编码员,在 Python 中涉猎过各种各样的事情。 python 中一个非常基本的概念/事情,我没有深入了解,与 from 和 import 语句有关。

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

1)

from bitarray import bitarray

2)

from numpy import numpy

3)

import numpy as np

4)

import bitarray as pp

【问题讨论】:

  • 我不知道为什么,但另一种选择是“from numpy import *”
  • 阅读文档可能会有所帮助:docs.python.org/2.7/tutorial/modules.html
  • @mauve 请不要鼓励不良做法。不要使用from import *,尤其是对于 numpy,因为它包含将覆盖内置函数的函数。
  • @M4tini 谢谢!我不知道这是不好的做法。我不记得我在哪里看到的,但我肯定偶尔会这样做。
  • @mauve 我在答案的底部提到了这一点 - 请注意说明为什么通常不鼓励这样做的示例。

标签: python matlab python-2.7 numpy


【解决方案1】:

1) 如果bitarray bitarray 中的函数 名称,那么它是完全有效的。

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

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

4) 这也很好,因为您只是在别名下导入。

【讨论】:

  • 为了完整性:bitarray 不必是 functionclass。它也可以只是一个普通变量。 import 只是导入“名称”,而不管这个名称绑定到什么类型的对象。
【解决方案2】:

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

bitarray 模块包含一个名为bitarray 的类(类似地,例如,标准库中的datetime 模块包含datetime 类)。因此以下是等价的:

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

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

在前面我们importclassbitarray直接从模块进入到当前命名空间;在后者中,我们将整个模块导入为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 cmets,您可以使用*“通配符导入”来导入所有内容,所以:

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()

【讨论】:

  • 太好了,这让我免于再次使用扑热息痛!谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 2010-12-14
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多