2012-08-09 13 views
14

Estoy intentando un ejemplo muy básico en el módulo Python scipy para el método transpose pero no está dando el resultado esperado. Estoy usando Ipython con el modo pylab.Transposición nude sin dar el resultado esperado

a = array([1,2,3] 
print a.shape 
>> (3,) 
b = a.transpose() 
print b.shape 
>> (3,) 

Si imprime los contenidos de las matrices "a" y "b", son similares.

expectativa es: (que se dan como resultado de transposición Matlab om)

[1, 
    2, 
    3] 
+0

similares: http://stackoverflow.com/questions/5954603/python-numpy-transpose – nobar

Respuesta

17

NumPy's transpose() invierte efectivamente la forma de una matriz. Si la matriz es unidimensional, esto significa que no tiene ningún efecto.

En NumPy, las matrices

array([1, 2, 3]) 

y

array([1, 
     2, 
     3]) 

son en realidad la misma - que sólo difieren en los espacios en blanco. Lo que probablemente quiera son los arreglos bidimensionales correspondientes, para los cuales transpose() funcionaría bien. También considere el uso de NumPy tipo matrix:

In [1]: numpy.matrix([1, 2, 3]) 
Out[1]: matrix([[1, 2, 3]]) 

In [2]: numpy.matrix([1, 2, 3]).T 
Out[2]: 
matrix([[1], 
     [2], 
     [3]]) 

Tenga en cuenta que para la mayoría de aplicaciones, la matriz unidimensional sencillo que funciona bien tanto como una fila o vector columna, pero cuando viene de Matlab, es posible que prefiera utilizar numpy.matrix.

+4

'matrix' doesn' t se comporta exactamente como 'array'. Crea confusión. Podría ser mejor cortar el cable y comenzar con 'array'. – jfs

+1

@ J.F.Sebastian: El hecho de que se comporte de manera diferente es exactamente la razón por la que lo mencioné, ya que este comportamiento se acerca más a lo que los usuarios de Matlab están acostumbrados. Raramente uso la clase 'matrix', pero a veces me resulta útil. –

+0

Recientemente tuve que usar una función (de 'sklearn') que llama a .shape en su entrada para decidir el número de características y muestras. Entonces, para mis datos, se requería explícitamente una matriz de entrada de forma (5,1) en lugar de (1,5), para hacer lo que quería. En este caso, una 'matriz' funcionará y una' matriz' no, a menos que haya una manera de manejar esto con las matrices. – user2428107

5

debería probar: a = array([[1,2,3]]) o a = array([[1],[2],[3]]), es decir, a debería haber una matriz (fila vector, vector de columna).

23

Transpose es un noop para matrices unidimensionales.

Añadir nuevo eje y la transposición:

>>> a[None].T 
array([[1], 
     [2], 
     [3]]) 
>>> np.newaxis is None 
True 

o remodelar:

>>> a.reshape(a.shape+(1,)) 
array([[1], 
     [2], 
     [3]]) 

O como @Sven Marnach sugerido en los comentarios, añadir nuevo eje al final:

>>> a[:,None] 
array([[1], 
     [2], 
     [3]]) 
+0

En lugar de agregar un eje al principio y transponer, generalmente preferiría agregar el nuevo eje al final: 'a [:, Ninguno]' dará el resultado deseado en un solo paso. –

+0

@SvenMarnach: He actualizado la respuesta – jfs

+0

Para generalizar para dimensiones más grandes, usando la idea de @SvenMarnach puedes hacer 'a [..., None]'. http://docs.scipy.org/doc/numpy-1.10.1/user/basics.indexing.html#structural-indexing-tools – astrojuanlu

5

Una forma más concisa de remodelar una matriz 1D en una matriz 2D es:

a = np.array([1,2,3]), a_2d = a.reshape((1,-1)) or a_2d = a.reshape((-1,1)) 

La -1 en la forma de vectores significa "rellenar cualquier número hace que esta obra"

Cuestiones relacionadas