numpy soustraire chaque ligne de matrice par vecteur

, Donc j'ai un n x d matrice et un n x 1 vecteur. J'essaie d'écrire un code pour soustraire chaque ligne de la matrice par le vecteur.

J'ai actuellement un for boucle qui parcourt et soustrait la i-ème ligne de la matrice par le vecteur. Existe-t-il un moyen de simplement soustraire une matrice entière par le vecteur?

Merci!

Code actuel:

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

C'est là X1 est la matrice de i-ième ligne et de la X2 est un vecteur. Puis-je faire en sorte que je n'ai pas besoin d'un for boucle?

33
demandé sur user3666197 2014-10-13 08:43:36

2 réponses

Cela fonctionne dans numpy mais seulement si les axes de fin ont la même dimension . Voici un exemple de soustraction réussie d'un vecteur d'une matrice:

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

Cela a fonctionné parce que l'axe de fuite des deux avait la même dimension (3).

Dans votre cas, les axes principaux avaient la même dimension. Voici un exemple, en utilisant le même v que ci-dessus, de la façon dont cela peut être corrigé:

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

Les règles pour les axes de diffusion sont expliquées en profondeur ici.

45
répondu John1024 2014-10-13 05:03:18

En plus de la réponse @John1024," transposer " un vecteur unidimensionnel dans numpy peut être fait comme ceci:

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

À partir de là, soustraire v de chaque colonne de m est trivial en utilisant la diffusion:

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]])
8
répondu Nagasaki45 2014-10-13 05:51:15