为什么将 numpy 导入为 np 用于科学计算?

计算科学 Python 麻木的
2021-12-23 17:32:24

科学家为什么要np为 fornumpy烦恼?

(请注意,这更像是一个“哲学”/推理问题 - 让我们假设您让代码按预期执行,而不管语法选择如何)

当我为科学应用程序编写代码时,数学函数(如sqrt, 以及数组)以及 Numpy 的许多其他特性都是“面包和黄油”——无处不在并且被认为是理所当然的。出于这个原因,我总是使用

from numpy import *

代替

import numpy as np

尽管我看到的几乎所有在线示例。事实上,我的一位同事发现我的代码很有用,他说他们必须仔细检查并在np任何地方插入。然而,为什么要打扰?老实说,在我编写的数千行 Python 代码中,这三个字符是多余的,浪费了我的时间。而那段时间并不是微不足道的:正如许多 SE 讨论中所述,程序员的时间比 CPU 时间更有价值。如果您想要一个超级优化的程序,请使用CFortran用于 HPC 而不是python.

使用

from numpy import sqrt

也是一种选择,但在快速制作脚本时也有缺点,您可能想在其中突然使用新功能(就像您在C, Fortran, Matlab, 中所做的那样)。

假设有一个库可以准确计算复数的平方根 - 那么它仍然更快,在必要时import complxlib as cplx使用,其他 99% 的时间。那么有没有一个真实的例子或论据来说明为什么我的方法是不好的做法?cplx.sqrtsqrt

请注意,这个问题具体是关于numpy- python 科学应用的主要内容,而不是例如super_esoteric_library8472.

1个回答

我想说,它可以用以下著名的编程原理来解释:

显式优于隐式

通常,这适用于类型;但是,它可以应用于命名空间(如@Mauro Vanzetto 所述)以及特定的库/包。

我个人喜欢np.sqrtor std::cout(而不是sqrtand cout),因为打字不会花费我很多,我可以确定不会发生棘手的变量/函数隐藏,并明确查看我是否使用来自某个特定的函数命名空间/库/包。

特别是在科学计算中,在某些情况下,即使求和的顺序也会显着改变结果,我想首先避免某种类型的问题——并通过明确指出每个函数的位置来简化我的调试工作。我使用的是来自。