2016-06-16 12 views
0

numpyを要素の長さで使用して文字列配列をソートするとします。numpyを使用して文字列配列をソート

>>> arr = ["year","month","eye","i","stream","key","house"] 
>>> x = np.sort(arr, axis=-1, kind='mergesort') 
>>> print(x) 
['eye' 'house' 'i' 'key' 'month' 'stream' 'year'] 

ただし、英数字の順序で並べ替えます。どのようにnumpyを長さで並べ替えることができますか?

+1

これが高速かもしれないと考えているため、これを行う場合、numpyの仕組みを理解していません。これは、同じ量のバイトを占める要素用に設計されています。不等長さの文字列はそれを満たしておらず、単にnumpyでオブジェクトにラップすることになりますが、これはたぶん非効率です。 –

+1

numpyを使用する理由はたくさんありますが、私はOliverの発言に同意しなければなりません。このコード例では、Pythonのビルトインソートメソッドが必要です。より美しく/コンパクトな構文が可能です。 (しかし多分あなたはnumpyを使用する他の理由があり、これはほんの一例です)。 – sascha

+0

ありがとうございます。今のところ、私は新鮮ではないと私は理解しようとしています。 @saschaそれでは、長さによって並べ替えるために非常に多くの文字列要素があると、どのように使用できますか? Python独自のソート方法のみ? – GGG

答えて

3

文字列の長さを含むヘルパー配列を追加し、numpyのargsortを使用して、これらの長さに従ってソートするインデックスを与えます。インデックスこれらのインデックスと、元のデータ:key機能が最速であるよう

import numpy as np 
arr = np.array(["year","month","eye","i","stream","key","house"]) # np-array needed for later indexing 
arr_ = map(lambda x: len(x), arr) # remark: py3 would work different here 
x = arr[np.argsort(arr_)] 
print(x) 
+2

'numpy.char.str_len'もあります(しかし少し速いです)。 –

+0

ありがとうございますが、私には「['year'] " – GGG

+0

しかありません。あなたはpython3を使用しており、私のコメントを無視しているからです。 mapの代わりにarr_ = list(map ...)を使う(Py3のmapはリスト/配列ではなくイテレータを返すので、この特別なステップが必要です)。 – sascha

1

私はarr1=arr*1000にあなたのリストを展開すると、Pythonのリストはソートlenを使用。

In [77]: len(arr1) 
Out[77]: 7000 

In [78]: timeit sarr=sorted(arr1,key=len) 
100 loops, best of 3: 3.03 ms per loop 

In [79]: %%timeit 
arrA=np.array(arr1) 
larr=[len(i) for i in arrA] # list comprehension works same as map 
sarr=arrA[np.argsort(larr)] 
    ....: 
100 loops, best of 3: 7.77 ms per loop 

リストを配列に変換するには約1ミリ秒かかります(この変換では、特に小さなリストで大きなオーバーヘッドが発生します)。既に作成された配列を使用して、np.char.str_lenの時間はまだPython sortよりも遅いです。

In [83]: timeit sarr=arrA[np.argsort(np.char.str_len(arrA))] 
100 loops, best of 3: 6.51 ms per loop 

np.char機能が便利なことができ、彼らはまだ基本的に対応するstr方法を適用して、リストを反復処理します。

一般にargsortは、key機能と同じ機能を提供します。