Распаковка кортежей / массивов / списков в качестве индексов для Numpy Arrays - PullRequest
17 голосов
/ 15 марта 2010

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

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

и получить

1

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

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

?

РЕДАКТИРОВАТЬ: Спасибо за ответы.В моей программе я индексировал массив Numpy, а не кортеж, и получал странные результаты.Преобразование в кортеж, как предполагает Алок, делает свое дело.

Ответы [ 4 ]

14 голосов
/ 15 марта 2010

Попробуйте

A[tuple(idx)]

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

13 голосов
/ 15 марта 2010

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

>>> import numpy
>>> A = numpy.array(((1,2),(3,4)))
>>> idx = (0,0)
>>> A[idx]
1
2 голосов
/ 15 марта 2010

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

2 голосов
/ 15 марта 2010

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

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...