Распаковка кортежей / массивов / списков в качестве индексов для Numpy Arrays
Я хотел бы быть в состоянии сделать
>>> A = numpy.array(((1,2),(3,4)))
>>> idx = (0,0)
>>> A[*idx]
и получить
1
однако это неверный синтаксис. Есть ли способ сделать это без явного выписывания
>>> A[idx[0], idx[1]]
?
РЕДАКТИРОВАТЬ: Спасибо за ответы. В моей программе я индексировал массив Numpy, а не кортеж, и получал странные результаты. Преобразование в кортеж, как предполагает Алок, делает свое дело.
4 ответа
Это проще, чем вы думаете
>>> import numpy
>>> A = numpy.array(((1,2),(3,4)))
>>> idx = (0,0)
>>> A[idx]
1
Пытаться
A[tuple(idx)]
Если у вас нет более сложного варианта использования, который не так прост, как этот пример, вышеприведенное должно работать для всех массивов.
Распаковка не требуется- когда между запятой [
а также ]
Вы делаете кортеж, не передавая аргументы. foo[bar, baz]
эквивалентно foo[(bar, baz)]
, Так что, если у вас есть кортеж t = bar, baz
вы бы просто сказали foo[t]
,
Индексирование объекта вызывает:
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)