2016-11-30 2 views
3

10 개의 상자에 넣으려고하는 배열 A가 있습니다. 여기 내가 한 일이 있습니다.Numpy에서 Binning

A = range(1,94) 
hist = np.histogram(A, bins=10) 
np.digitize(A, hist[1]) 

그러나 출력이 빈 (11)에 배치 마지막 값 (93) 11 통,하지 (10)을 가지고, 그것은 빈 (10) 했어야 때 해킹으로 문제를 해결하지만, 대부분의 무엇을 할 수 이것을하는 우아한 방법? hist [1]의 마지막 bin이 [-] 대신 [-]에 포함되어 있다는 것을 디지털화하려면 어떻게해야합니까?

+0

np.histogram의 출력은 실제로 10 빈들을 갖는다 카운트는'[10, 9, 9, 9, 9, 10, 9, 9, 9, 10]'입니다. 즉, 'histogram' 메서드는 마지막 빈의 오른쪽 경계를 포괄적으로 처리합니다. 'digitize'는 그렇지 않습니다; 그래서 그것은 '히스토그램 (histogram)'에 의해 준비된 빈 가장자리 (bin edges)와는 호환이되지 않습니다. – FTP

+0

감사합니다. zaq - 요소가 속한 bin을 가져 오는 방법이 있습니까? 위와 같은 정렬 된 목록에서는 쉽지만, 정렬되지 않은 목록이 있으면이 문제는 어려워집니다. –

답변

3

np.histogram의 출력에는 실제로 10 개의 bin이 있습니다. 마지막 (가장 오른쪽) 빈은 오른쪽 가장자리가 포함되므로 (다른 빈과 달리) 가장 큰 요소를 포함합니다.

np.digitize 메서드는 그 목적이 다르기 때문에 예외를 두지 않으므로 목록의 가장 큰 요소가 추가 빈에 배치됩니다. 과 일치하는 bin 할당을 얻으려면 fmin을 사용하여 digitize의 출력을 빈 수만큼 클램프하십시오.

A = range(1,94) 
bin_count = 10 
hist = np.histogram(A, bins=bin_count) 
np.fmin(np.digitize(A, hist[1]), bin_count) 

출력 :

array([ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 
     2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 
     4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 
     6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 
     8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 
     10, 10, 10, 10, 10, 10, 10, 10])