python - trasponer - Transposición de una matriz NumPy
transpuesta de una matriz python 3 (13)
Como algunos de los comentarios mencionados anteriormente, la transposición de matrices 1D son matrices 1D, por lo que una forma de transponer una matriz 1D sería convertir la matriz en una matriz como esta:
np.transpose(a.reshape(len(a), 1))
Uso Python y NumPy y tengo algunos problemas con "transpose":
a=array([5,4])
print a
print a.T
Invocar aT
no es transponer la matriz. Si a
es por ejemplo [[],[]]
, se transpone correctamente, pero necesito la transposición de [...,...,...]
.
El nombre de la función en numpy
es column_stack .
>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])
Está funcionando 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 quieres convertir tu vector 1D en una matriz 2D y luego transponerla, simplemente np.newaxis
con np.newaxis
(o None
, son iguales, newaxis
es simplemente 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 tendrá que preocuparse por esto. Agregar la dimensión extra generalmente no es lo que quieres, si solo lo haces por hábito. Numpy transmitirá automáticamente una matriz 1D al hacer varios cálculos. Generalmente no hay necesidad de distinguir entre un vector de fila y un vector de columna (ninguno de los cuales son vectores . ¡Ambos son bidimensionales!) Cuando solo quieres un vector.
La transposición de
x = [[0 1],
[2 3]]
es
xT = [[0 2],
[1 3]]
Bueno, el código es:
x = array([[0, 1],[2, 3]]);
np.transpose(x)
este es un enlace para más información:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
La transposición de [5,4] es [5,4], bueno en realidad
[5, 4]
PD: hay una forma simple de transponer una matriz 2D -
zip(*a)
Mi favorito es:
>>> np.atleast_2d([5, 4]).T
array([[4],
[5]])
Otra solución.... :-)
import numpy as np
a = [1,2,4]
[1, 2, 4]
b = np.array([a]).T
array ([[1], [2], [4]])
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 vanilla:
>>> numpy.vstack([1,2,3])
array([[1],
[2],
[3]])
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 clase de matrix
(ver matriz vs. matriz ) ...
matrix(v).T ## transpose a vector into a matrix
Solo puede transponer una matriz 2D. Puedes usar numpy.matrix
para crear una matriz 2D. Esto es tres años tarde, pero solo estoy agregando al posible conjunto de soluciones:
import numpy as np
m = np.matrix([2, 3])
m.T
Un poco tarde para la fiesta que veo, pero este es mi truco favorito :
a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS THE TRICK
print a
array([[1],
[2],
[3],
[4]])
Una vez que entiendes que el -1 dentro de la tupla dice básicamente "tantas filas como sea necesario", considero que esta es la forma más legible de "transponer" una matriz.
Use dos pares de corchetes en lugar de uno. Esto crea una matriz 2D, que puede transponerse, a diferencia de la matriz 1D que creas si usas un par de corchetes.
import numpy as np
a = np.array([[5, 4]])
a.T
Un 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]])
Usa el método de la shape
numpy para ver qué está pasando aquí:
>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
numpy matriz 1D -> matriz 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, puede reemplazar None
con np.newaxis
por legibilidad.