如何在numpy中关闭一列的科学记数法?

时间:2014-08-21 17:25:35

标签: numpy

我试图用scikit学习分类一些数据。数据存储在.csv中。我的问题是实例由唯一的17位整数标识。当我加载数据时,python / numpy / scikit learn会自动转换为科学记数法并对数字的尾端进行舍入。如何至少为包含ID号的变量禁用此功能?

另外 - 我看到np.getfromtxt()有一个'dtype'选项,允许用户指定每列的数据类型。有没有办法只在一列上使用此选项?我有> 250列,单独指定其余列(都是浮点数)是不切实际的

这是我加载数据的代码:

my_data = genfromtxt('data.csv', skip_header=1, delimiter=',')
data_list = my_data.tolist()

1 个答案:

答案 0 :(得分:2)

dtype使用的默认genfromtxtnp.float64;也就是说,它尝试将每个字段转换为浮点值。如果您给出参数dtype=None,它将尝试根据它在文件中找到的内容来确定每个字段的数据类型。这可能对你有用。

这是一个例子。 CSV文件stuff.csv包含:

12345678901234567,1.2,3.4
13579246801234567,5.6,7.8
576460752303423488,0.1,2.3

我将使用!cat stuff.csv在ipython中转储到控制台:

In [16]: !cat stuff.csv
12345678901234567,1.2,3.4
13579246801234567,5.6,7.8
576460752303423488,0.1,2.3

使用genfromtxt使用dtype=None

阅读文件
In [17]: data = genfromtxt('stuff.csv', delimiter=',', dtype=None)

In [18]: data
Out[18]: 
array([(12345678901234567, 1.2, 3.4), (13579246801234567, 5.6, 7.8),
       (576460752303423488, 0.1, 2.3)], 
      dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<f8')])

data是一个结构化数组,有三个字段。字段f0是64位整数,其他字段是浮点。

如果使用tolist()方法将其转换为Python序列(正如您在问题中所做的那样),则会得到元组列表:

In [19]: data.tolist()
Out[19]: 
[(12345678901234567, 1.2, 3.4),
 (13579246801234567, 5.6, 7.8),
 (576460752303423488, 0.1, 2.3)]

然而,如果本机长整数是32位,则无效。相反,你可以尝试使用&#34;转换器&#34;对于大整数。那应该让你把它们转换成你喜欢的任何类型(例如,np.uint64甚至是字符串)。

例如,这会将长整数字段转换为字符串:

In [20]: genfromtxt('stuff.csv', dtype=None, delimiter=',', converters={0:lambda s: s})
Out[20]: 
array([('12345678901234567', 1.2, 3.4), ('13579246801234567', 5.6, 7.8),
       ('576460752303423488', 0.1, 2.3)], 
      dtype=[('f0', 'S18'), ('f1', '<f8'), ('f2', '<f8')])

将它们转换为64位无符号整数:

In [21]: genfromtxt('stuff.csv', dtype=None, delimiter=',', converters={0:lambda s: np.uint64(s)})
Out[21]: 
array([(12345678901234567L, 1.2, 3.4), (13579246801234567L, 5.6, 7.8),
       (576460752303423488L, 0.1, 2.3)], 
      dtype=[('f0', '<u8'), ('f1', '<f8'), ('f2', '<f8')])