【问题标题】:How to select index over two dimension in PyTorch?如何在 PyTorch 中选择二维索引?
【发布时间】:2018-05-02 14:51:25
【问题描述】:

给定a = torch.randn(3, 2, 4, 5),我如何选择像(2, :, 0, :), (1, :, 1, :), (2, :, 2, :), (0, :, 3, :) 这样的子张量(生成的张量大小为(2, 4, 5)(4, 2, 5)

虽然a[2, :, 0, :] 给出了

 0.5580 -0.0337  1.0048 -0.5044  0.6784
-1.6117  1.0084  1.1886  0.1278  0.3739
[torch.FloatTensor of size 2x5]

但是,a[[2, 1, 2, 0], :, [0, 1, 2, 3], :] 给出了

TypeError: 对张量执行基本索引并遇到错误索引 dim 0 与列表类型的对象。唯一支持的类型是整数、切片、numpy 标量,或者如果使用 torch.LongTensor 或 torch.ByteTensor 进行索引,则只能传递单个张量。

虽然numpy 成功返回了(4, 2, 5) 张量。

【问题讨论】:

    标签: numpy pytorch


    【解决方案1】:

    它对你有用吗?

    import torch
    
    a = torch.randn(3, 2, 4, 5)
    print(a.size())
    
    b = [a[2, :, 0, :], a[1, :, 1, :], a[2, :, 2, :], a[0, :, 3, :]]
    b = torch.stack(b, 0)
    
    print(b.size()) # torch.Size([4, 2, 5])
    

    【讨论】:

    • 我想太多了,这种方法很简洁。 4D 数组的 Torch 表示法与 numpy 的不同。 +1。有很多问题github.com/pytorch/pytorch/issues/2412
    • 这是否意味着我必须使用for 列表理解来构建b
    • @displayname 不一定。你没有提到你的整个问题,你只是提到了一个特定的问题,考虑列表是解决问题的一种方法。
    • 索引实际上是由某些上下文生成的,所以我认为在实际问题中,需要for。谢谢。
    猜你喜欢
    • 2019-05-27
    • 2019-11-17
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2018-12-20
    • 2020-09-26
    • 2021-07-13
    相关资源
    最近更新 更多