web-dev-qa-db-fra.com

Transposer un tableau NumPy

J'utilise Python et NumPy et j'ai quelques problèmes avec "transposer":

a=array([5,4])
print a
print a.T

Invoquer a.T ne transpose pas le tableau. Si a est par exemple [[],[]], il est correctement transposé, mais j'ai besoin de la transposition de [...,...,...].

134
thaking

Cela fonctionne exactement comme il est supposé. La transposition d'un tableau 1D est toujours un tableau 1D! (Si vous êtes habitué à matlab, il n'a fondamentalement pas de concept de tableau 1D. Les tableaux "1D" de Matlab sont en 2D.)

Si vous voulez transformer votre vecteur 1D en un tableau 2D puis le transposer, découpez-le simplement avec np.newaxis (ou None, ils sont identiques, newaxis est un peu plus lisible).

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

De manière générale cependant, vous n'avez jamais besoin de vous inquiéter à ce sujet. Ajouter la dimension supplémentaire n’est généralement pas ce que vous voulez, si vous le faites par habitude. Numpy diffusera automatiquement un tableau 1D lors de divers calculs. Il n'est généralement pas nécessaire de faire la distinction entre un vecteur de ligne et un vecteur de colonne (ni l'un ni l'autre ne sont vectors. Ils sont tous les deux en 2D!) Lorsque vous souhaitez simplement un vecteur.

190
Joe Kington

Utilisez deux paires de crochets au lieu d’une. Cela crée un tableau 2D, qui peut être transposé, contrairement au tableau 1D créé si vous utilisez une paire de crochets.

import numpy as np    
a = np.array([[5, 4]])
a.T

Exemple plus complet:

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])

Utilisez la méthode shape de numpy pour voir ce qui se passe ici:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
105
savagent

Pour les tableaux 1D :

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])

Une fois que vous avez compris que -1 signifie ici "autant de lignes que nécessaire", je trouve que c'est le moyen le plus lisible de "transposer" un tableau. Si votre tableau est de dimension supérieure, utilisez simplement A.T.

60
Ulf Aslak

Vous pouvez convertir un vecteur existant en matrice en l’enveloppant dans un jeu supplémentaire de crochets ...

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy a aussi une matrix class (voir array vs. matrix ) ...

matrix(v).T ## transpose a vector into a matrix
16
nobar

numpy 1D array -> matrice colonnes/lignes:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

Et comme @ joe-kington l'a dit, vous pouvez remplacer None par np.newaxis pour plus de lisibilité.

13
ankostis

Pour "transposer" un tableau 1d en une colonne 2d, vous pouvez utiliser numpy.vstack :

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

Cela fonctionne aussi pour les listes de vanille:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])
8
Colonel Panic

Vous ne pouvez transposer qu'un tableau 2D. Vous pouvez utiliser numpy.matrix pour créer un tableau 2D. Nous avons trois ans de retard, mais j’ajoute un ensemble de solutions possibles:

import numpy as np
m = np.matrix([2, 3])
m.T
3
Jean-Louis Mbaka

La transposition de 

x = [[0 1],
     [2 3]]

est

xT = [[0 2],
      [1 3]]

bien le code est:

x = array([[0, 1],[2, 3]]);
np.transpose(x)        

cela un lien pour plus d'informations:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

1
Faeze Alahabadi

Une autre solution.... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

b = np.array([a]).T

tableau ([[1], [2], [4]])

0
omotto

Le nom de la fonction dans numpy est column_stack

>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])
0
tmarthal

Je ne fais que consolider le post ci-dessus, j'espère que cela aidera les autres à gagner du temps:

Le tableau ci-dessous a (2, )dimension, c'est un tableau 1-D,

b_new = np.array([2j, 3j])  

Il existe deux manières de transposer un tableau 1-D:


tranche avec "np.newaxis" ou aucun.!

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

autre manière d’écrire, la procédure ci-dessus sans l'opération T.!

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

L'emballage [] ou l'utilisation de np.matrix, signifie l'ajout d'une nouvelle dimension.!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)
0
anu

Comme certains des commentaires ci-dessus mentionnés, les tableaux 1D transposés sont des tableaux 1D, un moyen de transposer un tableau 1D consiste donc à convertir le tableau en matrice, comme suit:

np.transpose(a.reshape(len(a), 1))
0
TheOriginalAlex

utilisez plutôt arr [:, None] pour créer un vecteur colonne

0
Mohammed Awney