2012-03-15 272 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