Unterabtastung jedes n-ten Eintrags in einem Numpy-Array

92

Ich bin ein Anfänger mit Numpy und versuche, einige Daten aus einem langen Numpy-Array zu extrahieren. Ich muss an einer definierten Position in meinem Array beginnen und dann jeden n-ten Datenpunkt von dieser Position bis zum Ende meines Arrays unterabtasten.

im Grunde, wenn ich hätte

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

Ich möchte dies zunächst abtasten a[1]und dann jeden vierten Punkt von dort abtasten, um so etwas zu produzieren

b = [2,2,2.....]
Rich Williams
quelle

Antworten:

152

Sie können mit numpy des Schneidens einfach start:stop:step.

>>> xs
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
>>> xs[1::4]
array([2, 2, 2])

Dadurch wird eine Ansicht der Originaldaten erstellt, sodass die Zeit konstant bleibt . Es spiegelt auch Änderungen am ursprünglichen Array wider und behält das gesamte ursprüngliche Array im Speicher:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2]         # O(1), constant time
>>> b[:] = 0           # modifying the view changes original array
>>> a                  # original array is modified
array([0, 2, 0, 4, 0])

Wenn eines der oben genannten Probleme auftritt, können Sie eine Kopie explizit erstellen:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2].copy()  # explicit copy, O(n)
>>> b[:] = 0           # modifying the copy
>>> a                  # original is intact
array([1, 2, 3, 4, 5])

Dies ist keine konstante Zeit, aber das Ergebnis ist nicht an das ursprüngliche Array gebunden. Die Kopie grenzt auch an den Speicher an, wodurch einige Vorgänge schneller ausgeführt werden können.

behzad.nouri
quelle
Vielen Dank für die Warnung bezüglich der Referenz- / Wertkopie. Ich würde sonst definitiv in die Falle tappen
Chris