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

如何在numpy中关闭一列的科学记数法?,numpy,Numpy,我正在尝试使用scikit学习对一些数据进行分类。数据存储在.csv文件中。我的问题是,实例由唯一的17位整数标识。当我加载数据时,python/numpy/scikit-learn会自动转换为科学记数法,并将数字的尾端四舍五入。如何至少对包含ID号的变量禁用此功能 另外-我看到np.getfromtxt()有一个“dtype”选项,允许用户指定每列的数据类型。有没有办法只在一列上使用此选项?我有>250列,单独指定其余的列(都是浮点数)是不实际的 以下是我加载数据的代码: my_data =

我正在尝试使用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()

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

这里有一个例子。CSV文件
stuff.CSV
包含:

12345678901234567,1.2,3.4
13579246801234567,5.6,7.8
576460752303423488,0.1,2.3
我将使用
将其转储到ipython中的控制台!cat stuff.csv

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')])
但是,如果本机长整数为32位,则这将不起作用。相反,您可以尝试对大整数使用“转换器”。这将允许您将它们转换为您喜欢的任何类型(例如,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')])
[20]中的genfromtxt('stuff.csv',dtype=None,delimiter=',',converters={0:lambda s:s}) 出[20]: 阵列([('12345678901234567',1.2,3.4),('13579246801234567',5.6,7.8), ('576460752303423488', 0.1, 2.3)],
数据类型=[('f0','S18'),('f1',我不认为
None
可以处理OP的长整数。17位数字将适合有符号的64位整数。这对我来说是可行的,但我的系统上的本机整数大小是64位。我没有一个系统可以检查本机整数是32位时会发生什么。
溢出错误:Python int太大,无法转换为Clong
。但是你是对的,你应该在64位上有几个数字可供使用。@DSM:Grrr…Windows?添加
转换器={0:lambda s:np.int64(s)}
?使用32位Python的Linux。但是使用转换器技巧手动指定np.int64会有帮助吗!
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')])
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')])