2013-06-04 28 views
5

Bu yüzden, kelime listelerine sahibim ve her bir kelimenin her bir listede ne sıklıkta göründüğünü bilmem gerekiyor. ".count (word)" ifadesini kullanarak çalışır, ancak çok yavaştır (her bir listede binlerce kelime vardır ve binlerce listeleme vardır).numpy.histogramı numpy.bincount gibi davranmaya çalıştırabilir miyim?

Numlock ile işleri hızlandırmaya çalışıyorum. Her kelime için benzersiz bir sayısal kod oluşturdum, bu yüzden numpy.bincount'u kullanabildim (yalnızca tamsayılarla değil, yalnızca dizelerle çalıştığı için). Ama ben "ValueError: dizi çok büyük" alıyorum.

Şimdi ihtiyacım olan frekans sayımlarını döndürmek için numpy.histogram işlevinin "bölmeler" argümanını ayarlamaya çalışıyorum (bir şekilde numpy.histogram büyük dizilerde sorun yok gibi görünüyor). Ama şu ana kadar iyi değil. Dışarıda kimse daha önce yapmış mı? Bu mümkün mü? Göremediğim daha basit bir çözüm var mı?

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

Daha sonra sadece lookup_vals üzerinde numpy.bincount kullanabilir ve özgün dize benzersiz tamsayı geri almak gerekiyorsa, sadece kullanabilirsiniz:

+0

Diziniz ne kadar büyüktür !? Ben sadece bincount 10000000 uzunluk dizisi ile kullandım ve gayet iyi çalıştı. Yaptığın hatayı almadan önce hafızam tükendi. –

+1

Buradaki sorunun, ilk dizilerin büyüklüğünü değil, benzersiz sayısal kod sisteminizi içerdiğini düşünüyorum. np.bincount dizinizdeki en büyük tamsayıya eşit bir uzunluk dizisi yaratacaktır; bu, eğer bir çeşit kodlamayı gülünç büyük sayılarla kullanıyorsanız bir soruna neden olabilir. Yine de, np.bincount ([1000000000]) ile ilgili bir sorunum olmadı. Sayısal kodlama düzeniniz nedir? – cge

+1

Ah, binmeye çalıştığınız tamsayılar büyük olduğunda hata oluşur. Bunu foo = numpy.random.randint (2 ** 62, size = 1000) ile taklit edebilirsiniz; numpy.bincount (foo) '. Tüm kutuları depolamak için devasa bir dizine eklenemeyen bir dizi oluşturmaya çalışıyorum ve numpy hayır diyor (bu hata "multiarray/ctors.c" konumunda). Kaç kelimen var? –

cevap

5

Bunun için numpy kullanmayın. Bunun yerine collections.Counter kullanın. Bu kullanım durumu için tasarlandı.

+0

Sorun açıklandığı gibi olduğunda, açıkça bunu yapmak için doğru yol budur! –

+0

Harika! Temiz ve süper hızlı. – Parzival

4

Neden numpy.unique kullanarak asgari yerleşim bölgesini tamsayılar azaltmaz lookup_vals'un değerleri original_keys'a işaret eder.

Yani, gibi bir şey: Ayrıca

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) 

, bu tamsayılar kare ihtiyacını ortadan kaldırır.

1

Thiago, Ayrıca scipy'nin itemfreq yöntemiyle kategorik değişkenlerden de deneyebilirsiniz. İşte bir örnek:

>>> 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') 
İlgili konular