我是机器学习的新手。在尝试将字母转换为整数时遇到了一些问题。我使用的是Python 3.5,运行在Mac OS上。这是我的代码:
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() listFromLine1 = line.split('\t') listFromLine = zeros(3) i = 0 for value in listFromLine1: if value.isdigit(): valueAsInt = int(value) listFromLine[i] = valueAsInt i += 1 returnMat[index, :] = listFromLine[0:3] classLabelVector.append(int(listFromLine1[-1])) index += 1 return returnMat, classLabelVector
这是我的文本文件内容:
23 8 1 f7 8 5 j5 9 1 j6 6 6 f
这是我遇到的错误:
classLabelVector.append(int(listFromLine1[-1])) ValueError: invalid literal for int() with base 10: 'f'
有人可以帮我解决这些问题吗?
回答:
如果我正确理解了你的预期结果,你希望返回一个包含n个列表的列表。每个列表类似于[23. 8. 1.]。然后你希望有一个第二个列表,包含每个列表的最后一个数字,像这样:[1, 5, 1, 6]。
假设这一切都是正确的,你得到classLabelVector.append(int(listFromLine1[-1])) ValueError: invalid literal for int() with base 10: 'f'
的原因是因为你返回的不是数字,而是一个字符串。我发现了三个问题,这些问题应该可以解决错误。
首先,我在你的文本文档中没有发现’\t’。我改用了listFromLine1 = line.split(' ')
,它基于空格进行分割。这可能是由于你发布时复制的方式造成的,不过。
其次,当你为listFromLine
中的每个位置分配值时,你随后忽略了它,并从listFromLine1
中追加,而你对listFromLine1
什么也没做,所以它仍然是字符串。
第三,尝试使用if value.isnumeric():
代替if value.isdigit():
。
解决这些问题应该可以使程序正常运行。此外,你打开文件并运行fr.readlines()两次,并且从未告诉它关闭。你让程序为相同的信息工作两次。你应该尝试重写它,只打开一次,并使用with open() as fr:
,因为它完成后会自动关闭。
编辑:如果你希望第二个列表包含字母而不是数字,像[f, j, j, f],那么保持使用listFromLine1,并使用str()代替int():classLabelVector.append(str(listFromLine1[-1]))