Tôi nhận thấy rằng
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Tuy nhiên, cần có một số khác biệt, vì sau tất cả chúng là hai chức năng khác nhau.
Sự khác biệt giữa chúng là gì?
Tôi nhận thấy rằng
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Tuy nhiên, cần có một số khác biệt, vì sau tất cả chúng là hai chức năng khác nhau.
Sự khác biệt giữa chúng là gì?
Câu trả lời:
np.alusive có một tham số trọng lượng tùy chọn. Nếu nó không được cung cấp, chúng là tương đương. Hãy xem mã nguồn: Trung bình , Trung bình
np.mean:
try:
mean = a.mean
except AttributeError:
return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)
np.a hiểm:
...
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
vì weights
đã là tùy chọn. Có vẻ không cần thiết và chỉ phục vụ để gây nhầm lẫn cho người dùng.
Trong một số phiên bản của numpy, có một sự khác biệt quan trọng khác mà bạn phải biết:
average
không lấy mặt nạ tài khoản, vì vậy hãy tính trung bình trên toàn bộ tập hợp dữ liệu.
mean
mất mặt nạ tài khoản, vì vậy chỉ tính trung bình trên các giá trị không được che giấu.
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
công trình. Ngoài ra, có một báo cáo lỗi .
Trong lời mời của bạn, hai chức năng là như nhau.
average
có thể tính trung bình trọng số mặc dù.
Ngoài những khác biệt đã được ghi nhận, còn có một sự khác biệt cực kỳ quan trọng mà tôi mới phát hiện ra một cách khó khăn: không giống như np.mean
, np.average
không cho phép dtype
từ khóa, điều cần thiết để có kết quả chính xác trong một số trường hợp. Tôi có một mảng chính xác đơn rất lớn được truy cập từ một h5
tệp. Nếu tôi lấy giá trị trung bình dọc theo trục 0 và 1, tôi sẽ nhận được kết quả không chính xác trừ khi tôi chỉ định 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
Thật không may, trừ khi bạn biết phải tìm gì, bạn không nhất thiết phải nói kết quả của mình là sai. Tôi sẽ không bao giờ sử dụng np.average
lại vì lý do này nhưng sẽ luôn sử dụng np.mean(.., dtype='float64')
trên bất kỳ mảng lớn nào. Nếu tôi muốn trung bình có trọng số, tôi sẽ tính toán rõ ràng bằng cách sử dụng sản phẩm của vectơ trọng số và mảng mục tiêu và sau đó np.sum
hoặc np.mean
, nếu phù hợp (cũng có độ chính xác phù hợp).