numpy max เทียบกับ amax เทียบกับ maximum


133

numpy มีฟังก์ชันที่แตกต่างกันสามฟังก์ชันซึ่งดูเหมือนว่าสามารถใช้กับสิ่งเดียวกันได้ยกเว้นว่าnumpy.maximumสามารถใช้ได้เฉพาะองค์ประกอบที่ชาญฉลาดในขณะที่numpy.maxและnumpy.amaxสามารถใช้ได้กับแกนเฉพาะหรือองค์ประกอบทั้งหมด ทำไมถึงมีมากกว่าแค่numpy.max? มีความละเอียดอ่อนในการแสดงหรือไม่?

(ในทำนองเดียวกันminกับaminเทียบกับminimum)

คำตอบ:


168

np.maxnp.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เพื่อวัตถุประสงค์ (root) เดียวกันmaximumเช่นกับnumpy.amax([a1, a2], axis=0)--- แต่สิ่งนี้ไม่เหมาะสำหรับพฤติกรรมนี้numpy.maximumหรือไม่? ในทำนองเดียวกันสิ่งที่เพิ่มเข้ามาของnumpy.amax(เช่นaxisพารามิเตอร์) จะป้องกันไม่ให้เป็น a ufunc?
DilithiumMatrix

1
ถูกต้องamaxไม่ได้รับการปรับให้เหมาะสมสำหรับการเปรียบเทียบองค์ประกอบที่ชาญฉลาดในสิ่งนี้ - อินพุตใด ๆ จะต้องเป็นอาร์เรย์ Numpy ดังนั้นรายการนั้นจะถูกแปลงก่อนที่การดำเนินการจะเริ่มทำงาน (สมมติว่าทั้งสองรูปร่างเหมือนกัน) เอกสารสำหรับamaxพูดโดยเฉพาะว่าmaximumเร็วกว่าที่นี่
Alex Riley

ในคำถามที่สอง: ฉันเดาว่าamax อาจถูกทำให้เป็น ufunc แม้ว่าจุดประสงค์หลักของ ufuncs คือการอนุญาตให้มีการถ่ายทอดการดำเนินการระหว่างอาร์เรย์ ดูเหมือนว่าจะมีความจำเป็นเพียงเล็กน้อยในการสร้างmaxufunc แบบ unary ฉันคิดว่าamaxมีอยู่ก่อน ufuncs เป็นเรื่องจริง (มาจากตัวเลขพ่อแม่ของ 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.[... ]
Tom Hale

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.maxnp.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

ครั้งที่สอง สำหรับการเปรียบเทียบองค์ประกอบที่ชาญฉลาดของสองอาร์เรย์

ตัวแพร่กระจาย NaNs 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.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 ไม่เพียง แต่เปรียบเทียบ elementwise แต่ยังเปรียบเทียบอาร์เรย์ elementwise ด้วยค่าเดียว

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.