2017-12-25 6 views
0

Da:Zusammenführen von zwei Listen von unterschiedlicher Größe in eine Matrix

X = [[1, 0, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0]] 
y = [1, -1, 0] 
X = np.asarray(X, np.uint8) 
y = np.asarray(y, np.int8).T 
con = np.concatenate(X, y) 
print(con) 

Wo X sollte einen Datensatz mit einer Größe sein, (3,4) und y sind die Klassen-Etiketten jeder Zeile in der Matrix X . Zum Beispiel hat X[0]= [1, 0, 1, 1] ein Klassenlabel gleich 1 in y[0], d. H. y[0]=1. Ich möchte X und y zusammen in eine Matrix der Größe (3,5) zusammenführen, wobei die neue Spalte die y Liste ist. Aber der vorherige Code gibt mir diesen Fehler:

Traceback (most recent call last): 
    File "test.py", line 38, in <module> 
    con = np.concatenate(X, y) 
TypeError: only integer scalar arrays can be converted to a scalar index 

Ich bin mir nicht sicher, wie es zu beheben ist. Jede Hilfe wird geschätzt.

+1

Erstellen Sie ein Array von geeigneter Größe und dann die Werte aus den Listen zuordnen? –

+0

Werfen Sie einen Blick auf die Dokumentation! Hinweis: '' '' verketten ((a1, a2, ...), ... '' '. (Und ich würde concat der aproach im obigen Kommentar bevorzugen) – sascha

+0

sind Sie nach' con = np.hstack ((X , y.reshape (-1,1))) '? – MaxU

Antwort

0

Das erste Problem mit

np.concatenate(X, y) 

ist, dass das zweite Argument der Achse soll, nicht das zweite Array. np.concatenate((X, y), axis=1) würde funktionieren, wenn X und y beide die gleiche Form haben. Aber sie nicht.

In [181]: X = [[1, 0, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0]] 
    ...: y = [1, -1, 0] 
    ...: 
In [182]: np.column_stack((X,y)) 
Out[182]: 
array([[ 1, 0, 1, 1, 1], 
     [ 1, 1, 1, 1, -1], 
     [ 1, 0, 0, 0, 0]]) 

column_stack stellt sicher, dass die Eingänge in die richtige Form haben als Spalten verketten:

In [183]: np.concatenate((X,y),axis=1) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-183-a97a3320ed3e> in <module>() 
----> 1 np.concatenate((X,y),axis=1) 

ValueError: all the input arrays must have same number of dimensions 

In [184]: np.concatenate((X,np.array(y)[:,None]),axis=1) 
Out[184]: 
array([[ 1, 0, 1, 1, 1], 
     [ 1, 1, 1, 1, -1], 
     [ 1, 0, 0, 0, 0]]) 

aber vorsichtig sein, wenn Arrays mit unterschiedlichen Klassen von Daten verbinden. y ist Klassenlabel. Aber was ist X? Gleiche Art von Einheiten? Wenn es die Floats enthielt, würde das verbundene Array auch Floats sein. Ich vermute, dass dies nur ein Schritt in Richtung der Verwendung von anderem Code ist, wo Klassenbezeichnungen sinnvoller sind, wie pandas oder eines der Maschinenlernpakete.

0

Sie können auch mit den Listen arbeiten, und konvertieren Matrix (2-dim Array, um genauer zu sein) am Ende:

X = [[1, 0, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0]] 
y = [1, -1, 0] 
myList = [foo[0]+[foo[1]] for foo in zip(X,y)] 
myMatrix = np.array(myList) 

Gibt Ihnen:

array([[ 1, 0, 1, 1, 1], 
     [ 1, 1, 1, 1, -1], 
     [ 1, 0, 0, 0, 0]]) 

Aber ich

{foo[1]:foo[0] for foo in zip(X,y)} 

Gibt Ihnen:

die Label-Zeilenpaare in einem Wörterbuch gespeichert würden,
{-1: [1, 1, 1, 1], 0: [1, 0, 0, 0], 1: [1, 0, 1, 1]}, 

was gibt Ihnen viel mehr Flexibilität, und Sie können wie so zu einem numpy Array gehen nach wie vor:

np.array([v+[k] for k,v in myDict.items()]) 
Verwandte Themen