2014-10-13 12 views
28

Così ho una matrice n x d e un vettore n x 1. Sto cercando di scrivere un codice per sottrarre ogni riga della matrice dal vettore.NumPy sottrarre ogni riga della matrice per vettore

momento ho un for ciclo che un'iterazione e sottrae il i -esimo riga della matrice dal vettore. C'è un modo per sottrarre semplicemente un'intera matrice dal vettore?

Grazie!

codice attuale:

for i in xrange(len(X1)): 
    X[i,:] = X1[i,:] - X2 

Qui X1 è i fila esima della matrice e X2 è vettore. Posso fare in modo che non abbia bisogno di un ciclo for?

risposta

39

Che funziona in numpy ma solo se gli assi finali hanno la stessa dimensione. Ecco un esempio di sottrarre successo un vettore da una matrice:

In [27]: print m; m.shape 
[[ 0 1 2] 
[ 3 4 5] 
[ 6 7 8] 
[ 9 10 11]] 
Out[27]: (4, 3) 

In [28]: print v; v.shape 
[0 1 2] 
Out[28]: (3,) 

In [29]: m - v 
Out[29]: 
array([[0, 0, 0], 
     [3, 3, 3], 
     [6, 6, 6], 
     [9, 9, 9]]) 

Ciò funzionato perché l'asse posteriore di entrambi aveva la stessa dimensione (3).

Nel tuo caso, gli assi principali avevano la stessa dimensione. Ecco un esempio, utilizzando la stessa v come sopra, di modo che può essere fissato:

In [35]: print m; m.shape 
[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 
Out[35]: (3, 4) 

In [36]: (m.transpose() - v).transpose() 
Out[36]: 
array([[0, 1, 2, 3], 
     [3, 4, 5, 6], 
     [6, 7, 8, 9]]) 

Le regole per assi di trasmissione sono spiegate in modo approfondito here.

+0

Che dire di 'mv.transpose()' nel secondo caso? –

8

Oltre a @ risposta John1024, "recepisce" un vettore monodimensionale in NumPy può essere fatto in questo modo:

In [1]: v = np.arange(3) 

In [2]: v 
Out[2]: array([0, 1, 2]) 

In [3]: v = v[:, np.newaxis] 

In [4]: v 
Out[4]: 
array([[0], 
     [1], 
     [2]]) 

Da qui, sottraendo v da ogni colonna della m è banale usando broadcasting:

In [5]: print(m) 
[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 

In [6]: m - v 
Out[6]: 
array([[0, 1, 2, 3], 
     [3, 4, 5, 6], 
     [6, 7, 8, 9]]) 
Problemi correlati