2010-03-15 11 views
15

Ich würde gerne in der Lage seinAuspacken Tupeln/Arrays/Listen als Indizes für Numpy Arrays

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

zu tun und

1 

dies ist jedoch nicht gültig Syntax erhalten. Gibt es eine Möglichkeit, dies zu tun, ohne explizit zu schreiben

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

?

EDIT: Danke für die Antworten. In meinem Programm habe ich eher mit einem Numpy-Array als mit einem Tupel indexiert und seltsame Ergebnisse erhalten. Die Umwandlung in ein Tupel, wie Alok es vorschlägt, macht den Trick.

+0

Es ist eine schwierige Entscheidung war. Am Ende dachte ich, Vicki könnte mehr mit den Punkten anfangen als du. Trotzdem gab es eine Verbesserung :-) – ntimes

+0

Auch Vickis Antwort zeigt, dass ich das Beispiel-Tupel direkt verwenden kann. – ntimes

Antwort

11

Es ist einfacher als Sie denken:

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

warum nicht 'idx = [0,0]'? Es scheint nicht zu funktionieren, warum? – Alcott

+0

ist es auf den Unterschied zwischen 'Tupel' und' Arrays' zurückzuführen – TRiNE

11

Versuchen

A[tuple(idx)] 

Sofern Sie eine komplexere Anwendungsfall haben, wie dieses Beispiel nicht so einfach ist, für alle Arrays die oben funktionieren sollte.

+0

'idx' ist bereits ein Tupel. –

+1

@Mike: Ja, aber der Fragetitel sagt, es könnte eine Liste oder ein Array sein. –

+0

Ah, das habe ich vermisst. –

2

ein Objekt Indizierung ruft:

object.__getitem__(index) 

Wenn Sie A tun [1, 2], es ist das Äquivalent von:

A.__getitem__((1, 2)) 

Also, wenn Sie tun:

b = (1, 2) 

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

Beide Anweisungen werden als True ausgewertet.

Wenn Sie indizieren mit einer Liste passieren, es könnte nicht Index gleich, wie [1, 2]! = (1, 2)

2

nicht ausgepackt ist notwendig -wenn Sie haben Komma zwischen [ und , Sie machen ein Tupel, keine Argumente übergeben. foo[bar, baz] entspricht foo[(bar, baz)]. Also, wenn Sie ein Tupel t = bar, baz haben, würden Sie einfach foo[t] sagen.