numpy max vs amax vs 最大值

Posted

技术标签:

【中文标题】numpy max vs amax vs 最大值【英文标题】:numpy max vs amax vs maximum 【发布时间】:2016-02-07 18:28:35 【问题描述】:

numpy 具有三个不同的功能,它们似乎可以用于相同的事情 --- 除了 numpy.maximum 只能 以元素方式使用,而 numpy.maxnumpy.amax可用于特定轴或所有元素。为什么不仅仅是numpy.max?这在性能上有什么微妙之处吗?

(同样适用于min vs. amin vs. minimum

【问题讨论】:

【参考方案1】:

np.maximum 不仅逐元素比较,而且还逐元素比较数组与单个值

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])

【讨论】:

【参考方案2】:

np.max 只是np.amax 的别名。此函数仅适用于 single 输入数组,并在整个数组中找到最大元素的值(返回一个标量)。或者,它采用axis 参数,并沿输入数组的轴找到最大值(返回一个新数组)。

>>> a = np.array([[0, 1, 6],
                  [2, 4, 1]])
>>> np.max(a)
6
>>> np.max(a, axis=0) # max of each column
array([2, 4, 6])

np.maximum 的默认行为是采用 两个 数组并计算它们的元素最大值。在这里,“兼容”意味着一个数组可以广播到另一个数组。例如:

>>> b = np.array([3, 6, 1])
>>> c = np.array([4, 2, 9])
>>> np.maximum(b, c)
array([4, 6, 9])

np.maximum 也是universal function,这意味着它具有其他在处理多维数组时非常有用的特性和方法。例如,您可以计算数组(或数组的特定轴)上的累积最大值:

>>> d = np.array([2, 0, 3, -4, -2, 7, 9])
>>> np.maximum.accumulate(d)
array([2, 2, 3, 3, 3, 7, 9])

np.max 无法做到这一点。

在使用np.maximum.reduce时,可以让np.maximum在一定程度上模仿np.max

>>> np.maximum.reduce(d)
9
>>> np.max(d)
9

基本测试表明这两种方法的性能相当;他们应该像np.max() actually calls np.maximum.reduce 那样进行计算。

【讨论】:

谢谢。显然,可以将amax 用于与maximum 相同的(根)目的,即使用numpy.amax([a1, a2], axis=0) --- 但这不是像numpy.maximum 那样针对这种行为进行优化吗?同样,numpy.amax 的附加细节(例如axis 参数)是否会阻止它成为ufunc 没错,amax 在此没有针对元素比较进行优化 - 任何输入都需要是 Numpy 数组,以便在操作运行之前转换列表(假设两个形状相同)。 amax 的文档特别说 maximum 在这里更快。 关于第二个问题:我猜amax可以做成一个ufunc,虽然ufuncs的主要目的是允许在数组之间广播操作。似乎没有必要将 max 设为一元 ufunc。我认为amax 存在于 ufunc 真正成为事物之前(它来自数字,NumPy 的父级),因此也保留给后代。 Here maximum.reduce 性能优先:The Python function max() will find the maximum over a one-dimensional array, but it will do so using a slower sequence interface. The reduce method of the maximum ufunc is much faster. Also, the max() method will not give answers you might expect for arrays with greater than one dimension. [...] @TomHale:我认为文档是指 Python 内置的 max() 函数,而不是 numpy.max(),但绝对值得指出的是 Python max() 更慢。 【参考方案3】:

为了完整起见,在 Numpy 中有四个 maximum 相关的函数。它们分为两个不同的类别:

np.amax/np.maxnp.nanmax:用于单个数组订单统计 和np.maximumnp.fmax:用于两个数组的元素比较

我。 For single array order statistics

NaNs 传播者 np.amax/np.max 和它的 NaN 无知对应物 np.nanmax

np.max 只是np.amax 的别名,因此它们被视为一个函数。

>>> np.max.__name__
'amax'
>>> np.max is np.amax
True

np.max 传播 NaN,而 np.nanmax 忽略 NaN。

>>> np.max([np.nan, 3.14, -1])
nan
>>> np.nanmax([np.nan, 3.14, -1])
3.14

二。 For element-wise comparison of two arrays

NaNs 传播者 np.maximum 和它的 NaNs 无知对应物 np.fmax

这两个函数都需要两个数组作为前两个位置参数来比较。

# x1 and x2 must be the same shape or can be broadcast
np.maximum(x1, x2, /, ...);
np.fmax(x1, x2, /, ...)

np.maximum 传播 NaN,而 np.fmax 忽略 NaN。

>>> np.maximum([np.nan, 3.14, 0], [np.NINF, np.nan, 2.72])
array([ nan,  nan, 2.72])
>>> np.fmax([np.nan, 3.14, 0], [np.NINF, np.nan, 2.72])
array([-inf, 3.14, 2.72])

逐元素函数是np.ufunc(Universal Function),这意味着它们具有一些普通 Numpy 函数所没有的特殊属性。

>>> type(np.maximum)
<class 'numpy.ufunc'>
>>> type(np.fmax)
<class 'numpy.ufunc'>
>>> #---------------#
>>> type(np.max)
<class 'function'>
>>> type(np.nanmax)
<class 'function'>

最后,同样的规则适用于四个 minimum 相关函数:

np.amin/np.minnp.nanmin; 和np.minimumnp.fmin

【讨论】:

【参考方案4】:

您已经说明了为什么 np.maximum 不同 - 它返回一个数组,该数组是两个数组之间的元素最大值。

至于np.amaxnp.max:它们都调用相同的函数——np.max 只是np.amax 的别名,它们计算数组中所有元素的最大值,或者沿数组。

In [1]: import numpy as np

In [2]: np.amax
Out[2]: <function numpy.core.fromnumeric.amax>

In [3]: np.max
Out[3]: <function numpy.core.fromnumeric.amax>

【讨论】:

我现在感觉很愚蠢,我一直在使用from numpy import max as np_max 只是为了避免与通用的max 冲突,而我本来可以使用amax 隐藏

以上是关于numpy max vs amax vs 最大值的主要内容,如果未能解决你的问题,请参考以下文章

NumPy统计函数

14numpy——统计函数

Max-pooling VS Sum-pooling

win10 vs2019编译c++版本的numpy

numpy.stack vs concatenate vs hstack vs vstack

MAX with Inner join VS rank() over