如何使用广播从一个具有2D索引列表的2D numpy数组中获取元素?

5
如果我有一个2D的numpy数组,想要使用一组行列索引对来提取元素。
xy = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
idx = np.array([[0, 0], [1, 1], [2, 2]])
< p > for循环的解决方案:

elements = list()
for i in idx:
    elements.append(xy[idx[i][0], xy[idx[i][1])

输出:

print(elements)
>> [1, 5, 9]

我找到了一个解决方案,如果 idx 是元组列表,但我希望有一种无需首先将 idx 转换为元组的解决方案。

Numpy有一个用于1D索引的take方法,但我仍在思考如何修改我的数组以使其与之配合使用(如果这是正确的解决方案)。 - dranobob
我很困惑,这被标记为重复,但链接的问题是将索引转换为元组(这正是我想避免的)。 - dranobob
太好了,找到答案了。由于我无法在此处添加答案。解决方案就是使用切片: element = xy[[idx[:,0], idx[:,1]] - dranobob
链接的重复问题的被接受答案已经讨论了使用切片:a[idx[:,0],idx[:,1],idx[:,2]]。我们只需要阅读整个帖子 :) - Divakar
1个回答

2
    idy = zip(*idx)
    output = xy[idy]

zip函数不是将idx转换为元组列表(使用循环)吗? - dranobob
看一下这里的zip(https://docs.python.org/3/library/functions.html#zip),它只是使用循环。 - dranobob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接