什么样的x适合argsort(x)== argsort(argsort(x))?

时间:2019-08-04 21:05:35

标签: numpy sorting

对于一维数组,哪种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)))

哪种类型的数组符合条件?

1 个答案:

答案 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可以是通过翻转一些(可能为零)非重叠对的位置而从有序序列中获得的任何序列。