Python NumPy içinde np.mean () vs np.average ()?


191

Fark ettim

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

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

Bununla birlikte, bazı farklılıklar olmalıdır, çünkü sonuçta iki farklı işlevdir.

Aralarındaki farklar nelerdir?


20
Aslında, belgeler görebildiğim kadarıyla hemen netleştirmiyor. Söylemek imkansız değil, ama bu sorunun Stack Overflow için de geçerli olduğunu düşünüyorum.
BlackVegetable

1
numpy.mean: Dizi öğelerinin ortalamasını döndürür.
joaquin

@joaquin: "Belirtilen eksen boyunca aritmetik ortalamayı hesaplayın." vs "Belirtilen eksen boyunca ağırlıklı ortalamayı hesaplayın."
Blender

@Blender doğru. Yorumunuza bir tür komik yanıt vermeye çalışıyordum çünkü talimatlarınızı takip edersem , numpy.mean için dokümanda okuduğum ilk şey numpy.mean: Eğer öyleyseniz komik olan dizi öğelerinin ortalamasını döndürür OP sorununun cevabını arıyor.
joaquin

Yanıtlar:


181

np.average isteğe bağlı bir ağırlık parametresi alır. Sağlanmazsa eşdeğerdir. Kaynak koda bir göz atın: Mean , 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
Neden iki farklı işlev sunuyorlar? Onlar sadece sunmalıdır görünüyor np.averageberi weightszaten isteğe bağlıdır. Gereksiz görünüyor ve sadece kullanıcıların kafasını karıştırıyor.
Geoff

6
@Geoff Kullanıcılara aritmetik ortalamanın "ortalama" ile aynı olmadığı konusunda eğitim vermek için "ortalama" için bir NotImplementedException oluşturmasını tercih ederim.
FooBar

27

np.mean her zaman aritmetik bir ortalama hesaplar ve girdi ve çıktı için bazı ek seçeneklere sahiptir (örneğin hangi veri türlerinin kullanılacağı, sonucun nereye yerleştirileceği).

np.averageweightsparametre verilirse ağırlıklı bir ortalama hesaplayabilir .


25

Numpy'nin bazı versiyonlarında, bilmeniz gereken başka bir önemli fark var:

average maskeleri dikkate almayın, bu nedenle tüm veri kümesinin ortalamasını hesaplayın.

mean maskeleri dikkate alır, bu nedenle ortalamayı yalnızca maskelenmemiş değerler üzerinden hesaplayın.

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
Not: np.ma.averageçalışır. Ayrıca, bir hata raporu var .
Neil G


0

Belirtilen farklılıklara ek olarak, şimdi zor yolu keşfettiğim son derece önemli bir fark var: aksine np.mean, bazı durumlarda doğru sonuçlar almak için gerekli olan anahtar kelimeye np.averageizin vermiyor dtype. Bir h5dosyadan erişilen çok büyük bir tek duyarlıklı dizi var . Ortalamayı 0 ve 1 eksenleri boyunca alırsam, belirtmediğim sürece çılgınca yanlış sonuçlar alırım 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

Ne yazık ki, ne arayacağınızı bilmiyorsanız, sonuçlarınızın yanlış olduğunu söyleyemezsiniz. np.averageBu nedenle bir daha asla kullanmayacağım ama her zaman np.mean(.., dtype='float64')büyük bir dizide kullanacağım . Ağırlıklı bir ortalama istersem, ağırlık vektörü ve hedef dizinin ürününü ve daha sonra ya np.sumda np.mean, uygun şekilde (uygun hassasiyetle) kullanarak açıkça hesaplayacağım .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.