为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-08-16 09:47:04
假设我有一个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, :]


查看完整回答
反对 回复 2022-08-16
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号