操纵索引到2d numpy的阵列
我可以索引与一个元组或甚至一个元组的列表中的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)])
是的。在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
尝试以下方法,它为我工作:
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]
我相信最直接的方法是创建一个元组的子类并重新定义它的__add__
运算符来做你想做的事。这里是如何做到这一点:Python element-wise tuple operations like sum
看我的问题(括号中的问号之前)。添加只是一个例子,我需要'__add__''__sub__'' __mul__'' __rmul__'' __div__'和每个标量/矢量和矢量/矢量。也许这样的类将是未来版本Python的一个很好的扩展。 – 2012-03-15 14:43:05
+1简单啊,应该自己想想这个吧!这会在我的代码中给出'tuple',但现在我会使用它,如果它得到了太多的'tuple',我仍然可以派生出我自己的类 – 2012-03-15 14:48:10