Numpy Max vs amax vs maximum

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

(同理,min vs. amin vs. minimum)

304568 次浏览

你已经说明了为什么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>

np.max只是np.amax的别名。此函数仅适用于输入数组,并查找整个数组中最大元素的值(返回标量)。或者,它接受一个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的默认行为是接受两个数组并计算它们的元素最大值。这里,“compatible”意味着一个数组可以广播到另一个数组。例如:

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

但是np.maximum也是一个通用函数,这意味着它有其他在处理多维数组时有用的特性和方法。例如,你可以计算一个数组(或数组的特定轴)的累积最大值:

>>> 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

基本测试表明,这两种方法在性能上具有可比性;并且它们应该是__ABC0实际上调用np.maximum.reduce来进行计算。

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

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

对于单数组顺序统计

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

  • np.max只是np.amax的别名,所以它们被认为是一个函数。

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
    
  • np.max propagates NaNs while np.nanmax ignores NaNs.

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

II. For element-wise comparison of two arrays

NaNs propagator np.maximum and its NaNs ignorant counterpart np.fmax.

  • Both functions require two arrays as the first two positional args to compare with.

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

    >>> 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])
    
  • The element-wise functions are np.ufunc(Universal Function), which means they have some special properties that normal Numpy function don't have.

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

And finally, the same rules apply to the four minimum related functions:

  • np.amin/np.min, np.nanmin;
  • and np.minimum, np.fmin.

np.maximum不仅比较elementwise,而且比较数组elementwise与单个值

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