例如,首先按实部对复数的数组进行排序,然后按虚部的大小排序,然后先用负虚部进行排序:
def order(a):
return a.real, abs(a.imag), sign(a.imag)
z = array(sorted(z, key=order))
所以
array([ 1.+2.j, 5.+0.j, 1.+0.j, 1.+1.j, 1.+1.j, 1.-1.j, 6.+0.j, 1.-1.j, 1.-2.j])
成为
array([ 1.+0.j, 1.-1.j, 1.-1.j, 1.+1.j, 1.+1.j, 1.-2.j, 1.+2.j, 5.+0.j, 6.+0.j])
我认为有一种方法可以使用numpy的argsort做同样的事情,这可能更快,但我无法弄清楚:
In [2]: argsort((a.real, abs(a.imag), sign(a.imag)))
Out[2]:
array([[0, 2, 3, 4, 5, 7, 8, 1, 6],
[1, 2, 6, 3, 4, 5, 7, 0, 8],
[5, 7, 8, 1, 2, 6, 0, 3, 4]])
答案 0 :(得分:4)
您可以使用np.lexsort
:
import numpy as np
a = np.array([ 1.+2.j, 5.+0.j, 1.+0.j, 1.+1.j, 1.+1.j, 1.-1.j, 6.+0.j,
1.-1.j, 1.-2.j])
sorted_idx = np.lexsort((np.sign(a.imag), np.abs(a.imag), a.real))
>>> a[sorted_idx]
array([ 1.+0.j, 1.-1.j, 1.-1.j, 1.+1.j, 1.+1.j, 1.-2.j, 1.+2.j,
5.+0.j, 6.+0.j])
请注意,排序键是反向排序的,即last是主体。