Python 同时指定numpy/火炬轴的多个不同切片

Python 同时指定numpy/火炬轴的多个不同切片,python,numpy,gpu,torch,Python,Numpy,Gpu,Torch,我有一批图像(4d张量/数组,尺寸为“batchsize x channels x height x width”,我想在每个图像上绘制大小为s的水平条,但跨越每个图像的不同行。我可以通过for循环轻松地完成这一点,但我还无法找到矢量化的实现 理想情况下,我会生成一个“batchsize”随机起始点的一维张量r,并执行如下操作 t[:,:,r:r+s,:]=0。如果我尝试此操作,我会得到TypeError:只有整数标量数组可以转换为标量索引 如果我做一个玩具的例子,试着从一个批次中拿出两个不同的

我有一批图像(4d张量/数组,尺寸为“batchsize x channels x height x width”,我想在每个图像上绘制大小为s的水平条,但跨越每个图像的不同行。我可以通过for循环轻松地完成这一点,但我还无法找到矢量化的实现

理想情况下,我会生成一个“batchsize”随机起始点的一维张量r,并执行如下操作
t[:,:,r:r+s,:]=0
。如果我尝试此操作,我会得到
TypeError:只有整数标量数组可以转换为标量索引


如果我做一个玩具的例子,试着从一个批次中拿出两个不同的部分,只有两个图像,做一些像
t[:,:,torch.tensor(([1,2],[2,3]),:]
我得到了一个5D张量,因为它从批处理中的两个图像中提取了两个。我如何获取这些不同的部分,但每个图像只有一个?在这种情况下,如果输入是2xCxHxW,我需要2xCx2xW,其中第一个项目对应于第一个图像的第1行和第2行,而第二个项目对应于第二行ond项对应于第二幅图像的第2行和第3行。谢谢。

您可以使用此功能创建一个掩码,在该掩码中,您可以通过索引在y轴或x轴上执行操作。您可以通过将索引的x值排列为其y索引来执行此操作

bsg=sgs.data
设备=sgs.device
bs,ux,y=bsg.shape
最大y=y尺寸-1
rs=火炬。randint(0,最大值(bs,1),装置=装置)
m=火炬。arange(y,装置=装置)。重复(bs,x)
gpumask=((m(rs+size))。视图(bs,1,x,-1)
gpumask*bsg