【问题标题】:Invert the scale of an array反转数组的比例
【发布时间】:2018-12-26 19:33:08
【问题描述】:

假设我有以下数组:

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,第二低的值,2 现在是 6,依此类推。

【问题讨论】:

  • 他们有一个合乎逻辑的方法来做到这一点......x*-1。除此之外,我不明白这怎么可能是一件好事
  • 我真的不明白你的预期输出。它与您的输入有什么关系?为什么 3 不变?
  • @Bazingaa 最大的值7 应该变成最低的,1,第二大的应该变成第二小的,2等等
  • 为什么取反号不能解决这个问题。
  • 那么在这种情况下,如果你改变比例,3应该变成5

标签: python arrays list numpy


【解决方案1】:

这是一个 numpy 的方式:

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】:

    如果输入值是唯一的:

    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】:

    这是我的第一个想法:

    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])
    

    【讨论】:

      【解决方案4】:

      这是我如何在不排序的情况下反转 np 数组值(最大值 -> 最小值,最小值 -> 最大值)。

      np_arr_inv = np_arr * -1 + np_arr.max()
      

      因为是图像数据,所以需要保持顺序。

      仅供参考 Numpy 具有按位反转功能here

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2017-12-03
        • 1970-01-01
        • 2022-01-12
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多