np.mean () vs np.average () dengan Python NumPy?

191

Saya melihat itu

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

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

Namun, harus ada beberapa perbedaan, karena bagaimanapun keduanya adalah dua fungsi yang berbeda.

Apa perbedaan di antara mereka?

Sibbs Gambling
sumber
20
Sebenarnya, dokumentasi tidak membuatnya segera jelas, sejauh yang saya bisa lihat. Tidak mengatakan tidak mungkin untuk mengatakannya, tetapi saya pikir pertanyaan ini berlaku untuk Stack Overflow.
BlackVegetable
1
numpy.mean: Mengembalikan rata-rata elemen array.
joaquin
@ joaquin: "Hitung rata-rata aritmatika di sepanjang sumbu yang ditentukan." vs "Hitung rata-rata tertimbang di sepanjang sumbu yang ditentukan."?
Blender
@Bender benar. Saya hanya mencoba membuat semacam tanggapan lucu terhadap komentar Anda karena jika saya mengikuti instruksi Anda, hal pertama yang saya baca di dokumen untuk numpy.mean adalah numpy.mean: Mengembalikan rata-rata elemen array yang lucu jika Anda mencari jawaban untuk pertanyaan OP.
joaquin

Jawaban:

181

np.average mengambil parameter bobot opsional. Jika tidak disediakan mereka setara. Lihatlah kode sumber: Mean , Average

np.berarti:

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

np.rata-rata:

...
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
...
Palu
sumber
60
Mengapa mereka menawarkan dua fungsi yang berbeda? Sepertinya mereka harus menawarkan np.averagekarena weightssudah opsional. Tampaknya tidak perlu dan hanya berfungsi untuk membingungkan pengguna.
Geoff
6
@ Geoff Saya lebih suka mereka melempar NotImplementedException untuk "rata-rata", untuk mendidik pengguna bahwa rata-rata aritmatika tidak identik dengan "rata-rata".
FooBar
27

np.mean selalu menghitung rata-rata aritmatika, dan memiliki beberapa opsi tambahan untuk input dan output (misalnya tipe data apa yang digunakan, di mana harus menempatkan hasilnya).

np.averagedapat menghitung rata-rata tertimbang jika weightsparameter diberikan.

Amber
sumber
25

Dalam beberapa versi numpy ada perbedaan penting yang harus Anda ketahui:

average jangan mengambil topeng akun, jadi hitung rata-rata seluruh set data.

mean mengambil topeng akun, jadi hitung rata-rata hanya di atas nilai yang belum kedok.

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
GM
sumber
1
Catatan: np.ma.averageberfungsi. Juga, ada laporan bug .
Neil G
2

Dalam doa Anda, kedua fungsi itu sama.

average dapat menghitung rata-rata tertimbang sekalipun.

Tautan dokumen: meandanaverage

Prashant Kumar
sumber
0

Selain perbedaan yang telah dicatat, ada perbedaan lain yang sangat penting yang baru saja saya temukan dengan cara yang sulit: tidak seperti np.mean, np.averagetidak mengizinkan dtypekata kunci, yang penting untuk mendapatkan hasil yang benar dalam beberapa kasus. Saya memiliki array presisi tunggal yang sangat besar yang diakses dari h5file. Jika saya mengambil nilai rata-rata sepanjang sumbu 0 dan 1, saya mendapatkan hasil yang sangat salah kecuali jika saya menentukan 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

Sayangnya, kecuali Anda tahu apa yang harus dicari, Anda tidak dapat selalu mengatakan bahwa hasil Anda salah. Saya tidak akan pernah menggunakan np.averagelagi karena alasan ini tetapi akan selalu digunakan np.mean(.., dtype='float64')pada array besar. Jika saya ingin rata-rata tertimbang, saya akan menghitungnya secara eksplisit menggunakan produk dari vektor bobot dan array target dan kemudian salah satu , np.sumatau np.meansesuai (dengan presisi yang sesuai juga).

Grant Petty
sumber