同时分配 numpy/torch 轴的多个不同切片

Posted

技术标签:

【中文标题】同时分配 numpy/torch 轴的多个不同切片【英文标题】:Assigning multiple different slices of a numpy/torch axis simultaneously 【发布时间】:2020-02-29 02:34:44 【问题描述】:

我有一批图像(尺寸为“batchsize x 通道 x 高度 x 宽度”的 4d 张量/数组,我想在每个图像上绘制大小为零的水平条,但在每个图像的不同行上绘制。我可以使用 for 循环轻松完成此操作,但我无法找出矢量化实现。

理想情况下,我会生成一个“batchsize”随机起点的一维张量 r,然后执行类似的操作 t[:,:,r:r+s,:] = 0。如果我尝试这个,我会得到TypeError: only integer scalar arrays can be converted to a scalar index

如果我做一个玩具示例,只是尝试从只有两个图像的批次中提取两个不同的部分,做类似t[:,:,torch.tensor(([1,2],[2,3])),:] 之类的操作,我会得到一个 5D 张量,因为它正在拉 both批次中两个图像的这些部分。我如何抓取这些不同的部分,但每张图像只有一个?在这种情况下,如果输入是 2xCxHxW,我想要 2xCx2xW,其中第一项对应于第一张图像的第 1 行和第 2 行,第二项对应于第二张图像的第 2 行和第 3 行。谢谢你。

【问题讨论】:

【参考方案1】:

您可以使用此函数创建一个掩码,您可以在其中通过索引执行跨 y 或 x 轴的操作。您可以通过将索引的 x 值设置为它们的 y 索引来做到这一点。

bsg = sgs.data
device = sgs.device
bs, _, x, y = bsg.shape
max_y = y-size-1
rs = torch.randint(0, max_y, (bs,1), device=device)
m = torch.arange(y,device=device).repeat(bs, x)
gpumask = ((m < rs) | (m > (rs+size))).view(bs, 1, x, -1)
gpumask*bsg

【讨论】:

以上是关于同时分配 numpy/torch 轴的多个不同切片的主要内容,如果未能解决你的问题,请参考以下文章

torch和numpy的相互转换

pytorch学习-1:Torch vs Numpy

pytorch学习-1:Torch vs Numpy

tensorflow通过(不同范围的2d)切片列表更改/分配矩阵元素值

Pylint E1101 Module 'torch' has no 'from_numpy'

循环列表切片+元素分配Python