2014-07-10 12 views
7

Ich arbeite an einer Liste von Listen und den Zugriff auf Spalten war sehr verwirrend.Warum x [i] [:] = x [:] [i] wo x ist eine Liste von Listen?

wir x annehmen wird wie folgt definiert:

x = [[int(np.random.rand()*100) for i in xrange(5)] for x in xrange(10)] 
    pprint.pprint(x) 
[[86, 92, 95, 78, 68], 
[76, 80, 44, 30, 73], 
[48, 85, 99, 35, 14], 
[3, 84, 50, 39, 47], 
[3, 7, 67, 28, 65], 
[19, 13, 98, 53, 33], 
[9, 97, 35, 25, 89], 
[48, 3, 48, 5, 1], 
[21, 40, 72, 61, 62], 
[58, 43, 84, 69, 26]] 

nun beide x[1][:] und x[:][1] ergeben das gleiche Resultat:

[76, 80, 44, 30, 73] 

Kann jemand erklären, warum? Danke

+2

Warum verwenden Sie eine Liste von Listen? Du hast NumPy! Sie verwenden NumPy's Zufallszahlengenerator! Benutze ein Array! Wenn Sie anstelle einer Liste von Listen ein Array hätten, würden 'x [i,:]' und 'x [:, i]' tun, was Sie wollen. – user2357112

+0

Weil ich Listen von verschiedenen Größen und Typen habe und das Beispiel hier nur zur Veranschaulichung dient. – ipluto

Antwort

6

Das Verhalten ist ziemlich einfach zu verstehen, wenn Sie die beiden Indizierungsvorgänge für jeden Ihrer Ausdrücke in separate Teile aufteilen.

  • x[1] wird der zweite Wert aus der Liste der Listen (die Liste [76, 80, 44, 30, 73]) sein.
  • x[1][:] ist eine Kopie von x[1] (ein Stück, das die gesamte Liste umfasst).
  • x[:] ist eine (flache) Kopie von x (die Liste der Listen).
  • x[:][1] ist der zweite Wert aus der Liste der kopierten Listen, der das gleiche Objekt wie x[1] ist.

Also, die beiden Ausdrücke funktionieren gleich. Beachten Sie, dass der erste Ausdruck die Liste kopiert (mit der [:] Scheibe am Ende), sie sind nicht beide das gleiche Objekt (x[1][:] is x[:][1] wird False sein).

Wenn Sie ein 2D-Array mit numpy wurden, würden Sie ein anderes Verhalten bekommen, da man in beliebigen Dimensionen schneiden kann (etwas andere Syntax):

import numpy as np 

x = np.array([[86, 92, 95, 78, 68], 
       [76, 80, 44, 30, 73], 
       [48, 85, 99, 35, 14], 
       [3, 84, 50, 39, 47], 
       [3, 7, 67, 28, 65], 
       [19, 13, 98, 53, 33], 
       [9, 97, 35, 25, 89], 
       [48, 3, 48, 5, 1], 
       [21, 40, 72, 61, 62], 
       [58, 43, 84, 69, 26]]) 

print(x[1,:]) # prints the values of the second row: [76 80 44 30 73] 
print(x[:,1]) # prints the values of the second column: [92 80 85 84 7 13 97 3 40 43] 

Dies kann sein, was Sie suchen.

+0

Vielen Dank für die ausführliche Erklärung. Ich hätte definitiv np.array benutzt, wenn es nicht für verschiedene Arten von Listen in meiner ursprünglichen Liste gewesen wäre. – ipluto

3

x[:][1] ist die gesamte Array Zeile 1 und x[1][:] ist alle Reihe 1 von x, so dass sie beide auf die gleiche Zeile.

In [2]: x[:] 
Out[2]: 
[[86, 92, 95, 78, 68], 
[76, 80, 44, 30, 73], 
[48, 85, 99, 35, 14], 
[3, 84, 50, 39, 47], 
[3, 7, 67, 28, 65], 
[19, 13, 98, 53, 33], 
[9, 97, 35, 25, 89], 
[48, 3, 48, 5, 1], 
[21, 40, 72, 61, 62], 
[58, 43, 84, 69, 26]] 
In [3]: x[1] 
Out[3]: [76, 80, 44, 30, 73] 

In [4]: x[1][:] 
Out[4]: [76, 80, 44, 30, 73] 

x[:] Verwendung wird häufig verwendet, wenn Sie eine Kopie von x in einer Variablen und nicht nur ein Verweis darauf speichern wollte:

In [6]: x1 = x[:] 

In [7]: x1 
Out[7]: 
[[86, 92, 95, 78, 68], 
[76, 80, 44, 30, 73], 
[48, 85, 99, 35, 14], 
[3, 84, 50, 39, 47], 
[3, 7, 67, 28, 65], 
[19, 13, 98, 53, 33], 
[9, 97, 35, 25, 89], 
[48, 3, 48, 5, 1], 
[21, 40, 72, 61, 62], 
[58, 43, 84, 69, 26]] 

Erstellen einer Kopie:

In [11]: x1 = x[:] 
In [12]: id(x1)  # different objects so different id's 
Out[12]: 140130415845104  
In [13]: id(x) 
Out[13]: 140130400510176 

Erstellen einer Referenz:

In [14]: x1 = x 

In [15]: id(x) # same object so same id's 
Out[15]: 140130400510176 

In [16]: id(x1) 
Out[16]: 140130400510176 
1

x[1][:] sagt zuerst erhalten x[1], die das erste Objekt in der Liste ist. In diesem Fall ist es eine Liste. Wenn Sie dann [:] hinzufügen, sagen Sie, dass alle Listenobjekte aus dieser ersten Liste zurückgegeben werden. So gibt es das gesamte erste Listenobjekt aus Ihrer Hauptliste zurück.

x[:][1] wird zuerst durch x[:] sagen, um die ganze Liste zurückzugeben. Dann, indem Sie [1] hinzufügen, sagen Sie, dass nur das erste Element in der gesamten Liste zurückgegeben wird.

Verwandte Themen