2012-02-02 26 views
15

Dizeleri uzun süre bilmeden dizeleri tutacak bir numpy recarray başlatmak mümkün mü? Bir (yapmacık) bir örnek olarakDeğişken uzunluklu numpy recarray dizgileri

:

mydf = np.empty((numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ]) 

Sorun bilgilerle doldurma öncesinde benim recarray inşa olmam ve ben ille önceden file_name maksimum uzunluğunu bilmiyorum .

Bütün girişimleri kesilmiş olan dize alanında neden:

>>> mydf = np.empty((2,), dtype=[('file_name',str),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('', 6.9164002347457e-310), ('', 9.9413127e-317)], 
     dtype=[('file_name', 'S'), ('file_size_mb', '<f8')]) 
>>> mydf['file_name'] 
array(['f', 'a'], 
     dtype='|S1') 

(bir kenara olarak mydf['file_name'] gösterisi 'f' ve 'a' iken mydf gösterileri '' ve '' does neden?)

Ben türündeki (diyelim) |S10 ile initialize eğer

benzer şekilde, file_name sonra işler uzunluğu 10.

bulabildiğim tek benzer soru this one olduğunu

, ancak bu calcu de kesik olsun Uygun dize uzunluğu a priori ve dolayısıyla benimki ile aynı değildir (önceden hiçbir şey bilmediğim gibi).

file_name'un (örn. |S9999999999999 (bazı saçma üst sınırlar) ile inaktifleştirilmesi dışında bir alternatif var mı?

+0

bu iyi bir soru. recarrays'taki uzunluktaki 0 ​​dizgiler saçlarımı yarım saat boyunca kopardı! – Christoph

cevap

24

STRING dtype kullanmak yerine, her zaman object dtype olarak kullanılabilir. Bu, herhangi bir nesnenin Python değişken uzunluk dizeleri dahil olmak üzere bir dizi öğesine atanmasına izin verecektir. Örneğin:

>>> import numpy as np 
>>> mydf = np.empty((2,), dtype=[('file_name',object),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('foobarasdf.tif', 0.0), ('arghtidlsarbda.jpg', 0.0)], 
     dtype=[('file_name', '|O8'), ('file_size_mb', '<f8')]) 

Bu dizi kavramın ruhundan karşı değişken uzunluk elemanları olması, ancak bu bir elde OLARAK yakındır. Bir dizi fikri, öğelerin değişken uzunluktaki öğeleri yasaklayan iyi tanımlanmış ve düzenli aralıklı bellek adreslerinde bellekte depolanmasıdır. İşaretçileri dizideki bir dizgiye saklayarak, bu sınırlamayı aşabilir. (Bu, temel olarak yukarıdaki örneğin ne yapar.)

+0

bunun için teşekkürler - sadece R dilinden geçiş yapıyorum ve temel olarak bir veri çerçevesi çeşit nesne istedim ve bu harika çalışıyor! –

+3

Geç yorum: Eğer R'den hareket ediyorsanız, size çok tanıdık gelen ve dizeleri iyi işleyen pandas.DataFrame nesnesini düşünün. – mdurant