代码之家  ›  专栏  ›  技术社区  ›  yatu Sayali Sonawane

反转数组的比例

  •  5
  • yatu Sayali Sonawane  · 技术社区  · 6 年前

    假设我有以下数组:

    x = np.array([3,7,1,2,6])
    

    用哪种最简单的方法来获得具有其比例的阵列,比如说用逆方法?因此,最小值将成为最大值,最大值将成为最小值,对于其余值,依此类推。

    预期输出:

    array[3,1,7,6,2]
    

    为了澄清我想要得到什么,我说我的原始序列是:

    y = sorted(x)
    #[1, 2, 3, 6, 7]
    

    所以数组排序了。如果是这种情况,我想要的数组是反转的数组,所以 [7, 6, 3, 2, 1] . 我想用我当前的输入来完成这个任务。

    因此,当我的价值最低时, 1 现在是 7 ,第二个最低的Vaule, 2 现在是 6 等等。

    3 回复  |  直到 6 年前
        1
  •  4
  •   tch    6 年前

    这是一种麻木的方式:

    np.sort(x)[::-1][np.argsort(np.argsort(x))]
    

    为什么这样做:假设您的列表已经排序,那么您只需要反转它。由于列表没有排序,我们可以先对其排序,然后反转它,然后撤消排序。

    改进:我们只需要计算 argsort 曾经。然后 x 可以用这个列表排序,我们可以计算 argsort(x) 没有其他种类。

    ax = np.argsort(x)
    aax = np.zeros(len(ax),dtype='int')
    aax[ax] = np.arange(len(ax),dtype='int')
    
    x[ax[::-1]][aax]
    
        2
  •  2
  •   Dani Mesejo    6 年前

    如果输入值是唯一的:

    import numpy as np
    
    x = np.array([3, 7, 1, 2, 6])
    
    s = sorted(x)
    lookup = {v: i for v, i in zip(s, reversed(s))}
    
    result = np.array(list(map(lookup.get, x)))
    
    print(result)
    

    产量

    [3 1 7 6 2]
    

    如果我理解正确,您希望按排序顺序为每个值分配与排序顺序相反的相同位置的值。

        3
  •  0
  •   Yasin Yousif    6 年前

    我的第一个想法是:

    In [13]: xr=np.zeros_like(x)
    
    In [14]: g=0
    
    In [15]: f=np.unique(sorted(x))
    
    In [16]: for b in f:
                 g-=1
                 #for repeated values:
                 for y in np.where(x==b)[0]:
                     xr[y]=f[g]
        ...:     
    In [17]: xr
    Out[17]: array([3, 1, 7, 6, 2])