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

Jon*_*ler 51 python numpy absolute-value

Numpy提供了两者np.absolutenp.abs通过定义的别名

from .numeric import absolute as abs
Run Code Online (Sandbox Code Playgroud)

这似乎明显违反了蟒蛇的禅宗:

应该有一个 - 最好只有一个 - 明显的方法来做到这一点.

所以我猜这有充分的理由.

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

没有任何理由,我应该优先使用np.absolutenp.abs在我的代码,或者我应该简单地去为更多的"标准" np.abs

MSe*_*ert 46

这很可能是因为有一个同名的内置函数abs.对于和np.amax,也是如此.np.aminnp.round_

为NumPy的函数的别名abs,min,maxround仅在顶层包定义.

所以np.abs并且np.absolute完全相同.你使用哪一个并不重要.

短名称有几个优点:它们更短,并且Python程序员知道它们,因为名称与内置Python函数相同.因此,最终用户可以更轻松(更少打字,更少记住).

但也有原因,有不同的名称太:NumPy的(或更一般的第三方包)有时需要Python的功能abs,min等等.所以,他们定义了不同的名称的功能,所以你仍然可以访问Python函数封装内-和公正在包的顶层,您将公开"快捷方式".注意:在这种情况下,不同的名称不是唯一可用的选项:builtins如果有一个阴影内置名称,可以通过Python模块解决这个问题以访问内置函数.

也可能是这种情况(但这是我的纯粹推测),他们最初只包括长命名的函数absolute(等等),后来只添加了短别名.作为一个庞大且使用良好的库,NumPy开发人员不会轻易删除或弃用这些东西.因此,他们可能只保留长名称,因为它可能会破坏旧代码/脚本,如果他们将删除它们.

  • 嗯......你写的对于`abs` /`absolute`肯定是正确的,但是`np.maximum`和`np.max`并不相同.前者在两个阵列上以元素方式操作,后者是沿一个输入的轴的缩减操作. (3认同)
  • _“但是有理由使用不同的名称”_这实际上并不是避免名称遮蔽的最佳方法,不是吗?人们可以简单地在函数名称前面添加一个模块名称。 (2认同)
  • @Jeyekomon 我并不是要暗示这是最好的方法,甚至是好的方法。这只是一种可能。我想如何解决这个问题根本无法改变,因为 NumPy 试图向后兼容。因此,在这种情况下,任何关于哪个更好/最好的讨论都没有任何意义。 (2认同)

Nic*_*mer 16

还有Python 的内置函数abs(),但实际上所有这些函数都在做同样的事情。他们的速度甚至完全相同!(其他函数则不然,例如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()
Run Code Online (Sandbox Code Playgroud)