2017-02-24 15 views
0

私の質問はthisに似ています。私はgenfromtxtを使ってみましたが、まだ動作しません。浮動小数点としてではなく、期待通りにファイルを読み込みます。私は別のdtypes(なし、STR、フロート、バイト)、まだ成功してみましたpython3でnumpyバイトをfloatに変換するには?

 "1 _ 1",,,,, 
    "Time","Force","Stroke","Stress","Strain","Disp." 
    #"sec","N","mm","MPa","%","mm" 
    "0","0.2241135","0","0.01245075","0","0" 
    "0.1","0.2304713","0.0016","0.01280396","0.001066667","0.0016" 
    "0.2","1.707077","0.004675","0.09483761","0.003116667","0.004675" 

(b'"0"', b'"0.2241135"', b'"0"', b'"0.01245075"', b'"0"', b'"0"')として

 temp = np.genfromtxt('PFRP_12.csv', names=True, skip_header=1, comments="#", delimiter=",", dtype=None) 

以下のコードとファイルの抜粋を読みます。ありがとう!

編集:Evertは私もフロートを試してみました言及したが、どれもすべて、それらを読むとここ(nan, nan, nan, nan, nan, nan)

+0

[ドキュメント](https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html)を読んで、 'dtype = None'の代わりに' dtype = float'を使用してください。 – Evert

+0

@Evertはい、私はそうしました。シンプルなようなので、私は約1時間を探していたが、何も助けなかった。 –

+0

2番目のコードブロックが入力されているか、出力されていますか? – Evert

答えて

1

別の解決策は、converters引数を使用することです。

Side remark奇妙なことに、dtype="U12"などは実際にはバイトの代わりに文字列を生成する必要があります(.decode()の部分を避けてください)。これはうまくいかず、空のエントリになります。

+0

このコンバータも動作します: 'lambda s:float(s。strip(b '"')))'(バイトストリングにはストリップメソッドもあります)。 – hpaulj

0

レコード配列にご入力の変換の空想、読めない、関数型プログラミングスタイルの方法は、あなたが探しているされています

>>> np.core.records.fromarrays(np.asarray([float(y.decode().strip('"')) for x in temp for y in x]).reshape(-1, temp.shape[0]), names=temp.dtype.names, formats=['f'] * len(temp.dtype.names)) 

または数行にまたがって:私はこのソリューションをお勧めしません

>>> np.core.records.fromarrays(
... np.asarray(
...  [float(y.decode().strip('"')) for x in temp for y in x] 
... ).reshape(-1, temp.shape[0]), 
... names=temp.dtype.names, 
... formats=['f'] * len(temp.dtype.names)) 

が、SOMETこのようなものをハックするのは楽しいです。


あなたのデータの問題は、見た目よりも少し複雑です。 これは、CSVファイル内の数字が実際にはではなく、ではないためです。これらの数字は、周囲の二重引用符があるため、明示的に文字列です。フロートへの変換に関与する3つのステップがあるだから

: - (ストリップ)を削除各ストリング の各端部から二重引用符 - - デコードは、Python 3(ユニコード)ストリング バイト変換残りの文字列は浮動小数点になります

これは、3行目のダブルリスト内で発生します。これは、2行目の解説です。
結果リストは1Dです。私はそれをnumpy配列(np.asarray)に戻すので、私は何か2Dに簡単に変形することができます。それから、元の配列から得られた名前と各フィールドが浮動するように設定されたフォーマットを持つnp.core.records.fromarraysにその(現在のプレーンフロート)配列が与えられます。

np.genfromtxt('inp.txt', names=True, skip_header=1, comments="#", 
delimiter=",", dtype=None, 
converters=dict((i, lambda s: float(s.decode().strip('"'))) for i in range(6))) 

(あなたが各列のコンバータを指定する必要があります):

関連する問題