2009-11-12 15 views

risposta

79

Ecco un collegamento (ufficiale) molto migliore (NumPy for Matlab Users) - temo che il mathesaurus non sia aggiornato.

L'equivalente numpy di repmat(a, m, n) è tile(a, (m, n)).

Questo funziona con più dimensioni e fornisce un risultato simile a matlab. (Numpy fornisce un array di output 3d come ci si aspetterebbe - matlab per qualche motivo fornisce output 2d - ma il contenuto è lo stesso).

Matlab:

>> repmat([1;1],[1,1,1]) 

ans = 
    1 
    1 

Python:

In [46]: a = np.array([[1],[1]]) 
In [47]: np.tile(a, [1,1,1]) 
Out[47]: 
array([[[1], 
     [1]]]) 
+0

quando provo la dimensione (repmat ([1; 1], [1,1,2])) ottiene ans = 2 1 2 [in matlab] ma in python np.tile (a, [1,1,2]) .shape ottiene (1, 2, 2), voglio numpy dare risultato come matlab – vernomcrp

+2

np.tile (a [:, np.newaxis], [1,1,2]) - dà lo stesso. Il problema è che la piastrella promuove 'a' alla dimensione dell'argomento della piastrella per * prepending * nuovi assi, se necessario. Matlab sembra funzionare dall'altra parte. Allo stesso modo, con la piastrellatura 4d avrete bisogno di newaxis due volte ... quindi 'np.tile (a [:, newaxis, newaxis], [1,2,3,4]) = size (repmat (a, [1 2 3 4 ])) 'come richiesto ... – robince

8

Vedere NumPy for Matlab users.

Matlab:

repmat(a, 2, 3) 

Numpy:

numpy.kron(numpy.ones((2,3)), a) 
+5

Non penso che il collegamento mathesaurus sia molto buono. C'è una pagina Numpy For Matlab Users come parte della documentazione ufficiale che è più completa e aggiornata: http://www.scipy.org/NumPy_for_Matlab_Users – robince

+0

grazie, rcs, lo proverò – vernomcrp

+0

Ho modificato il rispondi per indicare i documenti ufficiali. –

14

Si noti che alcuni dei motivi avresti bisogno di usare repmat di MATLAB sono presi cura di broadcasting meccanismo di NumPy, che ti permette di fare vari tipi di matematica con matrici di forma simile. Quindi, se si dispone, ad esempio, di una matrice 1600x1400x3 che rappresenta un'immagine a 3 colori, è possibile (elementwise) moltiplicarla per [1.0 0.25 0.25] per ridurre la quantità di verde e blu a ciascun pixel. Vedi il link sopra per maggiori informazioni.

+0

grazie kwatford :) – vernomcrp

+0

Non che Matlab possa fare anche questa trasmissione, se usi 'bsxfun'. – gerrit

4

conoscere sia tile e repeat.

x = numpy.arange(5) 
print numpy.tile(x, 2) 
print x.repeat(2) 
3

Ecco come l'ho capito da un po 'di giocherellare. Felice di essere corretto e spero che questo aiuti.

Supponiamo di avere una matrice M di 2x3 elementi. Questo ha due dimensioni, ovviamente.


ho potuto vedere alcuna differenza tra Matlab e Python chiedendo di manipolare la matrice di ingresso lungo le dimensioni della matrice contiene già. Così i due comandi

repmat(M,m,n) % matlab 

np.tile(M,(m,n)) # python 

sono davvero equivalente per una matrice di rango 2 (due dimensioni).


Gli argomenti diventano contro-intuitivi quando si richiede la ripetizione/affiancamento di più dimensioni rispetto alla matrice di input. Tornando alla matrice M di rango due e forma 2x3, è sufficiente osservare cosa succede alla dimensione/forma della matrice di output. Dì che la sequenza per la manipolazione ora è 1,1,2.

In Matlab

> size(repmat(M,1,1,2)) 
ans = 

    2 3 2 

aver copiato i primi due dimensioni (righe e colonne) della matrice di input e ha ripetuto che, una volta in una nuova terza dimensione (copiato due volte, cioè). Fedele alla denominazione repmat per matrice ripetuta.

In Python

>>> np.tile(M,(1,1,2)).shape 
(1, 2, 6) 

ha applicato una procedura diversa poiché, presumo, la sequenza (1,1,2) viene letto in modo diverso rispetto a Matlab. Il numero di copie nella direzione di colonne, righe e dimensione fuori piano viene letto da destra a sinistra. L'oggetto risultante ha una forma diversa da Matlab. Non si può più affermare che repmat e tile sono istruzioni equivalenti.


Per ottenere tile a comportarsi come repmat, in Python si deve fare in modo che la matrice di ingresso ha tante dimensioni degli elementi sono in sequenza. Ciò avviene, ad esempio, da un po precondizionamento e creando un oggetto correlato N

N = M[:,:,np.newaxis] 

Poi, a un lato di ingresso ha N.shape = (2,3,1) anziché M.shape = (2,3) e il lato di uscita

>>> np.tile(N,(1,1,2)).shape 
(2, 3, 2) 

quale era la risposta di size(repmat(M,1,1,2)). Presumo questo perché abbiamo guidato Python per aggiungere la terza dimensione alla destra di (2,3) piuttosto che alla sua sinistra, in modo che Python elabori la sequenza (1,1,2) come era intesa nel Matlab modo di leggerlo.

L'elemento [:,:,0] nella risposta Python per N conterrà gli stessi valori dell'elemento (:,:,1) la risposta Matlab per M.


Infine, io non riesco a trovare un equivalente per repmat quando si usa il prodotto di Kronecker di

>>> np.kron(np.ones((1,1,2)),M).shape 
(1, 2, 6) 

a meno che io poi precondizione M in N come sopra. Quindi direi che il modo più generale per andare avanti è usare i modi di np.newaxis.


Il gioco diventa più complicato quando si considera una matrice L di rango 3 (tre dimensioni) e il semplice caso di mancata nuove dimensioni viene aggiunto nella matrice di uscita. Queste due istruzioni apparentemente equivalenti non produrrà gli stessi risultati

repmat(L,p,q,r) % matlab 

np.tile(L,(p,q,r)) # python 

perché la riga, colonna, fuori dal piano direzioni sono (p, q, r) in Matlab e (q, r, p) in Python , che non era visibile con array di rank-2. Lì, bisogna stare attenti e ottenere gli stessi risultati con le due lingue richiederebbe un maggiore precondizionamento.


Sono consapevole che questo ragionamento potrebbe non essere generale, ma potrei elaborarlo solo fino a qui. Spero che questo inviti altri compagni a metterlo a dura prova.

Problemi correlati