2016-07-24 5 views
0

Sprich: Ich dachte, sie würde produzieren genau gleicheWarum ergeben die Nummernfelder arr2d [:,: 1] und arr2d [:, 0] unterschiedliche Ergebnisse?

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 

arr2d[:, :1] mich

array([[1], 
     [4], 
     [7]]) 

arr2d[:,0] gibt mir

array([1, 4, 7]) 

gibt.

+0

Was ist der Unterschied zwischen der Zahl "1" und der Liste "[1]"? – Mephy

+1

Es ist nicht klar, warum Sie dachten, sie würden gleich sein. Ein Segment einer Sequenz ist nicht dasselbe wie ein Objekt aus dieser Sequenz. – jonrsharpe

+1

Der erste wählt einen Bereich von Spalten aus, also ändert er nicht die Nummer. von Dims, während der zweite eine Spalte auswählt und somit no reduziert. von Dims um "1". – Divakar

Antwort

3

1) Wenn Sie sagen arr2d[:, 0], sagen Sie mir geben Sie den 0. Index aller Zeilen in arr2d (das ist eine andere Art zu sagen, geben Sie mir die 0. Spalte).

2) Wenn Sie sagen arr2d[:, :1], Sie sagen, geben Sie mir alle :1 Index aller Zeilen in arr2d. Numpy interpretiert :1 genauso wie es 0:1 interpretieren würde. Sie sagen also "Geben Sie mir für jede Zeile den 0. bis zum ersten Index (exklusiv) jeder Zeile".Es stellt sich heraus, dass es nur der 0. Index ist, aber Sie haben ausdrücklich verlangt, dass die zweite Dimension die Länge eins hat (da 0:1 nur "Länge" ist).

So:

1)

print arr2d[:, 0].shape 

Ausgang:

(3L,) 

2)

print arr2d[:, 0:1].shape 

Ausgang:

(3L, 1L) 

Ich bekomme es immer noch nicht, warum geben sie nicht die gleiche Sache zurück?

Bedenken Sie:

print arr2d[:, 0:3] 
print arr2d[:, 0:3].shape 

print arr2d[:, 0:2] 
print arr2d[:, 0:2].shape 

print arr2d[:, 0:1] 
print arr2d[:, 0:1].shape 

Diese Ausgänge:

[[1 2 3] 
[4 5 6] 
[7 8 9]] 
(3L, 3L) 

[[1 2] 
[4 5] 
[7 8]] 
(3L, 2L) 

[[1] 
[4] 
[7]] 
(3L, 1L) 

Es wäre ein bisschen unerwartet und inkonsistent sein für die letzte Form (3L,) zu sein.

2

Mit einer Liste, haben Sie das gleiche Verhalten, das Sie beschrieben:

>>> a = [1, 2, 3, 4] 
>>> a[0] 
1 
>>> a[:1] 
[1] 

Der Zusatz mit numpy ist die Einführung von axis, die es etwas weniger intuitiv macht.

Im ersten Fall, du bist ein Element zu einem bestimmten Index, im zweiten Fall zurückkehrt, sind Sie ein Stück der Liste zurück.


Mit numpy, für die ersteren, sind Sie alle Elemente in der ersten Spalte auswählt, die eine eine Achse Array zurückgibt (eins weniger als die Anzahl der Achse des Mutter wie erwartet mit Indexierung), aber Im zweiten Fall schneiden Sie das ursprüngliche Array, für das das Ergebnis immer noch die ursprünglichen Dimensionen des übergeordneten Arrays enthält.

1

Index ':1' impliziert:

‚Die Liste von Artikel index 0-index 0‘, die offensichtlich eine Liste von 1 Artikel ist.

Index '0' impliziert:

'Der Artikel index 0'.

Wenn Sie dies auf Ihre Frage erweitern, sollten Sie die Ergebnisse, die Sie erhalten haben, deutlich machen.

arr2d[:, :1] bedeutet 'Daten für alle Zeilen und die Liste der Spalten 0 bis 0'.

Also das Ergebnis ist eine Liste von Listen.

arr2d[:, 0] bedeutet "Daten für alle Zeilen und nur die erste Spalte".

So ist es nur eine Liste.

Verwandte Themen