2017-06-20 9 views
1

Ich denke, ich verstehe die Indizierung von Array in Python/numpy richtig. Aber heute traf ich ein Problem wie folgt:Python Numpy Array Indizierung

Ich habe eine 6-d-Array z. A und A.shape = (11,1,9,1,5,7). Dann benutze ich die Indizierung wie folgt:

B = A[:,0,0,0,[3,4,2],0] 

und B.shape = (11,3) wie erwartet;

C = A[:,0,0,0,[3,4,2],:] 

und C.shape = (11,3,7) wie erwartet;

Aber wenn ich sage:

D = A[:,0,:,0,[3,4,2],0] 

und D.shape sollte (11,9,3) sein, wie ich erwarten kann jedoch zurück Python die D.shape = (3, 11, 9).

Und ich bin wirklich verwirrt über die Form des Arrays D.

Gibt es jemanden, der mir eine kurze Erklärung geben kann? Vielen Dank!

+1

Es gibt einen Abschnitt in der 'basic & advanced' Indizierung Dokumente über Scheiben und Listen zu mischen. Es gibt einige Mehrdeutigkeiten und "numpy" entscheidet sich, die Scheibenmaße zuletzt zu setzen. Dieses Verhalten wurde auch in früheren SO-Fragen diskutiert. – hpaulj

+0

Mögliches Duplikat von [Slice-Notation erklären] (https://stackoverflow.com/questions/509211/explain-slice-notation) – polka

+0

Nein, das ist nicht nur eine einfache Slice-Frage. Es ist etwas subtiler. – hpaulj

Antwort

2

Wie diskutiert in https://docs.scipy.org/doc/numpy-1.12.0/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

A[:,0,:,0,[3,4,2],0] 

Indizes mit der 'Erweitert' Liste, [3,4,2] die Größe 3 Dimension zu erzeugen. Und die 1. und 3. Dimension werden später hinzugefügt, was zu der (3,11,9) Form führt.

Dieses Verhalten ist etwas umstritten, besonders wenn die anderen Indizes Skalare sind. Die Begründung in den Dokumenten ist klarer, wenn zwei Indexlisten vorhanden sind.

Numpy sub-array assignment with advanced, mixed indexing

+0

Hallo hpaulj, vielen Dank für die Antwort. Jetzt bekomme ich den Punkt, dass vorsichtig sein, wenn Sie eine Kombination aus einer Scheibe und Seq verwenden. von ganzen Zahlen. – zlpython

+0

Und für Array B und C wurde die Scheibe auch verwendet (aber nur in der ersten und letzten Dimension), kombiniert mit anderen skalaren Indizes, was so funktioniert, wie ich normalerweise erwarten kann. Für Array D wurde jedoch ein Slice zwischen Skalarindizes verwendet, ich nehme an, dies ist der Grund, warum die Arrayform zu dem anderen Verhalten führt. ABER in Bezug auf diese Syntax ist es immer noch sehr leicht zu verwechseln. – zlpython