注意:我的数据使用了错误的源文件 - 一旦修复,我的问题就解决了。事实证明,没有简单的方法可以在不是整数文字的字符串上使用int(..)
。
这是“机器学习在行动”一书中的一个例子,我无法弄清楚出了什么问题。这是一些背景知识:
from numpy import as *
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines())
returnMat = zeros((numberOfLines,3))
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1])) # Problem here.
index += 1
return returnMat,classLabelVector
.txt文件如下:
40920 8.326976 0.953952 largeDoses
14488 7.153469 1.673904 smallDoses
26052 1.441871 0.805124 didntLike
75136 13.147394 0.428964 didntLike
38344 1.669788 0.134296 didntLike
...
我在行classLabelVector.append(int(listFromLine[-1]))
上收到错误,因为我相信,int(..)
正在尝试解析一个不是文字整数的字符串(即"largeDoses"
)。我错过了什么吗?
我查找了int()
的文档,但它似乎只解析了数字和整数文字:
http://docs.python.org/2/library/functions.html#int
另外,本书的摘录解释了本节如下:
最后,循环遍历文件中的所有行,并使用line.strip()去掉返回行字符。接下来,拆分线 进入由制表符分隔的元素列表:'\ t'。你拿 前三个元素并将它们推入矩阵的一行,并且 您使用负索引的Python功能来获取最后一项 从列表中放入classLabelVector。你必须明确 告诉解释器你想要最后一个的整数版本 列表中的项目,或者它将为您提供字符串版本。通常情况下, 你必须这样做,但NumPy会为你处理这些细节。
答案 0 :(得分:3)
像“largeDoses”这样的字符串无法转换为整数。在that code project的Ch02
文件夹中,您有两个数据文件,使用第二个datingTestSet2.txt
而不是加载第一个
答案 1 :(得分:1)
您可以使用ast.literal_eval并捕获异常ValueError格式错误的字符串(顺便说一句int('9.4')将引发异常)