(NumPy) 交换最大和最小,交换第二大和第二小,...,交换第 n 个最大和第 n 个最小,对于所有 n,在一维数组中
(NumPy) Swap largest and smallest, swap 2nd largest and 2nd smallest, ..., swap nth largest and nth smallest, for all n, in 1D array
例如,给定数组
vector1 = np.array([111, 1, 11, 1111])
vector2 = np.array([2222, 2, 222, 22, 22222])
我想找到这样的排列
np.all(vector1[permutation1] == np.array([11, 1111, 111,1]))
np.all(vector2[permutation2] == np.array([22, 22222, 222, 2222, 2]))
使得第 n 个最大值被任意 n 的第 n 个最小值替换。
很清楚(尽管乏味)如何针对这些特定示例手动计算这些排列,我们有
permutation1 = np.array([2, 3, 0, 1])
permutation2 = np.array([3, 4, 2, 0, 1])
我认为 np.argsort
和 np.flip
的某种组合应该起作用。但是,我还没有找到任何这样的组合,而且似乎还缺少一些更基本的东西。
到目前为止我已经尝试过:
我知道 np.argsort
可用于反转排列,例如
np.all(np.argsort(np.argsort(permutation)) == permuation)
和
np.all(np.argsort(np.argsort(np.argsort(vector))) == np.argsort(vector))
两者总是 True
.
np.argsort(np.argsort(vector))
给出了解释原始向量中每个元素的相对顺序的排列,例如
np.all(np.argsort(np.argsort(vector1)) == np.array([2, 0, 1, 3]))
正确的是vector1
的第一个元素第二大,vector1
的第二个元素最小,第三个元素第二小,第四个元素最大.
然而,np.argsort(np.argsort(np.flip(vector)))
没有像我预期的那样工作(它也等于 np.flip(np.argsort(np.argsort(vector)))
。np.argsort(np.flip(np.argsort(vector)))
和 np.flip(np.argsort(np.flip(vector)))
都没有。在这一点上我怀疑 np.flip
是正确的功能,但我有点不知所措。
您可以尝试以下方法:
>>> arr
array([ 111, 1, 11, 1111])
>>> np.sort(arr)[::-1][np.argsort(np.argsort(arr))]
array([ 11, 1111, 111, 1])
例如,给定数组
vector1 = np.array([111, 1, 11, 1111])
vector2 = np.array([2222, 2, 222, 22, 22222])
我想找到这样的排列
np.all(vector1[permutation1] == np.array([11, 1111, 111,1]))
np.all(vector2[permutation2] == np.array([22, 22222, 222, 2222, 2]))
使得第 n 个最大值被任意 n 的第 n 个最小值替换。
很清楚(尽管乏味)如何针对这些特定示例手动计算这些排列,我们有
permutation1 = np.array([2, 3, 0, 1])
permutation2 = np.array([3, 4, 2, 0, 1])
我认为 np.argsort
和 np.flip
的某种组合应该起作用。但是,我还没有找到任何这样的组合,而且似乎还缺少一些更基本的东西。
到目前为止我已经尝试过:
我知道 np.argsort
可用于反转排列,例如
np.all(np.argsort(np.argsort(permutation)) == permuation)
和
np.all(np.argsort(np.argsort(np.argsort(vector))) == np.argsort(vector))
两者总是 True
.
np.argsort(np.argsort(vector))
给出了解释原始向量中每个元素的相对顺序的排列,例如
np.all(np.argsort(np.argsort(vector1)) == np.array([2, 0, 1, 3]))
正确的是vector1
的第一个元素第二大,vector1
的第二个元素最小,第三个元素第二小,第四个元素最大.
然而,np.argsort(np.argsort(np.flip(vector)))
没有像我预期的那样工作(它也等于 np.flip(np.argsort(np.argsort(vector)))
。np.argsort(np.flip(np.argsort(vector)))
和 np.flip(np.argsort(np.flip(vector)))
都没有。在这一点上我怀疑 np.flip
是正确的功能,但我有点不知所措。
您可以尝试以下方法:
>>> arr
array([ 111, 1, 11, 1111])
>>> np.sort(arr)[::-1][np.argsort(np.argsort(arr))]
array([ 11, 1111, 111, 1])