3

私の一般的な問題は次のとおりです。

私が持っている入力として ( nis some int >1)

W = numpy.array(...)
L = list(...)

どこ

len(W) == n
>> true
shape(L)[0] == n
>> true

そして、コンパレータLの値に関するリストをソートしたいと思います。W私の考えは、次のことをすることでした:

def my_zip_sort(W,L):
    srt = argsort(W)
    return zip(L[srt],W[srt])

これは次のように機能するはずです。

a = ['a', 'b', 'c', 'd']
b = zeros(4)
b[0]=3;b[1]=2;b[2]=[1];b[3]=4
my_zip_sort(a,b)
>> [(c,1)(b,2)(a,3)(d,4)]

しかし、これはそうではありません。

TypeError: only integer arrays with one element can be converted to an index

したがって、別のループを実行する必要があります。

def my_zip_sort(W,L):
    srt = argsort(W)
    res = list()
    for i in L:
        res.append((L[srt[i]],W[srt[i]]))
    return res

aに関するスレッドを見つけましたMaskableListが、リストの特定の値を保持または破棄するだけでなく、並べ替える必要があるため、これはうまくいきません (コメントで読むことができます)。

a.__class__
>> msk.MaskableList
srt = argsort(b)
a[srt]
>> ['a', 'b', 'd']

結論:

listオブジェクトの を の制約によってソートする方法を見つけたいですarray。私は自分で方法を見つけました。これは、リストのインデックス作成を除いて、ちょっといいです。MaskableListこのタスクと同様に機能する、パフォーマンスの良いクラスを作成するのを手伝ってもらえますか?

4

1 に答える 1

1

list-loopを回避するために拡張する必要はありませんfor。新しいものを期待する場合は、 Alist-comprehensionで十分であり、おそらくここでできる最善の方法です。listtuples

def my_zip_sort(W, L):
    srt = argsort(W)
    return [(L[i], W[i]) for i in srt]

例:

n = 5
W = np.random.randint(10,size=5)
L = [chr(ord('A') + i) for i in W]

L # => ['A', 'C', 'H', 'G', 'C']

srt = np.argsort(W)
result = [(L[i], W[i]) for i in srt]


print result
[('A', 0), ('C', 2), ('C', 2), ('G', 6), ('H', 7)]
于 2013-02-02T20:36:09.307 に答える