maximum index python numpy math max

index - maximum python



numpy max vs amax vs maximum (3)

numpy tiene tres funciones diferentes que parecen que se pueden usar para las mismas cosas, excepto que numpy.maximum solo se puede usar por elementos, mientras que numpy.max y numpy.amax se pueden usar en ejes particulares o en todos los elementos . ¿Por qué hay algo más que numpy.max ? ¿Hay alguna sutileza en el rendimiento?

(Del mismo modo para min vs. amin vs. minimum )


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 por elementos de dos matrices

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

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

  • np.max es 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.max propaga NaNs mientras que np.nanmax ignora los 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

Propagador de NaNs np.maximum y su contraparte ignorante de 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.maximum propaga NaNs mientras que np.fmax ignora los 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 Here , lo que significa que tienen algunas propiedades especiales que la función normal de Numpy 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 .

Ya ha indicado por qué np.maximum es diferente: devuelve una matriz que es el máximo en cuanto a elementos entre dos matrices.

En cuanto a np.amax y np.max : ambos llaman a la misma función: np.max es 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>


np.max es 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 argumento de axis 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.maximum es tomar dos matrices y calcular su máximo de 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.maximum también es una función universal, lo que significa que tiene otras características y métodos que np.maximum útiles cuando se trabaja con matrices multidimensionales. Por ejemplo, puede calcular el máximo acumulado 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 .

Puede hacer que np.maximum imite np.max en cierta medida cuando use 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 llama a np.maximum.reduce para hacer el cálculo.