2 回答

TA貢獻1802條經(jīng)驗 獲得超5個贊
好的,在對不同類型的索引進行了大量實驗之后,我讓它工作了。事實證明,答案就在 Advanced Indexing 中。不幸的是,PyTorch 文檔沒有詳細介紹高級索引。這是 Numpy 文檔中的鏈接。
對于上述問題,此命令起到了作用:
>>> k_lst = torch.zeros([4,4,5])
>>> k_lst[torch.arange(4).unsqueeze(1), torch.arange(4), inp_list[:,:,1]] = inp_list[:,:,0].float()
>>> k_lst
tensor([[[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 3.],
[-1., 0., 0., 0., 0.],
[ 0., 45., 0., 0., 0.]],
[[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 3.],
[-1., 0., 0., 0., 0.],
[ 0., 45., 0., 0., 0.]],
[[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 3.],
[-1., 0., 0., 0., 0.],
[ 0., 45., 0., 0., 0.]],
[[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 3.],
[-1., 0., 0., 0., 0.],
[ 0., 45., 0., 0., 0.]]])
這正是我想要的。
我在搜索這個時學到了很多東西,我想與任何偶然發(fā)現(xiàn)這個問題的人分享這個。那么,為什么會這樣呢?答案在于廣播的工作方式。如果您查看所涉及的不同索引張量的形狀,您會發(fā)現(xiàn)它們(必然)是可廣播的。
>>> torch.arange(4).unsqueeze(1).shape, torch.arange(4).shape, inp_list[:,:,1].shape
(torch.Size([4, 1]), torch.Size([4]), torch.Size([4, 4]))
顯然,要訪問此處的 k_lst 等 3-D 張量的元素,我們需要 3 個索引 - 每個維度一個。如果你給算子3個相同形狀的張量[],它可以通過從3個張量中匹配對應的元素得到一堆合法的索引。
如果這 3 個張量具有不同的形狀,但可以廣播(就像這里的情況),它會復制缺少張量的相關(guān)行/列所需的次數(shù)以獲得具有相同形狀的張量。
最終,就我而言,如果我們研究如何分配不同的值,這相當于做
k_lst[0,0,inp_list[0,0,1]] = inp_list[0,0,0].float()
k_lst[0,1,inp_list[0,1,1]] = inp_list[0,1,0].float()
k_lst[0,2,inp_list[0,2,1]] = inp_list[0,2,0].float()
k_lst[0,3,inp_list[0,3,1]] = inp_list[0,3,0].float()
k_lst[1,0,inp_list[1,0,1]] = inp_list[1,0,0].float()
k_lst[1,1,inp_list[1,1,1]] = inp_list[1,1,0].float()
.
.
.
k_lst[3,3,inp_list[3,3,1]] = inp_list[3,3,0].float()
這個格式讓我想起了torch.Tensor.scatter(),但是如果能用它來解決這個問題,我還沒想好怎么辦。

TA貢獻1775條經(jīng)驗 獲得超8個贊
我相信你所說的是你有一個稀疏張量并且想要轉(zhuǎn)換它。從tf.sparse.to_dense開始,然后是tensorflow.Tensor.eval()
添加回答
舉報