从 2D 矩阵中基于 3D 矩阵的位置获取值

假设我有一个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]]])


慕哥6287543
浏览 90回答 1
1回答

Smart猫小萌

高级索引的结果将是索引沿要编制索引的维度的索引形状。 等价于 ,因此您的形状将是 、 或 。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, :]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python