说我有以下数组:
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>
答案 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