Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there an equivalent to the MATLAB function bsxfun in python?

I'm trying to port some of my code from matlab to python, and some of it uses the bsxfun() function for virtual replication followed by multiplication or division (I also use it for logical operations). I'd like to be able to do this without actually replicating the vector (either with a function or with some kind of diagonal matrix) before multiplying or dividing to save on memory and time.

If there's an equivalent of bsxfun in a C library of some kind, that would of course also work.

like image 620
Kevin Avatar asked Jan 20 '12 19:01

Kevin


2 Answers

There isn't really an equivalent of bsxfun, that I'm aware of, although numpy does take care of a lot of broadcasting for you, as others mentioned.

This is commonly touted as an advantage of numpy over matlab, and it is true that a lot of broadcasting is simpler in numpy, but bsxfun is actually more general, because it can take user-defined functions.

Numpy has this: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html but only for 1d.

like image 147
capybaralet Avatar answered Nov 17 '22 03:11

capybaralet


Python is very easy to use compared to matlab bsxfun(x) in python numpy can be easily done by ... in array[], e.g. m[...,:] You can try this:

>>>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.]]
like image 38
CCT Avatar answered Nov 17 '22 01:11

CCT