- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个向量 A = [0,1,2,3,0,0,1,1,2,2,3,3]
。我需要按越来越多的方式对它进行排序,以便它以有序的方式列出并从中提取 argsort。为了更好地解释这一点,我需要对 A 进行排序,使其返回 B = [0,4,5,1,6,7,2,8,9,3,10,11]
。但是,当我使用 pyotrch 的 torch.argsort(A)
时,它返回 B = [4,5,0,1,6,7,2,8,9,3,10,11 ]
。
我假设这样做的算法无法在我这边进行控制。有没有办法在不引入 for 循环的情况下解决这个问题?这样的操作是我的神经网络模型的一部分,如果没有有效地完成,将会导致性能问题。谢谢!
最佳答案
这是一个利用 broadcasting
的纯 PyTorch 解决方案, torch.unique()
, 和 torch.nonzero()
.这将有很大的插入作用,特别是对于基于 GPU 的实现/运行而言,如果我们必须切换回 NumPy,这是不可能的,argsort
然后转移回 PyTorch(如其他方法中所建议的) .
# our input tensor
In [50]: A = torch.tensor([0,1,2,3,0,0,1,1,2,2,3,3])
# construct an intermediate boolean tensor
In [51]: boolean = A[:, None] == torch.unique(A)
In [52]: boolean
Out[52]:
tensor([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]], dtype=torch.uint8)
一旦我们有了这个 bool 张量,我们就可以通过在转置 bool 张量后检查有 1
的位置来找到所需的索引。
这将为我们提供排序的 input
和 indices
。由于我们只需要索引,因此我们可以通过为最后一列(1
或 -1
)建立索引来获取它们
In [53]: torch.nonzero(boolean.t())[:, -1]
Out[53]: tensor([ 0, 4, 5, 1, 6, 7, 2, 8, 9, 3, 10, 11])
这是 OP 在评论中提供的另一个示例的结果:
In [55]: A_large = torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9])
In [56]: boolean_large = A_large[:, None] == torch.unique(A_large)
In [57]: torch.nonzero(boolean_large.t())[:, -1]
Out[57]:
tensor([ 0, 10, 11, 1, 12, 13, 2, 14, 15, 3, 16, 17, 4, 18, 19, 5, 20, 21,
6, 22, 23, 7, 24, 25, 8, 26, 27, 9, 28, 29])
注意:与其他答案中提出的基于 NumPy 的解决方案不同,在这里我们不必担心我们必须使用哪种kind
排序算法,因为我们根本没有使用任何排序。
关于python - Pytorch argsort 已排序,张量中有重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176439/
因此,它是一种间接排序,它返回对数组进行排序的索引。为什么它是“argsort”(考虑到它需要一个参数——要使用的排序类型,这是有道理的)而不是“indirect_sort”或类似的东西?还是 get
我有以下数据帧: 用户身份 列_1 列_2 第 3 列 一种 4.959 3.231 1.2356 乙 0.632 0.963 2.4556 C 3.234 7.445 5.3435 D 1.454
我正在纯Python中寻找一个理想的函数,它类似于numpy.argsort,因为它只返回排序索引的列表,同时保持原始数组不变,但它需要能够对多个数组中包含的数据进行排序数组。 示例: >>> nam
所以我有一个二维数组,其中第一列由介于 -1.0 和 1.0 之间的 float 组成。我想根据第一列对数组进行排序,从最低到最高,这样: data[0,data[0,:].argsort()] 但问
考虑以下代码: avgDists = np.array([1, 8, 6, 9, 4]) ids = avgDists.argsort()[:n] 这给了我 n 最小元素的索引。是否可以按降序使用相同
我在使用函数 argsort 对 2D 数组进行排序时遇到以下问题。 更准确地说,假设我有 5 个点,并计算了它们之间的欧氏距离,这些距离存储在二维数组 D 中: D=np.array([[0,0.3
我想我发现了 pandas 中的一个错误。我希望得到一些帮助来验证错误或帮助我找出我的代码中逻辑错误的位置。 我的代码如下: import pandas, numpy, StringIO def sq
所以我有一个数组,例如 [-0.7, -3.7, -2.1, -5.8, -1.2 ]这些特定数字对应于按顺序排列的标签:比如 0.7 对应于标签 201,3.7 对应于标签 202 等等。 正常排序
我正在尝试使用 argsort 函数对 numpy 数组进行排序。 不幸的是,这不起作用,我不明白为什么 :( 代码是: import numpy as np distance = np.array(
最近,我一直在试验 np.argsort,我发现了一些奇怪的东西。 如果你运行下面的代码,你会得到结果: In [0]: np.argsort([3]*16) Out[0]: array([ 0,
np.argsort() 如何处理关系? test = [1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0
这个问题在这里已经有了答案: how to make argsort result to be random between equal values? (2 个答案) 关闭 7 年前。 我有一个
我有一个 numpy 数组: foo = array([3, 1, 4, 0, 1, 0]) 我想要前 3 项。呼唤 foo.argsort()[::-1][:3] 返回 array([2, 0, 4
我有一些代码可以根据二维圆形窗口中的相邻值计算图像中的缺失值。它还使用来自同一位置的一个或多个时间相邻图像的值(即在 3 维中移动的相同 2D 窗口)。 对于每个缺失的位置,我需要计算的值不一定基于整
我有一个数组 [0.2,0,0,0,0.3,0,0,0,0.4]。我正在使用 np.argsort 对值进行排序并获取该索引。 因此,对于我的示例,它将类似于 [1,5,9,2,3,4,6...]。但
假设您有一个 numpy 向量 [0,3,1,1,1] 并且您运行 argsort你会得到 [0,2,3,4,1] 但所有的都是一样的!我想要的是一种洗牌相同值索引的有效方法。知道如何在没有 whil
如果我们有一个一维数组 arr = np.random.randint(7, size=(5)) # [3 1 4 6 2] print np.argsort(arr) # [1 4 0 2 3]
为什么 numpy 会给出这个结果: x = numpy.array([1.48,1.41,0.0,0.1]) print x.argsort() >[2 3 1 0] 当我期望它这样做时: [3 2
给定一个数组 'a' 我想按列对数组进行排序 sort(a, axis=0) 对数组做一些事情,然后撤消排序。我的意思不是重新排序,而是基本上颠倒每个元素的移动方式。我假设 argsort() 是我需
numpy.where() 有两种用法: 1. np.where(condition, x, y) 满足条件(condition),输出x,不满足输出y。 如果是一维数组,相当于[xv if
我是一名优秀的程序员,十分优秀!