2016-02-12 23 views
5

Xem xét một tính histogram của một mảng NumPy trả về tỷ lệ phần trăm:Filtering cạnh biểu đồ và đếm

# 500 random numbers between 0 and 10,000 
values = np.random.uniform(0,10000,500) 

# Histogram using e.g. 200 buckets 
perc, edges = np.histogram(values, bins=200, 
          weights=np.zeros_like(values) + 100/values.size) 

Các lợi nhuận trên hai mảng:

  • perc chứa % (tức là tỷ lệ phần trăm) của giá trị trong vòng mỗi cặp liên tiếp edges[ix]edges[ix+1] trên tổng số.
  • edges chiều dài len(hist)+1

Bây giờ, nói rằng tôi muốn lọc percedges vì vậy mà tôi chỉ kết thúc với tỷ lệ và các cạnh cho giá trị chứa trong một dòng sản phẩm mới [m, M]. '

Đó là, tôi muốn làm việc với các tiểu mảng của percedges tương ứng với khoảng thời gian giá trị trong vòng [m, M]. Không cần phải nói, mảng tỷ lệ phần trăm mới sẽ vẫn đề cập đến tổng số phân số của mảng đầu vào. Chúng tôi chỉ muốn lọc percedges để kết thúc với các mảng phụ chính xác.

Tôi làm cách nào để xử lý percedges để làm như vậy?

Giá trị của mM có thể là bất kỳ số nào của khóa học. Trong ví dụ trên, chúng ta có thể giả định ví dụ: m = 0M = 200.

Trả lời

2
m = 0; M = 200 
mask = [(m < edges) & (edges < M)] 
>>> edges[mask] 
array([ 37.4789683 , 87.07491593, 136.67086357, 186.2668112 ]) 

Hãy làm việc trên một tập dữ liệu nhỏ hơn để nó là dễ hiểu:

np.random.seed(0) 
values = np.random.uniform(0, 100, 10) 
values.sort() 
>>> values 
array([ 38.34415188, 42.36547993, 43.75872113, 54.4883183 , 
     54.88135039, 60.27633761, 64.58941131, 71.51893664, 
     89.17730008, 96.36627605]) 

# Histogram using e.g. 10 buckets 
perc, edges = np.histogram(values, bins=10, 
          weights=np.zeros_like(values) + 100./values.size) 

>>> perc 
array([ 30., 0., 20., 10., 10., 10., 0., 0., 10., 10.]) 

>>> edges 
array([ 38.34415188, 44.1463643 , 49.94857672, 55.75078913, 
     61.55300155, 67.35521397, 73.15742638, 78.9596388 , 
     84.76185122, 90.56406363, 96.36627605]) 

m = 0; M = 50 
mask = (m <= edges) & (edges < M) 
>>> mask 
array([ True, True, True, False, False, False, False, False, False, 
     False, False], dtype=bool) 

>>> edges[mask] 
array([ 38.34415188, 44.1463643 , 49.94857672]) 

>>> perc[mask[:-1]][:-1] 
array([ 30., 0.]) 

m = 40; M = 60 
mask = (m < edges) & (edges < M) 
>>> edges[mask] 
array([ 44.1463643 , 49.94857672, 55.75078913]) 
>>> perc[mask[:-1]][:-1] 
array([ 0., 20.]) 
+0

Cảm ơn, nhưng làm thế nào bây giờ chúng ta sử dụng 'mask' cũng để lọc 'perc'? –

1

Vâng, bạn có thể cần một số toán học cho việc này. Các thùng được đặt cách nhau không kém, do đó bạn có thể xác định bin là người đầu tiên đưa vào và là người cuối cùng bằng cách sử dụng độ rộng của mỗi bin:

bin_width = edges[1] - edges[0] 

Bây giờ tính toán bin hợp lệ đầu tiên và lần cuối:

first = math.floor((m - edges[0])/bin_width) + 1 # How many bins from the left 
last = math.floor((edges[-1] - M)/bin_width) + 1 # How many bins from the right 

(Bỏ qua +1 cho cả hai nếu bạn muốn bao gồm thùng chứa m hoặc M - nhưng sau đó hãy cẩn thận rằng bạn không kết thúc với giá trị âm cho đầu tiên và kéo dài)

Bây giờ bạn biết có bao nhiêu thùng để bao gồm:

valid_edges = edges[first:-last] 
valid_perc = perc[first:-last] 

Điều này sẽ loại trừ first điểm đầu tiên và last điểm cuối cùng.

Có thể là tôi chưa chú ý đủ để làm tròn và có lỗi "tắt một" bao gồm nhưng tôi nghĩ ý tưởng là âm thanh. :-)

Bạn có thể cần phải nắm bắt các trường hợp đặc biệt như M > edges[-1] nhưng để dễ đọc, tôi chưa bao gồm các trường hợp này.


Hoặc nếu các thùng không cách đều nhau mặt nạ sử dụng boolean thay vì tính toán:

first = edged[edges < m].size + 1 
last = edged[edges > M].size + 1 
Các vấn đề liên quan