получение TypeError: неподдерживаемые типы операндов для -: 'list' и 'list' при выполнении минимальной максимальной нормализации в python

Я работаю с Python в течение нескольких месяцев ... Теперь мне нужно выполнить минимальную-максимальную нормализацию для столбца моего набора данных (файл .csv), для которого я получаю вышеупомянутую ошибку типа ... Я много пробовал но он по-прежнему сохраняется .. Для функций min и max извлекаются правильные значения, но типы результатов являются списками, а не числами с плавающей запятой / целым числом ..

Это строка, которая вызывает ошибку

for i in range(num):

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

где krr - столбец, полученный из набора данных. Пожалуйста, помогите.

У меня есть функция "normal", которая выполняет минимальную и максимальную нормализацию. Я взял значения столбцов, используя 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

person Devi    schedule 02.01.2015    source источник
comment
У меня код работает нормально, можете ли вы попробовать отредактировать свой вопрос, чтобы добавить всю трассировку для полученной ошибки?   -  person zehnpaard    schedule 02.01.2015
comment
krr - это список с вложенными списками. Вам нужно изменить способ доступа к индексам.   -  person Henrik Andersson    schedule 02.01.2015
comment
Также был бы полезен репрезентативный сегмент того, как на самом деле выглядит krr.   -  person zehnpaard    schedule 02.01.2015
comment
да, не могли бы вы подробнее рассказать о переменной krr?   -  person Vivek Sable    schedule 02.01.2015
comment
@limelights: Спасибо .. krr - это список списка .. Ниже указано значение 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]] .. Итак, как я могу получить к нему доступ сейчас   -  person Devi    schedule 02.01.2015
comment
@VivekSable - Я отредактировал ... Пожалуйста, прочтите   -  person Devi    schedule 02.01.2015
comment
@zehnapaard - Я отредактировал ... Пожалуйста, прочтите   -  person Devi    schedule 02.01.2015


Ответы (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])

map применяет float к каждому элементу следующего списка и создает новый список. Вместо этого мы запрашиваем первый элемент этого списка и применяем float непосредственно к нему. Это число с плавающей запятой присваивается индексу в кронах.

PS eval(str(arr[i]))[0:-31] выглядит довольно устрашающе - действительно ли здесь нужно вызывать eval?

person zehnpaard    schedule 02.01.2015
comment
: Спасибо за ответ! Это решило мою проблему. Оператор eval self.krr [i] = map (float, eval (str (arr [i])) [0: -31]) был заменен на self.krr [i] = arr [i] [num] ... - person Devi; 05.01.2015