numpy加载数据文件时出现的问题

时间:2018-08-04 16:38:34

标签: python numpy

我想用scikit训练一个分类器,但是首先要做的是我需要加载相应的数据。我正在使用以下可用的数据文件:

https://archive.ics.uci.edu/ml/machine-learning-databases/yeast/

当我用文字打开它时,它具有以下内容:

ADT1_YEAST  0.58  0.61  0.47  0.13  0.50  0.00  0.48  0.22  MIT
ADT2_YEAST  0.43  0.67  0.48  0.27  0.50  0.00  0.53  0.22  MIT
ADT3_YEAST  0.64  0.62  0.49  0.15  0.50  0.00  0.53  0.22  MIT
AAR2_YEAST  0.58  0.44  0.57  0.13  0.50  0.00  0.54  0.22  NUC

每个文件都用双倍空格隔开,每行都有回车符。

我想用以下命令阅读它:

f=open("yeast.data")
data = np.loadtxt(f,delimiter=" ")

最后,我希望能够使用以下内容:

X = data[:,:-1]  # select all columns except the last
y = data[:, -1]   # select the last column

用于:

X_train, X_test, y_train, y_test = train_test_split(X, y)

但是当我尝试阅读它时,出现以下错误:

ValueError: could not convert string to float: ADT1_YEAST

那么如何在Python中读取此文件以在以后使用MLPClassifier?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以跳过f=open(...),并且可以使用dtype='O'来确保numpy以数字和字符串的混合形式读取它。由于链接文件中数据结构的某些不一致之处,最好使用genfromtxt而不是loadtxt

data = np.genfromtxt('yeast.data',dtype='O')

>>> data
array([[b'ADT1_YEAST', b'0.58', b'0.61', ..., b'0.48', b'0.22', b'MIT'],
       [b'ADT2_YEAST', b'0.43', b'0.67', ..., b'0.53', b'0.22', b'MIT'],
       [b'ADT3_YEAST', b'0.64', b'0.62', ..., b'0.53', b'0.22', b'MIT'],
       ..., 
       [b'ZNRP_YEAST', b'0.67', b'0.57', ..., b'0.56', b'0.22', b'ME2'],
       [b'ZUO1_YEAST', b'0.43', b'0.40', ..., b'0.53', b'0.39', b'NUC'],
       [b'G6PD_YEAST', b'0.65', b'0.54', ..., b'0.53', b'0.22', b'CYT']], dtype=object)

>>> data.shape
(1484, 10)

您可以在调用genfromtxt时更改dtype(请参阅documentation),也可以像这样手动更改它们:

data[:,0] = data[:,0].astype(str)
data[:,1:-1]= data[:,1:-1].astype(float)
data[:,-1] = data[:,-1].astype(str)

>>> data
array([['ADT1_YEAST', 0.58, 0.61, ..., 0.48, 0.22, 'MIT'],
       ['ADT2_YEAST', 0.43, 0.67, ..., 0.53, 0.22, 'MIT'],
       ['ADT3_YEAST', 0.64, 0.62, ..., 0.53, 0.22, 'MIT'],
       ..., 
       ['ZNRP_YEAST', 0.67, 0.57, ..., 0.56, 0.22, 'ME2'],
       ['ZUO1_YEAST', 0.43, 0.4, ..., 0.53, 0.39, 'NUC'],
       ['G6PD_YEAST', 0.65, 0.54, ..., 0.53, 0.22, 'CYT']], dtype=object)