2017-08-02 4 views
-1

Ich habe folgendes minimal Beispiel:Python mehrdimensionale Notation Transponiert automatisch

a = np.zeros((5,5,5)) 
a[1,1,:] = [1,1,1,1,1] 
print(a[1,:,range(4)]) 

I als Ausgang ein Array mit 5 Reihen und 4 Spalten erwarten würde, wo wir diejenigen in der zweiten Reihe haben. Stattdessen ist es ein Array mit 4 Zeilen und 5 Spalten mit Einsen auf der zweiten Spalte. Was passiert hier und was kann ich tun, um die erwartete Ausgabe zu erhalten?

+0

Darf ich fragen, warum ich downvoted bekommen? Ist meine Frage zu einfach oder schlecht gestellt? – HolyMonk

Antwort

3

Dies ist ein Beispiel für gemischte Grund und Indexierung, wie diskutiert in https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

Die Segmentdimension hat am Ende angehängt worden ist.

Mit einem Skalarindex ist dies ein Grenzfall für die dort beschriebene Mehrdeutigkeit. Es wurde in früheren SO-Fragen und einem oder mehreren Bugs/Problemen diskutiert.

Numpy sub-array assignment with advanced, mixed indexing

In diesem Fall können Sie den Bereich mit einer Scheibe, ersetzen und die erwartete Reihenfolge erhalten:

In [215]: a[1,:,range(4)].shape 
Out[215]: (4, 5)    # slice dimension last 
In [216]: a[1,:,:4].shape 
Out[216]: (5, 4) 
In [219]: a[1][:,[0,1,3]].shape 
Out[219]: (5, 3) 
+0

Gibt es auch eine einfache Problemumgehung als 'a [1,:,:: 4]' für den Fall, dass ich "a [1,:, [0,1,3]]" usw. nehmen möchte (dh alle außer einem Wert im letzten Index) – HolyMonk

+0

siehe mein Edit - Index zuerst mit dem Skalar. – hpaulj

+0

Perfekt, danke sehr nützlich und einfach zu verstehen, danke! – HolyMonk