評價此頁

torch.nonzero#

torch.nonzero(input, *, out=None, as_tuple=False) LongTensor or tuple of LongTensors#

注意

torch.nonzero(..., as_tuple=False) (預設) 返回一個二維張量,其中每一行都是一個非零值的索引。

torch.nonzero(..., as_tuple=True) 返回一個一維索引張量組成的元組,允許高階索引,因此 x[x.nonzero(as_tuple=True)] 可以得到張量 x 的所有非零值。返回的元組中,每個索引張量包含某個維度的非零索引。

有關兩種行為的更多詳細資訊,請參見下文。

input 在 CUDA 上時,torch.nonzero() 會導致主機-裝置同步。

as_tuple False (預設)時

返回一個包含 input 所有非零元素索引的張量。結果中的每一行都包含 input 中一個非零元素的索引。結果按字典序排序,最後一個索引變化最快(C 風格)。

如果 inputnn 個維度,則生成的索引張量 out 的大小為 (z×n)(z \times n),其中 zzinput 張量中非零元素的總數。

as_tuple True

返回一個由 1-D 張量組成的元組,每個張量對應 input 中的一個維度,其中包含 input 中所有非零元素(在該維度上)的索引。

如果 inputnn 個維度,則返回的元組包含 nn 個大小為 zz 的張量,其中 zzinput 張量中非零元素的總數。

作為特例,當 input 的維度為零且其值為非零標量時,它被視為一個只有一個元素的 1 維張量。

引數

input (Tensor) – 輸入張量。

關鍵字引數

out (LongTensor, optional) – 包含索引的輸出張量

返回

如果 as_tupleFalse,則為包含索引的輸出張量。如果 as_tupleTrue,則為每個維度建立一個 1-D 張量,包含沿該維度每個非零元素的索引。

返回型別

LongTensor 或 LongTensor 的 tuple

示例

>>> torch.nonzero(torch.tensor([1, 1, 1, 0, 1]))
tensor([[ 0],
        [ 1],
        [ 2],
        [ 4]])
>>> torch.nonzero(torch.tensor([[0.6, 0.0, 0.0, 0.0],
...                             [0.0, 0.4, 0.0, 0.0],
...                             [0.0, 0.0, 1.2, 0.0],
...                             [0.0, 0.0, 0.0,-0.4]]))
tensor([[ 0,  0],
        [ 1,  1],
        [ 2,  2],
        [ 3,  3]])
>>> torch.nonzero(torch.tensor([1, 1, 1, 0, 1]), as_tuple=True)
(tensor([0, 1, 2, 4]),)
>>> torch.nonzero(torch.tensor([[0.6, 0.0, 0.0, 0.0],
...                             [0.0, 0.4, 0.0, 0.0],
...                             [0.0, 0.0, 1.2, 0.0],
...                             [0.0, 0.0, 0.0,-0.4]]), as_tuple=True)
(tensor([0, 1, 2, 3]), tensor([0, 1, 2, 3]))
>>> torch.nonzero(torch.tensor(5), as_tuple=True)
(tensor([0]),)