如何使用numpy.genfromtxt当第一列是string和其余列是数字?

基本上,我有一堆数据,第一列是一个string(标签),其余的列是数值。 我运行以下:

data = numpy.genfromtxt('data.txt', delimiter = ',') 

这读取了大部分的数据,但标签列只是“南”。 我该如何处理?

默认情况下, np.genfromtxt使用np.genfromtxt dtype=float :这就是为什么string列转换为NaN的原因,毕竟它们不是一个数字…

您可以通过使用dtype=None来请求np.genfromtxt尝试猜测列的实际types。

 >>> from StringIO import StringIO >>> test = "a,1,2\nb,3,4" >>> a = np.genfromtxt(StringIO(test), delimiter=",", dtype=None) >>> print a array([('a',1,2),('b',3,4)], dtype=[('f0', '|S1'),('f1', '<i8'),('f2', '<i8')]) 

你可以通过使用他们的名字来访问这些列,比如a['f0']

如果你不知道你的列应该是什么,使用dtype=None是一个好方法。 如果你已经知道他们应该有什么types,你可以给一个明确的dtype 。 例如,在我们的testing中,我们知道第一列是一个string,第二列是一个int,我们希望第三列是一个浮点数。 我们会然后使用

 >>> np.genfromtxt(StringIO(test), delimiter=",", dtype=("|S10", int, float)) array([('a', 1, 2.0), ('b', 3, 4.0)], dtype=[('f0', '|S10'), ('f1', '<i8'), ('f2', '<f8')]) 

使用明确的dtype比使用dtype=None更有效,并且是推荐的方法。

在这两种情况下( dtype=None或者显式的,非同类的dtype ),你最终会得到一个结构化数组。

[注意:在dtype=None ,input被第二次parsing,每一列的types被更新以匹配更大的types:首先我们尝试一个bool,然后是一个int,然后是一个浮点数,然后是一个复数,然后我们保持一个string,如果一切都失败。 事实上,这个实现相当笨拙。 有一些尝试使types猜测更有效率(使用正则expression式),但没有任何卡住到目前为止]

如果你的数据文件是这样的结构

 col1, col2, col3 1, 2, 3 10, 20, 30 100, 200, 300 

那么numpy.genfromtxt可以使用names=True选项将第一行解释为列标题。 有了这个,您可以通过提供列标题非常方便地访问数据:

 data = np.genfromtxt('data.txt', delimiter=',', names=True) print data['col1'] # array([ 1., 10., 100.]) print data['col2'] # array([ 2., 20., 200.]) print data['col3'] # array([ 3., 30., 300.]) 

因为在你的情况下,数据是这样形成的

 row1, 1, 10, 100 row2, 2, 20, 200 row3, 3, 30, 300 

你可以使用下面的代码片段来实现类似的function:

 labels = np.genfromtxt('data.txt', delimiter=',', usecols=0, dtype=str) raw_data = np.genfromtxt('data.txt', delimiter=',')[:,1:] data = {label: row for label, row in zip(labels, raw_data)} 

第一行读取第一列(标签)为一个string数组。 第二行读取文件中的所有数据,但放弃第一列。 第三行使用字典理解来创build一个非常类似于numpy.genfromtxt使用names=True选项创build的结构化数组的字典:

 print data['row1'] # array([ 1., 10., 100.]) print data['row2'] # array([ 2., 20., 200.]) print data['row3'] # array([ 3., 30., 300.]) 

data=np.genfromtxt(csv_file, delimiter=',', dtype='unicode')

这对我来说可以。

您可以使用numpy.recfromcsv(filename) :每列的types将自动确定(如果您使用np.genfromtxt()np.genfromtxt() dtype=None ),并默认delimiter="," 。 这是Pierre GM在回答中指出的np.genfromtxt(filename, delimiter=",", dtype=None)的一个快捷方式。

对于这种格式的数据集:

 CONFIG000 1080.65 1080.87 1068.76 1083.52 1084.96 1080.31 1081.75 1079.98 CONFIG001 414.6 421.76 418.93 415.53 415.23 416.12 420.54 415.42 CONFIG010 1091.43 1079.2 1086.61 1086.58 1091.14 1080.58 1076.64 1083.67 CONFIG011 391.31 392.96 391.24 392.21 391.94 392.18 391.96 391.66 CONFIG100 1067.08 1062.1 1061.02 1068.24 1066.74 1052.38 1062.31 1064.28 CONFIG101 371.63 378.36 370.36 371.74 370.67 376.24 378.15 371.56 CONFIG110 1060.88 1072.13 1076.01 1069.52 1069.04 1068.72 1064.79 1066.66 CONFIG111 350.08 350.69 352.1 350.19 352.28 353.46 351.83 350.94 

此代码适用于我的应用程序:

 def ShowData(data, names): i = 0 while i < data.shape[0]: print(names[i] + ": ") j = 0 while j < data.shape[1]: print(data[i][j]) j += 1 print("") i += 1 def Main(): print("The sample data is: ") fname = 'ANOVA.csv' csv = numpy.genfromtxt(fname, dtype=str, delimiter=",") num_rows = csv.shape[0] num_cols = csv.shape[1] names = csv[:,0] data = numpy.genfromtxt(fname, usecols = range(1,num_cols), delimiter=",") print(names) print(str(num_rows) + "x" + str(num_cols)) print(data) ShowData(data, names) 

Python-2输出:

 The sample data is: ['CONFIG000' 'CONFIG001' 'CONFIG010' 'CONFIG011' 'CONFIG100' 'CONFIG101' 'CONFIG110' 'CONFIG111'] 8x9 [[ 1080.65 1080.87 1068.76 1083.52 1084.96 1080.31 1081.75 1079.98] [ 414.6 421.76 418.93 415.53 415.23 416.12 420.54 415.42] [ 1091.43 1079.2 1086.61 1086.58 1091.14 1080.58 1076.64 1083.67] [ 391.31 392.96 391.24 392.21 391.94 392.18 391.96 391.66] [ 1067.08 1062.1 1061.02 1068.24 1066.74 1052.38 1062.31 1064.28] [ 371.63 378.36 370.36 371.74 370.67 376.24 378.15 371.56] [ 1060.88 1072.13 1076.01 1069.52 1069.04 1068.72 1064.79 1066.66] [ 350.08 350.69 352.1 350.19 352.28 353.46 351.83 350.94]] CONFIG000: 1080.65 1080.87 1068.76 1083.52 1084.96 1080.31 1081.75 1079.98 CONFIG001: 414.6 421.76 418.93 415.53 415.23 416.12 420.54 415.42 CONFIG010: 1091.43 1079.2 1086.61 1086.58 1091.14 1080.58 1076.64 1083.67 CONFIG011: 391.31 392.96 391.24 392.21 391.94 392.18 391.96 391.66 CONFIG100: 1067.08 1062.1 1061.02 1068.24 1066.74 1052.38 1062.31 1064.28 CONFIG101: 371.63 378.36 370.36 371.74 370.67 376.24 378.15 371.56 CONFIG110: 1060.88 1072.13 1076.01 1069.52 1069.04 1068.72 1064.79 1066.66 CONFIG111: 350.08 350.69 352.1 350.19 352.28 353.46 351.83 350.94