2016-08-15 6 views
1

浮動小数点数の大きな配列とインデックスの2つの配列を考えると、以下の規則に従って、指定されたインデックス間に含まれるすべての値を合計するエレガントな方法を探しています:ラップアラウンド条件を持つインデックス配列間のナンビサムの和

  • index1のは> index0からは、総和はまっすぐ前方ファッション
  • index1の< index0から、合計 "ラップアラウンド" の値で行われます。例えばので

import numpy as np 

# Straight forward summation when index1 > index0 
values = np.array([0.,10.,20.,30.,40.,50.,60.,70.]) 
index0 = np.array([0,3]) 
index1 = np.array([2,6]) 
# Desired Result: np.array([30,180]) # (0+10+20),(30+40+50+60) 

# Wrap around condition when index1 < index0 
index0 = np.array([5]) 
index1 = np.array([1]) 
# Result: np.array([190]) # (50+60+70+0+10) 

私はむしろ大きな配列を扱っていますので、可能な場合、私は、エレガントなnumpyの中心のソリューションを探しています。

+0

あなたはあなたの例を二重チェック、境界線との結果がオフに見えると予想することができます... – Julien

+0

は、これらの範囲の重複が[(index0から= np.array 'のようなもの、があるかもしれません0,3])とindex1 = np.array([4,6]) '? – Divakar

+0

@Divakarはい。 'index0'と' index1'はペアのリストとしても表現できます: 'index = np.array([[0,4]、[3,6]、...])' ... ifそれは助ける。 – Fnord

答えて

2

そのことについては何:

# store all cumulative sums (adding 0 at the start for the empty sum) 
cs = np.insert(np.cumsum(values), 0, 0) 

# then for each indexing get the result in constant time (linear in index0/1 size): 
result = np.where(index0 < index1, 0, cs[-1]) + cs[index1+1]-cs[index0] 
+0

私が心に持っていたものよりも本当にコンパクトなもの、良い仕事! – Divakar

+0

うわー、きれいにやった!ありがとうございました! – Fnord

関連する問題