反转数组的顺序

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,第二低的值 2 现在变成了 6,以此类推。

他们有一种逻辑的方法来做这个... x*-1。除此之外,我不明白这怎么可能是一件好事。 - d_kennetz
1
我真的不理解你期望的输出。它与你的输入有什么关系?为什么3没有改变? - Sheldore
@Bazingaa 最大的值 7 应该变为最小的值 1,第二大的值应该变为次低值 2,以此类推。 - yatu
1
为什么取相反数不能解决这个问题? - d_kennetz
1
在这种情况下,如果您正在更改比例尺,则3应该变为5。 - Sheldore
4个回答

5

以下是使用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]

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


你可以解释/添加一下代码中逻辑的说明吗? - Sheldore

0

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

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

我需要保持顺序,因为这是图像数据。

顺便提一下,Numpy有一个位反转函数在这里


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接