105 votes

Python : Différenciation entre les vecteurs de lignes et de colonnes

Existe-t-il un bon moyen de différencier les vecteurs en ligne et en colonne en python ? Pour l'instant, j'utilise numpy et scipy et ce que je vois jusqu'à présent, c'est que si je donne un vecteur, disons

from numpy import *
Vector = array([1,2,3])

ils ne seraient pas capables de dire si je veux dire un vecteur de ligne ou de colonne. D'ailleurs :

array([1,2,3]) == array([1,2,3]).transpose()
True

Ce qui, dans le "monde réel", est tout simplement faux. Je réalise que la plupart des fonctions sur les vecteurs des modules mentionnés n'ont pas besoin de différenciation. Par exemple outer(a,b) o a.dot(b) mais j'aimerais faire la différence pour ma propre commodité.

101voto

bogatron Points 4412

Vous pouvez rendre la distinction explicite en ajoutant une autre dimension au tableau.

>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a.transpose()
array([1, 2, 3])
>>> a.dot(a.transpose())
14

Maintenant, forcez-le à être un vecteur colonne :

>>> a.shape = (3,1)
>>> a
array([[1],
       [2],
       [3]])
>>> a.transpose()
array([[1, 2, 3]])
>>> a.dot(a.transpose())
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

Une autre option consiste à utiliser np.newaxis lorsque vous souhaitez faire la distinction :

>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a[:, np.newaxis]
array([[1],
       [2],
       [3]])
>>> a[np.newaxis, :]
array([[1, 2, 3]])

50voto

meowsqueak Points 2131

Utiliser le double [] lorsque vous écrivez vos vecteurs.

Ensuite, si vous voulez un vecteur de ligne :

row_vector = array([[1, 2, 3]])    # shape (1, 3)

Ou si vous voulez un vecteur colonne :

col_vector = array([[1, 2, 3]]).T  # shape (3, 1)

20voto

blue_note Points 701

Le vecteur que vous créez est ni ligne ni colonne . Il n'a en fait qu'une seule dimension. Vous pouvez le vérifier en

  • vérification du nombre de dimensions myvector.ndim qui est 1
  • la vérification de la myvector.shape qui est (3,) (un tuple avec un seul élément). Pour un vecteur de ligne, il doit être (1, 3) et pour une colonne (3, 1)

Deux façons de gérer cela

  • créer un réel vecteur ligne ou colonne
  • reshape votre actuel

Vous pouvez créer explicitement une ligne ou une colonne

row = np.array([    # one row with 3 elements
   [1, 2, 3]
]
column = np.array([  # 3 rows, with 1 element each
    [1],
    [2],
    [3]
])

ou, avec un raccourci

row = np.r_['r', [1,2,3]]     # shape: (1, 3)
column = np.r_['c', [1,2,3]]  # shape: (3,1)

Alternativement, vous pouvez le remodeler en (1, n) pour les rangs, ou (n, 1) pour la colonne

row = my_vector.reshape(1, -1)
column = my_vector.reshape(-1, 1)

où le -1 trouve automatiquement la valeur de n .

8voto

abhra Points 164

Je pense que vous pouvez utiliser l'option ndmin de numpy.array. En le gardant à 2, cela signifie que ce sera un (4,1) et que la transposition sera (1,4).

>>> a = np.array([12, 3, 4, 5], ndmin=2)
>>> print a.shape
>>> (1,4)
>>> print a.T.shape
>>> (4,1)

4voto

Saullo Castro Points 12260

Si vous voulez une distiction pour ce cas, je vous recommande d'utiliser une matrix à la place, où :

matrix([1,2,3]) == matrix([1,2,3]).transpose()

donne :

matrix([[ True, False, False],
        [False,  True, False],
        [False, False,  True]], dtype=bool)

Vous pouvez également utiliser un ndarray en ajoutant explicitement une deuxième dimension :

array([1,2,3])[None,:]
#array([[1, 2, 3]])

et :

array([1,2,3])[:,None]
#array([[1],
#       [2],
#       [3]])

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