我使用了几个numpy函数,为了便于阅读,我更喜欢逐个导入它们而不是导入为np。
我使用pycharm IDE,它会自动建议从numpy.ma.core导入,而不仅仅是numpy。
我在过去使用屏蔽数组时遇到了问题:当我期待它时它没有引发错误,而且我没有意识到我使用了屏蔽数组,因为pycharm的这个自动导入。所以我想避免使用该库,但如果Pycharm仍然可以自动为我执行导入,而不是我必须在代码的顶部手动执行它们,我会很高兴。
这是一个函数副本的例子,来自numpy。 Pycharm建议从numpy.ma.core导入,我希望它建议只是numpy。
任何人?
您想要的功能实际上列在您显示的自动完成框中,它是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(...)
对此有两个非常好的论据,一个是哲学论证,一个是实践论证:
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
样式语法。