【发布时间】:2020-12-13 14:10:49
【问题描述】:
我试图在 pytorch 的张量列表中找到 n 个最小值的索引。由于这些张量可能包含许多非唯一值,因此我不能简单地计算百分位数来获得索引。然而,非唯一值的顺序并不重要。
我想出了以下解决方案,但想知道是否有更优雅的方法:
import torch
n = 10
tensor_list = [torch.randn(10, 10), torch.zeros(20, 20), torch.ones(30, 10)]
all_sorted, all_sorted_idx = torch.sort(torch.cat([t.view(-1) for t in tensor_list]))
cum_num_elements = torch.cumsum(torch.tensor([t.numel() for t in tensor_list]), dim=0)
cum_num_elements = torch.cat([torch.tensor([0]), cum_num_elements])
split_indeces_lt = [all_sorted_idx[:n] < cum_num_elements[i + 1] for i, _ in enumerate(cum_num_elements[1:])]
split_indeces_ge = [all_sorted_idx[:n] >= cum_num_elements[i] for i, _ in enumerate(cum_num_elements[:-1])]
split_indeces = [all_sorted_idx[:n][torch.logical_and(lt, ge)] - c for lt, ge, c in zip(split_indeces_lt, split_indeces_ge, cum_num_elements[:-1])]
n_smallest = [t.view(-1)[idx] for t, idx in zip(tensor_list, split_indeces)]
编辑:理想情况下,解决方案会选择非唯一值的随机子集,而不是选择列表的第一个张量的条目。
【问题讨论】:
-
您好,我不太了解您的编辑。您想要通过连接整个张量列表产生的张量的 n 个最小值,是吗?您的意思是您不希望第一次出现最小值,而是随机出现?
-
@trialNerror 是的。如果由于多个相同的值而导致排序不确定,我想要一个随机排序。