np.mean () vs np.average () ใน Python NumPy?


191

ฉันสังเกตเห็นว่า

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

อย่างไรก็ตามควรมีความแตกต่างเนื่องจากหลังจากพวกเขาเป็นสองหน้าที่แตกต่างกัน

ความแตกต่างระหว่างพวกเขาคืออะไร?


20
ที่จริงแล้วเอกสารไม่ได้ทำให้ชัดเจนทันทีเท่าที่ฉันเห็น ไม่ได้บอกว่ามันเป็นไปไม่ได้ที่จะบอก แต่ฉันคิดว่าคำถามนี้ใช้ได้กับ Stack Overflow เช่นเดียวกัน
BlackVegetable

1
numpy.mean: ส่งคืนค่าเฉลี่ยขององค์ประกอบอาร์เรย์
joaquin

@joaquin: "คำนวณค่าเฉลี่ยเลขคณิตตามแกนที่ระบุ" vs "คำนวณค่าเฉลี่ยถ่วงน้ำหนักตามแนวแกนที่ระบุ"?
เครื่องปั่น

@ ผู้ให้ข้อมูลที่ถูกต้อง ฉันแค่พยายามทำให้การตอบสนองต่อความคิดเห็นของคุณเป็นเรื่องตลกเพราะถ้าฉันทำตามคำแนะนำของคุณสิ่งแรกที่ฉันอ่านในเอกสารสำหรับ numpy.meanคือnumpy.mean: คืนค่าเฉลี่ยขององค์ประกอบอาเรย์ซึ่งตลกถ้าคุณเป็น กำลังมองหาคำตอบสำหรับคำถาม OP
joaquin

คำตอบ:


181

np.average ใช้พารามิเตอร์น้ำหนักทางเลือก หากไม่ได้ให้มาพวกเขาจะเทียบเท่า ดูซอร์สโค้ด: ค่าเฉลี่ย , ค่าเฉลี่ย

np.mean:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np.average:

...
if weights is None :
    avg = a.mean(axis)
    scl = avg.dtype.type(a.size/avg.size)
else:
    #code that does weighted mean here

if returned: #returned is another optional argument
    scl = np.multiply(avg, 0) + scl
    return avg, scl
else:
    return avg
...

60
ทำไมพวกเขาถึงมีฟังก์ชั่นที่แตกต่างกันสองอย่าง ดูเหมือนว่าพวกเขาควรจะให้np.averageเพราะweightsเป็นตัวเลือกแล้ว ดูเหมือนว่าไม่จำเป็นและทำหน้าที่สร้างความสับสนให้ผู้ใช้เท่านั้น
เจฟฟ์

6
@Geoff ฉันอยากให้พวกเขาโยน NotImplementedException สำหรับ "เฉลี่ย" เพื่อให้ความรู้แก่ผู้ใช้ว่าค่าเฉลี่ยเลขคณิตไม่เหมือนกับ "ค่าเฉลี่ย"
FooBar

27

np.mean คำนวณค่าเฉลี่ยเลขคณิตเสมอและมีตัวเลือกเพิ่มเติมสำหรับอินพุทและเอาท์พุท (เช่นประเภทข้อมูลที่จะใช้ตำแหน่งที่จะวางผลลัพธ์)

np.averageสามารถคำนวณค่าเฉลี่ยถ่วงน้ำหนักได้หากกำหนดweightsพารามิเตอร์ไว้


25

ในบางเวอร์ชั่นของ numpyมีความแตกต่างที่สำคัญอื่นที่คุณต้องระวัง:

average อย่าใช้รูปแบบของบัญชีดังนั้นให้คำนวณค่าเฉลี่ยของชุดข้อมูลทั้งหมด

mean ใช้รูปแบบของบัญชีเพื่อคำนวณค่าเฉลี่ยเฉพาะค่าที่ไม่เปิดเผย

g = [1,2,3,55,66,77]
f = np.ma.masked_greater(g,5)

np.average(f)
Out: 34.0

np.mean(f)
Out: 2.0

1
หมายเหตุ: ใช้np.ma.averageงานได้ นอกจากนี้ยังมีการรายงานข้อผิดพลาด
Neil G

2

ในการร้องขอของคุณทั้งสองฟังก์ชั่นจะเหมือนกัน

average สามารถคำนวณค่าเฉลี่ยถ่วงน้ำหนักได้

ลิงก์เอกสาร: meanและaverage


0

นอกเหนือไปจากความแตกต่างที่ระบุไว้แล้วมีอีกความแตกต่างที่สำคัญมากที่ผมเพียงแค่ตอนนี้ค้นพบวิธีที่ยาก: แตกต่างnp.mean, np.averageไม่อนุญาตให้มีdtypeคำหลักซึ่งเป็นสิ่งจำเป็นสำหรับการรับผลลัพธ์ที่ถูกต้องในบางกรณี ฉันมีอาร์เรย์ความแม่นยำเดี่ยวขนาดใหญ่มากที่เข้าถึงได้จากh5ไฟล์ หากฉันใช้ค่าเฉลี่ยตามแกน 0 และ 1 ฉันจะได้ผลลัพธ์ที่ไม่ถูกต้องหากไม่ได้ระบุไว้dtype='float64':

>T.shape
(4096, 4096, 720)
>T.dtype
dtype('<f4')

m1 = np.average(T, axis=(0,1))                #  garbage
m2 = np.mean(T, axis=(0,1))                   #  the same garbage
m3 = np.mean(T, axis=(0,1), dtype='float64')  # correct results

น่าเสียดายที่ถ้าคุณไม่ทราบว่าจะต้องหาอะไรคุณไม่สามารถบอกได้ว่าผลลัพธ์ของคุณนั้นผิด ฉันจะไม่ใช้np.averageอีกครั้งด้วยเหตุผลนี้ แต่จะใช้np.mean(.., dtype='float64')กับอาร์เรย์ขนาดใหญ่ทุกครั้ง ถ้าฉันต้องการค่าเฉลี่ยถ่วงน้ำหนักฉันจะคำนวณโดยใช้ผลิตภัณฑ์ของเวกเตอร์น้ำหนักและอาเรย์เป้าหมายแล้วอย่างใดอย่างหนึ่งnp.sumหรือnp.meanตามความเหมาะสม (ด้วยความแม่นยำที่เหมาะสมเช่นกัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.