2017-09-08 5 views
1

부울 인덱스를 기반으로 값 배열을 합산하는 방법을 찾고, 모듈러스 함수를 사용하여 월 시작/끝을 결정합니다.Numpy 부울 인덱스 합계

months = np.arange(36) + 1 # +1 to denote months rather than index 
vals = np.ones(36) 
vals[12:24] = 2 
vals[24:36] = 3 

# closest try: 

vals.cumsum()[[months % 12 == 0]] # returns array([12, 36, 72]) 

# target result = array([12, 24, 36]) 

vals.sum() 함수는 단지 전체를 요약하지만 cumsum 내가 찾고 있어요 아주 것이 아닙니다 모든 것을, 이상 축적한다. 목표 결과가 위에 포함되어 있습니다. 이것은 일반적으로 특정 매개 변수에 따라 값을 합산하기 위해 SUMIF 함수를 사용하여 수행되는 일반적인 스프레드 시트 요약 기술입니다.

쉬운 방법이 있나요? 나는 그것을 놓친 것일 뿐이라는 생각을 갖기 위해 약간의 시간을 할애했다. for 루프를 사용하지 않기를 바란다.

감사합니다.

답변

2

np.add.reduceat 필요 같다 :

np.add.reduceat(vals, np.flatnonzero((months - 1) % 12 == 0)) 
# array([ 12., 24., 36.]) 

설명 :

months 
# array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
#  18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
#  35, 36]) 

1). 합이 (months - 1) % 12으로 시작해야 어디 어디에 조건을 찾아 모듈을 사용

(months - 1) % 12 == 0 
# array([ True, False, False, False, False, False, False, False, False, 
#  False, False, False, True, False, False, False, False, False, 
#  False, False, False, False, False, False, True, False, False, 
#  False, False, False, False, False, False, False, False, False], dtype=bool) 

2). np.flatnonzero는 등 np.where 유사하고 인덱스를 제공하므로 여기서, 제 합은 12 (전용)까지 0에서 시작 :

np.flatnonzero((months - 1) % 12 == 0) 
array([ 0, 12, 24]) 

3). 인덱스를 찾은 후, 세그먼트를 요약하는 np.add.reduceat를 사용

np.add.reduceat(vals, [0, 12, 24]) 
# array([ 12., 24., 36.]) 

기본적으로이 [sum(vals[0:12]), sum(vals[12:24]), sum(vals[24:])]에 해당하고 필요한 출력을 제공합니다.

+0

당신에게 upvote를주었습니다. 그러나 15 인 미만의 담당자가 있으므로 보여주지 않습니다. 이 작동합니다. 설명해 주시겠습니까? 줄이기가 어떻게 작동하는지 잘 모르고 flatnonzero에 대한 명확한 설명을 찾지 못했습니다. – user7038639

+0

확실한 설명 업데이트 중 ... – Psidom

+0

큰 설명, 감사합니다. flatnonzero는 내가 사용하려고했던 매월 인덱싱 대신 0 기반 인덱싱을 사용하기 때문에 개월 수를 1에서 뺍니까? – user7038639

1

np.sum(vals[np.where(months % 12 == 0)[0]]) 어쩌면?

np.where은 색인을 선택하는 데 사용됩니다.