我试图用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()
答案 0 :(得分:2)
dtype
使用的默认genfromtxt
为np.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')])