numpy max vs amax vs max


132

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

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

Відповіді:


164

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параметр) не бути a ufunc?
DilithiumMatrix

1
Це правильно, amaxне оптимізовано для елементарного порівняння в цьому - будь-який вхід повинен бути масивом Numpy, щоб цей список був перетворений до запуску операції (припускаючи, що дві форми однакові). Документи amaxконкретно кажуть, що maximumтут швидше.
Алекс Райлі

Щодо другого питання: я думаю, що amax можна перетворити на нефункціональність, хоча головна мета ufuncs - дозволити трансляцію операцій між масивами. Здається, мало необхідності робити maxодинарний невдачу. Я думаю, що amaxіснували раніше, ніж ufuncs насправді була річчю (вона походить від числових, батьків NumPy), тому вона також зберігається для нащадків.
Алекс Райлі

Тут 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()повільніше.
Алекс Райлі

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 шкури .
Бас Янсен

8

Для повноти в Numpy є чотири максимально пов'язані функції. Вони поділяються на дві різні категорії:

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

I. Для статистики порядку одиночного масиву

Пропагатор NaNs np.amax/np.maxта його невігласний аналог NaNs 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. Для елементарного порівняння двох масивів

Пропагатор NaNs np.maximumта його необізнаний аналог NaNs 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( Universal Function ) , що означає, що вони мають деякі особливі властивості, яких нормальна функція 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.