Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
Python 更新PyTorch中的特定向量元素_Python_Numpy_Pytorch_Autograd - Fatal编程技术网

Python 更新PyTorch中的特定向量元素

Python 更新PyTorch中的特定向量元素,python,numpy,pytorch,autograd,Python,Numpy,Pytorch,Autograd,我有一个大的向量,我想更新。我将通过向向量中的特定元素添加偏移来更新它。我指定要更新的索引向量(称为索引向量ix),并为每个索引指定要添加到该元素的值(称为值向量vals)。如果索引向量的所有条目都是唯一的,则以下代码就足够了: vec = torch.zeros(4, dtype=torch.float) ix = torch.tensor([0,2], dtype=torch.long) vals = torch.tensor([0.2, 0.5], dtype=torch.float) v

我有一个大的向量,我想更新。我将通过向向量中的特定元素添加偏移来更新它。我指定要更新的索引向量(称为索引向量
ix
),并为每个索引指定要添加到该元素的值(称为值向量
vals
)。如果索引向量的所有条目都是唯一的,则以下代码就足够了:

vec = torch.zeros(4, dtype=torch.float)
ix = torch.tensor([0,2], dtype=torch.long)
vals = torch.tensor([0.2, 0.5], dtype=torch.float)
vec[ix] += vals
但是,如果在
ix
中存在重复索引,则这不起作用。针对重复索引的简单方法如下所示:

for i in range(len(ix)):
    vec[ix[i]] += vals[i]
但这并不能很好地扩展-当
ix
很大时,它的速度非常慢。有没有更快的方法?如果有一种快速方法可以对
ix
中具有相同索引的
vals
的所有条目求和,那么解决方法应该很简单

更新:
我找到了一个非常有效的解决方案,如下所述。我仍然希望得到更好解决方案的反馈

# get unique indices
ix_unique = torch.unique(ix)

# for each unique index, get sum of all vals with that index
vals_unique = torch.stack([
    torch.sum(torch.where(ix==i, vals, torch.zeros_like(vals))) 
    for i in ix_unique
])

# update vec
vec[ix_unique] += vals_unique

对于希望允许对同一ix索引进行多次更新的情况,还存在一个名为的库。 在这种情况下,如果ix中有3个相同的标记,则会将3*val添加到该索引中。

torch.index_add()
导入火炬
vec=火炬.0(4,数据类型=火炬.float)
ix=火炬张量([0,0,2],dtype=火炬长)
VAL=火炬张量([0.2,0.1,0.5],dtype=火炬浮动)
火炬指数(vec、0、ix、VAL)
你会得到

张量([0.3000,0.0000,0.5000,0.0000])

参考资料:

您可以写下自己的答案,向其他人表明存在解决方案!