2014-01-07 11 views
5

Ich möchte einen Vektor an eine Matrix in Python anhängen. Ich versuchte append oder concatenate Methoden, aber ich habe die Antwort nicht erhalten. Ich arbeitete zuvor mit Matlab und dort habe ich dies:Wie man einen Vektor an eine Matrix in Python anhängen

m = zeros(10,4) % define my matrix, 10x4 
    v = ones(10,1) % my vecto, 10x1 
    c = [m,v] % so simple! the result is: 10x5 (the vector added as the last column) 

Wie kann ich das in Python zu tun mit numpy?

dank

+0

Sprechen Sie über C++ oder Pyth auf? Python hat keine Vektoren/Arrays, es hat Listen oder Wörterbücher. – IanAuld

+2

@IanAuld - Er bezieht sich auf numpy Arrays. –

+0

Entschuldigung, ich füge dem Fragetext numpy hinzu. – Hadi

Antwort

21

Sie suchen np.r_ und np.c_. (Think "Spalte Stapel" und "Zeile Stack" (die auch Funktionen sind), aber mit Matlab-Stil Bereich Generationen.)

Auch np.concatenate sehen, np.vstack, np.hstack, np.dstack, np.row_stack, np.column_stack usw.

Für Beispiel:

import numpy as np 
m = np.zeros((10, 4)) 
v = np.ones((10, 1)) 
c = np.c_[m, v] 

Ausbeuten:

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

Dies ist auch äquivalent zu np.hstack([m, v]) oder np.column_stack([m, v])

Wenn Sie sich nicht von Matlab kommen, hstack und column_stack wahrscheinlich scheinen viel besser lesbar und beschreibend. (Und sie sind wohl besser in diesem Fall aus diesem Grund.)

Allerdings haben np.c_ und np.r_ zusätzliche Funktionalität, die Leute von Matlab zu erwarten erwarten. Zum Beispiel:

In [7]: np.r_[1:5, 2] 
Out[7]: array([1, 2, 3, 4, 2]) 

Oder:

In [8]: np.c_[m, 0:10] 
Out[8]: 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 2.], 
     [ 0., 0., 0., 0., 3.], 
     [ 0., 0., 0., 0., 4.], 
     [ 0., 0., 0., 0., 5.], 
     [ 0., 0., 0., 0., 6.], 
     [ 0., 0., 0., 0., 7.], 
     [ 0., 0., 0., 0., 8.], 
     [ 0., 0., 0., 0., 9.]]) 

Jedenfalls für Matlab Leute, ist es praktisch, über np.r_ und np.c_ neben vstack, hstack usw.

+0

Ok, jetzt ist es eher komplett – joojaa

+4

100% korrekt, aber ich würde die Verwendung von 'c_' und 'r_' im Allgemeinen entmutigen, sie sehen seltsam in Python-Code scheinen nur zu Mollycoddle-Benutzer kommen vorbei aus existieren MATLAB. – wim

+0

@wim - Guter Punkt. Ich stimme sicherlich zu, dass es im Allgemeinen eine gute Idee ist, sie nicht in langlebigen Codebasen zu verwenden, die von mehreren Personen gepflegt werden. Sie sind jedoch sehr praktisch für den interaktiven Gebrauch und den Aufbau schneller Sequenzen. Ich hätte sie wahrscheinlich nicht sofort empfehlen sollen, aber ich finde, ich benutze sie viel mehr als früher, jedenfalls. –

4

In numpy wissen es ist ähnlich:

>>> m=np.zeros((10,4)) 
>>> m 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 
>>> v=np.ones((10,1)) 
>>> v 
array([[ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.]]) 

>>> np.c_[m,v] 
array([[ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1.]]) 
Verwandte Themen