¿Hay un equivalente a la función de MATLAB bsxfun en python?
(2)
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.
Si hay un equivalente de bsxfun en una biblioteca C de algún tipo, eso también funcionaría.
No hay realmente un equivalente de bsxfun, que yo sepa, aunque Numpy se encarga de una gran cantidad de transmisiones para ti, 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, porque 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.
Python es muy fácil de usar en comparación con matlab bsxfun (x) en python numpy se puede hacer fácilmente por ... en array [], p. Ej. M [...,:] Puedes 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.]]