1

を使用して CSV ファイルをインポートする作業を行っていますnumpy.genfromtxt

インポートするデータには列名のヘッダーがあり、それらの列名の一部にgenfromtxt無効と見なされる文字が含まれています。具体的には、一部の名前に「#」と「 」が含まれています。入力データは、私が管理していない他のソースによって生成されるため、変更できません。

とを使用するnames=Truecomments=None、必要なすべての列名を取り込むことができません。

をオーバーライドしようとしましnumpy.lib.NameValidator.deletechars=Noneたが、これは実際に使用されている NameValidator クラスのインスタンスには影響しません。

deletechars属性であるかのようにフィールドにアクセスする再配列の可能性のために、それが存在することを理解しています。ただし、読み取り時に文字が取り除かれても、無効な文字を含む列名を読み取ることができる必要があります。

NameValidator無効な文字をチェックしないようにする方法、またはチェックする文字を変更する方法はありますか? root ではないため、numpy/lib/_iotools.py を変更できません。共有インストールを変更するのはよくありません。

4

3 に答える 3

2

numpy.genfromtxt が厳しい要件であると明示的に述べていないため、asciitableを試すことをお勧めします。

このモジュールには、解析前に特定のエントリを置き換える方法があります: http://cxc.harvard.edu/contrib/asciitable/#replace-bad-or-missing-values

また、既存のリーダーに基づいて独自のリーダーを定義することもできます: http://cxc.harvard.edu/contrib/asciitable/#advanced-table-reading

asciitable reader の出力は numpy 配列であるため、現在多かれ少なかれ使用している関数を直接 asciitable に置き換えることができるはずです。

于 2012-08-07T08:29:24.097 に答える
1

NameValidatordeletecharsで構築された場合はデフォルトのセットを使用しますdeletechars=Noneが、非セットを渡すとNoneそれが使用されます。に渡すパラメータをnp.genfromtext取ります。deletecharsNameValidator

だから、あなたは書くことができるはずです

np.genfromtxt(..., deletechars=set())

空のセット、またはデフォルトのサブセットの場合set("""~!@#$%^&*()-=+~\|]}[{';: /?.>,<"""):

deletechars = np.lib._iotools.NameValidator.defaultdeletechars - set("# ")
np.genfromtxt(..., deletechars=deletechars)
于 2012-08-07T08:46:43.933 に答える
1

IMHOgenfromtxtは、より単純なソリューションで十分な場合によく使用されます。

したがって、厄介なデータセット (エントリの欠落、複数の不明な列タイプ) がない限り、迅速で汚いパーサーをコーディングする方がよいでしょう (つまり、いくつかの行をスキップし、ヘッダーを解析し、残りを読み取り、最後に再編成します)。

さて、本当に が必要な場合genfromtxt、@ecatmur は、 のdeletechars引数genfromtxtがに送信され_iotools.NameValidator、削除する文字のセットを構築することを正しく指摘しました。を使用すると、デフォルト セットを使用するようにdeletechars=None指示されます。NameValidator最初に試すことは、 を使用せずdeletechars=Noneに空のsetorを使用すること''です。

何があっても、二重引用符"と末尾のスペースは削除され、類似した名前は区別されることに注意してください。

>>> fields = ["blah", "'blah'", "\"blah\"", "#blah", "blah "]
>>> np.lib._iotools.NameValidator(deletechars='').validate(fields)
... ('blah', "'blah'", 'blah_1', '#blah', 'blah_2')

3 番目と最後のエントリは という名前の 3 つの列blahになるため、名前を変更する必要があります。

これがあなたに合わない場合は、ブロックにぶつかっているのではないかと思います:genfromtxtカスタマイズされた を受け入れるように伝える方法は現在ありませんNameValidator。ただし、それは良い考えかもしれないので、numpy のメーリング リストでその点を指摘することをお勧めします。

于 2012-08-07T13:07:41.920 に答える