2012-01-20 2 views
18

J'essaie de porter une partie de mon code de matlab vers python, et une partie utilise la fonction bsxfun() pour la réplication virtuelle suivie de la multiplication ou de la division (je l'utilise aussi pour les opérations logiques). Je voudrais pouvoir le faire sans réellement répliquer le vecteur (soit avec une fonction ou avec une sorte de matrice diagonale) avant de multiplier ou diviser pour économiser sur la mémoire et l'heure.Existe-t-il un équivalent à la fonction MATLAB bsxfun en python?

S'il existe un équivalent de bsxfun dans une bibliothèque C quelconque, cela fonctionnerait bien sûr également.

+6

Si vous travaillez avec des tableaux en Python que vous allez vouloir être en utilisant numpy (www.numpy.org), et a numpy très belles propriétés de diffusion. (Voir http://www.scipy.org/EricsBroadcastingDoc pour un court tutoriel.) – DSM

+2

Selon cette [question] (http://stackoverflow.com/questions/3213212/matlab-equivalent-of-numpy-broadcasting) le L'équivalent de la diffusion numpy dans matlab est 'bsxfun', donc je suppose que cela fonctionne dans l'autre sens. – jcollado

+0

Il existe maintenant un didacticiel de diffusion numérique "officielle" à l'adresse http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html Le didacticiel proposé par DSM est toujours disponible sur https: // github. com/dwf/sauvé-scipy-wiki/blob/maître/EricsBroadcastingDoc.rst – user2809402

Répondre

3

Il n'y a pas vraiment un équivalent de bsxfun, à ma connaissance, bien que numpy s'occupe de beaucoup de diffusion pour vous, comme d'autres l'ont mentionné. Ceci est communément présenté comme un avantage de numpy sur matlab, et il est vrai que beaucoup de diffusion est plus simple en numpy, mais bsxfun est en fait plus général, car il peut prendre des fonctions définies par l'utilisateur. Numérot a ceci: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html mais seulement pour 1d.

2

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

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