2016-08-30 2 views
-1

Ich bin neu in Python und ich muss eine Liste der Zahl (0,1,2,3) in ein 2D-Array transformieren. Grundsätzlich haben beide die gleiche Zeilennummer, der Wert in der 1D-Liste gibt jedoch ihre Spaltennummer im 2D-Array an. Der Wert in der 2D-Liste mit einem 1. Zum Beispiel markiert eine Probe 1D ListeTransform 1D Liste

list_1d = [1,0,3,2,0] 

1 
0 
3 
2 
0 

ich es brauche, um umgewandelt zu werden,

0 1 0 0 
1 0 0 0 
0 0 1 0 
0 1 0 0 
1 0 0 0 

ich einen 2D-Array aus Nullen erstellt habe,

array_2d = np.zeros((len(list_1d),4)) 

Mit freundlichen Grüßen.

+3

Vielleicht bin ich etwas fehlt, aber es sieht aus wie 1 & 2 Ergebnis in der gleichen Zeile in 'array_2d', während 0 Ergebnisse in keiner 1 in dieser Reihe, die entspricht nicht Ihrer Beschreibung. –

+0

Unter welchen Umständen könnte eine 1 in der ersten Spalte erscheinen? –

+0

'array_2d [:] [list_1d] = 1' Allerdings markiert es die ersten 4 Zeilen und Spalten mit einer 1 –

Antwort

5

„Ich wollte den Code optimieren, indem sie nicht ein for-Schleife, da meine Liste Millionen von Elementen hat.“

In diesem Fall verwenden numpy:

>>> list_1d = [1,0,3,2,0] 
>>> mat = np.zeros((len(list_1d),4)) 
>>> mat[range(len(list_1d)), list_1d] = 1 
>>> mat 
array([[ 0., 1., 0., 0.], 
     [ 1., 0., 0., 0.], 
     [ 0., 0., 0., 1.], 
     [ 0., 0., 1., 0.], 
     [ 1., 0., 0., 0.]]) 

Da dieser Ansatz bei der Python-Ebene vermeidet Looping, sollte es schnell auch für große Datenmengen.

0

das gewünschte Ergebnis in der Frage der Annahme ist nicht richtig, könnte man so etwas tun:

list_1d = [1,0,3,2,0] 

x_size = max(list_1d) + 1 
y_size = len(list_1d) 

matrix = [] 
for y in range(y_size): 
    line = [] 
    for x in range(x_size): 
     line.append(1 if x == list_1d[y] else 0) 
    matrix.append(line) 

print matrix 

druckt [[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]]

+0

Idealerweise wollte ich Code optimieren, indem ich keine for-Schleife verwende, da meine Liste Millionen von Elementen enthält. –

1

Hier ist ein Einzeiler

>>> np.array([[ 1 if i == n else 0 for i in range(4)] for n in list_1d]) 
array([[0, 1, 0, 0], 
     [1, 0, 0, 0], 
     [0, 0, 0, 1], 
     [0, 0, 1, 0], 
     [1, 0, 0, 0]]) 

Es verwendet ein verschachtelte Paar von Comprehensions, um zu tun, was Sie brauchen. Die Breite des Feldes fest verdrahtet ist (die range(4))

+2

können Sie vermeiden, die Größe zu harcodieren, indem Sie 'max (list_1d) + 1' anstelle von 4 verwenden – Tryph

0
list_1d = [1,0,3,2,0] 

Wie groß sollte die Matrix sein?

height ist die Anzahl der Elemente in der 1D-Liste.

height = len(list_1d) 

Wie sollte breit die Matrix sein?

width ist die Anzahl der Elemente in jeder inneren Liste.

width = max(list_1d) 

Was ist der Wert jedes inneren Listenelement sollte?

0 die meiste Zeit.

Wann sollte ein Matrixelement nicht Null sein?

Wenn die Zeile ihren ursprünglichen Index hat und ihre Spalte ihren ursprünglichen Wert hat.

Können Sie das als Boolean ausdrücken?

index == value 

Können Sie das als Int ausdrücken?

Werfen Sie einfach die Bool auf einen Int.

Was ist die Definition einer Zeile?

[int(value == index) for index in range(1 + width)] 

Wie sieht es für alle Werte aus?

[[int(value == index) for index in range(1 + width)] for value in list_1d] 

Demonstrieren:

>>> width=max(list_1d) 
>>> [[int(value == index) for index in range(1 + width)] for value in list_1d] 
[[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]]