【问题标题】:getting TypeError: unsupported operand type(s) for -: 'list' and 'list' while doing Min max normalization in python获取 TypeError: unsupported operand type(s) for -: 'list' and 'list' while doing Min max normalization in python
【发布时间】:2015-01-02 17:49:13
【问题描述】:

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

这是导致错误的行

for i in range(num):

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

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

我有一个“正常”函数,它可以进行最小-最大归一化.. 我已经使用 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

【问题讨论】:

  • 该代码对我来说很好,您可以尝试编辑您的问题以添加您遇到的错误的整个回溯吗?
  • krr 是一个带有嵌套列表的列表。您需要更改访问索引的方式。
  • 也是 krr 实际外观的代表性部分。
  • 是的,你能提供更多关于 krr 变量的细节吗?
  • @limelights:Thank You..krr 是 list 的 list..下面是 krr list [[31.0], [61.0], [116.0], [123.0], [27.0] 的值, [77.0], [60.0], [77.0], [119.0], [76.0], [123.0], [125.0]]..那么我现在如何访问它

标签: python normalization pyscripter


【解决方案1】:

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

如果你看看你的公式:

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

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

我的建议是,在你完成构建 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 真的需要在这里调用吗?

【讨论】:

  • :谢谢您的回复!这解决了我的问题。 eval 语句 self.krr[i]=map(float,eval(str(arr[i]))[0:-31]) 被替换为 self.krr[i]=arr[i][num]...
猜你喜欢
  • 2020-05-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2020-10-01
  • 2016-09-26
相关资源
最近更新 更多