2012-01-20 17 views
18

Sto provando a trasferire un po 'del mio codice da MATLAB a Python, e alcuni usano la funzione bsxfun() per la replica virtuale seguita da moltiplicazione o divisione (lo uso anche per le operazioni logiche). Mi piacerebbe essere in grado di farlo senza effettivamente replicare il vettore (con una funzione o con una sorta di matrice diagonale) prima di moltiplicare o dividere per risparmiare memoria e tempo.Esiste un equivalente alla funzione MATLAB bsxfun in python?

Se c'è un equivalente di bsxfun in una libreria C di qualche tipo, ovviamente funzionerebbe anche.

+6

Se si lavora con gli array in Python si sta andando a voler essere utilizzando NumPy (www.numpy.org), e ha numpy proprietà di trasmissione molto belle. (Vedi http://www.scipy.org/EricsBroadcastingDoc per un breve tutorial.) – DSM

+2

Secondo questa [domanda] (http://stackoverflow.com/questions/3213212/matlab-equivalent-of-numpy-broadcasting) il l'equivalente della trasmissione numpy in matlab è 'bsxfun', quindi immagino che funzioni in senso inverso. – jcollado

+0

Esiste ora un'esercitazione di "numpy broadcasting" ufficiale su http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html Il tutorial suggerito da DSM può ancora essere trovato su https: // github. com/DWF/salvato-SciPy-wiki/blob/master/EricsBroadcastingDoc.rst – user2809402

risposta

3

Non c'è davvero un equivalente di bsxfun, di cui sono a conoscenza, sebbene numpy si prenda cura di molte trasmissioni per voi, come altri hanno menzionato.

Questo è comunemente propagandato come vantaggio di numpy su MATLAB, ed è vero che molte trasmissioni sono più semplici in numpy, ma bsxfun è in realtà più generale, perché può assumere funzioni definite dall'utente.

Numpy ha questo: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html ma solo per 1d.

2

Python è molto facile da usare rispetto a matlab bsxfun (x) in python numpy può essere fatto facilmente da ... in array [], ad es. m [...,:] Si può provare questo:

>>>m = np.zeros([5,13], dtype=np.float32) 
>>>print(m) 

    [[ 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. 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.]] 

>>>c=np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13]]) 
>>>print(m[...,:] +4*c) 
[[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]] 
Problemi correlati