Я могу проиндексировать массив 2d numpy с помощью кортежа или даже списка кортежей.
a = numpy.array([[1,2],[3,4]])
i = [(0,1),(1,0)] # edit: bad example, should have taken [(0,1),(0,1)]
print a[i[0]], a[i]
(Дает 2 [2 3]
)
Однако я не могу манипулировать кортежами с помощью векторной арифметики, т.е.
k = i[0]+i[1]
не дает желаемого (1,1)
, но объединяет.
С другой стороны, используя массивы numpy для индексов, арифметика работает, но индексация не работает.
i = numpy.array(i)
k = i[0]+i[1] # ok
print a[k]
дает массив [[3 4], [3 4]]
вместо желаемого 4
.
Есть ли способ выполнять векторные арифметические операции над индексами, а также иметь возможность проиндексировать с ними массив numpy (без вывода класса из кортежа и перегрузки всех операторов)?
Этот вопрос сначала выглядел многообещающе, но я не мог понять если я могу применить это к моей ситуации.
Изменить (комментарий к принятому ответу):
... и работа с массивами индексов также работает с использованием карты
arr = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
ids = numpy.array([(0,1),(1,0)])
ids += (0,1) # shift all indices by 1 column
print arr[map(tuple,ids.T)]
(хотя меня смущает, зачем мне транспонирование. Я бы тоже столкнулся с этой проблемой выше, и мне просто повезло с [(0,1),(0,1)])
tuple
в моем коде, но я буду использовать его сейчас, и если его станет слишком многоtuple
, я все равно смогу создать свой собственный класс в конце 15.03.2012