2013-04-03 22 views
9

Ho una domanda sul risultato di un'operazione che ho eseguito accidentalmente con due matrici numpy (e successivamente corretto).Confusione di sottrazione di Numpy Matrix

Diciamo che ho un vettore di colonna, A = [1,2,3] e un vettore di riga B = [1,1,1]. Per quanto ne so, non esiste un modo matematico corretto per "sottrarre" questi due vettori, cioè dovrebbe essere un'operazione non definita. Eppure, quando lo faccio, torno:

>>> matrix([[0, 1, 2], 
      [0, 1, 2], 
      [0, 1, 2]]) 

ho pensato che questo potrebbe essere una sorta di operazione di trasmissione, ma questo mi turba ancora un po '. Gli oggetti numpy.matrix non dovrebbero contenere solo operazioni matriciali matematicamente valide?

Qualsiasi aiuto è apprezzato!

Grazie!

+0

Sarebbe interessante sapere. – Ivan

+0

google "broadcasting numpy" – user1149913

+2

@ user1149913 Credo che la domanda non sia come funziona la trasmissione, ma piuttosto, perché una riga è autorizzata ad aggiungere/sottrarre con un vettore di colonna? Inoltre, ricorda che le regole di trasmissione sono molto diverse per 'np.matrix' di' np.ndarray'. – askewchan

risposta

2

A e B vengono trasmessi insieme:

A = np.matrix([[1],[2],[3]]) 
#a 3x1 vector 
#1 
#2 
#3 

B = np.matrix([[1,1,1]]) 
#a 1x3 vector 
#1 1 1 

A-B 
#a 3x3 vector 
#0 0 0 
#1 1 1 
#2 2 2 

A viene trasmesso lungo la sua dimensione 1 dimensione (colonne) in

#1 1 1 
#2 2 2 
#3 3 3 

B ottenere trasmesso lungo la sua dimensione 1 dimensione (righe) in

#1 1 1 
#1 1 1 
#1 1 1 

Poi AB viene calcolata come di consueto per due Matrici 3x3.

Se vuoi sapere perché lo fa invece di segnalare un errore è perché np.matrix eredita da np.array. np.matrix sovrascrive la moltiplicazione, ma non l'addizione e la sottrazione, quindi utilizza le operazioni basate sul np.array, che trasmette quando le dimensioni lo consentono.

+1

Ma devi stare attento a chi sta usando questo. Matematici e fisici non lo sapranno necessariamente (anche se un rapido google potrebbe dirlo) e presumeranno che questo dovrebbe restituire un errore quando chiaramente non lo è. A mio parere, np.matrix dovrebbe sovrascrivere anche l'addizione e la sottrazione. Questa è una biblioteca di matematica di cui stiamo parlando qui. – astromax

+3

Sono d'accordo astromax. Quando si lavora su oggetti matrix, penso che sarebbe meglio lanciare un errore o un'eccezione di default invece di eseguire un'operazione inaspettata. Matlab ha ragione – kith

0

Non riesco davvero a spiegare la logica, perché spesso uso np.matrix anziché np.array per evitare questo genere di cose. Grazie al collegamento di @ Jaime nei commenti sopra, è chiaro che np.matrix è semplicemente una sottoclasse da np.ndarray con operazioni infix ridefinite in cui è presente una risposta appropriata da algebra lineare. Dove non c'è, ricade sulle regole da np.ndarray con ndim = 2.

Sembra che Inoltre segue le regole della moltiplicazione matrice per cui gli elementi da A sono accoppiati con quali elementi da B:

In [1]: import numpy as np 
In [2]: A = np.matrix([1,2,3]).T 
In [3]: B = np.matrix([1,1,1]) 

In [4]: A 
Out[4]: 
matrix([[1], 
     [2], 
     [3]]) 

In [5]: B 
Out[5]: matrix([[1, 1, 1]]) 

In [6]: A+B 
Out[6]: 
matrix([[2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4]]) 

In [7]: A*B 
Out[7]: 
matrix([[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]]) 

Questo è lo stesso comportamento si ottiene con np.array:

In [9]: a = np.arange(3)[...,None] 

In [10]: b = np.arange(3) 

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

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

In [13]: a+b 
Out[13]: 
array([[0, 1, 2], 
     [1, 2, 3], 
     [2, 3, 4]])