2016-12-29 4 views
-1

Ich habe 2 numpy ArraysStapeln 2 Spaltenvektoren

a.shape = (100,) 
b.shape = (50,) 
np.vstack((a,b)) 

ValueError: all the input array dimensions except for the concatenation axis must match exactly 

vstack soll die Arrays in Zeilen stapeln. Ich habe 2 Spalten Vektoren, die funktionieren sollten.

Aber wenn ich versuche, mit

np.hstack((a,b)) 

es gibt mir (150,) das ist, was ich will. Warum ist das der Fall? Isnt vstack soll in Reihen gestapelt werden?

+0

können Sie bitte die Definition von numpy Arrays a & b teilen? – Shijo

+0

Lesen Sie über 'numpy.newaxis' oder die Verwendung von 'None' in der Indizierung. – Benjamin

Antwort

1

column vectors ist kein nützlicher Descriptor in dieser 1d-Arrays.

In [1668]: x=np.arange(10) 
In [1669]: x.shape 
Out[1669]: (10,) 

Die Standardanzeige ist als Reihe (aufgeteilt in Zeilen, wenn lange genug)

In [1670]: x 
Out[1670]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

Ich habe eine zusätzliche Dimension hinzufügen, um es als Spalte machen anzuzeigen:

In [1671]: x[:,None] 
Out[1671]: 
array([[0], 
     [1], 
     [2], 
     ... 
     [8], 
     [9]]) 
In [1672]: _.shape 
Out[1672]: (10, 1) 

Einfaches Verketten verbindet diese Form Ende-zu-Ende

In [1673]: np.concatenate((x,x)).shape 
Out[1673]: (20,) 

Wir können die axis=0 oder axis=-1 hinzufügen oder hstack verwenden, um das gleiche zu tun.

vstack verbindet sie "vertikal", aber zuerst wird jedes in 2d, z. (1,10), so ist das Ergebnis (2,10):

In [1674]: np.vstack((x,x)).shape 
Out[1674]: (2, 10) 

Das ist, was numpy bedeuten Benutzer durch Reihen gestapelt werden.

vstack funktioniert für mein Beispiel, weil die 2 Arrays die gleiche Größe haben. In deinem unterscheiden sie sich. Es versucht, ein (1.100) zu einem (1.50) auf der 1. Achse zu verketten.

3

Zeilen und Spalten sind nicht genau sinnvoll, wenn Sie eindimensionale Arrays haben, nur mit mehrdimensionalen Arrays. Dies wird auch in der Dokumentation exlicitly erwähnt für np.vstack:

Entspricht np.concatenate (TUP, Achse = 0), wenn TUP enthält Arrays, die zumindest 2-dimensional sind.

Für 1D-Arrays können Sie einfach np.concatenate verwenden:

>>> np.concatenate([np.ones(10), np.ones(5)]) 
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 
    1., 1.]) 
+0

Vielleicht erwähnenswert die neue (-ish) generische 'numpy.stack'-Funktion, die jetzt verfügbar ist. –

+0

@PaulH Aber das Stapeln mit 'np.stack' erfordert, dass sie insgesamt gleiche Formen haben. Das OP erklärte, dass "_ [' np.hstack'] mir (150,) das gibt, was ich will._ ". Habe ich völlig falsch verstanden, was er gefragt hat? – MSeifert

+0

Nein, hast du nicht. Ich habe den Zweck von 'Stack' missverstanden. Entschuldigung für den Lärm. –