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