web-dev-qa-db-ja.com

python numpy.savetxtを使用してASCIIファイルに文字列と浮動小数点数を書き込む方法は?

次のような文字列と浮動小数点数の両方を含むリストのセットがあります。

import numpy as num

NAMES  = num.array(['NAME_1', 'NAME_2', 'NAME_3'])
FLOATS = num.array([ 0.5    , 0.2     , 0.3     ])

DAT =  num.column_stack((NAMES, FLOATS))

これら2つのリストを積み重ねて、列の形式でテキストファイルに書き込みます。したがって、これを行うにはnumpy.savetxt(可能であれば)を使用します。

num.savetxt('test.txt', DAT, delimiter=" ") 

これを行うと、次のエラーが表示されます。

>>> num.savetxt('test.txt', DAT, delimiter=" ") 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_9597b1f_20120920-py2.7-macosx-10.8-x86_64.Egg/numpy/lib/npyio.py", line 1047, in savetxt
    fh.write(asbytes(format % Tuple(row) + newline))
TypeError: float argument required, not numpy.string_

理想的な出力ファイルは次のようになります。

NAME_1    0.5
NAME_2    0.2
NAME_3    0.3

文字列と浮動小数点数の両方をテキストファイルに書き込み、csvを使用しないようにするにはどうすればよいですか(他の人が読めるようにしたいのですが)。 numpy.savetxtを使用する代わりにこれを行う別の方法はありますか?

60
Victor

データの形式(fmt)をsavetxtで指定する必要があります。この場合、文字列(%s)として指定します。

num.savetxt('test.txt', DAT, delimiter=" ", fmt="%s") 

デフォルトのフォーマットはフロートです。これが、文字列ではなくフロートを予期していた理由であり、エラーメッセージについて説明しています。

99
joris

現在受け入れられている答えは、文字列と浮動小数点数の両方を含むリストを保存する方法を尋ねる質問に実際には対応していません。完全を期すために、@ jorisコメントで指定されたリンクに基づいて、いくつかの修正を加えた完全に機能する例を提供します。

import numpy as np

names  = np.array(['NAME_1', 'NAME_2', 'NAME_3'])
floats = np.array([ 0.1234 ,  0.5678 ,  0.9123 ])

ab = np.zeros(names.size, dtype=[('var1', 'U6'), ('var2', float)])
ab['var1'] = names
ab['var2'] = floats

np.savetxt('test.txt', ab, fmt="%10s %10.3f")

更新:この例は、Python 3で'U6' Unicode文字列 dtype'S6'バイト文字列ではなく、ab構造化配列 を作成する場合。後者のdtypeはPython 2.7で機能しますが、Python 3でb'NAME_1'のような文字列を記述します。

31
divenex