¿Cómo mantengo la orientación fila / columna de los vectores en números?

Desde un fondo de Matlab / Octave, he estado tratando de aprender el entumecimiento. Una cosa que me ha estado disparando una y otra vez es la distinción entre vectores y matrices multidimensionales. Para esta pregunta, le daré un problema específico que tengo, pero le agradecería mucho que alguien también pudiera explicar la imagen más general detrás de las matrices unidimensionales en números, por qué los querría, en primer lugar, cómo para evitar problemas al mezclar matrices unidimensionales y multidimensionales, etc. De todos modos, la pregunta:

Tengo una matriz 2-D llamada X:

X = numpy.arange(10).reshape(2,5) 

y quiero tomar la última columna de X y almacenarla como otra matriz bidimensional (es decir, un vector de columna) llamada Y. La única forma en que he podido venir para esto es:

 Y = numpy.atleast_2d(X[:,4]).T 

Pero no me gusta por un par de razones:

  1. No siento que deba decirle que transponga el vector cuando la orientación debería estar implícita en X [:, 4].

  2. Usar atleast_2D parece tan incómodo de usar una y otra vez en el código donde esta situación podría surgir mucho. Se siente como si estuviera haciendo algo mal.

Entonces, en resumen, ¿hay una mejor manera?

Gracias.

Primero, la manera fácil de hacer lo que quieres:

 Y = X[:,4:] 

Ahora, la razón por la que numpy no estaba haciendo esto cuando lo intentabas antes tiene que ver con cómo funcionan los arreglos en Python, y en realidad en la mayoría de los lenguajes de progtwigción. Cuando escribes algo como a[4] , eso es acceder al quinto elemento de la matriz, sin darte una vista de alguna sección de la matriz original. Entonces, por ejemplo, si a es una matriz de números, entonces a[4] solo será un número. Si a es una matriz bidimensional, es decir, efectivamente una matriz de matrices, entonces a[4] sería una matriz unidimensional. Básicamente, la operación de acceder a un elemento de matriz devuelve algo con una dimensionalidad de menos que la matriz original.

Ahora, Python incluye esta cosa llamada “notación de segmento”, representada mediante el uso de dos puntos, que es una forma diferente de acceder a los elementos de la matriz. En lugar de devolver un elemento (algo con una dimensionalidad menor que la matriz original), devuelve una copia de una sección de la matriz original. Esencialmente, a:b representa la lista de todos los elementos en los índices a (inclusive) a b (exclusivo). Se puede omitir b o ambos, en cuyo caso el sector se extiende hasta el extremo correspondiente de la matriz.

Lo que esto significa para su caso es que cuando escribe X[:,4] , tiene una notación de sector y una notación de índice regular. La notación de división representa todos los índices a lo largo de la primera dimensión (solo 0 y 1, ya que la matriz tiene dos filas), y el 4 representa el quinto elemento a lo largo de la segunda dimensión. Cada instancia de un índice regular básicamente reduce la dimensionalidad del objeto devuelto en uno, por lo que, dado que X es una matriz 2D, y hay un índice regular, se obtiene un resultado de 1D. Numpy solo muestra matrices 1D como vectores de fila. El truco, si quieres sacar algo de las mismas dimensiones con las que comenzaste, es usar todos los índices de división, como hice en el ejemplo al principio de esta publicación.

Si quisiera extraer la quinta columna de algo que tuviera más de 5 columnas en total, podría usar X[:,4:5] . Si quisiera una vista de las filas 3-4 y las columnas 5-7, haría X[3:5,5:8] . Con suerte se entiende la idea.