我有一个形状为(a, b, c)的3维数组/张量,并且我有一个不同索引的长度a的列表,每个索引在[0, b)的范围内.我想使用索引来获得一个大小为(a, c)的array.现在,我用一种难看的列表理解来做这件事

z = torch.stack([t_[b, :] for t_, b in zip(tensor, B)])

这是在神经网络的前向传递中实现的,所以我真的想避免列表理解.有没有什么Torch(或NumPy)函数可以更高效地完成我想要的事情?

还有一个小例子:

tensor = [[[ 0,  1],
           [ 2,  3],
           [ 4,  5]],
          [[ 6,  7],
           [ 8,  9],
           [10, 11]],
          [[12, 13],
           [14, 15],
           [16, 17]],
          [[18, 19],
           [20, 21],
           [22, 23]]]  # shape: (4, 3, 2)
B = [0, 1, 2, 2]
output = [[ 0,  1],
          [ 8,  9],
          [16, 17],
          [22, 23]]  # shape (4, 2)

背景:我有时间序列数据,这些数据有不同长度的时间窗口.我使用Torch的pack_padded_sequence(和反向)来屏蔽它,但我必须在屏蔽开始之前的时间点获得LSTM的输出,因为这样网络的输出就会变得不可用.在本例中,我有4个时点,每个时点的长度为0, 1, 2, 2,每个时点有2个特征.

推荐答案

使用高级索引.要获得所需的输出,我们需要第一个轴的相应索引,它是使用下面的torch.arange()创建的:

output = tensor[torch.arange(len(B)), B]

或者使用numpy

output = tensor[np.arange(len(B)), B]

这两种产品都有:

tensor([[ 0,  1],
        [ 8,  9],
        [16, 17],
        [22, 23]])

完整代码使用示例:

import torch
tensor = torch.tensor([
    [[ 0,  1],
     [ 2,  3],
     [ 4,  5]],
    [[ 6,  7],
     [ 8,  9],
     [10, 11]],
    [[12, 13],
     [14, 15],
     [16, 17]],
    [[18, 19],
     [20, 21],
     [22, 23]]])
B = [0, 1, 2, 2]
output = tensor[torch.arange(len(B)), B]

Python相关问答推荐

双情节在单个图上切换-pPython

X射线扫描显示Docker中的pip漏洞,尽管图像中未安装pip

在for循环中保存和删除收件箱

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

当变量也可以是无或真时,判断是否为假

云上Gunicorn的Flask-socketIO无法工作

Python中的锁定类和线程以实现dict移动

脚注在Python中使用regex导致错误匹配

根据多列和一些条件创建新列

使用imap-tools时错误,其邮箱地址包含域名中的非默认字符

已删除的构造函数调用另一个构造函数

如何在PIL、Python中对图像应用彩色面膜?

Pydantic:如何将对象列表表示为dict(将列表序列化为dict)

Locust请求中的Python和参数

如何使用Jinja语法在HTML中重定向期间传递变量?

点到面的Y距离

更改键盘按钮进入'

matplotlib + python foor loop

巨 Python :逆向猜谜游戏

通过追加列表以极向聚合