numpy - 什么样的 x 适合 argsort(x) == argsort(argsort(x))?
问题描述
对于一维数组,什么样的 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)))
什么类型的数组符合标准?
解决方案
将@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 可能等于 xp 因此必须由两个元素的翻转和保持不变的元素组成。这也足够了。
我们现在知道 argsort(x) 长什么样了。x 本身呢?为简单起见,我们假设 x 只有唯一元素,否则必须考虑使用的排序算法的细节。让我们为排序后的 x 写 s。那么 s = x[p]。用 p 置换两边,我们得到 s[p] = x[p^2] = x。因此 x 可以是通过翻转一些(可能为零)非重叠对的位置从有序序列中获得的任何序列。
推荐阅读
- c++ - 有没有办法使用winapi打开蓝牙?
- javascript - 显示警报时如何自动滚动到顶部
- html - 将引导手风琴上的加减号图标移动到最右边
- postgresql - 为什么使用 JDBC 时 current_time 与 PostgreSQL 12 中的 current_timestamp 和 now() 都不同?
- python - 为什么两个循环方法第一次返回正确的结果,而第三个方法需要运行三次才能得到正确的结果?
- wordpress - 分配自定义类别以阻止 - Gutenberg - WordPress
- css - 传单平铺层使用 Css 类添加背景颜色
- python - 点安装。vs setup.py:最终目录
- sql - 使用 2 个表信息在我的数据中进行 Oracle 练习题
- flutter - 将小部件中心与 AppBar 底部边缘对齐