2010-04-27 15 views
11

Ich habe ein Array wie:Slicing-Arrays in numpy/scipy

a = array([[1,2,3],[3,4,5],[4,5,6]]) 

was ist der effizienteste Weg, aus dieser einen 1x2-Array zu schneiden, dass nur die ersten beiden Spalten von „a“ hat?

D.h.

array([[2,3],[4,5],[5,6]]) in this case. 

Dank.

+3

Wie ist das Beispiel in Ihrem Q "1x2" ...? Und wie hat es die _first_ zwei Spalten? Ich muss verwirrt sein ... –

+2

@Alex: die Ergebnisse zu sehen, ich erwarte er meinte die letzten zwei Spalten :) Und 1x2 ... naja. Es gibt 3 Arrays von 2 Elementen, man könnte es als das sehen;) Du hast aber vollkommen recht, +1 – Wolph

+0

Ja, ich denke, es war ein Tippfehler. behoben – mithunpaul

Antwort

18

Zweidimensionale numpy Arrays verwenden indiziert a[i,j] (nicht a[i][j]), aber man kann die gleiche Slicing-Notation mit numpy Arrays und Matrizen, wie Sie können mit gewöhnlichen Matrizen in Python (nur in einer einzigen [] setzen) verwenden :

 
>>> from numpy import array 
>>> a = array([[1,2,3],[3,4,5],[4,5,6]]) 
>>> a[:,1:] 
array([[2, 3], 
     [4, 5], 
     [5, 6]]) 
+0

Gilt diese Regel nur für 2-dimensionale Arrays? –

+0

@IvanBalashov Nein, Sie können dies auch für höhere Dimensionen verwenden. – Demento

4

Ist das wonach Sie suchen?

a[:,1:] 
1

Oder in anderen Worten: die grundlegende slice Syntax (documentation zu zitieren) ist i: j: k wobei i der Startindex ist, j der Anhalteweg Index ist und k der Schritt (k> 0)

Nun, wenn 'i' nicht gegeben ist, ist es standardmäßig 0 für k> 0 und n - 1 für k < 0. Wenn j nicht angegeben wird, wird standardmäßig n verwendet.

Das ist für ein eindimensionales Array. Jetzt sind zweidimensionale Arrays ein anderes Biest. Die Slicing-Syntax ist ein [rowrange, columnrange]

Also, wenn Sie alle Zeilen möchten, aber nur die letzten zwei Spalten, wie in Ihrem Fall, tun Sie a [0: 3,1: 3].

Hier [0: 3] bedeutet, alle Zeilen von 0 bis 3 und [1: 3] bedeutet, dass alle Spalten aus der Spalte 1 bis Spalte 3

Nun, wie Sie fragen sich vielleicht, auch wenn Sie nur haben 3 Spalten und die Nummerierung beginnt bei 1, also muss dieser Befehl technisch drei Spalten nach rechts zurückgeben. d. h. Spalte 1, Spalte 2, Spalte 3. Das ist der schwierige Teil dieser Syntax. Sie müssen beginnen, von NACH der ersten Zahl zu zählen. Wenn Sie also [1: 3] sagen, sagen Sie mir bitte Spalte 2 und Spalte 3. Welches sind die letzten beiden Spalten, die Sie wollen.

Jetzt, wenn Sie nicht wissen, wie lange Ihre Matrix ist oder wenn Sie alle Zeilen möchten, können Sie diesen Teil leer lassen. d. H.

a [:, 1: 3] wird auch funktionieren.

Gleiches gilt auch für Spalten. [1 ,: 0]

Nun, wie die obige Antwort heißt, wenn Sie sagen wollte, werden alle Spalten, aber nur die erste Zeile, würden Sie

a schreiben [:, 1:] funktioniert, ist, weil, wenn Sie sagen [1:] für Spalten, es bedeutet, geben Sie mir alles nach der ersten Spalte und bis zum Ende aller Spalten. "leer" bedeutet "bis zum Ende".

Inzwischen müssen Sie erkennen, dass alles auf jeder Seite des Kommas alles eine Teilmenge des eindimensionalen Falles ist, den ich oben erwähnt habe. ich.e, wenn Sie Ihre Zeilen mit Schrittgrößen angeben möchten Sie a [:: 2,1]

, die in Ihrem Fall wird wieder schreiben kann Array ([[2, 3], [5, 6]])

dh der Befehl erläutert als: geben Sie mir alle Zeilen und nehmen 2 auf einmal. Plus gib mir nur die letzten 2 Spalten.

Das brauchte einige Zeit um herauszufinden. Also hier einfügen, nur für den Fall, dass es jemandem hilft.