在 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.
但我不确定合并它们的有效方法是什么,因为我不想使用 NumPy
或 for
循环等。这会使过程变慢,因为原始张量太大,我要用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
只包含 0
和 len(xy)-1
之间的值,那么我们可以等效地使用 i_complement = len(set(indexes))
,它只是删除 indexes
中的重复值].
在 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.
但我不确定合并它们的有效方法是什么,因为我不想使用 NumPy
或 for
循环等。这会使过程变慢,因为原始张量太大,我要用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
只包含 0
和 len(xy)-1
之间的值,那么我们可以等效地使用 i_complement = len(set(indexes))
,它只是删除 indexes
中的重复值].