对于一维数组,哪种x给您argsort(x) == argsort(argsort(x))
?排序数组将是一个琐碎的孤子。
但您无法对[1, 0, 2]
或[1, 0, 2, 3]
我真的很感兴趣。
sorted_array = np.arange(10)
np.testing.assert_array_equal(np.argsort(sorted_array), np.argsort(np.argsort(sorted_array)))
# or
semi_sorted = [1, 0, 2]
np.testing.assert_array_equal(np.argsort(semi_sorted), np.argsort(np.argsort(semi_sorted)))
# or
semi_sorted = [1, 0, 2, 3]
np.testing.assert_array_equal(np.argsort(semi_sorted), np.argsort(np.argsort(semi_sorted)))
# or
semi_sorted = [2, 1, 3, 4, 5]
np.testing.assert_array_equal(np.argsort(semi_sorted), np.argsort(np.argsort(semi_sorted)))
哪种类型的数组符合条件?
答案 0 :(得分:0)
要正式化@Alex Riley的直觉:
对于任何(从零开始的)置换p,我们有argsort(p)= p ^ -1,因为根据argsort的定义p [argsort(p)] = [0,1,2,...]和[0, 1,2,...]被视为排列,是同一性。
现在,无论x是什么,argsort(x)都是一个置换,因此为其写p,我们得到p = p ^ -1或等效地p ^ 2 = id。
自反的排列p是什么样的?如果两次应用p,则没有任何变化,因此,如果第一次应用p将x移至y,第二次应用p必须将y移至x。由于y可能相等,因此x p必须由两个元素的翻转和保持不变的元素组成。这也足够。
我们现在知道argsort(x)是什么样的。那么x本身呢?为了简单起见,假设x仅具有唯一元素,否则必须考虑所使用的排序算法的细节。让我们为排序后的x编写s。则s = x [p]。用p置换双方,得到s [p] = x [p ^ 2] = x。因此,x可以是通过翻转一些(可能为零)非重叠对的位置而从有序序列中获得的任何序列。