2010-03-15 15 views
15

me gustaría ser capaz de hacerdesembalaje tuplas/arreglos/listas como índices para numpy matrices

>>> A = numpy.array(((1,2),(3,4))) 
>>> idx = (0,0) 
>>> A[*idx] 

y obtener

1 

sin embargo esto no es una sintaxis válida. ¿Hay alguna forma de hacerlo sin escribir explícitamente

>>> A[idx[0], idx[1]] 

?

EDIT: Gracias por las respuestas. En mi programa estaba indexando con una matriz Numpy en lugar de una tupla y obtenía resultados extraños. La conversión a una tupla como Alok sugiere el truco.

+0

Fue una decisión difícil. Al final, pensé que Vicki podría hacer los puntos más que tú. Aun así, te di un voto positivo :-) – ntimes

+0

Además, supongo que la respuesta de Vicki ilustra que puedo usar el ejemplo de tupla directamente. – ntimes

Respuesta

11

Es más fácil de lo que piensa:

>>> import numpy 
>>> A = numpy.array(((1,2),(3,4))) 
>>> idx = (0,0) 
>>> A[idx] 
1 
+3

¿por qué no 'idx = [0,0]'? Parece que no funciona, ¿por qué? – Alcott

+0

es debido a la diferencia entre 'tuples' y' arrays' – TRiNE

11

Trate

A[tuple(idx)] 

A menos que tenga un caso de uso más complejo que no es tan simple como este ejemplo, lo anterior debe funcionar para todas las matrices.

+0

'idx' ya es una tupla. –

+1

@Mike: sí, pero el título de la pregunta dice que podría ser una lista o una matriz. –

+0

Ah, me lo perdí. –

2

Indexación de un objeto llama:

object.__getitem__(index) 

Al hacer A [1, 2], que es el equivalente de:

A.__getitem__((1, 2)) 

Así que cuando lo hace:

b = (1, 2) 

A[1, 2] == A[b] 
A[1, 2] == A[(1, 2)] 

Ambas declaraciones evaluarán a True.

Si le sucede al índice con una lista, que podría No índice de la misma, como [1, 2]! = (1, 2)

2

Sin desembalaje es necesario -cuando tiene una coma entre [ y ], está haciendo una tupla, no pasando argumentos. foo[bar, baz] es equivalente a foo[(bar, baz)]. Entonces, si tiene una tupla t = bar, baz, simplemente diga foo[t].

Cuestiones relacionadas