2016-06-21 20 views
3

Ich bin gerade über ein numpiges Indexverhalten gestolpert, das ich nicht ganz verstehe. Es scheint, als würde numpy die Reihenfolge meiner Achsen abhängig vom Indexierungsschema ändern. Leider kann ich in der Dokumentation keine Erklärung für das Folgende finden. Könnte mir jemand erklären, was vor sich geht?Numpy Indizierung reorders Array

# This is expected: dimension 1 is reduced to length 1: 
print np.ndarray(shape=(3,3,3,3))[:, [0], :, :].shape 
>>> (3, 1, 3, 3) 

# This is the unexpected behavior: 
print np.ndarray(shape=(3,3,3,3))[:, [0], :, 0].shape 
>>> (1, 3, 3) 

Ich hätte erwartet, dass der zweite Befehl (3, 1, 3) ergeben. Warum ändert sich meine Form der ersten beiden Dimensionen, wenn ich ein Element von der vierten her wähle? Vielen Dank im Voraus!

Edit: Ich sehe dies auf numpy 1.11.0 mit Python 2.7.11

+1

Obwohl obskur, ist dieses Verhalten [dokumentiert] (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing). –

Antwort

4

Es ist das erwartete Verhalten ... NumPy behandelt Achsen mit Scheiben indiziert und Achsen unterschiedlich mit Arrays indiziert. Das Standardverhalten besteht darin, dass die resultierende Form die resultierende Form von Achsen aufweist, die vor der resultierenden Form von Achsen, die mit Schnitten indiziert wurden, mit Arrays indiziert werden. Was bedeutet, dass das Odd Out der erste Fall ist, der (1, 3, 3, 3) hätte sein sollen. Aber jemand dachte, dass es Benutzer für einige einfache Fälle wie Ihren verwirren würde. Wenn also alle mit Arrays indizierten Achsen gruppiert sind, wird die resultierende Form an der Position der Ausgabeform platziert, an der sich der Cluster der Array - indizierten Achsen befand Original-Array.

Sie können es selbst testen:

>>> print np.ndarray(shape=(3,3,3,3))[:, [0], [0], :].shape 
(3, 1, 3) 

Wie Sie erfahren haben, diese Klugheit ist wahrscheinlich eher verwirrend als ein konsistentes Verhalten. Der Konsens unter den NumPy-Entwicklern ist, dass es besser wäre, Clustered-Array-indexierte Achsen nicht anders zu behandeln, und es gibt sogar a PR implementing indexer attributes, die diese seriösere Indexierung erlauben würden.

Aus Gründen der Abwärtskompatibilität ist es unwahrscheinlich, dass sich die standardmäßige Indizierung in absehbarer Zeit ändert, obwohl in einigen Fällen in nicht allzu ferner Zukunft mit der Ausgabe von veralteten Warnungen begonnen werden kann.

Verwandte Themen