我是机器学习的新手。尝试将int用于字母时遇到一些问题。我在Mac OS上使用Python 3.5。这是我的代码:
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
这是我的txt文件:
23 8 1 f
7 8 5 j
5 9 1 j
6 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'
的原因是因为您没有返回任何数字,而是返回了一个字符串。我发现了3个应该可以修复错误的问题。
首先,我在您的文本文档中没有找到'\ t'。我改用listFromLine1 = line.split(' ')
,它根据空格进行拆分。不过,这可能只是来自发布时复制的方式。
其次,当为listFromLine
中的每个位置分配一个值时,您将忽略它并从您未做任何事情的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]))