Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch-为一系列多个索引编制索引?_Pytorch - Fatal编程技术网

Pytorch-为一系列多个索引编制索引?

Pytorch-为一系列多个索引编制索引?,pytorch,Pytorch,假设我有一个大小为[100100]的张量,我有一组大小为[100]的start\u索引和end\u索引 我希望能够做到以下几点: 张量[开始索引:结束索引,:]=0 不幸的是,我在说 TypeError:只有单个元素的整数张量可以转换为索引 那么,如果没有for循环,这真的是可能的吗?据我所知,如果没有某种循环或列表理解,这是不可能的 下面是一些可能有用的替代方案,具体取决于您的用例。特别是,如果您希望对多个作业重复使用相同的start\u索引和end\u索引,或者如果您希望只对tensor执行

假设我有一个大小为[100100]的张量,我有一组大小为[100]的
start\u索引
end\u索引

我希望能够做到以下几点:

张量[开始索引:结束索引,:]=0

不幸的是,我在说

TypeError:只有单个元素的整数张量可以转换为索引


那么,如果没有for循环,这真的是可能的吗?

据我所知,如果没有某种循环或列表理解,这是不可能的

下面是一些可能有用的替代方案,具体取决于您的用例。特别是,如果您希望对多个作业重复使用相同的
start\u索引
end\u索引
,或者如果您希望只对
tensor
执行一个就地作业,那么下面的解决方案将非常有用


例如,如果给您的不是
start\u索引
end\u索引
,而是索引列表

row_indices = torch.cat([torch.arange(s, e, dtype=torch.int64) for s, e in zip(start_indices, end_indices)])
那么,使用

tensor[row_indices, :] = 0
tensor[mask] = 0

或者给你一个面具

mask = torch.zeros(tensor.shape, dtype=torch.bool, device=tensor.device)
for s, e in zip(start_indices, end_indices):
    mask[s:e, :] = True
那么,使用

tensor[row_indices, :] = 0
tensor[mask] = 0

不仍然需要for循环。这部分真的很慢。如果可能的话,我想避免for循环。正如我的答案开头所示,据我所知,pytorch不支持为同一维度使用多个开始/结束标记进行索引,任何解决方案都需要某种形式的循环。如果您不需要计算每次迭代的索引,这里提供的解决方案可能会很有用,但一般来说不一定会更快。我最终编写了自己的cuda内核,它基本上是30倍快。是的,我曾考虑将其作为一个潜在的解决方案提出来,但没有时间真正编写一个。如果可能的话,可以发布你的cuda内核作为你问题的答案吗?这将是非常有用的!很抱歉,这是特定领域的。我可能会在某个时候写一个广义的