numpy max - amax - maksimum


132

dışında numpy --- aynı şeyler için kullanılabilir gibi görünse üç farklı işlevlere sahiptir numpy.maximumolabilir ancak kullanılan eleman-akıllıca ederken,numpy.max ve numpy.amaxbelli eksenlerde veya tüm elementlerde kullanılabilir. Neden daha fazlası var numpy.max? Performansta bu konuda biraz incelik var mı?

(Benzer için mingenel aminvs minimum)

Yanıtlar:


165

np.maxsadece bir takma addır np.amax. Bu işlev yalnızca tek bir giriş dizisi üzerinde çalışır ve bu dizinin tamamındaki maksimum öğenin değerini bulur (bir skaler döndürür). Alternatif olarak, bir axisbağımsız değişken alır ve giriş dizisinin bir ekseni boyunca maksimum değeri bulur (yeni bir dizi döndürür).

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

Varsayılan davranış np.maximumalınmak iki diziler ve bunların öğeye göre maksimum hesaplamak. Burada 'uyumlu', bir dizinin diğerine yayınlanabileceği anlamına gelir. Örneğin:

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

Ancak np.maximumaynı zamanda evrensel bir işlevdir , bu da çok boyutlu dizilerle çalışırken yararlı olan başka özelliklere ve yöntemlere sahip olduğu anlamına gelir. Örneğin, bir dizi (veya dizinin belirli bir ekseni) üzerindeki kümülatif maksimum değeri hesaplayabilirsiniz:

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

Bu ile mümkün değil np.max.

Şunları kullanırken bir dereceye kadar np.maximumtaklit edebilirsiniz :np.maxnp.maximum.reduce

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

Temel testler, iki yaklaşımın performans açısından karşılaştırılabilir olduğunu göstermektedir; ve np.max()aslındanp.maximum.reduce hesaplamayı yapmak için çağrılar gibi olmalılar .


1
Teşekkürler. Açıkçası , yani --- ile amaxaynı (kök) amaç için kullanılabilir maximum, numpy.amax([a1, a2], axis=0)ancak bu, bu davranış için olduğu kadar optimize edilmemiş numpy.maximummi? Benzer şekilde, eklenen nitelikler numpy.amax(örneğin axisparametre) onun a olmasını engelliyor ufuncmu?
DilithiumMatrix

1
Bu doğru, amaxbu konuda eleman bazlı karşılaştırma için optimize edilmemiştir - herhangi bir girdinin bir Numpy dizisi olması gerekir, böylece işlem çalıştırılmadan önce listenin dönüştürülmesi gerekir (iki şeklin aynı olduğu varsayılarak). Özellikle dokümanlar amaxbunun maximumburada daha hızlı olduğunu söylüyor .
Alex Riley

İkinci soruya üzerinde: sanırım amax olabilir ufuncs temel amacı işlemleri diziler arasında yayınlanacak izin vermek olmasına rağmen, bir ufunc içine yapılabilir. Tek maxbir ufunc yapmaya çok az ihtiyaç var gibi görünüyor . Sanırım amaxufuncs gerçekten bir şey olmadan önce var olmuştu (NumPy'nin ebeveyni sayısaldan geliyordu) bu yüzden gelecek nesil için de saklanıyor.
Alex Riley

İşte maximum.reduce performans için tercih 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: Bence dokümantasyon Python yerleşik max()fonksiyondan ziyade yerleşik fonksiyona atıfta bulunuyor numpy.max(), ancak kesinlikle Python'un max()daha yavaş olduğunu belirtmeye değer .
Alex Riley

21

Neden np.maximumfarklı olduğunu zaten belirtmiştiniz - iki dizi arasında eleman açısından maksimum olan bir dizi döndürür.

Gelince np.amaxve np.max: ikisi de aynı işlevi çağırır - np.maxyalnızca bir takma np.amaxaddır ve bir dizideki veya bir dizinin ekseni boyunca tüm öğelerin maksimumunu hesaplarlar.

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
Şimdi kendimi aptal gibi hissediyorum , sadece postları kullanabilirken her zaman from numpy import max as np_maxjenerikle çatışmaktan kaçınmak için yapıyordum . maxamax
Bas Jansen

8

Tamlık için, Numpy'de dört maksimum ilgili işlev vardır. İki farklı kategoriye ayrılırlar:

  • np.amax/np.max, np.nanmax: tek dizi sıra istatistikleri için
  • ve np.maximum, np.fmax: bir öğeye göre karşılaştırma için iki dizi

I. için tek bir dizi sıra istatistikleri

NaNs yayıcısı np.amax/np.maxve NaN bilgisiz muadili np.nanmax.

  • np.maxyalnızca bir takma adıdır np.amax, bu nedenle tek bir işlev olarak kabul edilirler.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxNaN'leri np.nanmaxyok sayarken NaN'leri yayar .

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

II. İki dizinin eleman bazında karşılaştırması için

NaNs yayıcısı np.maximumve NaNs cahil muadili np.fmax.

  • Her iki işlev, karşılaştırmak için ilk iki konumsal bağımsız değişken olarak iki dizi gerektirir.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumNaN'leri np.fmaxyok sayarken NaN'leri yayar .

    >>> 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])
  • Element-wise fonksiyonlar np.ufunc( Universal Function ) ' dır, yani normal Numpy fonksiyonunda olmayan bazı özel özelliklere sahiptirler.

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

Son olarak, aynı kurallar, ilgili minimum dört işlev için de geçerlidir :

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

0

np.maximum sadece elementwise karşılaştırması yapmakla kalmaz, aynı zamanda elementwise diziyi tek değerle karşılaştırır

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.