操纵索引到2d numpy数组

时间:2012-03-15 13:55:53

标签: python numpy indexing multidimensional-array

我可以使用元组甚至元组列表索引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)])

3 个答案:

答案 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]