torch.unique¶
- torch.unique(input, sorted=True, return_inverse=False, return_counts=False, dim=None) tuple[Tensor, Tensor, Tensor] [source]¶
返回输入张量中的唯一元素。
注意
此函数与
torch.unique_consecutive()
不同之处在于,此函数还会消除非连续重复值。注意
目前在 CUDA 实现和 CPU 实现中,torch.unique 始终在开始时对张量进行排序,无论排序参数如何。排序可能会很慢,因此如果您的输入张量已经排序,建议使用
torch.unique_consecutive()
,这样可以避免排序。- 参数:
输入(张量)- 输入张量
sorted (bool) – 是否在返回输出之前按升序对唯一元素进行排序。
return_inverse (bool) – 是否也返回原始输入中元素在返回的唯一列表中的索引。
return_counts (bool) – 是否也返回每个唯一元素的计数。
dim(int,可选)- 要操作的维度。如果为
None
,则返回展平输入的唯一值。否则,将给定维度索引的每个张量视为应用唯一操作的元素之一。请参阅示例以获取更多详细信息。默认值:None
- 返回值:
一个张量或包含张量的元组
output(Tensor):唯一标量元素的输出列表。
inverse_indices(Tensor):(可选)如果为
return_inverse
,则将返回一个额外的张量(与输入形状相同),表示原始输入中的元素在输出中的映射索引;否则,此函数将仅返回单个张量。counts (Tensor):(可选)如果
return_counts
为 True,则将返回一个额外的张量(形状与输出相同或输出.size(dim),如果指定了 dim),表示每个唯一值或张量的出现次数。
- 返回类型:
(Tensor, Tensor (可选), Tensor (可选))
示例:
>>> output = torch.unique(torch.tensor([1, 3, 2, 3], dtype=torch.long)) >>> output tensor([1, 2, 3]) >>> output, inverse_indices = torch.unique( ... torch.tensor([1, 3, 2, 3], dtype=torch.long), sorted=True, return_inverse=True) >>> output tensor([1, 2, 3]) >>> inverse_indices tensor([0, 2, 1, 2]) >>> output, inverse_indices = torch.unique( ... torch.tensor([[1, 3], [2, 3]], dtype=torch.long), sorted=True, return_inverse=True) >>> output tensor([1, 2, 3]) >>> inverse_indices tensor([[0, 2], [1, 2]]) >>> a = torch.tensor([ ... [ ... [1, 1, 0, 0], ... [1, 1, 0, 0], ... [0, 0, 1, 1], ... ], ... [ ... [0, 0, 1, 1], ... [0, 0, 1, 1], ... [1, 1, 1, 1], ... ], ... [ ... [1, 1, 0, 0], ... [1, 1, 0, 0], ... [0, 0, 1, 1], ... ], ... ]) >>> # If we call `torch.unique(a, dim=0)`, each of the tensors `a[idx, :, :]` >>> # will be compared. We can see that `a[0, :, :]` and `a[2, :, :]` match >>> # each other, so one of them will be removed. >>> (a[0, :, :] == a[2, :, :]).all() tensor(True) >>> a_unique_dim0 = torch.unique(a, dim=0) >>> a_unique_dim0 tensor([[[0, 0, 1, 1], [0, 0, 1, 1], [1, 1, 1, 1]], [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1]]]) >>> # Notice which sub-tensors from `a` match with the sub-tensors from >>> # `a_unique_dim0`: >>> (a_unique_dim0[0, :, :] == a[1, :, :]).all() tensor(True) >>> (a_unique_dim0[1, :, :] == a[0, :, :]).all() tensor(True) >>> # For `torch.unique(a, dim=1)`, each of the tensors `a[:, idx, :]` are >>> # compared. `a[:, 0, :]` and `a[:, 1, :]` match each other, so one of >>> # them will be removed. >>> (a[:, 0, :] == a[:, 1, :]).all() tensor(True) >>> torch.unique(a, dim=1) tensor([[[0, 0, 1, 1], [1, 1, 0, 0]], [[1, 1, 1, 1], [0, 0, 1, 1]], [[0, 0, 1, 1], [1, 1, 0, 0]]]) >>> # For `torch.unique(a, dim=2)`, the tensors `a[:, :, idx]` are compared. >>> # `a[:, :, 0]` and `a[:, :, 1]` match each other. Also, `a[:, :, 2]` and >>> # `a[:, :, 3]` match each other as well. So in this case, two of the >>> # sub-tensors will be removed. >>> (a[:, :, 0] == a[:, :, 1]).all() tensor(True) >>> (a[:, :, 2] == a[:, :, 3]).all() tensor(True) >>> torch.unique(a, dim=2) tensor([[[0, 1], [0, 1], [1, 0]], [[1, 0], [1, 0], [1, 1]], [[0, 1], [0, 1], [1, 0]]])