我尝试使用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
我认为这是因为前两列显然是整数而不是浮点数,但现在我甚至不确定它指的是哪个int对象,因为它甚至不会读取浮点数。如何让loadtxt
工作?
相关:如何使用dtype = ?
指定多列的格式我无法通过谷歌搞清楚。
答案 0 :(得分:10)
在您的第二个示例中,问题可能是usecols=(2)
。 usecols
必须是序列。 (2)
是整数2,而不是包含2的单元素元组,可能是错误消息抱怨的内容:loadtxt()
正在尝试迭代int
。如果您愿意,请使用(2,)
(或[2]
。
答案 1 :(得分: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])
当然,正如kindall的回答所示,你的第二个例子会失败,因为usecols
不接受单个整数;它requires a sequence。 ((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])