Python 无法理解NumPy loadtxt中的转换器行为

Python 无法理解NumPy loadtxt中的转换器行为,python,numpy,Python,Numpy,我试图使用numpy.loadtxt和converters参数从文本文件中读取数据。我有一个int和string的混合列。代码是: a, b, c, d, e = np.loadtxt(infile, delimiter = ',', usecols=(0, 2, 5, 8, 9), skiprows = 1, unpack = True, converters = dict(zip((0, 2, 5, 8, 9), (int, float,

我试图使用numpy.loadtxt和converters参数从文本文件中读取数据。我有一个int和string的混合列。代码是:

a, b, c, d, e = np.loadtxt(infile, delimiter = ',', usecols=(0, 2, 5, 8, 9), skiprows = 1,
                           unpack = True, converters = dict(zip((0, 2, 5, 8, 9), (int, float, float, int, int))))
数据被正确地读入和解压,但所有变量(a、b、c、d和e)都以浮点形式结束。我是否在转换器语法中犯了错误

编辑尝试性答案

我尝试使用@joris建议的dtype=(int,float,float,int,int)作为:

a,b,c,d,e = np.loadtxt(infile,delimiter = ',', usecols=(0,2,5,8,9), skiprows = 1, unpack = True, dtype = (int,float,float,int,int))
但我得到了以下错误:

     41                                            skiprows = 1,
     42                                            unpack = True,
---> 43                                            dtype = (int,float,float,int,int))
     44
     45

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/npyio.pyc in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack)
    665     try:
    666         # Make sure we're dealing with a proper dtype

--> 667         dtype = np.dtype(dtype)
    668         defconv = _getconv(dtype)
    669

TypeError: data type not understood
WARNING: Failure executing file: <forward_NDMMF.py>
41 skiprows=1,
42解包=正确,
--->43数据类型=(int,float,float,int,int))
44
45
/loadtxt中的Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/npyio.pyc(fname、dtype、comments、delimiter、converter、skiprows、usecols、unpack)
665试试:
666#确保我们处理的是正确的数据类型
-->667 dtype=np.dtype(dtype)
668 defconv=\u getconv(数据类型)
669
TypeError:无法理解数据类型
警告:执行文件失败:

我用的是NumPy v。1.5.1.

文件表明
转换器
应包含以下功能:

转换器:dict,可选

将列号映射到将该列转换为浮点的函数的字典。例如,如果列0是日期字符串:converters={0:datestr2num}。转换器还可用于为缺少的数据提供默认值:转换器={3:lambda s:float(s或0)}。默认值:无

如果您想要整数,则需要使用
dtype
关键字强制转换浮点

>>> numpy.loadtxt('th.txt', delimiter=',', usecols=(0, 2, 3), converters=dict(zip((0, 2, 3), (float, float, float))), dtype=([('i1', '<i4'), ('i2', '<f4'), ('i3', '<i4')]))
array([(1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4)],
      dtype=[('i1', '<i4'), ('f1', '<f4'), ('i2', '<i4')])

但如果这样做,则不能按列指定格式。

要指定不同列的类型,可以使用参数
dtype
而不是
转换器

dtype=(int,float,float,int,int)
编辑:

显然,这种类型的
dtype
规范似乎不适用于
loadtxt
,但它适用于
genfromtxt
(有人知道为什么它不适用于
loadtxt
,或者这是
genfromtxt
的额外功能之一吗?)

如果您想使用
loadtxt
,一个带有元组的结构化数据类型规范可以工作,比如
[('f0',int),('f1',float)]
而不是
(int,float)


但还有另一个问题。当使用这种结构化数据类型和结构化数组(不同列的类型不同)时,
unpack
似乎不起作用。至少我试过一个简单的例子。但这可能是一个已经解决的错误:(但为此,您必须升级到1.6)。

@joris,似乎
dtype
不接受这样的简单元组类型。你需要一个记录
dtype
@senderle,奇怪,我没有测试它,而是直接从numpy用户手册中复制的,所以我认为它是correct@senderle:在一个简单的例子中,它使用一个普通元组(numpy 1.5.1)@mishaF,可以尝试
genfromtxt
而不是
loadtxt
(使用相同的参数)。我用一个简单的例子用
genfromtxt
试了一下,然后
dtype
就可以工作了(只有解包时会出现问题)。@joris。谢谢你的更新。解包行为很重要,因为如果没有它,我可以在读取后解析数组时进行类型转换。我将尝试genfromtxt.Acutally,只需传递一个类型的元组()就可以用于numpy 1.5.1。我应该更仔细地阅读文档!不过,按列指定格式是我在这里的最终目标。
dtype=(int,float,float,int,int)