2010-04-27 13 views
11

que tienen una matriz como:matrices de rebanado en numpy/SciPy

a = array([[1,2,3],[3,4,5],[4,5,6]]) 

¿cuál es la forma más eficiente de cortar a cabo una serie 1x2 fuera de este que tiene sólo las dos primeras columnas de la "a"?

es decir,

array([[2,3],[4,5],[5,6]]) in this case. 

gracias.

+3

¿Cómo es el resultado del ejemplo en su Q "1x2" ...? ¿Y cómo tiene las primeras dos columnas? Debo confundirme ... –

+2

@Alex: al ver los resultados, creo que se refería a las dos últimas columnas :) Y 1x2 ... bueno. Hay 3 matrices de 2 elementos, puedes verlo así;) Sin embargo, estás en lo cierto, +1 – Wolph

+0

, sí, creo que fue un error tipográfico. se corrigió – mithunpaul

Respuesta

18

Dos matrices numpy dimensionales son indexados usando a[i,j] (no a[i][j]), pero se puede utilizar la misma notación rebanar con matrices numpy y matrices como sea posible con matrices normales en Python (justo ponerlos en una sola []) :

 
>>> from numpy import array 
>>> a = array([[1,2,3],[3,4,5],[4,5,6]]) 
>>> a[:,1:] 
array([[2, 3], 
     [4, 5], 
     [5, 6]]) 
+0

¿Se aplica esta regla solo a las matrices de 2 dimensiones? –

+0

@IvanBalashov No, también puedes usar esto para dimensiones más grandes. – Demento

4

¿Esto es lo que estás buscando?

a[:,1:] 
1

O dicho de otro modo (por citar documentation) la sintaxis básica rebanada es i: j: k, donde i es el índice de partida, j es el índice de parada, y k es el paso (k> 0)

Ahora, si 'i' no se da, por defecto es 0 para k> 0 y n - 1 para k < 0. Si no se da j, el valor predeterminado es n.

Eso es para una matriz unidimensional. Ahora las matrices bidimensionales son una bestia diferente. La sintaxis de corte es un [rango de filas, columnrange]

Por lo tanto, si desea todas las filas, pero solo las dos últimas, como en su caso, haga a [0: 3,1: 3].

Aquí [0: 3] significa que todas las filas de 0 a 3. y [1: 3] significa todas las columnas de la columna 1 a la columna 3.

Ahora, como usted puede preguntarse, a pesar de que sólo tiene 3 columnas y la numeración comienza desde 1, por lo que técnicamente este comando debe devolver 3 columnas a la derecha. es decir columna 1, columna 2, columna 3. Esa es la parte difícil de esta sintaxis. Tienes que comenzar a contar DESPUÉS del primer número. Entonces, cuando dices [1: 3], en realidad estás diciendo dame la columna 2 y la columna 3. Cuáles son las dos últimas columnas que deseas.

Ahora, si no sabe cuánto tiempo tiene su matriz o si desea todas las filas, puede dejar esa parte vacía. es decir

a [:, 1: 3] también funcionará.

Igual va para las columnas también. es decir, si quería decir, todas las columnas, pero sólo la primera fila, podría escribir

a [0: 1 ,:]

Ahora, ¿cómo lo anterior respuesta [:, 1:] funciona es porque cuando dices [1:] para las columnas, significa darme cualquier cosa DESPUÉS de la primera columna, y hasta el final de todas las columnas. es decir, vacío significa 'hasta el final'.

A estas alturas debe tener en cuenta que cualquier cosa en cualquier lado de la coma es todo un subconjunto del caso unidimensional que mencioné anteriormente. yo.E Si desea especificar sus filas usando tamaños de paso se puede escribir una [:: 2,1]

que en su caso volverá matriz ([[2, 3], [5, 6]])

es decir, el comando aclara como: dame todas las filas, tomando 2 a la vez. Además, dame solo las últimas 2 columnas.

Esto me tomó un tiempo para averiguar. Así que pegarlo aquí, en caso de que ayude a alguien.