J'utilise Python et NumPy et j'ai quelques problèmes avec "transposer":
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
L'appel a.T
ne transpose pas le tableau. Si a
c'est par exemple [[],[]]
alors il transpose correctement, mais j'ai besoin de la transposition de [...,...,...]
.
Réponses:
Cela fonctionne exactement comme il est censé le faire. 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 2D.)
Si vous souhaitez transformer votre vecteur 1D en un tableau 2D, puis le transposer, découpez-le simplement avec
np.newaxis
(ouNone
, ils sont identiques,newaxis
c'est juste plus lisible).De manière générale cependant, vous n'avez jamais à vous en soucier. L'ajout d'une dimension supplémentaire n'est généralement pas ce que vous voulez, si vous le faites simplement 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 ligne et un vecteur colonne (ni l'un ni l'autre ne sont des vecteurs . Ils sont tous deux 2D!) Lorsque vous voulez juste un vecteur.
la source
np.arange
de créer rapidement un tableau 1D. Cela fonctionne exactement de la même manière poura = np.array([5,4])
.()
n'indiquent pas de dimension supplémentaire dans numpy. Sia = np.arange(10)
alorsa
estarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
comme produit para.__repr__()
. Il s'agit d'una.ndim --> 1
vecteur à 1 dimension (c'est-à-dire ) comme indiqué par les crochets[]
. Learray( ... )
n'est pas vu lorsque vous faites l'unprint(a)
ou l' autrea.__str__()
.np.vstack()
opération d'être plus explicite:print np.vstack(a)
.Utilisez deux paires de supports au lieu d'une. Cela crée un tableau 2D, qui peut être transposé, contrairement au tableau 1D que vous créez si vous utilisez une paire de crochets.
Exemple plus approfondi:
Utilisez la
shape
méthode de numpy pour voir ce qui se passe ici:la source
Pour les baies 1D :
Une fois que vous comprenez que -1 signifie ici "autant de lignes que nécessaire", je trouve que c'est la manière la plus lisible de "transposer" un tableau. Si votre tableau est de dimensionnalité supérieure, utilisez simplement
a.T
.la source
transpose
etreshape
modifiez le tableau de différentes manières (la forme de l'image résultante est la même, mais les éléments sont placés différemment).Vous pouvez convertir un vecteur existant en matrice en l'enveloppant dans un jeu supplémentaire de crochets ...
numpy a aussi une
matrix
classe (voir tableau vs matrice ) ...la source
tableau numpy 1D -> matrice colonne / ligne:
Et comme @ joe-kington l'a dit, vous pouvez remplacer
None
parnp.newaxis
pour plus de lisibilité.la source
Pour 'transposer' un tableau 1d dans une colonne 2d, vous pouvez utiliser
numpy.vstack
:Cela fonctionne également pour les listes vanille:
la source
vstack
- jacent ?np.concatenate([atleast_2d(_m) for _m in tup], 0)
. Il divise le tableau en (1,1) tableaux et les concatène! Dans le processus, il fait une copie, tandis que tous ceux qui sont remodelés font une vue.Vous ne pouvez transposer qu'un tableau 2D. Vous pouvez utiliser
numpy.matrix
pour créer un tableau 2D. C'est trois ans de retard, mais j'ajoute simplement à l'ensemble possible de solutions:la source
np.matrix
n'est pas nécessaire et est généralement déconseillée.utilisez plutôt
arr[:,None]
pour créer un vecteur de colonnela source
La transposition de
est
eh bien le code est:
voici un lien pour plus d'informations:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
la source
Une autre solution.... :-)
la source
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 une
(2, )
dimension, c'est un tableau 1-D,Il existe deux façons de transposer un tableau 1-D:
tranchez-le avec "np.newaxis" ou aucun.!
autre manière d'écrire, ce qui précède sans
T
opération.!Envelopper [] ou utiliser np.matrix, c'est ajouter une nouvelle dimension.!
la source
Comme certains des commentaires ci-dessus mentionnés, la transposition des tableaux 1D sont des tableaux 1D, donc une façon de transposer un tableau 1D serait de convertir le tableau en une matrice comme ceci:
la source
Le nom de la fonction dans
numpy
est column_stack .la source
Il existe une méthode non décrite dans les réponses mais décrite dans la documentation de la
numpy.ndarray.transpose
méthode:On peut faire:
Ce qui (imo) est plus agréable que d'utiliser
newaxis
.la source
Fondamentalement, ce que fait la fonction de transposition est d'échanger la forme et les enjambées du tableau:
Dans le cas d'un tableau numpy 1D (tableau de rang 1), la forme et les enjambées sont des tuples à 1 élément et ne peuvent pas être échangés, et la transposition d'un tel tableau 1D le renvoie inchangé. Au lieu de cela, vous pouvez transposer un "vecteur-ligne" (tableau numpy de forme
(1, n)
) en un "vecteur-colonne" (tableau numpy de forme(n, 1)
). Pour y parvenir, vous devez d'abord convertir votre tableau numpy 1D en vecteur de ligne, puis permuter la forme et les enjambées (transposer). Voici une fonction qui le fait:Exemple:
Bien sûr, vous n'êtes pas obligé de le faire de cette façon puisque vous avez un tableau 1D et vous pouvez directement le remodeler en
(n, 1)
tableau para.reshape((-1, 1))
oua[:, None]
. Je voulais juste montrer comment la transposition d'un tableau fonctionne.la source
La façon dont j'ai appris à implémenter cela de manière compacte et lisible pour les tableaux 1-D, jusqu'à présent:
numpy.r_ et numpy.c_ traduisent les objets de tranche en concaténation le long du premier et du deuxième axe, respectivement. Donc le slicing v2 [:, 0] en transposant le tableau vertical v2 dans le tableau horizontal h2
numpy.vstack équivaut à la concaténation le long du premier axe après que les tableaux 1-D de forme (N,) ont été remodelés en (1, N). Reconstruit les tableaux divisés par vsplit .
la source