【问题标题】:(NumPy) Swap largest and smallest, swap 2nd largest and 2nd smallest, ..., swap nth largest and nth smallest, for all n, in 1D array(NumPy)交换最大和最小,交换第二大和第二小,...,交换第 n 个最大和第 n 个最小,对于所有 n,在一维数组中
【发布时间】:2021-07-27 04:17:09
【问题描述】:

例如,给定数组

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.argsortnp.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 是正确使用的函数但我有点不知所措。

【问题讨论】:

    标签: python numpy numpy-ndarray numpy-slicing


    【解决方案1】:

    您可以尝试以下方法:

    >>> arr
    array([ 111,    1,   11, 1111])
    >>> np.sort(arr)[::-1][np.argsort(np.argsort(arr))]
    array([  11, 1111,  111,    1])
    

    【讨论】:

    • 你是救生员!太感谢了!我需要自己弄清楚为什么这有效的数学/逻辑,但它似乎确实有效。再次感谢您!
    • OK,因为np.sort(vector)[np.argsort(np.argsort(vector))]vector相同(因为np.argsort(np.argsort(vector))np.argsort(vector)的倒数),np.argsort(np.argsort(vector))在位置i的值(例如@987654328 @) 说vector[i](5+1)'th 最小的元素。因此,为了在位置i 处获得(5+1)th 最大 元素,我们只需索引np.flip(np.sort(vector)) 或等效的np.sort(vector)[::-1]。这是有道理的,并且绝对应该始终有效。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2023-03-29
    • 2014-06-12
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多