2012-02-02 10 views
15

文字列の長さを事前に知らなくても、文字列を保持するnumpy再配列を初期化することはできますか?可変長のnumpy再配列文字列

(不自然)の例としては:

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

問題は、私は情報とそれを埋めるの前に私のrecarrayを構築しています、と私は必ずしも事前にfile_nameの最大の長さを知らないということです。

すべての私の試みは、切り捨てられた文字列フィールドの結果:

>>> 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') 

(余談として、 mydf['file_name']ショー「F」と「」ながら mydfショー「」と「」を行い、なぜ?)

私は file_nameため |S10(例えば)タイプで初期化した場合、その後のものは長さ10

で切り捨て取得

は同様に、私は見つけることができる唯一の同様の質問がthis oneですが、このcalcu適切な文字列の長さがで先験的にであるため、私とまったく同じではありません。

を(例えば)|S9999999999999(つまり、なんとなく上限)で始める以外の方法はありますか?

+0

これは良い質問です。再配列の長さ0の文字列はちょうど私に30分髪を引き裂かせてくれました! – Christoph

答えて

24

STRING dtypeを使用する代わりに、常にobjectをdtypeとして使用できます。これにより、任意のオブジェクトをPythonの可変長文字列を含む配列要素に割り当てることができます。たとえば:

>>> 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')]) 

それは、アレイの概念の精神に対する可変長要素を持っていることですが、これは1つが得ることができる限り近くにあります。配列の考え方は、要素が可変長要素を禁止する明確かつ規則的に配置されたメモリアドレスでメモリに格納されることです。文字列へのポインタを配列に格納することで、この制限を回避することができます。 (これは基本的に上記の例のとおりです)

+0

これはありがたいことです - 私はR言語から移っていて、基本的にデータフレームの種類のオブジェクトがほしいと思っていました。 –

+3

Late comment:Rから移動する場合は、pandas.DataFrameオブジェクトを考慮してください。 – mdurant

関連する問題