Y a-t-il un équivalent à la fonction MATLAB bsxfun en python?

j'essaie de transférer une partie de mon code de matlab à python, et une partie utilise la fonction bsxfun() pour la réplication virtuelle suivie d'une multiplication ou d'une division (Je l'utilise aussi pour les opérations logiques). J'aimerais pouvoir le faire sans répliquer le vecteur (avec une fonction ou une sorte de matrice diagonale) avant de le multiplier ou de le diviser pour économiser de la mémoire et du temps.

S'il y a un équivalent de bsxfun dans un type de bibliothèque C, cela bien sûr aussi travailler.

19
demandé sur Shai 2012-01-20 23:27:15

2 réponses

il n'y a pas vraiment d'équivalent de bsxfun, dont je suis au courant, bien que numpy s'occupe de beaucoup de diffusion pour vous, comme d'autres l'ont mentionné.

ceci est généralement présenté comme un avantage de numpy sur matlab, et il est vrai que beaucoup de radiodiffusion est plus simple dans numpy, mais bsxfun est en fait plus général, parce qu'il peut prendre des fonctions définies par l'utilisateur.

Numpy a ce: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html mais seulement pour 1d.

3
répondu David 2014-10-17 02:38:53

Python est très facile à utiliser comparé à matlab bsxfun(x) en python numpy peut être facilement fait par ... dans le tableau [], p.ex. m[...,:] Vous pouvez essayer ceci:

>>>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.]]
2
répondu CCT 2017-07-21 14:01:07