Transposición de una matriz NumPy

191

Uso Python y NumPy y tengo algunos problemas con la "transposición":

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

Invocar a.Tno es transponer la matriz. Si aes, por ejemplo [[],[]], se transpone correctamente, pero necesito la transposición de [...,...,...].

deshielo
fuente
También probé "imprimir a.transponer", que es lo mismo pero sin éxito, no transponer ...
tomando

Respuestas:

246

Funciona exactamente como se supone que debe hacerlo. ¡La transposición de una matriz 1D sigue siendo una matriz 1D ! (Si está acostumbrado a matlab, fundamentalmente no tiene un concepto de matriz 1D. Las matrices "1D" de Matlab son 2D).

Si desea convertir su vector 1D en una matriz 2D y luego transponerlo, simplemente córtelo np.newaxis(o None, son lo mismo, newaxises más legible).

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

Sin embargo, en términos generales, nunca debe preocuparse por esto. Agregar la dimensión adicional generalmente no es lo que quieres, si solo lo haces por costumbre. Numpy transmitirá automáticamente una matriz 1D al hacer varios cálculos. Por lo general, no es necesario distinguir entre un vector de fila y un vector de columna (ninguno de los cuales son vectores . ¡Ambos son 2D!) Cuando solo quieres un vector.

Joe Kington
fuente
2
@thaking: solía np.arangehacer rápidamente una matriz 1D. Funciona exactamente igual para a = np.array([5,4]).
Joe Kington
2
@thaking Si es nuevo en numpy, tenga en cuenta que los corchetes ()no indican una dimensión adicional en numpy. Si a = np.arange(10)entonces aes array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])como producido por a.__repr__(). Este es un a.ndim --> 1vector unidimensional (es decir ) como lo indican los corchetes []. El array( ... )no se ve cuando se hace bien print(a)o a.__str__().
dtlussier
77
@JoeKington hay una situación en la que la transmisión de una matriz 1D es útil. Calcular la distancia entre todos los puntos 1D en una matriz. Gracias a su solución, se puede hacer x - x [np.newaxis] .T que da la matriz de distancia
JuanPi
44
Personalmente, encuentro np.vstack()operación sea más explícito: print np.vstack(a).
Alexander Pozdneev
2
No es solo matlab, sino que el álgebra lineal tiene el concepto de un vector fila / columna. Numpy es idiosincrásico para las personas que vienen de muchos lugares, no solo de matlab.
Eric
133

Use dos pares de paréntesis en lugar de uno. Esto crea una matriz 2D, que puede transponerse, a diferencia de la matriz 1D que crea si usa un par de paréntesis.

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

Ejemplo más completo:

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

Use el shapemétodo de numpy para ver lo que está sucediendo aquí:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
salvaje
fuente
11
Prefiero esta solución a la [np.newaxis], parece más elegante imo.
PhilMacKay
Las máquinas no son tan inteligentes. Incluso si solo tiene una esposa, debe declararse como su primera esposa.
Sreeragh AR
Esta debería ser la respuesta elegida
bruno
79

Para matrices 1D :

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

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

Una vez que comprenda que -1 aquí significa "tantas filas como sea necesario", creo que esta es la forma más legible de "transponer" una matriz. Si su matriz es de mayor dimensionalidad, simplemente use a.T.

Ulf Aslak
fuente
55
Tenga en cuenta que esto solo funciona con vectores. Si tiene una matriz bidimensional, las operaciones transposey la reshapematriz modificada de diferentes maneras (la forma de la imagen resultante es la misma, pero los elementos se colocan de manera diferente).
johndodo
2
Gracias por tu comentario Entiendo su punto de vista, pero creo que distrae más de lo que aclara mi respuesta porque doy una solución simple de una línea a la pregunta exacta que @thaking enmarca. No se trata de matrices 2-d, se trata de matrices 1-d. Manzanas y peras aquí.
Ulf Aslak
2
Por supuesto. Su respuesta es correcta y elegante para este caso, nunca quise criticarla. Pero dado el título de la pregunta ("Transposición de una matriz NumPy") sospecho que muchos visitantes vendrán aquí buscando una solución más genérica y quería advertirles que no es aplicable a las matrices 2D. De lo contrario, su respuesta es correcta y adecuada dada la pregunta del OP.
johndodo
@UlfAslak, actualice su respuesta de que su enfoque no es generalizable a la matriz ND, siempre es bueno ser claro como lo sugiere! Johndodo, para que nadie use su técnica incorrectamente.!, La pregunta aquí es la respuesta correcta y no un revestimiento.
Anu
18

Puede convertir un vector existente en una matriz envolviéndolo en un conjunto adicional de corchetes ...

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

numpy también tiene una matrixclase (ver matriz vs. matriz ) ...

matrix(v).T ## transpose a vector into a matrix
sin bar
fuente
14

matriz 1D numpy -> matriz de columna / fila:

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

Y como dijo @ Joe-kington, se puede reemplazar Nonecon np.newaxispara facilitar la lectura.

ankostis
fuente
10

Para 'transponer' una matriz 1d a una columna 2d, puede usar numpy.vstack:

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

También funciona para listas de vainilla:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])
Coronel Panic
fuente
1
@sandroscodelller, ¿has mirado el código subyacente vstack? np.concatenate([atleast_2d(_m) for _m in tup], 0). ¡Divide la matriz en (1,1) matrices y concatena esas! En el proceso, hace una copia, mientras que todos los reformados hacen una vista.
hpaulj
3

Solo puede transponer una matriz 2D. Puede usar numpy.matrixpara crear una matriz 2D. Esto lleva tres años de retraso, pero solo estoy agregando al posible conjunto de soluciones:

import numpy as np
m = np.matrix([2, 3])
m.T
Jean-Louis Mbaka
fuente
El uso de np.matrixno es necesario y generalmente se desaconseja.
hpaulj
3

en su lugar, use arr[:,None]para crear un vector de columna

Mohammed Awney
fuente
2

Otra solución.... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

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

omotto
fuente
¿Cuál es el problema con esta solución?
omotto
1

Solo estoy consolidando la publicación anterior, espero que ayude a otros a ahorrar algo de tiempo:

La matriz a continuación tiene (2, )dimensión, es una matriz 1-D,

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

Hay dos formas de transponer una matriz 1-D:


córtelo con "np.newaxis" o ninguno.

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

otra forma de escribir, lo anterior sin Toperación.

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

Ajustar [] o usar np.matrix, significa agregar una nueva dimensión.!

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

Como algunos de los comentarios mencionados anteriormente, la transposición de las matrices 1D son matrices 1D, por lo que una forma de transponer una matriz 1D sería convertir la matriz en una matriz de la siguiente manera:

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

El nombre de la función en numpyes column_stack .

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

Hay un método no descrito en las respuestas pero descrito en la documentación del numpy.ndarray.transposemétodo:

Para una matriz 1-D esto no tiene efecto, ya que un vector transpuesto es simplemente el mismo vector. Para convertir una matriz 1-D en un vector de columna 2D, se debe agregar una dimensión adicional. np.atleast2d (a) .T logra esto, al igual que un [:, np.newaxis].

Uno puede hacer:

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

Que (imo) es mejor que usar newaxis.

Amin Karbas
fuente
0

Básicamente, lo que hace la función de transposición es intercambiar la forma y los pasos de la matriz:

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

En el caso de una matriz nudosa 1D (matriz de rango 1), la forma y las zancadas son tuplas de 1 elemento y no se pueden intercambiar, y la transposición de dicha matriz 1D la devuelve sin cambios. En su lugar, puede transponer un "vector fila" (matriz numpy de forma (1, n)) en un "vector columna" (matriz numpy de forma (n, 1)). Para lograr esto, primero debe convertir su matriz numpy 1D en un vector de fila y luego intercambiar la forma y las zancadas (transponerlo). A continuación se muestra una función que lo hace:

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

Ejemplo:

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

Por supuesto, no tiene que hacerlo de esta manera, ya que tiene una matriz 1D y puede cambiarla directamente a (n, 1)matriz por a.reshape((-1, 1))o a[:, None]. Solo quería demostrar cómo funciona la transposición de una matriz.

Andreas K.
fuente
0

La forma en que he aprendido a implementar esto de una manera compacta y legible para matrices 1-D, hasta ahora:

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_ y numpy.c_ traducen objetos de corte a concatenación a lo largo del primer y segundo eje, respectivamente. Por lo tanto, la división v2 [:, 0] en la transposición de la matriz vertical v2 en la matriz horizontal h2

numpy.vstack es equivalente a la concatenación a lo largo del primer eje después de que las matrices 1-D de forma (N,) se hayan reformado a (1, N). Reconstruye matrices divididas por vsplit .

and-sang
fuente