numpy max против amax против максимума


132

numpy имеет три разные функции, которые, похоже, могут использоваться для одних и тех же вещей, за исключением того, что numpy.maximumмогут использоваться только поэлементно, в то время как numpy.maxи numpy.amaxмогут использоваться для определенных осей или всех элементов. Почему больше, чем просто numpy.max? Есть ли в этом какая-то тонкость в исполнении?

(Аналогично для minvs. aminvs. minimum)

Ответы:


165

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- взять два массива и вычислить их поэлементный максимум. Здесь «совместимый» означает, что один массив может транслироваться другому. Например:

>>> 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имитировать np.maxпри использовании np.maximum.reduce:

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

Базовое тестирование предполагает, что эти два подхода сопоставимы по производительности; и они должны быть, поскольку на np.max()самом деле вызываетnp.maximum.reduce выполнение вычислений.


1
Спасибо. Очевидно, что можно использовать amaxдля той же (корневой) цели, что и maximum, например, с numpy.amax([a1, a2], axis=0)---, но разве это не так оптимизировано для этого поведения, как numpy.maximum? Точно так же, препятствуют ли добавленные тонкости numpy.amax(например, axisпараметр) ему быть ufunc?
DilithiumMatrix

1
Правильно, amaxздесь не оптимизировано для поэлементного сравнения - любой ввод должен быть массивом Numpy, чтобы этот список был преобразован до выполнения операции (при условии, что две формы были одинаковыми). В документации amaxконкретно говорится, что maximumздесь быстрее.
Alex Riley

По второму вопросу: я предполагаю, что его amax можно было бы превратить в ufunc, хотя основная цель ufuncs - разрешить широковещательную передачу операций между массивами. Кажется, нет необходимости делать maxунарный ufunc. Я думаю, что amaxсуществовали до того, как ufuncs действительно стали вещью (это произошло от numeric, родительского элемента NumPy), поэтому также сохраняется для потомков.
Alex Riley

Вот 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.[...]
Том Хейл

1
@TomHale: Я думаю, что документация относится к встроенной max()функции Python , а не numpy.max(), но определенно стоит отметить, что Python max()работает медленнее.
Alex Riley

21

Вы уже указали, почему np.maximumотличается - он возвращает массив, который является поэлементным максимумом между двумя массивами.

Что касается np.amaxи np.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>

2
Сейчас я чувствую себя глупо, я все время делал from numpy import max as np_maxпросто, чтобы избежать конфликта с универсальным, maxв то время как я мог бы просто использовать amax шкуры .
Bas Jansen

8

Для полноты, в Numpy есть максимум четыре связанных функции. Они делятся на две разные категории:

  • np.amax/np.max, np.nanmax: для статистики порядка одного массива
  • и np.maximum, np.fmax: для поэлементного сравнения двух массивов

I. Для статистики заказов одного массива

Распространитель np.amax/np.maxNaN и его невежественный аналог 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

II. Для поэлементного сравнения двух массивов

Распространитель NaN np.maximumи его невежественный аналог 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( Универсальная функция ) , что означает, что у них есть некоторые особые свойства, которых нет у обычной функции Numpy.

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

И, наконец, те же правила применяются к четырем минимальным связанным функциям:

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

0

np.maximum не только сравнивает поэлементно, но и сравнивает поэлементно массив с одним значением

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.