np.mean () so với np.alusive () trong Python NumPy?


189

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ì?


20
Trên thực tế, tài liệu không làm cho nó rõ ràng ngay lập tức, như tôi có thể thấy. Không nói là không thể nói, nhưng tôi nghĩ câu hỏi này có giá trị đối với Stack Overflow hoàn toàn giống nhau.
BlackV Donable 18/11/13

1
numpy.mean: Trả về mức trung bình của các phần tử mảng.
joaquin

@joaquin: "Tính trung bình số học dọc theo trục đã chỉ định." vs "Tính trung bình có trọng số dọc theo trục đã chỉ định."?
Máy xay sinh tố

@Blender đúng. Tôi chỉ cố gắng đưa ra một phản hồi hài hước cho nhận xét của bạn bởi vì nếu tôi làm theo hướng dẫn của bạn, điều đầu tiên tôi đọc trong tài liệu cho numpy.meannumpy.mean: Trả về mức trung bình của các phần tử mảng rất buồn cười nếu bạn là tìm kiếm câu trả lời cho câu hỏi OP
joaquin

Câu trả lời:


180

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
...

59
Tại sao họ cung cấp hai chức năng khác nhau? Có vẻ như họ chỉ nên cung cấp np.averageweightsđã 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.
Geoff

6
@Geoff Tôi thà để họ ném NotImcellenceedException cho "mức trung bình", để giáo dục người dùng rằng trung bình số học không giống với "mức trung bình".
FooBar

26

np.mean luôn luôn tính toán trung bình số học và có một số tùy chọn bổ sung cho đầu vào và đầu ra (ví dụ: sử dụng kiểu dữ liệu nào, nơi đặt kết quả).

np.averagecó thể tính trung bình có trọng số nếu weightstham số được cung cấp.


24

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

1
Lưu ý: np.ma.averagecông trình. Ngoài ra, có một báo cáo lỗi .
Neil G

2

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ù.

Liên kết tài liệu: meanaverage


0

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.averagekhông cho phép dtypetừ 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 h5tệ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.averagelạ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.sumhoặc np.mean, nếu phù hợp (cũng có độ chính xác phù hợp).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.