2014-10-13 11 views
28

więc mieć n x d matrycę i n x 1 wektor. Próbuję napisać kod, aby odjąć każdy wiersz w macierzy od wektora.NumPy odejmowanie każdego wiersza macierzy przez wektor

mają obecnie for pętlę iteracji i odejmuje i -tym wiersz w macierzy przez wektor. Czy istnieje sposób na proste odjęcie całej macierzy od wektora?

Dzięki!

Obecny Kod:

for i in xrange(len(X1)): 
    X[i,:] = X1[i,:] - X2 

Tu X1 jest macierzy i-tego wiersza, a X2 to wektor. Czy mogę zrobić to tak, że nie potrzebuję pętli for?

Odpowiedz

39

Działa to w numpy, ale tylko wtedy, gdy osie końcowe mają ten sam wymiar. Oto przykład z powodzeniem odejmowania wektora z matrycy:

In [27]: print m; m.shape 
[[ 0 1 2] 
[ 3 4 5] 
[ 6 7 8] 
[ 9 10 11]] 
Out[27]: (4, 3) 

In [28]: print v; v.shape 
[0 1 2] 
Out[28]: (3,) 

In [29]: m - v 
Out[29]: 
array([[0, 0, 0], 
     [3, 3, 3], 
     [6, 6, 6], 
     [9, 9, 9]]) 

Okazało się to dlatego, że tylna oś obie miały takie same wymiary (3).

W twoim przypadku wiodące osie miały ten sam wymiar. Oto przykład, przy użyciu tego samego v jak wyżej, w jaki sposób, że mogą być ustalane:

In [35]: print m; m.shape 
[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 
Out[35]: (3, 4) 

In [36]: (m.transpose() - v).transpose() 
Out[36]: 
array([[0, 1, 2, 3], 
     [3, 4, 5, 6], 
     [6, 7, 8, 9]]) 

Zasady osi transmisyjnej są wyjaśnione w głębi here.

+0

Co powiesz na 'mv.transpose()' w drugim przypadku? –

8

Oprócz @ John1024 odpowiedź, „transpozycji” jednowymiarowa wektor w numpy można zrobić tak:

In [1]: v = np.arange(3) 

In [2]: v 
Out[2]: array([0, 1, 2]) 

In [3]: v = v[:, np.newaxis] 

In [4]: v 
Out[4]: 
array([[0], 
     [1], 
     [2]]) 

Stąd odjęcie v z każdej kolumnie m jest trywialny za pomocą transmisji:

In [5]: print(m) 
[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 

In [6]: m - v 
Out[6]: 
array([[0, 1, 2, 3], 
     [3, 4, 5, 6], 
     [6, 7, 8, 9]])