用元组列表索引numpy数组

用元组列表索引numpy数组,numpy,multidimensional-array,indices,Numpy,Multidimensional Array,Indices,为什么我不能像这样使用元组索引列表对数据数组进行索引 idx = [(x1, y1), ... (xn, yn)] X[idx] 相反,我不得不做一些笨拙的事情,比如 idx2 = numpy.array(idx) X[idx2[:, 0], idx2[:, 1]] # or more generally: X[tuple(numpy.vsplit(idx2.T, 1)[0])] 有没有更简单、更通俗的方法?您可以使用元组列表,但约定与您想要的不同numpy需要行索引列表,后跟列值列表。显然

为什么我不能像这样使用元组索引列表对数据数组进行索引

idx = [(x1, y1), ... (xn, yn)]
X[idx]
相反,我不得不做一些笨拙的事情,比如

idx2 = numpy.array(idx)
X[idx2[:, 0], idx2[:, 1]] # or more generally:
X[tuple(numpy.vsplit(idx2.T, 1)[0])]

有没有更简单、更通俗的方法?

您可以使用元组列表,但约定与您想要的不同
numpy
需要行索引列表,后跟列值列表。显然,您希望指定(x,y)对的列表

文档中的相关部分是“整型数组索引”


下面是一个示例,在二维阵列中查找3个点。(2d中的2点可能会令人困惑):

使用您的xy索引对样式:

In [230]: idx1 = [(0,2),(1,3),(1,0)]
In [231]: [X[i] for i in idx1]
Out[231]: [2, 7, 4]

In [240]: X[tuple(np.array(idx1).T)]
Out[240]: array([2, 7, 4])
X[tuple(zip(*idx1))]
是进行转换的另一种方法。
tuple()
在Python2中是可选的
zip(*…)
是一种Python习惯用法,它反转列表的嵌套

您正走在正确的轨道上:

In [242]: idx2=np.array(idx1)
In [243]: X[idx2[:,0], idx2[:,1]]
Out[243]: array([2, 7, 4])
我的
tuple()。根据
numpy
惯例,需要进行某种转换

(我们是否应该检查什么适用于n维和m点?

使用可以直接传递给数组索引的
NumPy
数组元组:

index = tuple(np.array(list(zip(*index_tuple))))
new_array = list(prev_array[index])

实际上,您不需要转换为数组,
tuple(zip(*index\u tuple))
就足够了
index = tuple(np.array(list(zip(*index_tuple))))
new_array = list(prev_array[index])