Распаковка кортежей/массивов/списков в качестве индексов для массивов Numpy

Я хотел бы иметь возможность делать

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

и получим

1

однако это недопустимый синтаксис. Есть ли способ сделать это без явного написания

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

?

EDIT: Спасибо за ответы. В моей программе я индексировал массив Numpy вместо кортежа и получал странные результаты. Преобразование в кортеж, как предлагает Алок, делает трюк.

Ответ 1

Это проще, чем вы думаете:

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

Ответ 2

Try

A[tuple(idx)]

Если у вас нет более сложного варианта использования, который не так прост, как этот пример, то приведенное выше должно работать для всех массивов.

Ответ 3

Индексирование вызовов объектов:

object.__getitem__(index)

Когда вы выполняете A [1, 2], это эквивалентно:

A.__getitem__((1, 2))

Итак, когда вы это сделаете:

b = (1, 2)

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

Оба оператора будут оценивать значение True.

Если вам случится индексировать список, он может не индексировать то же, что и [1, 2]!= (1, 2)

Ответ 4

Нет необходимости распаковывать - если у вас есть запятая между [ и ], вы делаете кортеж, а не передаете аргументы. foo[bar, baz] эквивалентно foo[(bar, baz)]. Поэтому, если у вас есть кортеж t = bar, baz, вы просто скажете foo[t].