我可以使用元组甚至元组列表索引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起初看起来很有希望,但我无法弄清楚我是否可以将它应用到我的情况中。
编辑(对已接受答案的评论):
...然后使用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)])
答案 0 :(得分: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
答案 1 :(得分:1)
我认为最直接的方法是创建元组的子类并重新定义其__add__
运算符以执行您想要的操作。以下是如何执行此操作:Python element-wise tuple operations like sum
答案 2 :(得分: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]