5

numpy.loadtxt次のようなファイル内のデータを読み取るために使用しようとしています。

## 14 line of header
3 0 36373.7641026
3 1 36373.7641026
3 2 36373.7641026
...

そして、私がこれを与えると:

>>> chunk, power = numpy.loadtxt(bf,skiprows=14,usecols=(1,2),unpack=True)

またはこれでも:

>>> power = numpy.loadtxt(bf,skiprows=14,usecols=(2))

それは言う、TypeError: 'int' object is not iterable

最初の 2 つの列が浮動小数点数ではなく明らかに整数だったためだと思いましたが、浮動小数点数だけを読み取らないため、どの int オブジェクトを参照しているのかさえわかりません。どうすれば仕事をすることができloadtxtますか?

関連: 複数の列の形式を指定するにはどうすればよいですかdtype = ??

4

2 に答える 2

10

2番目の例では、問題はおそらくusecols=(2). usecolsシーケンスでなければなりません。(2)は整数 2 であり、2 を含む 1 要素のタプルではなく、おそらくエラー メッセージが訴えてloadtxt()いるものintです。を使用します(2,)(または必要[2]に応じて)。

于 2012-05-25T17:26:30.543 に答える
1

この場合、十分な情報が提供されていないため、問題の原因を特定するのは困難です。ここに投稿した内容を考えると、コードは機能するはずです。

>>> with open('beamtest.out', 'r') as f:
...     f.readlines()
... 
['header 0\n', 'header 1\n', 'header 2\n', 'header 3\n', 'header 4\n', 
 'header 5\n', 'header 6\n', 'header 7\n', 'header 8\n', 'header 9\n', 
 'header 10\n', 'header 11\n', 'header 12\n', 'header 13\n', 
 '3 0 36373.7641026\n', '3 1 36373.7641026\n', '3 2 36373.7641026']
>>> chunk, power = numpy.loadtxt('beamtest.out', skiprows=14,
                                 usecols=(1,2), unpack=True)
>>> chunk
array([ 0.,  1.,  2.])
>>> power
array([ 36373.7641026,  36373.7641026,  36373.7641026])

もちろん、kindallusecolsの答えが示すように、単一の整数を受け入れないため、2 番目の例は失敗します。シーケンスが必要です。((1)1括弧で囲まれています。タプルを作成するには、そこにコンマが必要です -- (1,)。)

dtype複数の列のフォーマットを指定するために使用する方法の例を次に示します。

>>> record = numpy.loadtxt('beamtest.out', skiprows=14, usecols=(1, 2), 
                           dtype={'names':('chunk', 'power'), 
                                  'formats':('i8', 'f8')}) 
>>> record
array([(0, 36373.7641026), (1, 36373.7641026), (2, 36373.7641026)], 
      dtype=[('chunk', '<i8'), ('power', '<f8')])
>>> record['chunk']
array([0, 1, 2])
>>> record['power']
array([ 36373.7641026,  36373.7641026,  36373.7641026])
于 2012-05-25T17:25:54.417 に答える