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

3 投票
1 回答
4193 浏览
提问于 2025-04-17 05:41

在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 也有类似的功能(如果我没记错的话,是根据前六个元素来判断的)……

那么在NumPy/Python中有没有这样的函数呢?我知道我可以自己写一个函数来测试每一列的元素是否可以转换成整数等等,但有没有现成的功能可以用呢?我知道在所有的例子中,通常是要明确指定数据类型,但我想跳过这一步。谢谢。

1 个回答

5

numpy.genfromtxt 可以在你设置 dtype=None 的时候自动猜测数据类型:

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 之前需要对文件进行一些处理,你可以创建一个 类似文件的对象包装器,这个包装器可以处理文件,然后再传给 np.genfromtxt

撰写回答