Vorrei eseguire l'equivalente del seguente codice MATLAB utilizzando NumPy: repmat([1; 1], [1 1 1])
. Come potrei realizzare questo?Qual è l'equivalente di repmat di MATLAB in NumPy
risposta
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]]])
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
grazie, rcs, lo proverò – vernomcrp
Ho modificato il rispondi per indicare i documenti ufficiali. –
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.
conoscere sia tile
e repeat
.
x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
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.
- 1. Matlab - bsxfun non è più veloce di repmat?
- 2. Replica il tensore di Kronecker con repmat in MATLAB
- 3. Qual è l'operatore @ in MATLAB?
- 4. Traduci matlab in python/numpy
- 5. Qual è l'ordine di colore MATLAB predefinito?
- 6. Qual è l'equivalente numpy di python's zip (*)?
- 7. Qual è l'equivalente Matlab di `not in` di Python?
- 8. MATLAB due volte più veloce di Numpy
- 9. La convoluzione è più lenta in Numpy che in Matlab?
- 10. Calcolo della matrice di covarianza in Matlab
- 11. Qual è l'equivalente di "zip()" in Python's numpy?
- 12. trova la funzione matlab in numpy/scipy
- 13. NumPy all'interfaccia MATLAB con mlabwrap
- 14. "Conversione" di array Numpy in Matlab e viceversa
- 15. L'equivalente di Numpy della funzione findpeaks di Matlab?
- 16. Qual è l'equivalente MathNet di MATLAB risolve C = A \ B
- 17. Perché (in MATLAB) questo codice è più veloce?
- 18. Numpy/Python prestazioni terribilmente vs. Matlab
- 19. Indicizzazione array simile a MATLAB con Numpy
- 20. Qual è la cosa più vicina a #define in Matlab?
- 21. Qual è la differenza tra ndarray e array in numpy?
- 22. Qual è la differenza tra cholesky in numpy e scipy?
- 23. Qual è la differenza tra | e || in MATLAB?
- 24. Qual è la differenza tra & e && in MATLAB?
- 25. Qual è la differenza tra * e. * In MATLAB?
- 26. Qual è la differenza tra appiattire e ravel in numpy?
- 27. FFT in Matlab e numpy/scipy danno risultati diversi
- 28. Uscite vettoriali con eigen in conflitto tra Matlab e Numpy
- 29. Rimozione di ogni altro elemento in NumPy
- 30. Qual è il modo normale in MATLAB di leggere la pagina di aiuto per pagina?
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
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