In numpy/scipy (oder reinem Python, wenn Sie bevorzugen), was wäre eine gute Möglichkeit, zusammenhängende Regionen in einem numply-Array zu gruppieren und die Länge dieser Regionen zu zählen?Gruppieren von zusammenhängenden Werten in einer Reihe mit ihrer Länge
Etwas wie folgt aus:
x = np.array([1,1,1,2,2,3,0,0,0,0,0,1,2,3,1,1,0,0,0])
y = contiguousGroup(x)
print y
>> [[1,3], [2,2], [3,1], [0,5], [1,1], [2,1], [3,1], [1,2], [0,3]]
Ich habe versucht, dies mit Schleifen nur zu tun, aber es ist eine längere Zeit in Anspruch nimmt, als ich möchte (6 Sekunden) eine Liste mit etwa 30 Millionen Proben und 20000 angrenzend zu tun Regionen.
Edit:
Und nun für einige Geschwindigkeitsvergleiche (nur mit time.clock() und ein paar hundert Iterationen oder weniger, wenn sie in Sekunden).
Zuerst mein Python-Loop-Code an 5 Proben getestet.
Number of elements 33718251
Number of regions 135137
Time taken = 8.644007 seconds...
Number of elements 42503100
Number of regions 6985
Time taken = 10.533305 seconds...
Number of elements 21841302
Number of regions 7619335
Time taken = 7.671015 seconds...
Number of elements 19723928
Number of regions 10799
Time taken = 5.014807 seconds...
Number of elements 16619539
Number of regions 19293
Time taken = 4.207359 seconds...
Und jetzt mit der vektorisierten Lösung von Divakar.
Number of elements 33718251
Number of regions 135137
Time taken = 0.063470 seconds...
Number of elements 42503100
Number of regions 6985
Time taken = 0.046293 seconds...
Number of elements 21841302
Number of regions 7619335
Time taken = 1.654288 seconds...
Number of elements 19723928
Number of regions 10799
Time taken = 0.022651 seconds...
Number of elements 16619539
Number of regions 19293
Time taken = 0.021189 seconds...
Modified Ansatz gibt etwa gleiche Zeiten (vielleicht 5% langsamer im schlimmsten Fall)
Und jetzt mit dem Generator Ansatz von Kasramvd.
Number of elements 33718251
Number of regions 135137
Time taken = 3.834922 seconds...
Number of elements 42503100
Number of regions 6985
Time taken = 4.785480 seconds...
Number of elements 21841302
Number of regions 7619335
Time taken = 6.806867 seconds...
Number of elements 19723928
Number of regions 10799
Time taken = 2.264413 seconds...
Number of elements 16619539
Number of regions 19293
Time taken = 1.778873 seconds...
Und jetzt seine numpythonische Version.
Wie auch immer ich denke, die Moral der Geschichte ist, dass numpy sehr gut ist.
So starten Sie ein Ende parenthese auf Linie sind vermisst 1. – baranskistad
Können Sie uns wissen lassen, die Art von Beschleunigungen (falls vorhanden) könnten Sie mit den vorgeschlagenen Lösungen kommen? – Divakar
Sicher, ich werde sie mit meinen und anderen Lösungen vergleichen. – AMagee