Trasposizione di un array NumPy


193

Uso Python e NumPy e ho dei problemi con "transpose":

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

Il richiamo a.Tnon sta trasponendo l'array. Se aè per esempio, [[],[]]allora traspone correttamente, ma ho bisogno del recepimento di [...,...,...].


ho anche provato "print a.transpose" che è lo stesso ma senza successo, non trasporre ...
Thaking

Risposte:


247

Funziona esattamente come dovrebbe. La trasposizione di un array 1D è ancora un array 1D ! (Se sei abituato a matlab, fondamentalmente non ha un concetto di array 1D. Gli array "1D" di Matlab sono 2D.)

Se vuoi trasformare il tuo vettore 1D in un array 2D e poi trasporlo, taglialo con np.newaxis(o None, sono gli stessi, newaxisè solo più leggibile).

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

In generale, però, non devi mai preoccuparti di questo. Aggiungere la dimensione extra di solito non è quello che vuoi, se lo fai solo per abitudine. Numpy trasmetterà automaticamente un array 1D quando esegue vari calcoli. Di solito non è necessario distinguere tra un vettore di riga e un vettore di colonna (nessuno dei due sono vettori . Sono entrambi in 2D!) Quando si desidera solo un vettore.


2
@thaking - Ho appena usato np.arangeper creare rapidamente un array 1D. Funziona esattamente allo stesso modo per a = np.array([5,4]).
Joe Kington,

2
@thaking Se sei nuovo di numpy, tieni presente che le parentesi tonde ()non indicano una dimensione aggiuntiva in numpy. Se a = np.arange(10)allora aè array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])come prodotto da a.__repr__(). Questo è un a.ndim --> 1vettore monodimensionale (cioè ) come indicato dalle parentesi quadre []. Non array( ... )si vede quando si o print(a)o a.__str__().
dtlussier,

7
@JoeKington c'è una situazione in cui è utile la trasmissione di un array 1D. Calcolo della distanza tra tutti i punti 1D in un array. Grazie alla tua soluzione si può fare x - x [np.newaxis] .T che dà la matrice della distanza
JuanPi

4
Personalmente, trovo np.vstack()il funzionamento di essere più esplicito: print np.vstack(a).
Alexander Pozdneev,

2
Non è solo matlab, ma l'algebra lineare ha il concetto di un vettore riga / colonna. Numpy è idiosincratico per le persone che provengono da molti luoghi, non solo da matlab.
eric,

135

Utilizzare due coppie di parentesi anziché una. Questo crea un array 2D, che può essere trasposto, diversamente dall'array 1D che crei se usi una coppia di parentesi.

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

Esempio più approfondito:

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

Usa il shapemetodo numpy per vedere cosa sta succedendo qui:

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

11
Preferisco questa soluzione a [np.newaxis], sembra più elegante imo.
PhilMacKay,

Le macchine non sono così intelligenti. Anche se hai una sola moglie, dovrebbe essere dichiarata come la tua prima moglie.
Sreeragh, AR

Questa dovrebbe essere la risposta scelta
bruno

79

Per array 1D :

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

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

Una volta compreso che -1 qui significa "tutte le righe necessarie", trovo che questo sia il modo più leggibile di "trasporre" un array. Se il tuo array ha una dimensionalità superiore, utilizza semplicemente a.T.


5
Si noti che questo funziona solo con i vettori. Se si dispone di una matrice bidimensionale, le operazioni transposee la reshapemodifica della matrice sono diverse (la forma dell'immagine risultante è la stessa, ma gli elementi sono posizionati in modo diverso).
johndodo,

2
Grazie per la tua osservazione Vedo il tuo punto, ma penso che distragga più di quanto chiarisca la mia risposta perché do una semplice soluzione di una riga alla domanda esatta che @thaking inquadra. Non si tratta di array 2D, ma di array 1D. Mele e pere qui.
Ulf Aslak,

2
Ovviamente. La tua risposta è corretta ed elegante per questo caso, non ho mai avuto intenzione di criticarla. Ma dato il titolo della domanda ("Trasposizione di un array NumPy") sospetto che molti visitatori verranno qui alla ricerca di una soluzione più generica e volevo avvertirli che non è applicabile agli array 2D. Altrimenti la tua risposta è corretta e adeguata data la domanda del PO.
johndodo

@UlfAslak, aggiorna la tua risposta che il tuo approccio non è generalizzabile all'array ND, è sempre bene essere chiari come suggerito da! Johndodo, in modo che nessuno dovrebbe usare la tua tecnica in modo errato.!, La domanda qui è per la risposta giusta e non un liner.!
Anu,

18

Puoi convertire un vettore esistente in una matrice avvolgendolo in un set aggiuntivo di parentesi quadre ...

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

numpy ha anche una matrixclasse (vedi array vs. matrice ) ...

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

14

matrice 1D intorpidita -> matrice colonna / riga:

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

E come ha detto @ joe-kington, puoi sostituirlo Nonecon np.newaxisper leggibilità.


10

Per 'trasporre' un array 1d in una colonna 2d, puoi usare numpy.vstack:

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

Funziona anche con elenchi di vaniglia:

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

1
@sandroscodelller, hai guardato il codice sottostante vstack? np.concatenate([atleast_2d(_m) for _m in tup], 0). Suddivide l'array in (1,1) array e concatena quelli! Nel processo ne fa una copia, mentre tutti quelli che rimodellano fanno una vista.
hpaulj,

3

È possibile trasporre solo un array 2D. È possibile utilizzare numpy.matrixper creare un array 2D. Sono in ritardo di tre anni, ma sto solo aggiungendo alla possibile serie di soluzioni:

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

L'uso di np.matrixnon è necessario ed è generalmente scoraggiato.
hpaulj,



2

Un'altra soluzione .... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

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


Qual è il problema con questa soluzione ?!
omotto,

1

Sto solo consolidando il post sopra, spero che possa aiutare gli altri a risparmiare un po 'di tempo:

L'array di seguito ha (2, )dimensione, è un array 1-D,

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

Esistono due modi per trasporre un array 1-D:


taglialo con "np.newaxis" o nessuno.!

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

altro modo di scrivere, quanto sopra senza Toperazione.!

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

Avvolgere [] o usare np.matrix significa aggiungere una nuova dimensione.!

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

0

Come alcuni dei commenti sopra menzionati, la trasposizione degli array 1D è array 1D, quindi un modo per trasporre un array 1D sarebbe quello di convertire l'array in una matrice in questo modo:

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


0

Esiste un metodo non descritto nelle risposte ma descritto nella documentazione per il numpy.ndarray.transposemetodo:

Per un array 1-D questo non ha alcun effetto, poiché un vettore trasposto è semplicemente lo stesso vettore. Per convertire un array 1-D in un vettore di colonna 2D, è necessario aggiungere una dimensione aggiuntiva. np.atleast2d (a) .T ottiene questo, così come un [:, np.newaxis].

Si può fare:

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

Quale (imo) è più bello dell'uso newaxis.


0

Fondamentalmente ciò che la funzione di trasposizione fa è scambiare la forma e i passi dell'array:

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

Nel caso di array numpy 1D (array di rango 1) la forma e i passi sono tuple a 1 elemento e non possono essere scambiati, e la trasposizione di tale array 1D lo restituisce invariato. Invece, puoi trasporre un "vettore di riga" (matrice numpy di forma (1, n)) in un "vettore di colonna" (matrice numpy di forma (n, 1)). Per raggiungere questo obiettivo, devi prima convertire l'array numpy 1D in vettore riga e quindi scambiare la forma e i passi (trasponilo). Di seguito è una funzione che lo fa:

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

Esempio:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

>>> transpose(a)
array([[1, 4],
       [2, 5],
       [3, 6]])

Ovviamente non è necessario farlo in questo modo poiché si dispone di un array 1D e è possibile rimodellarlo direttamente in (n, 1)array con a.reshape((-1, 1))o a[:, None]. Volevo solo dimostrare come funziona la trasposizione di un array.


0

Finora ho imparato a implementarlo in modo compatto e leggibile per gli array 1-D:

h = np.array([1,2,3,4,5])

v1 = np.vstack(h)
v2 = np.c_[h]

h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]

numpy.r_ e numpy.c_ traducono gli oggetti slice in concatenazione rispettivamente lungo il primo e il secondo asse. Pertanto lo slicing v2 [:, 0] nel trasporre l'array verticale v2 nell'array orizzontale h2

numpy.vstack è equivalente alla concatenazione lungo il primo asse dopo che le matrici 1-D di forma (N,) sono state rimodellate in (1, N). Ricostruisce le matrici divise per vsplit .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.