2011-02-06 19 views
8

Supongamos que tengo una matriz 2D NumPy tales como:Conseguir el índice de la fila para una matriz 2D NumPy cuando se conocen los valores de columna múltiples

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

¿Cómo puedo encontrar el índice de la fila para la que conozco varios valores? Por ejemplo, si se sabe que la 0ª columna es 2 y la 1ª columna es 5, me gustaría saber el índice de la fila donde se cumple esta condición (fila 1 en este caso).

En mi aplicación, las dos primeras columnas son coordenadas (x, y), y la tercera columna es información sobre esa coordenada. Estoy tratando de encontrar coordenadas particulares en una lista para poder cambiar el valor en la tercera columna.

EDIT: Para aclarar, aquí es un ejemplo no-cuadrado:

a = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10 , 11, 12], [13, 14, 15, 16, 17, 18]]

Supongamos que sé la fila Busco tiene 13 en la columna 0 y 14 en la primera columna. Me gustaría devolver el índice de esa fila. En este caso, me gustaría devolver el índice 2 (2da fila).

O mejor aún, me gustaría editar la cuarta columna de la fila que tiene 13 en la columna 0 y 14 en la primera columna. Aquí es una solución que encontré para el caso que he descrito (cambiando el valor a 999):

un [(a [:, 0] == 13) & (a [:, 1 ] == 14), 3] = 999

da:

a = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 999, 17, 18]]

Lo siento si esto no estaba claro. ¿Podría alguien señalar en mi publicación original (por encima de la edición) cómo podría interpretarse de manera diferente, porque tengo problemas para verla?

Gracias.

EDIT 2: error corregido en la primera edición (en negrita)

ahora puedo ver cómo hice todo este asunto confuso para todos. La solución a mi problema está bien descrita en la condición b) de la solución de comer. Gracias.

+0

Estoy fallado. Después de su edición, ¿cuál es su resultado para 'sum (a [0] == 13) '? Gracias – eat

+0

Desafortunadamente me equivoqué al editar mi publicación la primera vez, que ahora he modificado. Gracias por tu paciencia. – lookitsmarc

+0

encantados de que haya podido resolver su problema. Si crees que mi respuesta fue valiosa para ti, puedes considerarla para retribuirla ;-). Gracias – eat

Respuesta

4

Estas son formas de manejar las condiciones en las columnas o filas, inspirado en el Zen de Python.

In []: import this 
The Zen of Python, by Tim Peters 

Beautiful is better than ugly. 
Explicit is better than implicit. 
... 

Así pues, siguiendo el segundo consejo:
a) las condiciones en la columna (s), aplicado a la fila (s):

condiciones
In []: a= arange(12).reshape(3, 4) 
In []: a 
Out[]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In []: a[2, logical_and(1== a[0, :], 5== a[1, :])]+= 12 
In []: a 
Out[]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 21, 10, 11]]) 

b) en fila (s), aplicado a la columna (s):

In []: a= a.T 
In []: a 
Out[]: 
array([[ 0, 4, 8], 
     [ 1, 5, 21], 
     [ 2, 6, 10], 
     [ 3, 7, 11]]) 
In []: a[logical_and(1== a[:, 0], 5== a[:, 1]), 2]+= 12 
In []: a 
Out[]: 
array([[ 0, 4, 8], 
     [ 1, 5, 33], 
     [ 2, 6, 10], 
     [ 3, 7, 11]]) 

Así que espero que esto realmente tenga sentido siempre que sea explícito al acceder a columnas y filas. El código generalmente es leído por personas con diversos antecedentes.

9
In [80]: a = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) 
In [81]: a 
Out[81]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

a==2 devuelve una matriz numpy booleano, mostrando donde la condición es verdadera:

In [82]: a==2 
Out[82]: 
array([[False, True, False], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 

se puede encontrar cualquier columnas en las que esto es verdad mediante el uso de np.any(...,axis=0):

In [83]: np.any(a==2,axis=0) 
Out[83]: array([False, True, False], dtype=bool) 

In [84]: np.any(a==5,axis=0) 
Out[84]: array([False, True, False], dtype=bool) 

Puede encuentre donde ambas condiciones son simultáneamente verdaderas usando &:

In [85]: np.any(a==2,axis=0) & np.any(a==5,axis=0) 
Out[85]: array([False, True, False], dtype=bool) 

Por último, se encuentra el índice de las columnas donde las condiciones son simultáneamente verdaderas usando np.where:

In [86]: np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0)) 
Out[86]: (array([1]),) 
2

Haciendo

np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0)) 

como unutbu sugirió no va a usar la información que 2 se encuentra en la columna 0 y 5 es en el primero. Así, por a = np.array([[5, 2, 3], [2, 5, 6], [7, 8, 9]]), será por error volver (array([0, 1]),)

su lugar, puede utilizar

np.where((a[0]==2) & (a[1]==5)) 

para obtener el resultado correcto (array([1]),).

Además, si desea editar la segunda columna de esa fila en particular, puede omitir np.where y simplemente hacer referencia a ella con: a[2][(a[0]==2) & (a[1]==5)]. Esto funcionará también para asignaciones, por ejemplo a[2][(a[0]==2) & (a[1]==5)] = 11.

+0

Su ejemplo de asignación no dio los resultados que esperaba. Para a = np.array ([[5, 2, 3], [2, 5, 6], [7, 8, 9]]) usando a [2] [(a [0] == 2) & (a [1] == 5)] = 11 devuelve una matriz ([[5, 2, 3], [2, 5, 6], [7, 11, 9]]) cuando quise devolver la matriz ([[ 5, 2, 3], [2, 5, 11], [7, 8, 9]]).Sin embargo, he descubierto la solución que produce este resultado: a [(a [0] == 2) & (a [1] == 5), 2] = 11 – lookitsmarc

+0

@lookitsmarc: basado en su comentario a J0ker5, Me gustaría pedirle que califique su pregunta. ¿Le importaría dar un ejemplo de un 'a' no cuadrado, que cumpla con sus requisitos? En mi humilde opinión, su pregunta actual de alguna manera mezcla filas y cols entre sí. Gracias – eat

+0

He editado mi publicación original con más aclaraciones. Espero que sea suficiente. – lookitsmarc

Cuestiones relacionadas