反转数组的比例

时间:2018-12-26 19:33:09

标签: python arrays list numpy

说我有以下数组:

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,依此类推。< / p>

4 个答案:

答案 0 :(得分:4)

这是一种麻木的方式:

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]

答案 1 :(得分: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]

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

答案 2 :(得分:0)

这是我的第一个念头:

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

答案 3 :(得分:0)

这是我不排序就反转np数组值(最大值->最小值,最小值->最大)的方法。

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

我需要保留订单,因为它是图像数据。

FYI Numpy具有按位反转函数here