你實際上有兩個問題,一個來自標題和隱藏在它後面的問題。第一種是通過回答:
First/@ list
第二個,計數1的遊程的數量,已經回答了很多次,但是這種解決方案
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &
比獅子座的解決方案快大約50% 。注意:我增加了測試列表的長度爲更好的時機:
largeTestList = RandomInteger[{0, 1}, {10000000}];
Count[Split[largeTestList], {1 ..}] // AbsoluteTiming
Count[Split[largeTestList][[All, 1]], 1] // AbsoluteTiming
Total[Clip[[email protected]#, {0, 1}]] + First[#] &@ largeTestList // AbsoluteTiming
([email protected]@[email protected]# + [email protected]#[[{1, -1}]])/2 &@ largeTestList // AbsoluteTiming
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &@
largeTestList // AbsoluteTiming
Out[680]= {3.4361965, 2498095}
Out[681]= {2.4531403, 2498095}
Out[682]= {0.2710155, 2498095}
Out[683]= {0.2530145, 2498095}
Out[684]= {0.1710097, 2498095}
獅子座的編譯攻擊後,我正要在認輸,但我發現了一個可能的優化,所以開始進入戰鬥.. [Mr.Wizard,獅子座和我應該在監獄裏被拋出干擾對SO和平]
runsOf1Cbis =
Compile[{{lst, _Integer, 1}},
Module[{r = Table[0, {Length[lst] - 1}], i = 1, ctr = First[lst]},
For[i = 2, i <= Length[lst], i++,
If[lst[[i]] == 1 && lst[[i - 1]] == 0, ctr++; i++]];
ctr], CompilationTarget -> "C", RuntimeOptions -> "Speed"]
largeTestList = RandomInteger[{0, 1}, {10000000}];
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &@
largeTestList // AbsoluteTiming
runsOf1C[largeTestList] // AbsoluteTiming
runsOf1Cbis[largeTestList] // AbsoluteTiming
Out[869]= {0.1770101, 2500910}
Out[870]= {0.0960055, 2500910}
Out[871]= {0.0810046, 2500910}
結果各不相同,但我得到10和30%之間的改善。
優化可能很難發現,但如果{0,1}測試成功,則是額外的i++
。在連續的地點你不能有兩個。
而且,在這裏,我自己的優化優化的列昂尼德的優化優化(我希望這不會拖,或者我要去挨一個堆棧溢出):
runsOf1CDitto =
Compile[{{lst, _Integer, 1}},
Module[{i = 1, ctr = First[lst]},
For[i = 2, i <= Length[lst], i++,
If[lst[[i]] == 1, If[lst[[i - 1]] == 0, ctr++];
i++]];
ctr], CompilationTarget -> "C", RuntimeOptions -> "Speed"]
largeTestList = RandomInteger[{0, 1}, {10000000}];
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &@
largeTestList // AbsoluteTiming
runsOf1C[largeTestList] // AbsoluteTiming
runsOf1Cbis[largeTestList] // AbsoluteTiming
runsOf1CAlt[largeTestList] // AbsoluteTiming
runsOf1CDitto[largeTestList] // AbsoluteTiming
Out[907]= {0.1760101, 2501382}
Out[908]= {0.0990056, 2501382}
Out[909]= {0.0780045, 2501382}
Out[910]= {0.0670038, 2501382}
Out[911]= {0.0600034, 2501382}
幸運的是,列昂尼德在他的代碼中有一個多餘的初始化,可以刪除。
完美,非常感謝!我試過[All,1]訪問子列表,但我無法弄清楚要計數的模式。所以,模式只是1,對吧? –
是的,在這種情況下,模式是文字1. –