Python中min()返回map对象引发运算错误的技术求助
解决Python3中map对象导致的min/max运算错误问题
嘿,我来帮你搞定这个坑!你遇到的问题其实是Python2和Python3中map()函数的行为差异导致的,这本书大概率是基于Python2编写的,所以示例代码在Python3里跑会出问题。
问题根源
在Python2中,map()会直接返回一个列表;但Python3里map()返回的是一个迭代器对象(也就是你看到的<map object at 0x000002130BF3E240>)。你的loadDataSet函数里应该是直接把这个map对象添加到了dataMat中,导致最终生成的矩阵里存的不是数值,而是迭代器对象——这就难怪你调用min(datMat[:,0])时拿到的是map对象,而非预期的数值了,后续减法运算自然会报类型不兼容的错误。
修复方案
只需要修改loadDataSet函数,把map()返回的迭代器转换成数值列表即可,有两种简单的方式:
方式1:把map对象转为列表
import numpy as np def loadDataSet(fileName): dataMat = [] fr = open(fileName) for line in fr.readlines(): curLine = line.strip().split('\t') # 把map迭代器转成数值列表 fltLine = list(map(float, curLine)) dataMat.append(fltLine) # 转为numpy矩阵,确保是数值类型 return np.mat(dataMat)
方式2:用列表推导式替代map(更直观)
import numpy as np def loadDataSet(fileName): dataMat = [] fr = open(fileName) for line in fr.readlines(): curLine = line.strip().split('\t') # 直接用列表推导式生成数值列表 fltLine = [float(x) for x in curLine] dataMat.append(fltLine) return np.mat(dataMat)
验证效果
修改后,再执行min(datMat[:,0])就会返回预期的matrix([[-5.379713]]),后续的rangeJ = float(max(dataSet[:,j]) - minJ)也能正常计算,不会再报TypeError啦!
内容的提问来源于stack exchange,提问作者Nats De
相关产品推荐
相关产品推荐

