2012-01-20 16 views
18

Estoy intentando trasladar parte de mi código de matlab a python, y parte de él usa la función bsxfun() para replicación virtual seguida de multiplicación o división (también la utilizo para operaciones lógicas). Me gustaría poder hacer esto sin replicar realmente el vector (ya sea con una función o con algún tipo de matriz diagonal) antes de multiplicar o dividir para ahorrar memoria y tiempo.¿Hay un equivalente a la función MATLAB bsxfun en python?

Si hay un equivalente de bsxfun en una biblioteca C de algún tipo, eso también funcionaría.

+6

Si se trabaja con matrices en Python que vas a querer estar usando numpy (www.numpy.org), y tiene numpy muy buenas propiedades de transmisión. (Consulte http://www.scipy.org/EricsBroadcastingDoc para obtener un breve tutorial.) – DSM

+2

Según esta [pregunta] (http://stackoverflow.com/questions/3213212/matlab-equivalent-of-numpy-broadcasting) la el equivalente de la difusión numpy en matlab es 'bsxfun', así que supongo que esto funciona al revés. – jcollado

+0

Ahora hay un tutorial de difusión numpy "oficial" en http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html El tutorial sugerido por DSM aún se puede encontrar en https: // github. com/dwf/rescatado-scipy-wiki/blob/master/EricsBroadcastingDoc.rst – user2809402

Respuesta

3

No hay realmente un equivalente de bsxfun, del que soy consciente, aunque Numpy se encarga de una gran cantidad de transmisiones para usted, como otros mencionaron.

Esto comúnmente se promociona como una ventaja de Numpy sobre matlab, y es cierto que mucha difusión es más simple en numpy, pero bsxfun es en realidad más general, ya que puede tomar funciones definidas por el usuario.

Numpy tiene esto: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html pero solo para 1d.

2

Python es muy fácil de usar en comparación con matlab bsxfun (x) en python numpy se puede hacer fácilmente por ... en conjunto [], p. m [...,:] Puede probar esto:

>>>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.]] 
Cuestiones relacionadas