2016-01-05 43 views
5

Tôi có một tập hợp dữ liệu (X, Y). Giá trị biến độc lập của tôi X không phải là duy nhất, vì vậy có nhiều giá trị lặp lại, tôi muốn xuất một mảng mới chứa: X_unique, là danh sách các giá trị duy nhất của X. Y_mean, giá trị trung bình của tất cả các giá trị Y tương ứng với X_unique . Y_std, độ lệch chuẩn của tất cả các giá trị Y tương ứng với X_unique.Thực hiện trung bình nhóm và độ lệch chuẩn với các mảng NumPy

x = data[:,0] 
y = data[:,1] 
+1

Bạn có thể thêm một [Minimal, Hoàn thành, và kiểm chứng ví dụ] (http://stackoverflow.com/help/mcve) cho câu hỏi của bạn? – Kasramvd

+0

Hãy xem http://stackoverflow.com/questions/4373631/sum-array-by-number-in-numpy –

+1

Ngoài ra: nếu bạn đang làm việc với dữ liệu thực tế, có thể bạn sẽ thấy dễ dàng hơn để sử dụng ['pandas'] (http://pandas.pydata.org) hơn là numpy trần. Nếu 'data' của bạn là' DataFrame' thay vì 'ndarray', giống như' df.groupby (0) [1] .agg (["mean", "std"]) 'sẽ hoạt động .. – DSM

Trả lời

2
x_unique = np.unique(x) 
y_means = np.array([np.mean(y[x==u]) for u in x_unique]) 
y_stds = np.array([np.std(y[x==u]) for u in x_unique]) 
4

Bạn có thể sử dụng binned_statistic from scipy.stats có hỗ trợ chức năng thống kê khác nhau được áp dụng trong khối qua một mảng 1D. Để có được khối, chúng ta cần phải sắp xếp và nhận được vị trí của sự thay đổi (nơi khối thay đổi), mà np.unique sẽ hữu ích. Đưa tất cả những, đây là một thực hiện -

from scipy.stats import binned_statistic as bstat 

# Sort data corresponding to argsort of first column 
sdata = data[data[:,0].argsort()] 

# Unique col-1 elements and positions of breaks (elements are not identical) 
unq_x,breaks = np.unique(sdata[:,0],return_index=True) 
breaks = np.append(breaks,data.shape[0]) 

# Use binned statistic to get grouped average and std deviation values 
idx_range = np.arange(data.shape[0]) 
avg_y,_,_ = bstat(x=idx_range, values=sdata[:,1], statistic='mean', bins=breaks) 
std_y,_,_ = bstat(x=idx_range, values=sdata[:,1], statistic='std', bins=breaks) 

Từ các tài liệu của binned_statistic, người ta cũng có thể sử dụng một chức năng thống kê tùy chỉnh:

chức năng: một chức năng người dùng định nghĩa mà phải mất một mảng 1D của các giá trị , và xuất ra một thống kê số duy nhất. Hàm này sẽ được gọi là trên các giá trị trong mỗi thùng. Thùng trống sẽ được thể hiện bằng hàm ([]) hoặc NaN nếu điều này trả về lỗi.

mẫu đầu vào, đầu ra -

In [121]: data 
Out[121]: 
array([[2, 5], 
     [2, 2], 
     [1, 5], 
     [3, 8], 
     [0, 8], 
     [6, 7], 
     [8, 1], 
     [2, 5], 
     [6, 8], 
     [1, 8]]) 

In [122]: np.column_stack((unq_x,avg_y,std_y)) 
Out[122]: 
array([[ 0.  , 8.  , 0.  ], 
     [ 1.  , 6.5  , 1.5  ], 
     [ 2.  , 4.  , 1.41421356], 
     [ 3.  , 8.  , 0.  ], 
     [ 6.  , 7.5  , 0.5  ], 
     [ 8.  , 1.  , 0.  ]]) 
+0

Didn ' t biết về sự tồn tại của 'binned_statistic'. Tôi có thể sẽ sử dụng nó rất nhiều trong tương lai gần! Tôi đã viết mã cython để đạt được những điều tương tự lol! cảm ơn! –

+0

@imaluengo Tôi biết nó có thể nhận được giá trị trung bình, nhưng tôi không chắc chắn về độ lệch chuẩn, và nó đã hoạt động! Nguồn là câu trả lời này - http://stackoverflow.com/a/29894547/3293881. Có vẻ thực sự gọn gàng để có một cái gì đó tự nhiên với các mảng NumPy! – Divakar

1

Pandas được thực hiện cho nhiệm vụ như:

data=np.random.randint(1,5,20).reshape(10,2) 
import pandas 
pandas.DataFrame(data).groupby(0).mean() 

cho

  1 
0   
1 2.666667 
2 3.000000 
3 2.000000 
4 1.500000 
Các vấn đề liên quan