Манипулирование индексами для двумерного массива - PullRequest
3 голосов
/ 15 марта 2012

Я могу индексировать двумерный массив с помощью кортежа или даже списка кортежей

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), но объединяет.

С другой стороны, используя для индексов числовые массивы, арифметика работает, но индексация не работает.

i = numpy.array(i)
k = i[0]+i[1]      # ok
print a[k]

дает массив [[3 4], [3 4]] вместо желаемого 4.

Есть ли способ до делать векторную арифметику по индексам но также иметь возможность до индексировать массив numpy с ними (без извлечения класса из кортежа и перегрузки всех операторов)?

Этот вопрос сначала выглядел многообещающе, но я не мог понять, смогу ли я применить его к моей ситуации.

Редактировать (прокомментировать принятый ответ):

... и работа с массивами индексов также работает с использованием map

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)])

Ответы [ 3 ]

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

Да. Преобразуйте массив NumPy в кортеж, когда вам нужно проиндексировать:

a[tuple(k)]

Тест:

>>> a = numpy.array([[1,2],[3,4]])
>>> i = numpy.array([(0,1),(1,0)])
>>> k = i[0] + i[1]
>>> a[tuple(k)]
4
1 голос
/ 15 марта 2012

Я считаю, что самый простой способ сделать это - создать подкласс кортежа и переопределить его оператор __add__, чтобы он делал то, что вы хотите. Вот как это сделать: Элементарные кортежные операции Python, такие как sum

0 голосов
/ 15 марта 2012

попробуйте следующее, у меня это работает:

import numpy

def functioncarla(a,b):
    return a+b

a = numpy.array([[1,2],[3,4]])
i = [(0,1),(1,0)]

#k = i[0]+i[1]
aux = map(functioncarla, i[0], i[1])
k = tuple(aux)
print 'k = ', k

print 'a[k] = ', a[k]
...