189 votes

Numpy : Diviser chaque ligne par un élément de vecteur

Supposons que j'ai un tableau numpy :

data = np.array([[1,1,1],[2,2,2],[3,3,3]])

et j'ai un "vecteur" correspondant :

vector = np.array([1,2,3])

Comment puis-je opérer sur data le long de chaque ligne pour soustraire ou diviser de sorte que le résultat soit :

sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]

En résumé : Comment effectuer une opération sur chaque ligne d'un tableau 2D avec un tableau 1D de scalaires qui correspondent à chaque ligne ?

3voto

FungPok Chan Points 41

La clé est de remodeler le vecteur de taille (3,) en (3,1) : diviser chaque ligne par un élément ou bien (1,3) : diviser chaque colonne par un élément. Comme data.shape ne correspond pas à la forme du vecteur, NumPy étend automatiquement la forme du vecteur à (3,3) et effectue la division, élément par élément.

In[1]: donnees/vecteur.reshape(-1,1)
Out[1]:
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

In[2]: donnees/vecteur.reshape(1,-1)
Out[2]:
array([[1.        , 0.5       , 0.33333333],
       [2.        , 1.        , 0.66666667],
       [3.        , 1.5       , 1.        ]])

Similaire :

x = np.arange(9).reshape(3,3)
x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

x/np.sum(x, axis=0, keepdims=True)
array([[0.        , 0.08333333, 0.13333333],
       [0.33333333, 0.33333333, 0.33333333],
       [0.66666667, 0.58333333, 0.53333333]])

x/np.sum(x, axis=1, keepdims=True)
array([[0.        , 0.33333333, 0.66666667],
       [0.25      , 0.33333333, 0.41666667],
       [0.28571429, 0.33333333, 0.38095238]])

print(np.sum(x, axis=0).shape)
print(np.sum(x, axis=1).shape)
print(np.sum(x, axis=0, keepdims=True).shape)
print(np.sum(x, axis=1, keepdims=True).shape)
(3,)
(3,)
(1, 3)
(3, 1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X