我使用了几种numpy函数,为了便于阅读,我更喜欢逐个导入它们,而不是作为np导入。
我使用pycharm IDE,它会自动建议从numpy.ma.core导入,而不仅仅是numpy。
过去我在使用掩码数组时遇到了问题:当我期望它不会出现错误时,并且由于从pycharm自动导入而没有意识到自己在使用掩码数组。因此,我想避免使用该库,但很高兴Pycharm仍然可以为我自动进行导入,而不必在代码顶部手动进行导入。
这是numpy中的函数副本的示例。 Pycharm建议从numpy.ma.core导入,我希望仅建议numpy。
有人吗?
答案 0 :(得分:1)
所需的功能实际上在显示的自动完成框中列出,并且为numpy.lib.function_base.copy
。您可以按照以下assert
来自己证明:
import numpy as np
assert np.lib.function_base.copy is np.copy
名称空间混乱的原因是numpy.copy
函数实际上实际上是defined in numpy.lib.function_base
(链接指向源代码)。然后,通过Numpy源中顶级numpy.lib.function_base.copy
文件中的代码将numpy
导出到顶级__init__.py
命名空间。因此,Pycharm将改用copy
上numpy.lib.function_base.copy
的原始定义,而不是numpy.copy
上的别名。
最强烈的建议是,建议您在代码中使用以下语法:
import numpy as np
np.copy(...)
代替任何用法,例如:
from numpy import copy
copy(...)
对此有两个非常好的论点,一个是哲学上的,一个是实践上的:
Zen of Python告诉我们
显式优于隐式。
代码中的用法类似np.copy
会立即告诉读者,您打算使用Numpy的复制功能,而不是copy.copy
。尤其是如果您的.py
文件长几百行,那么没人(包括您三个月后)都不会知道您在文件顶部导入的内容,从而引起混乱。
在实践上,像np.copy
这样的语法可以避免名称冲突错误。这是一种当您打算使用numpy.ma.core.copy
时偶然遇到numpy.copy
时遇到的问题的好方法。 Numpy中的许多函数和方法都具有非常通用的名称(copy
,min
,max
等),这使它们极易发生冲突错误。另外,正如您所经历的那样,顶级numpy
包和Numpy中的其他地方(例如numpy.ma.core
)都存在许多同名函数。解决此问题的唯一好方法是np.copy
样式语法。