2012-11-12 13 views
6

Ich möchte einfach ein leeres 10 * 3 * 2 Array mit Python erstellen.Erstelle leere Matrix Python

Ich dachte erste dieser ein, aber das funktioniert nicht:

parameters = [ [ [] * 2 ]*3 ] * 10 

das gibt mir einen Vektor von zehn Vektoren mit drei [] Elemente darin:

[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []], 
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]] 

, das ist Wenn ich auf Parameter [0] [0] [1] zugreifen möchte, bin ich außerhalb der Grenzen, während ich eine Dimension 2 für die innersten Vektoren entlang der dritten Dimension haben möchte.

dann dachte ich, diese

[ [ [[] * 2] ]*3 ] * 10 

Ich dachte, dass [[] * 2] würde mir jetzt bringt das, was ich will, ein innerste zwei Elemente Vektor. Ich erhalte

[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]] 

Also, wie es geht, oder wie diese Initialisierung zu entkommen?

Kd rgds.

Antwort

17

Ich würde Ihnen empfehlen, Numpy für diese Art von Sachen zu verwenden. Es erleichtert den Zugriff auf Spalten oder Zeilen. Für Ihren Anwendungsfall würden Sie tun

import numpy as np 

matrix = np.zeros((2,3,10)) 
second_col = matrix[:,1,:] 

Numpy wird auch eine bessere Pflege Ihrer Daten nehmen, und es setzt eine Menge von dem Matrix-Algebra in Fortran oder C, so dass es viel schneller in der sein wird (möglich) Zukunft, wenn Sie Matrixmultiplikation und dergleichen machen.

6

würde ich so etwas tun, mit Hilfe dieser Listen erstellt werden verschiedene Objekte (das heißt unterschiedliche id()):

In [96]: [ [ [ []*2] for _ in range(3)] for _ in range(10) ] 
Out[96]: 
[[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]]] 

In [98]: [id(x) for x in lis] #all objects are unique 
Out[98]:  
[151267948, 
 151268076, 
 151268492, 
 151269164, 
 151267276, 
 151265356, 
 151268140, 
 151269036, 
 151265644, 
 151265964] 


In [101]: lis1=[ [ [[] * 2] ]*3 ] * 10 

In [102]: [id(x) for x in lis1] # all objects are same, changing one will change 
            # others as well 
Out[102]: 
[151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188] 
11

Zu allererst Sie etwas in die innerste Liste (wie None) einfügen sollte. Zweitens, wenn Sie die Multiplikation in der äußersten Liste verwenden, repliziert es Referenzen auf die innere Liste, so dass, wenn Sie ein Element ändern, wird auch dieses Element ändern in allen anderen Listen:

>> parameters = [ [ [None] * 2 ]*3 ] * 10 
>> print parameters 
[[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]]] 
>> parameters[0][0][1]=1 
>> print parameters 
[[[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]]] 

Daher Sie sollte eher Listenkomprehensionen verwenden:

>> parameters=[[[None for i in range(2)] for j in range(3)] for k in range(10)] 

Allerdings würde ich empfehlen numpy zu verwenden, wie in einem der anderen Antworten vorgeschlagen.

4

Hier ist eines der Probleme mit dem, was Sie tun.

Angenommen, Sie haben ein Array erstellen, etwa so:

>>> l = [ [ [[] * 2] ]*3 ] * 10 
>>> l 
[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]] 

in Ordnung so weit zu sein scheint. Lass uns etwas in das Array setzen.

>>> l[0][0][0] = 2 
>>> l 
[[[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]]] 

Woah! Wir haben 1 Stück darin gelegt, aber es hat alles verändert! Wie ist das passiert?

Nun, es scheint, dass wir 60 Listenobjekte haben. Wir haben jedoch tatsächlich 60 Referenzen auf ein Listenobjekt. Ändere eins, ändere sie alle.

TL; DR: Verwenden Sie den Multiplikationsoperator nicht in einer Liste von Listen.