2013-06-04 2 views
5

私は単語のリストを持っており、各単語が各リストにどのくらいの頻度で現れるかを知る必要があります。 ".count(word)"を使うと動作しますが、速度が遅すぎます(各リストには何千もの単語があり、何千ものリストがあります)。numpy.histogramをnumpy.bincountのように振ることができますか?

私はnumpyで物事をスピードアップしようとしてきました。私は各単語に一意の数値コードを生成したので、numpy.bincountを使用することができました(文字列ではなく整数のみで動作するため)。しかし、私は "ValueError:配列が大きすぎます"というメッセージが表示されます。

これで、numpy.histogram関数の "bins"引数を調整して、必要な頻度のカウントを返すようにしようとしています(何とかnumpy.histogramが大きな配列に問題がないようです)。しかし、今のところいいえ。誰もが前にこれをしたことが起こった?それも可能ですか?私が見逃している簡単な解決策がありますか?

+0

あなたの配列はどれくらいですか?私はint型の10000000の長さの配列でbincountを使用しましたが、うまくいきました。私はあなたがエラーを取得する前に私はメモリが不足しています。 –

+1

私は、ここでの問題は、最初の配列のサイズではなく、独自の数値コードシステムが関係していると思います。 np.bincountは1 +あなたの配列中の最大の整数に等しい長さの配列を作成します。あなたが大量のコードを何らかの形で使っているなら、問題を引き起こす可能性があります。それでも、np.bincount([1000000000])に問題はありませんでした。あなたの数値コード体系は何ですか? – cge

+1

ああ、それはあなたがビンにしようとしている整数が巨大であるときにエラーが発生するようです。 'foo = numpy.random.randint(2 ** 62、size = 1000);でエミュレートすることができます。 numpy.bincount(foo) 'です。私はそれがすべてのビンを格納するために巨大なインデックス不可能な配列を作成しようとしていると思います。numpyはnoと言っています(エラーは 'multiarray/ctors.c'にあります)。何語持っていますか? –

答えて

5

これにはnumpyを使用しないでください。代わりにcollections.Counterを使用してください。このユースケースのために設計されています。

+0

問題が説明されている場合、これは明らかに正しい方法です! –

+0

恐ろしい!クリーンで超高速。 – Parzival

4

なぜnumpy.uniqueを使用して最小限のセットにあなたの整数を減らさない:

original_keys, lookup_vals = numpy.unique(big_int_string_array, return_inverse=True) 

あなたはその後、ちょうどlookup_valsnumpy.bincountを使用することができ、あなたは元の文字列のユニークな整数を取り戻すために必要がある場合は、あなただけ使用することができます値がlookup_valsであり、添え字がoriginal_keysです。

ので、何かのように:また

import binascii 
import numpy 

string_list = ['a', 'b', 'c', 'a', 'b', 'd', 'c'] 
int_list = [binascii.crc32(string)**2 for string in string_list] 

original_keys, lookup_vals = numpy.unique(int_list, return_inverse=True) 

bins = bincount(lookup_vals) 

、それはあなたの整数を二乗する必要がありません。

1

Thiago、 また、scipyのitemfreqメソッドを使用してカテゴリ変数から直接試すこともできます。 ここに例があります:

>>> import scipy as sp 
>>> import scipy.stats 
>>> rv = ['do', 're', 'do', 're', 'do', 'mi'] 
>>> note_frequency = sp.stats.itemfreq(rv) 
>>> note_frequency 
array([['do', '3'], 
     ['mi', '1'], 
     ['re', '2']], 
     dtype='|S2') 
関連する問題