在 PyTorch 的特定索引上将一个张量合并到另一个张量中

Merge one tensor into other tensor on specific indexes in PyTorch

在 Pytorch 中将一个张量合并到另一个张量的任何有效方法,但在特定索引上。

这是我的全部问题。

我在下面的代码中有一个 tensor 的索引列表 xy 是原始张量。 我需要保留 xy 的行(索引列表中的那些行)并对这些索引以外的元素应用一些函数(为简单起见,假设函数是'将它们乘以二),

xy = torch.rand(100,4)
indexes=[1,2,55,44,66,99,3,65,47,88,99,0]

然后将它们合并回原来的张量。

这是我到目前为止所做的: 我创建了一个遮罩张量

indexes=[1,2,55,44,66,99,3,65,47,88,99,0]
xy = torch.rand(100,4)
mask=[]
for i in range(0,xy.shape[0]):
    if i in indexes: 
         mask.append(False)  
    else:
        mask.append(True)
print(mask)
import numpy as np
target_mask = torch.from_numpy(np.array(mask, dtype=bool))
print(target_mask.sum()) #output is 89 as these are element other than preserved. 

在屏蔽行上应用函数

zy = xy[target_mask]
print(zy)
zy=zy*2
print(zy)

上面的代码工作正常并张贴在这里以澄清问题

现在我想在保存在列表 indexes 中的指定索引上将张量 zy 合并到 xy 中。 这是我做的伪代码,可以看出它太复杂了,需要 3 个 for 循环才能完成任务。而且会浪费太多资源

# pseudocode
for masked_row in indexes: 
    for xy_rows_index in xy: 
        if xy_rows_index= masked_row
            pass
        else:
            take zy tensor row and replace here #another loop to read zy. 

但我不确定合并它们的有效方法是什么,因为我不想使用 NumPyfor 循环等。这会使过程变慢,因为原始张量太大,我要用GPU

Pytorch 中有什么有效的方法吗?

获得掩码后,您可以就地分配更新值。

zy = 2 * xy[target_mask]
xy[target_mask] = zy

至于获取掩码,我认为您的方法不一定有问题,尽管使用内置的集合操作可能会更有效率。这也给出了一个索引张量而不是一个掩码,根据更新的索引数量,它可能更有效。

i = list(set(range(len(xy)))-set(indexes))
zy = 2 * xy[i]
xy[i] = zy

编辑:

为了解决评论,特别是找到 i 索引的补集,我们可以做

i_complement = list(set(range(len(xy)))-set(i))

但是,假设 indexes 只包含 0len(xy)-1 之间的值,那么我们可以等效地使用 i_complement = len(set(indexes)),它只是删除 indexes 中的重复值].