5

たとえば、複素数の配列を最初に実部で並べ替え、次に虚部の大きさで並べ替え、次に負の虚部で並べ替えるには、次のようにします。

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

1 に答える 1

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

ソートキーが逆の順序になっていることに注意してください。つまり、最後がプリンシパルです。

于 2013-01-18T05:34:27.283 に答える