我应该使用 np.absolute 还是 np.abs?

Should I use np.absolute or np.abs?

Numpy 提供通过

定义的 np.absolute and the alias np.abs
from .numeric import absolute as abs

这似乎明显违反了 the zen of python:

There should be one-- and preferably only one --obvious way to do it.

所以我猜这是有充分理由的。

我个人几乎在我的所有代码中都使用了 np.abs 并查看了例如Stack Overflow 上 np.abs vs np.absolute 的搜索结果数量似乎绝大多数人都这样做(2130 对 244 次点击)。

有什么理由我应该在我的代码中优先使用 np.absolute 而不是 np.abs,还是我应该使用更多 "standard" np.abs

可能是因为有一个同名的内置函数,absnp.amaxnp.aminnp.round_也是如此。

NumPy 函数的别名 abs, min, max and round 仅在顶级包中定义。

所以np.absnp.absolute是完全一样的。使用哪一个都没有关系。

短名称有几个优点:它们更短并且为 Python 程序员所知,因为名称与内置 Python 函数相同。所以最终用户更容易(更少输入,更少记住)。

但也有不同名称的原因:NumPy(或更一般的第 3 方包)有时需要 Python 函数 absmin 等。所以在package 他们定义了不同名称的函数,所以你仍然可以访问 Python 函数——而且只是在包的顶层你公开了 "shortcuts"。注意:在这种情况下,不同的名称并不是唯一可用的选项:如果隐藏了内置名称,可以使用 Python 模块 builtins 来访问内置函数。

也可能是这种情况(但这纯粹是我的猜测)它们最初只包含长名称函数 absolute(等等),后来才添加短别名。作为一个大型且使用良好的库,NumPy 开发人员不会轻易删除或弃用一些东西。所以他们可能只保留长名称,因为如果他们删除它们可能会破坏旧的 code/scripts。

还有Python's built-in abs(), but really all those functions are doing the same thing. They're even exactly equally fast! (This is not the case for other functions, like max().)

重现情节的代码:

import numpy as np
import perfplot


def np_absolute(x):
    return np.absolute(x)


def np_abs(x):
    return np.abs(x)


def builtin_abs(x):
    return abs(x)


b = perfplot.bench(
    setup=np.random.rand,
    kernels=[np_abs, np_absolute, builtin_abs],
    n_range=[2 ** k for k in range(25)],
    xlabel="len(data)",
)
b.save("out.png")
b.show()