Supongamos que tengo:
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
me pone ITH línea de la matriz (por ejemplo [1, 2]
). ¿Cómo puedo acceder a la i-ésima columna? (por ejemplo [1, 3, 5]
) Además, ¿sería una operación costosa?
>>> test[:,0]
array([1, 3, 5])
Similar,
>>> test[1,:]
array([3, 4])
le permite acceder a filas. Esto está cubierto en la Sección 1.4 (Indexación) de la referencia NumPy . Esto es rápido, al menos en mi experiencia. Ciertamente es mucho más rápido que acceder a cada elemento en un bucle.
Y si desea acceder a más de una columna a la vez, puede hacer lo siguiente:
fuente
test[:,[0,2]]
solo accede a los datos, por ejemplo,test[:, [0,2]] = something
modificaría la prueba y no crearía otra matriz. Perocopy_test = test[:, [0,2]]
, de hecho, crea una copia como usted dice.test[:,[0,2]]
solo accede a los datos mientrastest[:, [0, 2]][:, [0, 1]]
no lo hace? Parece muy poco intuitivo que hacer lo mismo nuevamente tenga un resultado diferente.este comando le da un vector de fila, si solo desea recorrerlo, está bien, pero si desea apilar con alguna otra matriz con dimensión 3xN, tendrá
mientras
le proporciona un vector de columna, para que pueda realizar operaciones de concatenación o hstack.
p.ej
fuente
También puede transponer y devolver una fila:
fuente
Para obtener varias columnas independientes, simplemente:
obtendrás las columnas 0 y 2
fuente
Aunque la pregunta ha sido respondida, permítanme mencionar algunos matices.
Digamos que está interesado en la primera columna de la matriz.
Como ya sabe por otras respuestas, para obtenerlo en forma de "vector de fila" (matriz de formas
(3,)
), utilice el corte:Para verificar si una matriz es una vista o una copia de otra matriz, puede hacer lo siguiente:
ver ndarray.base .
Además de la diferencia obvia entre los dos (la modificación
arr_c1_ref
afectaráarr
), el número de bytes para atravesar cada uno de ellos es diferente:Ver avances . ¿Porque es esto importante? Imagine que tiene una matriz muy grande en
A
lugar dearr
:y desea calcular la suma de todos los elementos de la primera columna, es decir,
A_c1_ref.sum()
oA_c1_copy.sum()
. Usar la versión copiada es mucho más rápido:Esto se debe a la diferente cantidad de avances mencionados anteriormente:
Aunque parezca que usar copias de columna es mejor, no siempre es así porque hacer una copia lleva tiempo y usa más memoria (en este caso, me llevó aproximadamente 200 µs crear el
A_c1_copy
). Sin embargo, si necesitamos la copia en primer lugar, o si necesitamos hacer muchas operaciones diferentes en una columna específica de la matriz y estamos de acuerdo en sacrificar la memoria por la velocidad, entonces hacer una copia es el camino a seguir.En el caso de que estemos interesados en trabajar principalmente con columnas, podría ser una buena idea crear nuestra matriz en el orden de columna mayor ('F') en lugar del orden de fila mayor ('C') (que es el valor predeterminado ), y luego haga el corte como antes para obtener una columna sin copiarla:
Ahora, realizar la operación de suma (o cualquier otra) en una vista de columna es mucho más rápido.
Finalmente, permítanme señalar que la transposición de una matriz y el uso de la división en filas es lo mismo que el uso de la división en columnas en la matriz original, porque la transposición se realiza simplemente intercambiando la forma y los pasos de la matriz original.
fuente
Luego puede seleccionar la segunda - cuarta columna de esta manera:
fuente