Estoy usando numpy y quiero indexar una fila sin perder la información de la dimensión.
import numpy as np
X = np.zeros((100,10))
X.shape # >> (100, 10)
xslice = X[10,:]
xslice.shape # >> (10,)
En este ejemplo, xslice es ahora 1 dimensión, pero quiero que sea (1,10). En R, usaría X [10,:, drop = F]. ¿Hay algo similar en numpy. No pude encontrarlo en la documentación y no vi una pregunta similar.
¡Gracias!
x[None, 10]
harás lo que quieras.None
s al lado de los atenuadores que estás cortando.b
; debería serb = np.zeros((100,10))
.X[10,None]
(usando su código como ejemplo).np.matmul()
o@
). Esto me quemó.Otra solución es hacer
o
La dimensionalidad de una matriz se conserva cuando la indexación se realiza mediante una lista (o una matriz) de índices. Esto es bueno porque te deja la opción entre mantener la dimensión y apretar.
fuente
x = np.array([[1,2,3,4]])
si luego lo corta,x[[0],[1,2]]
obtiene el unidimensional.array([2, 3])
Mi opinión es que al seleccionar los vectores de columna o fila, es mejor hacer el corte simple y luego usarlonp.reshape
, así que en mi ejemplo seríanp.reshape(x[0,[1,2]],[1,2])
X[[10]]
se interpretaría comoX[10]
y la forma será más pequeña; de manera similar,X[[10, 20]] == X[10, 20]
y la forma es aún más pequeñaa
forma(10, 20, 30)
, entoncesa[0, :, [0]]
tendrá forma(1, 20)
, no(20, 1)
, porque en estos últimos se emiten índices a losa[[0], :, [0]]
que muchas veces no es exactamente lo que esperas! Considerando quea[0, :, :1]
le dará lo(20, 1)
esperado. Además, consulte el comentario anterior para un caso de borde extraño con índice único. En general, parece que este método tiene demasiados casos extremos.Encontré algunas soluciones razonables.
1) uso
numpy.take(X,[10],0)
2) usa esta extraña indexación
X[10:11:, :]
Idealmente, este debería ser el predeterminado. Nunca entendí por qué se eliminan las dimensiones. Pero esa es una discusión para numpy ...
fuente
alist[0]
y se mantienen al dividirlas.slice(n, n+1)
para extraer índicen
) debería ser la respuesta aceptada, ya que es la única que se extiende naturalmente al caso n-dimensional.X[10:11, :]
en Python 3.7.5 (es decir, sin los dos puntos adicionales después del 11)Aquí hay una alternativa que me gusta más. En lugar de indexar con un solo número, indexe con un rango. Es decir, use
X[10:11,:]
. (Tenga en cuenta que10:11
no incluye 11).Esto también hace que sea fácil de entender con más dimensiones, sin
None
hacer malabares y sin saber qué eje usar qué índice. Además, no es necesario realizar una contabilidad adicional con respecto al tamaño de la matriz, soloi:i+1
para cualquierai
que haya utilizado en la indexación regular.fuente
Para agregar a la solución que involucra la indexación por listas o matrices por gnebehay, también es posible usar tuplas:
fuente
Esto es especialmente molesto si está indexando mediante una matriz que podría tener una longitud de 1 en tiempo de ejecución. Para ese caso, hay
np.ix_
:fuente