ฉันสังเกตเห็นว่า
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
อย่างไรก็ตามควรมีความแตกต่างเนื่องจากหลังจากพวกเขาเป็นสองหน้าที่แตกต่างกัน
ความแตกต่างระหว่างพวกเขาคืออะไร?
ฉันสังเกตเห็นว่า
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
อย่างไรก็ตามควรมีความแตกต่างเนื่องจากหลังจากพวกเขาเป็นสองหน้าที่แตกต่างกัน
ความแตกต่างระหว่างพวกเขาคืออะไร?
คำตอบ:
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
...
np.average
เพราะweights
เป็นตัวเลือกแล้ว ดูเหมือนว่าไม่จำเป็นและทำหน้าที่สร้างความสับสนให้ผู้ใช้เท่านั้น
np.mean
คำนวณค่าเฉลี่ยเลขคณิตเสมอและมีตัวเลือกเพิ่มเติมสำหรับอินพุทและเอาท์พุท (เช่นประเภทข้อมูลที่จะใช้ตำแหน่งที่จะวางผลลัพธ์)
np.average
สามารถคำนวณค่าเฉลี่ยถ่วงน้ำหนักได้หากกำหนดweights
พารามิเตอร์ไว้
ในบางเวอร์ชั่นของ 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
ในการร้องขอของคุณทั้งสองฟังก์ชั่นจะเหมือนกัน
average
สามารถคำนวณค่าเฉลี่ยถ่วงน้ำหนักได้
นอกเหนือไปจากความแตกต่างที่ระบุไว้แล้วมีอีกความแตกต่างที่สำคัญมากที่ผมเพียงแค่ตอนนี้ค้นพบวิธีที่ยาก: แตกต่าง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
ตามความเหมาะสม (ด้วยความแม่นยำที่เหมาะสมเช่นกัน)