2012-09-30 24 views
15

¿Por qué el programanumpy.shape da respuestas inconsistentes - ¿por qué?

import numpy as np 

c = np.array([1,2]) 
print(c.shape) 
d = np.array([[1],[2]]).transpose() 
print(d.shape) 

dar

(2,) 
(1,2) 

como su salida? ¿No debería ser

(1,2) 
(1,2) 

en su lugar? Lo obtuve tanto en python 2.7.3 como en python 3.2.3

+4

Otros pueden preguntar al revés, por lo que creo que deberías decir por qué esperas más tarde. – hakre

+1

Usted puede estar pensando en matlab, pero verifique la diferencia entre 'matriz' y' matriz', en numpy, las matrices son preferibles. – seberg

+1

@hakre Realmente no veo ninguna diferencia (en la vida real) entre una lista (horizontal) y una matriz de 1 xn, así que esperaba que la forma de la matriz simple fuera 1 xn, y también esperaba d = [1 , 2] y no [[1, 2]], pero tiene su propio tipo de lógica una vez que ve lo que está sucediendo. – user1710403

Respuesta

1

len(c.shape) es la "profundidad" de la matriz.

Para c, la matriz es sólo una lista (un vector), la profundidad es 1.
Para d, la matriz es una lista de listas, la profundidad es 2.

Nota:

c.transpose() 
# array([1, 2]) 

que no es d, por lo que este comportamiento no es incoherente.

dt = d.transpose() 
# array([[1], 
#  [2]]) 
dt.shape # (2,1) 
14

Cuando se invoca el atributo .shape de un ndarray, se obtiene una tupla con tantos elementos como las dimensiones de la matriz. La longitud, es decir, el número de filas, es la primera dimensión (shape[0])

  • Se comienza con una matriz: c=np.array([1,2]). Es una matriz 1D simple, por lo que su forma será una tupla de 1 elemento, y shape[0] es la cantidad de elementos, por lo que c.shape = (2,)
  • Considere c=np.array([[1,2]]). Es una matriz 2D, con 1 fila. La primera y única fila es [1,2], que nos da dos columnas. Por lo tanto, c.shape=(1,2) y len(c)=1
  • Considere c=np.array([[1,],[2,]]). Otra matriz 2D, con 2 filas, 1 columna: c.shape=(2,1) y len(c)=2.
  • Considere d=np.array([[1,],[2,]]).transpose(): esta matriz es la misma que np.array([[1,2]]), por lo tanto su forma es (1,2).

Otro atributo útil es .size: Ese es el número de elementos a través de todas las dimensiones, y tiene una serie de cc.size = np.product(c.shape).

Más información sobre la forma en el documentation.

+1

Realmente no tengo un comentario útil, pero siento la necesidad de decir ... esto me molesta por alguna razón ... –

0

transpose no cambia el número de dimensiones de la matriz. Si c.ndim == 1, c.transpose() == c. Pruebe:

c = np.array([1,2]) 
print c.shape 
print c.T.shape 
c = np.atleast_2d(c) 
print c.shape 
print c.T.shape 
0

Solución rápida: compruebe la propiedad .ndim; si es 2, la propiedad .shape funcionará como esperaba.

Motivo Por qué: si la propiedad .ndim es 2, entonces numpy informa un valor de forma que coincide con la convención. Si la propiedad .ndim es 1, entonces numpy simplemente informa la forma de una manera diferente.

Más información: Cuando pase np.array una lista de listas, la propiedad .shape coincidirá con las nociones estándar de las dimensiones de una matriz: (filas, columnas).

Si pasa np.array solo por una lista, entonces numpy no cree que tenga una matriz en sus manos, e informa la forma de una manera diferente.

La pregunta es: ¿numpy piensa que tiene una matriz, o cree que tiene algo más en sus manos.

Cuestiones relacionadas