pytorch中每行的第k个值?

pytorch中每行的第k个值?,pytorch,vectorization,Pytorch,Vectorization,给定 导入火炬 A=torch.rand(9).视图((3,3))#张量([0.7455,0.7736,0.1772],\n[0.6646,0.4191,0.6602],\n[0.0818,0.8079,0.6424]) k=火炬张量([0,1,0]) A.kthvalue_向量化(k)->[0.1772,0.6602,0.0818] 也就是说,我想用不同的k对每一列进行操作。 不是kthvalue也不是topk提供的API。 有没有一种矢量化的方法来解决这个问题? 备注-第k个值不是第k个

给定

导入火炬
A=torch.rand(9).视图((3,3))#张量([0.7455,0.7736,0.1772],\n[0.6646,0.4191,0.6602],\n[0.0818,0.8079,0.6424])
k=火炬张量([0,1,0])
A.kthvalue_向量化(k)->[0.1772,0.6602,0.0818]
也就是说,我想用不同的k对每一列进行操作。
不是
kthvalue
也不是topk提供的API。 有没有一种矢量化的方法来解决这个问题?
备注-第k个值不是第k个索引中的值,而是第k个最小元素

torch.kthvalue(输入,k,dim=None,keepdim=False,out=None)->(张量,长传感器)

返回一个namedtuple(值、索引),其中值是给定维度中输入张量每行的第k个最小元素。索引是找到的每个元素的索引位置


假设您不需要索引到原始矩阵中(如果需要,也可以对第二个返回值使用奇特的索引),您可以简单地对值进行排序(默认情况下按最后一个索引)并返回适当的值,如下所示:

def kth_smallest(tensor, indices):
    tensor_sorted, _ = torch.sort(tensor)
    return tensor_sorted[torch.arange(len(indices)), indices]
此测试用例为您提供了所需的值:

tensor = torch.tensor(
    [[0.7455, 0.7736, 0.1772], [0.6646, 0.4191, 0.6602], [0.0818, 0.8079, 0.6424]]
)

print(kth_smallest(tensor, [0, 1, 0])) # -> [0.1772,0.6602,0.0818]

你能解释一下你是如何以
[1,5,1]
收场的吗?它不应该是
[1,5,7]
?另外,请注意,
A
将无效,因为您没有向构造函数提供有效的数据类型。请为输入包含一个工作列表。当然,您的预期输出仍然可以是伪代码。另外,请注意Python是零索引的,因此
k
应该是
torch.tensor([0,1,0])
。ccl请阅读pytorch文档中关于kthvalue的内容,您输入k作为您希望的索引上方的一个,并提供一个工作示例,当然,纠正了期望的输出:)每行的第k个值通常被称为列?它缺少了kthvalue函数相对于nlogn的
O(n)
优势,但如果真正的kth_值不能矢量化,这是一个很好的选择。是的,不幸的是,但没有
O(n)
我所知道的PyTorch中预先制作的解决方案。如果此操作如此关键,您可以编写自己的或集成
numba
/
cupy
(不确定此方法是否以及有多复杂)。