numpy max vs amax vs maximum

132

numpy tiene tres funciones diferentes, que parecen que pueden ser utilizados por las mismas cosas --- excepto que numpy.maximumpuede solamente ser usado elemento a elemento, mientras que numpy.maxy numpy.amaxpuede ser utilizado en ejes particulares, o todos los elementos. ¿Por qué hay más que solo numpy.max? ¿Hay alguna sutileza en el rendimiento?

(Del mismo modo para minvs. aminvs. minimum)

DilithiumMatrix
fuente

Respuestas:

164

np.maxes solo un alias para np.amax. Esta función solo funciona en una matriz de entrada única y encuentra el valor del elemento máximo en toda la matriz (devolviendo un escalar). Alternativamente, toma un axisargumento y encontrará el valor máximo a lo largo de un eje de la matriz de entrada (devolviendo una nueva matriz).

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

El comportamiento predeterminado de np.maximumes tomar dos matrices y calcular su máximo en cuanto a elementos. Aquí, 'compatible' significa que una matriz se puede transmitir a la otra. Por ejemplo:

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

Pero np.maximumtambién es una función universal, lo que significa que tiene otras características y métodos que resultan útiles al trabajar con matrices multidimensionales. Por ejemplo, puede calcular el máximo acumulativo sobre una matriz (o un eje particular de la matriz):

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

Esto no es posible con np.max.

Puedes np.maximumimitar np.maxhasta cierto punto cuando usas np.maximum.reduce:

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

Las pruebas básicas sugieren que los dos enfoques son comparables en rendimiento; y deberían serlo, ya que np.max()realmente llamanp.maximum.reduce a hacer el cálculo.

Alex Riley
fuente
1
Gracias. Obviamente, se puede usar amaxpara el mismo propósito (raíz) que maximum, es decir, con numpy.amax([a1, a2], axis=0)--- pero ¿no está tan optimizado para este comportamiento como numpy.maximum? Del mismo modo, ¿las sutilezas añadidas de numpy.amax(por ejemplo, el axisparámetro) impiden que sea un ufunc?
DilithiumMatrix
1
Así es, amaxno está optimizado para la comparación de elementos sabios en esto: cualquier entrada deberá ser una matriz Numpy, por lo que esa lista se convertiría antes de que se ejecutara la operación (suponiendo que las dos formas fueran las mismas). Los documentos para amaxdecir específicamente que maximumes más rápido aquí.
Alex Riley
Sobre la segunda pregunta: supongo que amax podría convertirse en un ufunc, aunque el objetivo principal de los ufuncs es permitir que las operaciones se transmitan entre matrices. Parece que hay poca necesidad de hacer maxun fallo unario. Creo que amaxexistía antes de que los ufuncs fueran realmente una cosa (vino de numérico, el padre de NumPy), por lo que también se mantiene para la posteridad.
Alex Riley
Aquí maximum.reduce se prefiere para el rendimiento: 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.[...]
Tom Hale
1
@TomHale: Creo que la documentación se refiere a la max()función integrada de Python , en lugar de hacerlo numpy.max(), pero definitivamente vale la pena señalar que Python max()es más lento.
Alex Riley
21

Ya ha indicado por qué np.maximumes diferente: devuelve una matriz que es el máximo de elementos entre dos matrices.

En cuanto a np.amaxy np.max: ambos llaman a la misma función, np.maxes solo un alias para np.amax, y calculan el máximo de todos los elementos en una matriz, o a lo largo de un eje de una matriz.

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>
tmdavison
fuente
2
Me siento estúpido ahora, estaba haciendo todo from numpy import max as np_maxlo posible para evitar conflictos con el genérico maxtodo el tiempo, mientras que podría haber usado amax pieles .
Bas Jansen
8

Para completar, en Numpy hay cuatro funciones relacionadas máximas . Se dividen en dos categorías diferentes:

  • np.amax/np.max, np.nanmax: para estadísticas de orden de matriz única
  • y np.maximum, np.fmax: para la comparación elemento a elemento de dos matrices

I. Para estadísticas de orden de matriz única

El propagador de np.amax/np.maxNaN y su contraparte ignorante de NaN np.nanmax.

  • np.maxes solo un alias de np.amax, por lo que se consideran como una función.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxpropaga NaNs mientras np.nanmaxignora NaNs.

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

II Para la comparación por elementos de dos matrices

El propagador de NaN np.maximumy su contraparte ignorante de NaN np.fmax.

  • Ambas funciones requieren dos matrices como los dos primeros argumentos posicionales para comparar.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumpropaga NaNs mientras np.fmaxignora 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])
  • Las funciones de elementos sabios son np.ufunc( Función universal ) , lo que significa que tienen algunas propiedades especiales que la función Numpy normal no tiene.

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

Y finalmente, las mismas reglas se aplican a las cuatro funciones mínimas relacionadas:

  • np.amin/np.min` np.nanmin`
  • y np.minimum, np.fmin.
YaOzI
fuente
0

np.maximum no solo compara elementwise sino que también compara array elementwise con un solo valor

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