tags:

views:

98

answers:

4

I would love to be able to do

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

and get

1

however this is not valid syntax. Is there a way of doing this without explicitly writing out

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

?

EDIT: Thanks for the replies. In my program I was indexing with a Numpy array rather than a tuple and getting strange results. Converting to a tuple as Alok suggests does the trick.

+2  A: 

Try

A[tuple(idx)]

Unless you have a more complex use case that's not as simple as this example, the above should work for all arrays.

Alok
`idx` is already a tuple.
Mike Graham
@Mike: yes, but the question title says it might be a list or an array.
Alok
@Alok, Ah, I missed that.
Mike Graham
+1  A: 

Indexing an object calls:

object.__getitem__(index)

When you do A[1, 2], it's the equivalent of:

A.__getitem__((1, 2))

So when you do:

b = (1, 2)

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

Both statements will evaluate to True.

If you happen to index with a list, it might not index the same, as [1, 2] != (1, 2)

lunixbochs
+2  A: 

No unpacking is necessary—when you have a comma between [ and ], you are making a tuple, not passing arguments. foo[bar, baz] is equivalent to foo[(bar, baz)]. So if you have a tuple t = bar, baz you would simply say foo[t].

Mike Graham
+2  A: 

It's easier than you think:

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