2014-05-08 6 views
9

Jest to kod mam w oktawie:Konwersja bsxfun z @times do NumPy

sum(bsxfun(@times, X*Y, X), 2) 

Część bsxfun kodu produkuje elementu mnożenie więc pomyślałem, że numpy.multiply(X*Y, X) by rade ale dostałem wyjątek. Kiedy zrobiłem trochę badań, odkryłem, że mnożenie elementarne nie działa na tablicach Pythona (szczególnie jeśli X i Y są typu "numpy.ndarray"). Zastanawiałem się więc, czy ktokolwiek może to wyjaśnić nieco więcej - tzn. Czy wypisanie rzutowania na inny typ obiektu działa? Kod Octave działa, więc wiem, że nie mam błędu algebry liniowej. Zakładam, że bsxfun i numpy.multiply nie są w rzeczywistości równoważne, ale nie jestem pewien, dlaczego tak wiele wyjaśnień byłoby świetnie.

Udało mi się znaleźć website! to daje konwersję funkcji Octave na Matlab, ale w moim przypadku nie było to pomocne.

+0

Pytanie to wydaje się być nie na temat, ponieważ jest to żądanie tłumaczenia kodu – jonrsharpe

+0

, gdy zastosujesz 'sum()' w NumPy wybierasz właściwą "oś"? –

+0

"Mam wiele problemów" nie jest zbyt pouczający. Opisz działanie, które widzisz, powtarzalny przykład to najlepszy sposób na to. –

Odpowiedz

10

bsxfun w programie Matlab oznacza binarną ekspansję singletonową, w numpy nazywa się nadawanie i powinna się odbywać automatycznie. Rozwiązanie będzie zależeć od wymiarów twojej X, czyli jest to wiersz lub kolumna wektor ale ta odpowiedź pokazuje jeden sposób, aby to zrobić:

How to multiply numpy 2D array with numpy 1D array?

Myślę, że problemem jest to, że transmisja wymaga jednego z wymiary mają być 1 i, w przeciwieństwie do Matlab, numpy wydaje się różnicować między 1 wymiarowym 2 elementem wektora i 2 wymiarowym 2 elementem, tj. różnicą między matrycą o kształcie (2,) i kształtu (2,1), potrzebujesz tego ostatniego do nadawania, aby zdarzyło się .

+0

Czy nie ma bxnfun w numpy? Co, jeśli chciałem zrobić na przykład sumę elementów? – Pinocchio

+0

Po prostu wykonujesz sumę, numpy automatycznie wyemituje ją wzdłuż wymiaru. Tak więc po prostu '+' w numpy jest tym samym, co 'bsxfun (@plus ,,)' w Matlab * pod warunkiem, że * twoje numpy wymiary mają rację – Dan

+0

, więc jest to kod Pythona dosłownie tylko 'A + B' lub' A * B' (zakładając, że A mówi, że Dx1 i B mają 1 x K). – Pinocchio

2

Dla tych, którzy nie wiedzą Numpy, myślę, że warto zwrócić uwagę, że równowartość Octave (oraz Matlaba) * operatora (mnożenie macierzy) jest numpy.dot (a debatably, numpy.outer). Operator Numpy's * jest podobny do bsxfun(@times,...) w Octave, który sam jest generalizacją .*.

W Oktawie, gdy stosuje się bsxfun, istnieją nieokreślone wymiary singletonu po prawej stronie "prawdziwego" rozmiaru operandów; to znaczy, tablicę n1 x n2 x n3 można uznać za n1 x n2 x n3 x 1 x 1 x 1 x.... W Numpy, domyślne wymiary singleton są po lewej; więc m1 x m2 x m3 można uznać za ... x 1 x 1 x m1 x m2 x m3. Ma to znaczenie przy rozważaniu rozmiarów operandów: w Octave, bsxfun(@times,a,b) będzie działać, jeśli a jest 2 x 3 x 4, a b jest 2 x 3. W Numpy nie można było pomnożyć dwóch takich tablic, ale jedna tablica może zmultiplikować tablicę.

Wreszcie bsxfun(@times, X*Y, X) w Octave prawdopodobnie będzie wyglądać jak numpy.dot(X,Y) * X. Nadal istnieją pewne getchy: na przykład, jeśli spodziewasz się produktu zewnętrznego (to znaczy, w Octave X jest wektorem kolumn, Y w wierszu wektorowym), możesz zamiast tego spojrzeć na użycie numpy.outer lub uważać na kształt X i Y.