假设我有一个numpy矩阵:并且有我需要的位置,从中值:。data = np.random.rand(200, 50, 100)locs = np.random.randint(50, size=(200, 2))如何获得生成的形状矩阵?从本质上讲,我想从 指定的位置获取值。(200, 2, 100)datalocs如果我这样做:,我最终会得到一个形状的矩阵,而不是。data[locs](200, 2, 50, 100)(200, 2, 100)根据要求更新了更多详细信息:如果我们有:data = np.arange(125)reshaped = np.reshape(data, (5, 5, 5))locs = [[3, 4], [2, 1], [1, 3], [3, 3], [0, 0]]然后执行类似操作应给出以下输出:data[locs]array([[[ 15, 16, 17, 18, 19], [ 20, 21, 22, 23, 24]], [[ 35, 36, 37, 38, 39], [ 30, 31, 32, 33, 34]], [[ 55, 56, 57, 58, 59], [ 65, 66, 67, 68, 69]], [[ 90, 91, 92, 93, 94], [ 90, 91, 92, 93, 94]], [[100, 101, 102, 103, 104], [100, 101, 102, 103, 104]]])
1 回答

Smart猫小萌
TA贡献1911条经验 获得超7个赞
高级索引的结果将是索引沿要编制索引的维度的索引形状。 等价于 ,因此您的形状将是 、 或 。data[locs]data[locs, :, :]locs.shape + data.shape[1:](200, 2, 50, 100)
您似乎要求的是索引使用轴 1,使轴 0 与 中的行保持同步。为此,您需要沿轴 1 编制索引,并在轴零中提供从 0 到 200 的索引。datalocslocslocs
重要的是要记住,所有高级索引必须广播到相同的形状。由于是成形的,第一个索引必须成形或正确广播。我将展示前者,因为它更简单,更有效。locs(200, 2)(200, 1)(200, 2)
data = np.random.rand(200, 50, 100)
locs = np.random.randint(50, size=(200, 2))
rows = np.arange(200).reshape(-1, 1)
result = data[rows, locs, :]
添加回答
举报
0/150
提交
取消