numpy.loadtxt给出"不可迭代"的错误

Loo*_*nit 5 python numpy input

我正在尝试使用numpy.loadtxt如下所示的文件读取数据:

## 14 line of header
3 0 36373.7641026
3 1 36373.7641026
3 2 36373.7641026
...
Run Code Online (Sandbox Code Playgroud)

当我这样说时:

>>> chunk, power = numpy.loadtxt(bf,skiprows=14,usecols=(1,2),unpack=True)
Run Code Online (Sandbox Code Playgroud)

甚至这个:

>>> power = numpy.loadtxt(bf,skiprows=14,usecols=(2))
Run Code Online (Sandbox Code Playgroud)

它说, TypeError: 'int' object is not iterable

我认为这是因为前两列显然是整数不浮动,但现在我甚至不确定它所指的是哪个int对象,因为它甚至不会只读取浮点数.我该如何loadtxt工作?

相关:如何dtype = ?通过谷歌解决问题,如何指定多列的格式.

kin*_*all 10

在您的第二个示例中,可能存在问题usecols=(2).usecols必须是一个序列.(2)是整数2,而不是包含2的单元素元组,并且可能是错误消息抱怨的:loadtxt()正在尝试迭代int.使用(2,)(或者[2]如果你愿意的话).


sen*_*rle 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])
Run Code Online (Sandbox Code Playgroud)

当然,正如kindall的答案所示,您的第二个示例将失败,因为usecols不接受单个整数;它需要一个序列。((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])
Run Code Online (Sandbox Code Playgroud)