numpy有三个不同的函数,它们似乎可以用于相同的事情——除了numpy.maximum可以只有用于元素,而numpy.max和numpy.amax可以用于特定的轴或所有元素。为什么不止numpy.max?这在性能上有什么微妙之处吗?
numpy.maximum
numpy.max
numpy.amax
(同理,min vs. amin vs. minimum)
min
amin
minimum
你已经说明了为什么np.maximum是不同的——它返回的数组是两个数组之间的元素最大值。
np.maximum
至于np.amax和np.max:它们都调用相同的函数——np.max只是np.amax的别名,并且它们计算数组中所有元素的最大值,或者沿着数组的轴计算。
np.amax
np.max
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参数,并沿着输入数组的轴找到最大值(返回一个新数组)。
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
>>> np.maximum.reduce(d) 9 >>> np.max(d) 9
基本测试表明,这两种方法在性能上具有可比性;并且它们应该是__ABC0实际上调用np.maximum.reduce来进行计算。
为了完整起见,在Numpy中有四个最大相关的函数。它们分为两类:
np.amax/np.max
np.nanmax
np.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
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.
np.ufunc
>>> 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
np.minimum
np.fmin
np.maximum不仅比较elementwise,而且比较数组elementwise与单个值
>>>np.maximum([23, 14, 16, 20, 25], 18) array([23, 18, 18, 20, 25])