2012-01-20 14 views
18

Próbuję przenieść część mojego kodu z MATLAB do Pythona, a niektóre z nich używają funkcji bsxfun() do wirtualnej replikacji, po której następuje mnożenie lub dzielenie (używam jej również do operacji logicznych). Chciałbym móc to zrobić bez faktycznej replikacji wektora (z funkcją lub z macierzą przekątną) przed pomnożeniem lub podzieleniem, aby zaoszczędzić na pamięci i czasie.Czy istnieje odpowiednik funkcji bsxfun MATLAB w python?

Jeśli istnieje odpowiednik bsxfun w jakiejś bibliotece C, to oczywiście by działało.

+6

Jeśli pracujesz z tablic w Pythonie masz zamiar chcą być przy użyciu numpy (www.numpy.org) i numpy ma bardzo ładne właściwości nadawcze. (Zobacz http://www.scipy.org/EricsBroadcastingDoc na krótki samouczek.) – DSM

+2

Zgodnie z tym [pytanie] (http://stackoverflow.com/questions/3213212/matlab-equivalent-of-numpy-broadcasting) odpowiednik numpy nadawania w Matlabie to 'bsxfun', więc myślę, że działa to na odwrót. – jcollado

+0

Istnieje teraz "oficjalny" tutorial do transmisji numpy na http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html Samouczek zasugerowany przez DSM można znaleźć na https: // github. com/dwf/uratowany-scipy-wiki/blob/master/EricsBroadcastingDoc.rst – user2809402

Odpowiedz

3

Nie ma tak naprawdę odpowiednika bsxfun, o którym jestem świadomy, chociaż numpy zajmuje się wieloma transmisjami, jak wspomnieli inni.

Jest to powszechnie reklamowana zaleta numpy over matlab, i prawdą jest, że wiele emisji jest prostsze w numpy, ale bsxfun jest rzeczywiście bardziej ogólny, ponieważ może przyjmować funkcje zdefiniowane przez użytkownika.

Numpy ma to: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html , ale tylko dla 1d.

2

Python jest bardzo łatwy w obsłudze w porównaniu z Matlab bsxfun (x) pytona numpy mogą być łatwo wykonane przez ... w tablicy [], np m [...:] Można spróbować:

>>>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.]] 
Powiązane problemy