numpy max vs amax vs max


132

즉 제외 NumPy와는 --- 그들은 같은 것을 사용할 수 있습니다처럼 보일 세 가지 기능을 가지고 numpy.maximum있습니다 하면서, 요소 현명한 사용 numpy.maxnumpy.amax특정 축, 또는 모든 요소에 사용할 수 있습니다. 왜 그 이상이 numpy.max있습니까? 성능에 미묘한 부분이 있습니까?

(유사 대한 minaminminimum)

답변:


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을 가져 와서 요소 별 최대 값을 계산하는 것입니다. 여기서 '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모방 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

두 번째 질문 : ufuncs의 주요 목적은 배열간에 작업을 브로드 캐스트하는 것이지만 ufunc로 만들 amax 있다고 생각 합니다. max단항 우푼 을 만들 필요가 거의없는 것 같습니다 . 나는 amaxufuncs가 실제로 (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()함수가 아니라 파이썬을 언급한다고 생각 numpy.max()하지만, 파이썬 max()이 느리다는 것을 분명히 지적 할 가치가 있습니다.
Alex Riley

21

이미 np.maximum다른 이유를 언급 했습니다. 두 배열 사이의 요소 별 최대 값 인 배열을 반환합니다.

관해서 np.amaxnp.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
나는 지금 바보를 느낀다. 나는 단지 hides를 사용할 수 있었지만 항상 from numpy import max as np_max제네릭과의 충돌을 피하기 위해 하고 max있었다 . amax
Bas Jansen

8

완전성을 위해 Numpy에는 최대 4 개의 관련 기능이 있습니다. 그들은 두 가지 범주로 나뉩니다.

  • np.amax/np.max, np.nanmax: 단일 배열 순서 통계
  • np.maximum, np.fmax: 두 배열 의 요소 별 비교

I. 를 들어 하나의 배열 순서 통계

NaN 전파자 np.amax/np.max와 NaN 무식한 대응 자 np.nanmax.

  • np.max의 별칭 np.amax일 뿐이 므로 하나의 함수로 간주됩니다.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxNaN은 np.nanmax무시하고 NaN은 무시합니다.

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

II. 두 배열 의 요소 별 비교

NaN 전파자 np.maximum와 NaN 무식 단 np.fmax.

  • 두 함수 모두 비교할 첫 번째 두 위치 인수로 두 개의 배열이 필요합니다.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumNaN은 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])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.