18

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

(不自然な)例として:

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

問題は、再配列に情報を入力する前に再配列を構築していることであり、事前に最大長を知っているとは限りません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' と 'a' が表示されるmydfのですか?)

同様に、(たとえば) |S10for型で初期化するとfile_name、長さ 10 で切り捨てられます。

私が見つけることができる唯一の同様の質問はthis oneですが、これはアプリオリに適切な文字列の長さを計算するため、私のものとはまったく同じではありません(事前に何も知らないため)。

file_namewith (eg) |S9999999999999(つまり、ばかげた上限)を初期化する以外の方法はありますか?

4

1 に答える 1

27

dtypeを使用する代わりに、STRINGいつでもobjectdtype として使用できます。これにより、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')])

可変長の要素を持つことは配列の概念の精神に反しますが、これは可能な限り近いものです。配列の考え方は、要素が明確に定義された一定間隔のメモリ アドレスに格納されるというものであり、これにより可変長要素が禁止されます。文字列へのポインタを配列に格納することで、この制限を回避できます。(これは基本的に上記の例が行うことです。)

于 2012-02-02T09:08:38.010 に答える