使用另一个数组切片numpy数组

3
我正在尝试从一个NumPy数组y中提取一个子集,该子集由x中包含的一组索引指定,同时仍然保留y的某些索引。以具体示例为例,假设y的形状为(10,10,10,3),而x的形状为(7,7,3)。其中x的最后一个维度对应于y的前三个维度的索引信息。也就是说,我想要进行一种有效的切片操作,其结果与以下代码相同:
for i in x.shape[0]:
    for j in x.shape[1]:
        z[i,j,:] = y[x[i,j,0],x[i,j,1],x[i,j,2],:]

理想情况下,答案应该不受 x 的维度数量的影响。
通常来说,yN+1 维的,形状为 (...,N),而 xQ+1 维的,形状为 (...,N),结果的形状与 x 相同。
这样做的动机是从向量场中提取子集。
1个回答

4

这应该能够比较好地工作:

y[x[..., 0], x[..., 1], x[..., 2]]

总的来说:
y[tuple(np.rollaxis(x, -1))]

第一个版本可以满足我的需求,但只有在 y 的维数事先已知的情况下才能使用。第二个版本是通用的,但很慢(在我的一个测试中慢了20倍)。 - amaurea

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