Ik gebruik Python en NumPy en heb wat problemen met “transponeren”:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
Het aanroepen van a.T
transponeert de array niet. Als a
bijvoorbeeld [[],[]]
is, dan transponeert het correct, maar ik heb het transponeren van [...,...,...]
.
Antwoord 1, autoriteit 100%
Het werkt precies zoals het hoort. Het transponeren van een 1Darray is nog steeds een 1Darray! (Als je gewend bent aan matlab, heeft het in principe geen concept van een 1D-array. De “1D” -arrays van Matlab zijn 2D.)
Als u uw 1D-vector in een 2D-array wilt veranderen en deze vervolgens wilt transponeren, snijdt u deze in plakjes met np.newaxis
(of None
, ze zijn hetzelfde , newaxis
is gewoon beter leesbaar).
import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)
Over het algemeen hoeft u zich hier echter nooit zorgen over te maken. Het toevoegen van de extra dimensie is meestal niet wat je wilt, als je het gewoon uit gewoonte doet. Numpy zal automatisch een 1D-array uitzenden bij het uitvoeren van verschillende berekeningen. Het is meestal niet nodig om onderscheid te maken tussen een rijvector en een kolomvector (die geen van beide vectorenzijn. Ze zijn beide 2D!) als je alleen een vector wilt.
Antwoord 2, autoriteit 59%
Gebruik twee paar haakjes in plaats van één. Dit creëert een 2D-array die kan worden getransponeerd, in tegenstelling tot de 1D-array die u maakt als u één paar haakjes gebruikt.
import numpy as np
a = np.array([[5, 4]])
a.T
Uitgebreider voorbeeld:
>>> 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]])
Gebruik numpy’s shape
methode om te zien wat hier aan de hand is:
>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
Antwoord 3, Autoriteit 37%
voor 1D-arrays :
a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT
print a
array([[1],
[2],
[3],
[4]])
Als u eenmaal begrijpt dat -1 hier “zoveel rijen als nodig” betekent, vind ik dit de meest leesbare manier om een array te transponeren. Als uw array van een hogere dimensionaliteit is, gebruikt u gewoon a.T
.
Antwoord 4, Autoriteit 7%
U kunt een bestaande vector omzetten in een matrix door deze in een extra set vierkante haakjes te wikkelen …
from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix
Numpy heeft ook een matrix
klasse (zie array versus matrix ) …
matrix(v).T ## transpose a vector into a matrix
Antwoord 5, autoriteit 5%
numpy 1D-array –> kolom/rij matrix:
>>> a=np.array([1,2,4])
>>> a[:, None] # col
array([[1],
[2],
[4]])
>>> a[None, :] # row, or faster `a[None]`
array([[1, 2, 4]])
En zoals @joe-kington al zei, je kunt None
vervangen door np.newaxis
voor de leesbaarheid.
Antwoord 6, autoriteit 4%
Als u een 1D-array wilt ‘transponeren’ naar een 2D-kolom, kunt u numpy.vstack
:
>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
[2],
[3]])
Het werkt ook voor vanillelijsten:
>>> numpy.vstack([1,2,3])
array([[1],
[2],
[3]])
Antwoord 7
Je kunt alleen een 2D-array transponeren. U kunt numpy.matrix
gebruiken om een 2D-array te maken. Dit is drie jaar te laat, maar ik voeg alleen maar toe aan de mogelijke reeks oplossingen:
import numpy as np
m = np.matrix([2, 3])
m.T
Antwoord 8
gebruik in plaats daarvan arr[:,None]
om een kolomvector te maken
Antwoord 9
Een andere oplossing… 🙂
import numpy as np
a = [1,2,4]
[1, 2, 4]
b = np.array([a]).T
matrix([[1],
[2],
[4]])
Antwoord 10
Wat de transponeerfunctie eigenlijk doet, is de vorm en stappen van de array omwisselen:
>>> 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)
In het geval van een 1D numpy-array (rang-1-array) zijn de vorm en stappen 1-element-tupels en kunnen ze niet worden verwisseld, en de transponering van zo’n 1D-array geeft deze ongewijzigd terug. In plaats daarvan kun je een “rij-vector” (numpy array van vorm (1, n)
) transponeren in een “column-vector” (numpy array van vorm (n, 1)
). Om dit te bereiken, moet je eerst je 1D numpy-array converteren naar rij-vector en vervolgens de vorm en passen verwisselen (transponeren). Hieronder is een functie die dit doet:
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])
Voorbeeld:
>>> 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]])
Natuurlijk hoeft u dit niet op deze manier te doen, aangezien u een 1D-array hebt en u deze direct kunt omvormen tot een (n, 1)
-array door a.reshape((-1, 1))
of a[:, None]
. Ik wilde alleen laten zien hoe het transponeren van een array werkt.
Antwoord 11
Ik consolideer alleen het bovenstaande bericht, ik hoop dat het anderen zal helpen om wat tijd te besparen:
De onderstaande array heeft een (2, )
dimensie, het is een 1-D array,
b_new = np.array([2j, 3j])
Er zijn twee manieren om een 1-D array te transponeren:
snijd het met “np.newaxis” of geen.!
print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)
andere manier van schrijven, het bovenstaande zonder T
bewerking.!
print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)
Inpakken [ ] of np.matrix gebruiken, betekent een nieuwe dimensie toevoegen.!
print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)
Antwoord 12
Het transponeren van
x = [[0 1],
[2 3]]
is
xT = [[0 2],
[1 3]]
Nou, de code is:
import numpy as np
a = [[0, 1],[2, 3]]
x = np.array(a);
np.transpose(x)
Of de eenvoudige manier:
x.T
dit is een link voor meer informatie: http:// docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
** Het transponeren van een 1-D-array geeft een ongewijzigd beeld van de oorspronkelijke array. Probeer dit voor 1D-array:
b = np.array([a])
Antwoord 13
Zoals sommige van de hierboven genoemde opmerkingen, zijn de transponering van 1D-arrays 1D-arrays, dus een manier om een 1D-array te transponeren zou zijn om de array als volgt naar een matrix te converteren:
np.transpose(a.reshape(len(a), 1))
Antwoord 14
De naam van de functie in numpy
is column_stack.
>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])
Antwoord 15
Er is een methode die niet wordt beschreven in de antwoorden, maar wordt beschreven in de documentatievoor de numpy.ndarray.transpose
methode:
Voor een 1-D-array heeft dit geen effect, omdat een getransponeerde vector gewoon dezelfde vector is. Om een 1-D-array om te zetten in een 2D-kolomvector, moet een extra dimensie worden toegevoegd. np.atleast2d(a).T bereikt dit, net als a[:, np.newaxis].
Men kan doen:
import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)
Welke (IMO) is mooier dan het gebruik van newaxis
.
Antwoord 16
De manier waarop ik heb geleerd dit te implementeren op een compacte en leesbare manier voor 1-D-arrays, tot nu toe:
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 _ en Numpy.c _ Vertalen Slice-objecten op respectievelijk aaneenschakeling langs de eerste en tweede as. Daarom de slicing V2 [:, 0] bij het omzetten van de verticale array V2 in de horizontale array H2
Numpy.vstack is gelijk aan de aaneenschakeling langs de eerste as na 1-D-vorm van vorm (N,) zijn opnieuw gevormd tot (1, N). Rebuilds arrays gedeeld door vsplit .