max numpy vs amax vs maksimum

132

numpy memiliki tiga fungsi yang berbeda yang tampak seperti mereka dapat digunakan untuk hal-hal yang sama --- kecuali bahwa numpy.maximumdapat hanya menjadi digunakan elemen-bijaksana, sementara numpy.maxdan numpy.amaxdapat digunakan pada sumbu tertentu, atau semua elemen. Mengapa ada lebih dari sekadar numpy.max? Apakah ada beberapa kehalusan dalam kinerja ini?

(Demikian pula untuk minvs. aminvs. minimum)

DilithiumMatrix
sumber

Jawaban:

164

np.maxhanyalah alias untuk np.amax. Fungsi ini hanya bekerja pada array input tunggal dan menemukan nilai elemen maksimum di seluruh array (mengembalikan skalar). Atau, dibutuhkan axisargumen dan akan menemukan nilai maksimum sepanjang sumbu array input (mengembalikan array baru).

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

Perilaku default np.maximumadalah untuk mengambil dua array dan menghitung maksimum elemen-bijaksana mereka. Di sini, 'kompatibel' berarti bahwa satu array dapat disiarkan ke array lainnya. Sebagai contoh:

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

Tetapi np.maximumjuga merupakan fungsi universal yang artinya memiliki fitur dan metode lain yang berguna ketika bekerja dengan array multidimensi. Misalnya, Anda dapat menghitung maksimum kumulatif di atas array (atau sumbu tertentu dari array):

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

Ini tidak mungkin dengan np.max.

Anda dapat np.maximummeniru np.maxsampai batas tertentu saat menggunakan np.maximum.reduce:

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

Pengujian dasar menunjukkan bahwa kedua pendekatan tersebut sebanding dalam kinerja; dan mereka harus, sebagaimana np.max()panggilan sebenarnyanp.maximum.reduce untuk melakukan perhitungan.

Alex Riley
sumber
1
Terima kasih. Jelas seseorang dapat menggunakan amaxuntuk tujuan (root) yang sama dengan maximum, yaitu dengan numpy.amax([a1, a2], axis=0)--- tetapi apakah ini tidak dioptimalkan untuk perilaku ini numpy.maximum? Demikian pula, apakah sifat-sifat tambahan yang ditambahkan numpy.amax(misalnya axisparameter) menghalanginya dari menjadi ufunc?
DilithiumMatrix
1
Itu benar, amaxtidak dioptimalkan untuk perbandingan elemen-bijaksana dalam hal ini - input apa pun harus berupa array Numpy, sehingga daftar akan dikonversi sebelum operasi berjalan (dengan asumsi bahwa kedua bentuk itu sama). Dokumen untuk amaxsecara khusus mengatakan bahwa maximumlebih cepat di sini.
Alex Riley
Pada pertanyaan kedua: Saya kira amax bisa dibuat menjadi ufunc, meskipun tujuan utama ufunc adalah untuk memungkinkan operasi disiarkan di antara array. Tampaknya sedikit kebutuhan untuk membuat maxUufunc unary. Saya pikir amaxada sebelum ufuncs benar-benar benda (itu berasal dari numerik, orangtua NumPy) sehingga juga disimpan untuk anak cucu.
Alex Riley
Berikut maximum.reduce ini lebih disukai untuk kinerja: 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: Saya pikir dokumentasi mengacu pada max()fungsi yang dibangun di Python , bukan numpy.max(), tetapi jelas layak untuk menunjukkan bahwa Python max()lebih lambat.
Alex Riley
21

Anda telah menyatakan mengapa np.maximumberbeda - mengembalikan array yang merupakan elemen-maksimum maksimum antara dua array.

As np.amaxdan np.max: keduanya memanggil fungsi yang sama - np.maxhanya alias untuk np.amax, dan mereka menghitung maksimum semua elemen dalam array, atau sepanjang sumbu array.

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>
tmdavison
sumber
2
Saya merasa bodoh sekarang, saya lakukan from numpy import max as np_maxhanya untuk menghindari konflik dengan obat generik maxsetiap saat sementara saya bisa saja menggunakan amax jangat .
Bas Jansen
8

Untuk kelengkapan, di Numpy ada empat fungsi terkait maksimum . Mereka jatuh ke dalam dua kategori berbeda:

  • np.amax/np.max, np.nanmax: untuk statistik pesanan array tunggal
  • dan np.maximum, np.fmax: untuk perbandingan unsur-bijaksana dua array

I. Untuk statistik pesanan array tunggal

Penyebar np.amax/np.maxNaN dan rekanannya yang tidak tahu NaN np.nanmax.

  • np.maxhanya alias np.amax, jadi mereka dianggap sebagai satu fungsi.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxmenyebarkan NaN sementara np.nanmaxmengabaikan NaN.

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

II Untuk perbandingan elemen-bijaksana dari dua array

Penyebar NaN np.maximumdan rekanan jahil NaN-nya np.fmax.

  • Kedua fungsi membutuhkan dua array sebagai dua argumen posisi pertama untuk dibandingkan.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximummenyebarkan NaN sementara np.fmaxmengabaikan 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])
  • Fungsi elemen-bijaksana adalah np.ufunc( Fungsi Universal ) , yang berarti mereka memiliki beberapa properti khusus yang tidak memiliki fungsi Numpy normal.

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

Dan akhirnya, aturan yang sama berlaku untuk empat fungsi terkait minimum :

  • np.amin/np.min, np.nanmin;
  • dan np.minimum, np.fmin.
YaOzI
sumber
0

np.maximum tidak hanya membandingkan elementwise tetapi juga membandingkan array elementwise dengan nilai tunggal

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
shivaraj karki
sumber