Python 如何沿给定的dim将N维张量的对角线设置为0?

Python 如何沿给定的dim将N维张量的对角线设置为0?,python,pytorch,diagonal,Python,Pytorch,Diagonal,我想找出一种方法,将三维张量的对角线(沿2个给定的DIM)设为0。举个例子,假设我有一个[N,N,N]形状的张量,我想把dim=1,2的对角线设为0?这到底是怎么做到的 我尝试使用fill\u diagonal\u,但这仅适用于每个子数组的第k个对角线元素,即: >数据=火炬一号(3,4,4) >>>数据填充(0) 张量([[0,1,1,1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 0, 1, 1], [1,

我想找出一种方法,将三维张量的对角线(沿2个给定的DIM)设为0。举个例子,假设我有一个[N,N,N]形状的张量,我想把dim=1,2的对角线设为0?这到底是怎么做到的

我尝试使用
fill\u diagonal\u
,但这仅适用于每个子数组的第k个对角线元素,即:

>数据=火炬一号(3,4,4)
>>>数据填充(0)
张量([[0,1,1,1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 0, 1],
[1, 1, 1, 1]]])
然而,我希望每个子矩阵的整个对角线在这里等于0。因此,预期的结果是

tensor([[[0, 1, 1, 1],
         [1, 0, 1, 1],
         [1, 1, 0, 1],
         [1, 1, 1, 0]],

        [[0, 1, 1, 1],
         [1, 0, 1, 1],
         [1, 1, 0, 1],
         [1, 1, 1, 0]],

        [[0, 1, 1, 1],
         [1, 0, 1, 1],
         [1, 1, 0, 1],
         [1, 1, 1, 0]]])
其次,我为给定的一对维度声明的原因是,我需要沿着两对不同的维度重复这个“归零”(例如dim=(1,2)然后dim=(0,1))以获得我需要的掩蔽

有没有一种方法可以为3D张量屏蔽2个任意维度上的给定对角线?

您可以使用子张量上的a来实现这一点:

跨越dim0的
#
对于范围内的i(数据大小(0)):
数据[i]。填充(0)
如果需要在三维张量的任意二维上执行此操作,只需将填充应用于适当的切片:

#跨dim1
对于范围内的i(数据大小(1)):
数据[:,i]。填充(0)
跨越dim2的
#
对于范围内的i(数据大小(2)):
数据[:,:,i]。填充(0)