2012-03-15 264 views
3

我可以索引與一個元組或甚至一個元組的列表中的2D numpy的陣列操縱索引到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的陣列與他們(未經元組派生一個類和重載所有的運營商)?

This question看起來很有希望,但我無法弄清楚我是否可以將它應用於我的情況。

編輯(上接受的答案評論):

...和指標的排列工作再工作原理以及使用地圖

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

回答

2

是的。在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 
+0

+1簡單啊,應該自己想想這個吧!這會在我的代碼中給出'tuple',但現在我會使用它,如果它得到了太多的'tuple',我仍然可以派生出我自己的類 – 2012-03-15 14:48:10

0

嘗試以下方法,它爲我工作:

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

我相信最直接的方法是創建一個元組的子類並重新定義它的__add__運算符來做你想做的事。這裏是如何做到這一點:Python element-wise tuple operations like sum

+0

看我的問題(括號中的問號之前)。添加只是一個例子,我需要'__add__''__sub__'' __mul__'' __rmul__'' __div__'和每個標量/矢量和矢量/矢量。也許這樣的類將是未來版本Python的一個很好的擴展。 – 2012-03-15 14:43:05