Seleccione ciertas filas (condición cumplida), pero solo algunas columnas en Python / Numpy

Tengo una matriz numpy con 4 columnas y quiero seleccionar las columnas 1, 3 y 4, donde el valor de la segunda columna cumple una determinada condición (es decir, un valor fijo). Intenté seleccionar primero solo las filas, pero con las 4 columnas mediante:

I = A[A[:,1] == i] 

que funciona Luego probé (de manera similar a matlab, que sé muy bien):

 I = A[A[:,1] == i, [0,2,3]] 

que no funciona ¿Cómo hacerlo?


DATOS DE EJEMPLO:

  >>> A = np.array([[1,2,3,4],[6,1,3,4],[3,2,5,6]]) >>> print A [[1 2 3 4] [6 1 3 4] [3 2 5 6]] >>> i = 2 # I want to get the columns 1, 3 and 4 for every row which has the value i in the second column. In this case, this would be row 1 and 3 with columns 1, 3 and 4: [[1 3 4] [3 5 6]] 

Ahora estoy usando esto:

 I = A[A[:,1] == i] I = I[:, [0,2,3]] 

Pero pensé que tenía que haber una mejor manera de hacerlo … (Estoy acostumbrado a MATLAB)

 >>> a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) >>> a array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> a[a[:,0] > 3] # select rows where first column is greater than 3 array([[ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> a[a[:,0] > 3][:,np.array([True, True, False, True])] # select columns array([[ 5, 6, 8], [ 9, 10, 12]]) # fancier equivalent of the previous >>> a[np.ix_(a[:,0] > 3, np.array([True, True, False, True]))] array([[ 5, 6, 8], [ 9, 10, 12]]) 

Para obtener una explicación sobre el oscuro np.ix_() , consulte https://stackoverflow.com/a/13599843/4323

Finalmente, podemos simplificar dando la lista de números de columna en lugar de la tediosa máscara booleana:

 >>> a[np.ix_(a[:,0] > 3, (0,1,3))] array([[ 5, 6, 8], [ 9, 10, 12]]) 

Si no desea utilizar posiciones booleanas sino los índices, puede escribirlo de esta manera:

 A[:, [0, 2, 3]][A[:, 1] == i] 

Volviendo a su ejemplo:

 >>> A = np.array([[1,2,3,4],[6,1,3,4],[3,2,5,6]]) >>> print A [[1 2 3 4] [6 1 3 4] [3 2 5 6]] >>> i = 2 >>> print A[:, [0, 2, 3]][A[:, 1] == i] [[1 3 4] [3 5 6]] 

Seriamente,

 >>> a=np.array([[1,2,3], [1,3,4], [2,2,5]]) >>> a[a[:,0]==1][:,[0,1]] array([[1, 2], [1, 3]]) >>> 

Esto también funciona.

 I = np.array([row[[x for x in range(A.shape[1]) if x != i-1]] for row in A if row[i-1] == i]) print I 

Edición: Dado que la indexación comienza desde 0, entonces

 i-1 

debería ser usado.

Espero que esto responda a tu pregunta, pero una parte del script que he implementado usando pandas es:

 df_targetrows = df.loc[df[col2filter]*somecondition*, [col1,col2,...,coln]] 

Por ejemplo,

 targets = stockdf.loc[stockdf['rtns'] > .04, ['symbol','date','rtns']] 

esto devolverá un dataframe con solo columnas ['symbol','date','rtns'] desde stockdf donde el valor de la fila de rtns satisface, stockdf['rtns'] > .04

espero que esto ayude