如何排序unsort:array(1).sort transform of array(2) - > array(3).unsort(反向数组(1).sort

时间:2017-03-13 19:25:16

标签: python sorting numpy

如何排序,操作然后取消结果?

假设我有一个float数组p1 = 0.15,0.3, 0.25, 0.12, ...。它分类为:p2 = sort(p1)。对于某个函数p2,函数(以p3作为输入操作)会产生p3 = f(p2, x, y, ...)f

如何以最聪明的方式取消p3? (与p1的排序方式相反)

即:p4 = unsort(p3)< - p4未分类到与p1相同的订单,用于与p1进行比较(x-plot)?

3 个答案:

答案 0 :(得分:4)

你需要一个双重argsort来保持秩序:

In [6]: a
Out[6]: array([5, 4, 8, 3, 6, 1, 2, 4, 9, 6])

In [7]: b=sort(a)

In [8]: b
Out[8]: array([1, 2, 3, 4, 4, 5, 6, 6, 8, 9])

In [9]: ii=a.argsort().argsort()

In [10]: c=b*b

In [11]: c
Out[11]: array([ 1,  4,  9, 16, 16, 25, 36, 36, 64, 81])

In [12]: c[ii]
Out[12]: array([25, 16, 64,  9, 36,  1,  4, 16, 81, 36])

答案 1 :(得分:0)

一种方法是使用collections.abc.Mapping来查找将对初始数组进行排序的索引。可以使用相同的索引将数组取消排序到其结果中,如下所示:

a = np.array([5, 2, 4, 3, 1])
i = np.argsort(a)    # i = array([4, 1, 3, 2, 0])

# b will be the sorted version of a    
b = a[i]             # b = array([1, 2, 3, 4, 5])
# c is the function on b
c = b**2             # c = array([ 1,  4,  9, 16, 25])

# d will hold the un-sorted result
d = np.empty(a.shape)
d[i] = c             # d = array([ 25.,   4.,  16.,   9.,   1.])

但这需要您在编制索引之前预先声明d

答案 2 :(得分:0)

使用内置函数在python中取消排序列表:

程序:

value

输出:

a=[589,273,981,642,702,883,319,128]
print("a",a)
b=[(p[1],p[0]) for p in enumerate(a)]
print("b",b)
c=sorted(b)
print("c",c)
d=[p[1] for p in c]
z=[p[0] for p in c]
print("d",d)
print("z",z)
y=zip(d,z)
print("y",y)
x=list(y)
print("x",x)
w=sorted(x)
print("w",w)
v=[p[1] for p in w]
print("v",v)
# unsort of z in one statement:
u=[r[1] for r in
    sorted(list(zip([q[1] for q in
        sorted([(p[1],p[0]) for p in
            enumerate(a)])],z)))]