Total 関数としきい値パラメーターを使用して巨大なリストの長さを短縮する方法を探しています。For と If の使用は避けたいと思います (古い習慣から来ています)。
例: 「削減」したいリスト:{1,5,3,8,11,3,4}
のしきい値で5
。
必要な出力:{6,11,11,7}
つまり、リストの最初の部分で Total 関数を使用し、この関数の結果がしきい値よりも高いかどうかを調べます。そうであれば、Total 関数の結果を使用して、リストの次の部分に進みます。
もう 1 つの例は{1,1,1,1,1}
、しきい値が の場合です5
。結果は です{5}
。
ありがとう!
編集:動作していますが、かなり遅いです。より速くするためのアイデアはありますか?
編集2:ループのもの(シンプルでスマートではない)
For[i = 1, i < Length[mylist] + 1, i++,
sum = sum + mylist[[i]];
If[sum > Threshold ,
result = Append[result , sum]; sum = 0; ]; ];
EDIT 3:私は今、やるべき新しいことがあります。{{1,2}{4,9}{1,3}{0,5}{7,3}}
多かれ少なかれ同じ考えですが、リストの1番目と2番目の部分は、しきい値のものよりも高くなければなりません(両方) 。例 : If lst[[1]] and lst[[2]] > threshold do the summuation
2D リストの各部分。Mr.Wizard の f2 関数をこのケースに適用しようとしましたが、うまくいきませんでした。より簡単な場合は、2 つの独立したリストを提供してf3[lst1_,lst2_,thres_]:=
Reap[Sow@Fold[If[Element of the lst1 > thr && Element of the lst2, Sow@#; #2, # + #2] &, 0, lst1]][[2, 1]]
、たとえばこの入力を使用できます。
EDIT 4:そうです、それは本当に明確ではありません。しかし、Min@# > thr
ステートメントの使用は完全に機能しています。
古いコード (醜く、まったくスマートではありません):
sumP = 0;
resP = {};
sumU = 0;
resU = {};
For[i = 1, i < Length[list1 + 1, i++,
sumP = sumP + list1[[i]];
sumU = sumU + list2[[i]];
If[sumP > 5 && sumU > 5 ,
resP = Append[resP, sumP]; sumP = 0;
resU = Append[resU, sumU]; sumU = 0;
];
]
Mr.WizardによるNEWファスト:
f6[lst_, thr_] :=
Reap[Sow@Fold[If[Min@# > thr , Sow@#1; #2, #1 + #2] &, 0, lst]][[2,
1]]
その ~40 倍高速です。どうもありがとう。
Thread[{resP, resU}] == f6[Thread[{list1,list2}], 5] True