自动检测/转换数据类型?

时间:2011-11-05 12:08:58

标签: python numpy scipy

numpy中是否有一个函数可以确定字符串是整数还是浮点数并自动转换它们?例如,我经常有一组记录,这些记录使用str.strip()str.split()的组合从文本文件中解析。然后我得到像

这样的东西
List = [['1','a','.3'],
        ['2','b','-.5']]

然后使用numpy.rec.fromrecords

转换
In [1227]: numpy.rec.fromrecords(List)
Out[1227]: 
rec.array([('1', 'a', '.3'), ('2', 'b', '-.5')], 
      dtype=[('f0', '|S1'), ('f1', '|S1'), ('f2', '|S3')])

在R中,有一个名为type.convert的函数,字符串的向量/列传递给它,它将确定列的类型应该是什么(即如果它是字符串和数字的混合,它将仍然是一个字符向量)。 Excel也会这样做(基于前6个元素,如果我没记错的话)......

NumPy / Python中有这样的功能吗?我知道我可能会编写一个函数来测试列的每个元素是否可以转换为整数等,但是内置了什么?我知道在所有的例子中,处方是明确指定dtypes,但我想跳过这一步。感谢。

1 个答案:

答案 0 :(得分:5)

如果您设置dtype=None

numpy.genfromtxt可以猜测dtypes

import numpy as np
import io

alist = [['1','a','.3'],
        ['2','b','-.5']]

f = io.BytesIO('\n'.join(' '.join(row) for row in alist))
arr = np.genfromtxt(f,dtype=None)
print(arr)
print(arr.dtype)
# [(1, 'a', 0.3) (2, 'b', -0.5)]
# [('f0', '<i4'), ('f1', '|S1'), ('f2', '<f8')]

请注意,最好将np.genfromtxt直接应用于您的文本文件,而不是创建中间列表List(或我称之为alist)。如果您需要在将文件发送到np.genfromtxt之前对文件进行一些处理,则可以在文件周围创建一个file-like object wrapper来处理并传递给np.genfromtxt