获取TypeError:不支持的操作数类型 - :' list'和'列出'同时在python中执行Min max规范化

时间:2015-01-02 07:59:30

标签: python normalization pyscripter

我一直在使用Python几个月..现在,我必须为我的数据集(.csv文件)列执行min-max规范化,我得到上面提到的类型错误..我有尝试了很多,但它仍然存在..检查最小和最大函数的正确值,但结果的类型是列表而不是浮点数/整数..

这是导致错误的行

for i in range(num):

         normalized[i]=(krr[i]-min(krr)/(max(krr)-min(krr))

其中krr是从数据集中检索的列。请帮助。

我有一个函数“normal”,它执行min-max规范化。 我使用eval获取了列值,如代码

所示
def normal(self,arr,num):
    print("------------------->entered Normalisation block----------------->")
    for i in range(num):
   # trr=eval(str(arr[i]))[0:-31]
      self.krr[i]=map(float,eval(str(arr[i]))[0:-31])   //extracting one particular column
      #mn=min(self.krr)
      #mx=max(self.krr)

    print(self.krr)
    ls=min(self.krr)
    hs=max(self.krr)
    diff=hs-ls

    for i in range(num):
        normalized[i]=(self.krr[i]-ls)/diff

1 个答案:

答案 0 :(得分:0)

好的,所以这里的关键问题是您正在处理一个子列表列表,每个子列表包含一个数字。

如果你看一下你的公式:

(krr[i]-min(krr)/(max(krr)-min(krr))

正如您所提到的,python可以处理max和min - 它将返回包含最大/最小数字的子列表。 (虽然请注意,获取包含一个数字的列表与仅获取一个数字非常不同)但是,不支持列表之间的减法和除法,因此您的错误消息。所以迟早,你需要从子列表中获取值。

我的建议是,在完成构建krr之后,立即在代码中添加以下行:

krr = [element[0] for element in krr]

将krr从子列表列表转换为每个子列表的第一个元素的列表。

修改

认为的替代方案将起作用,并且效率更高,是改变

def normal(self,arr,num):
    print("------------------->entered Normalisation block----------------->")
    for i in range(num):
    # trr=eval(str(arr[i]))[0:-31]
        self.krr[i]=map(float,eval(str(arr[i]))[0:-31]) # This row

进入这个:

        self.krr[i]=float(eval(str(arr[i]))[0:-31][0])

mapfloat应用于以下列表的每个元素,并创建一个新列表。相反,我们要求该列表的第一个元素,并直接应用float。该浮动被分配给krr中的索引。

PS eval(str(arr[i]))[0:-31]看起来很可怕 - 这里真的需要调用eval吗?