2013-10-15 41 views
17

Sử dụng Numpy/Python, có thể trả lại giá trị trung bình và phương sai từ một cuộc gọi hàm đơn không?Numpy trung bình VÀ phương sai từ chức năng duy nhất?

Tôi biết rằng tôi có thể thực hiện chúng riêng biệt, nhưng giá trị trung bình là cần thiết để tính toán độ lệch chuẩn mẫu. Vì vậy, nếu tôi sử dụng các hàm riêng biệt để lấy giá trị trung bình và phương sai, tôi sẽ bổ sung thêm chi phí không cần thiết.

Tôi đã thử xem các tài liệu gọn gàng ở đây (http://docs.scipy.org/doc/numpy/reference/routines.statistics.html), nhưng không thành công.

+0

Tại sao bạn không sử dụng numpy.std? Hay bạn muốn tính toán một cái gì đó khác với độ lệch chuẩn? – Greg

Trả lời

24

Bạn không thể vượt qua một bình biết đến np.std hoặc np.var, bạn sẽ phải chờ cho new standard library statistics module, nhưng trong khi chờ đợi, bạn có thể tiết kiệm một ít thời gian bằng cách sử dụng công thức:

In [329]: a = np.random.rand(1000) 

In [330]: %%timeit 
    .....: a.mean() 
    .....: a.var() 
    .....: 
10000 loops, best of 3: 80.6 µs per loop 

In [331]: %%timeit 
    .....: m = a.mean() 
    .....: np.mean((a-m)**2) 
    .....: 
10000 loops, best of 3: 60.9 µs per loop 

In [332]: m = a.mean() 

In [333]: a.var() 
Out[333]: 0.078365856465916137 

In [334]: np.mean((a-m)**2) 
Out[334]: 0.078365856465916137 

Nếu bạn thực sự đang cố gắng để tăng tốc, hãy thử np.dot để làm bình phương và tổng hợp (vì đó là một dot-sản phẩm là gì):

In [335]: np.dot(a-m,a-m)/a.size 
Out[335]: 0.078365856465916137 

In [336]: %%timeit 
    .....: m = a.mean() 
    .....: c = a-m 
    .....: np.dot(c,c)/a.size 
    .....: 
10000 loops, best of 3: 38.2 µs per loop 
+1

Nội dung ấn tượng! – Ginger

+5

Đối với người đọc trong tương lai: [mô-đun thống kê được thêm vào Python 3.4] (https://docs.python.org/3/library/statistics.html) và hàm phương sai có thể được chuyển qua một phương tiện đã được tính toán để tiết kiệm thời gian xử lý. Tôi không chắc chắn như thế nào hiệu suất của nó so sánh với numpy, mặc dù. –

0

bạn cũng có thể tránh được trừ bằng cách sử dụng mối quan hệ giữa trung bình, phương sai và sức mạnh của tín hiệu:

In [7]: import numpy as np 

In [8]: a = np.random.rand(1000) 

In [9]: %%timeit 
    ...: a.mean() 
    ...: a.var() 
    ...: 
10000 loops, best of 3: 24.7 us per loop 

In [10]: %%timeit 
    ...: m = a.mean() 
    ...: np.mean((a-m)**2) 
    ...: 
100000 loops, best of 3: 18.5 us per loop 

In [11]: %%timeit 
    ...: m = a.mean() 
    ...: power = np.mean(a ** 2) 
    ...: power - m ** 2 
    ...: 
100000 loops, best of 3: 17.3 us per loop 

In [12]: %%timeit 
    ...: m = a.mean() 
    ...: power = np.dot(a, a)/a.size 
    ...: power - m ** 2 
    ...: 
100000 loops, best of 3: 9.16 us per loop 
Các vấn đề liên quan