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?
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?
Yanıtlar:
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
...
np.average
beri weights
zaten isteğe bağlıdır. Gereksiz görünüyor ve sadece kullanıcıların kafasını karıştırıyor.
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
np.ma.average
çalışır. Ayrıca, bir hata raporu var .
Çağrınızda iki işlev aynıdır.
average
gerçi ağırlıklı bir ortalama hesaplayabilir.
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.average
izin vermiyor dtype
. Bir h5
dosyadan 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.average
Bu 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.sum
da np.mean
, uygun şekilde (uygun hassasiyetle) kullanarak açıkça hesaplayacağım .