You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyTorch中通过不规则索引实现张量无循环赋值?

无需显式循环实现PyTorch按行指定起始位置赋值

你可以利用PyTorch的广播机制生成布尔掩码,直接完成批量赋值,完全避免显式循环,效率比逐行循环高得多(尤其是当Tensor行数较多时)。

实现步骤:

  1. 将索引列表转换为PyTorch Tensor,便于后续广播操作;
  2. 生成第二维度的列索引范围,通过广播比较生成掩码矩阵(标记哪些位置需要替换);
  3. 利用掩码直接对x和y的对应位置进行赋值。

代码示例:

import torch

x = torch.randn(2, 10)
y = torch.randn(2, 10)
idxs = torch.tensor([2, 6])  # 转为Tensor适配PyTorch操作

# 生成第二维度的列索引
cols = torch.arange(x.size(1), device=x.device)
# 广播生成掩码:每行中列索引 >= 对应起始位置的元素标记为True
mask = cols >= idxs.unsqueeze(1)

# 批量赋值
x[mask] = y[mask]

另一种高级索引实现方式

如果你偏好直接生成需要更新的坐标,也可以通过拼接索引的方式完成:

import torch

x = torch.randn(2, 10)
y = torch.randn(2, 10)
idxs = [2, 6]

# 生成行索引:每个行号重复对应需要更新的列数
rows = torch.arange(x.size(0)).repeat_interleave([x.size(1) - idx for idx in idxs])
# 生成列索引:拼接每行需要更新的列范围
cols = torch.cat([torch.arange(idx, x.size(1)) for idx in idxs])

# 按坐标赋值
x[rows, cols] = y[rows, cols]

两种方法中,掩码实现更简洁直观,且内存效率更高,推荐优先使用。

内容的提问来源于stack exchange,提问作者Matt Pitkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:15:05