Невозможно перебрать 2d-массив для нормализации данных

Я пытаюсь нормализовать свои данные, и мне нужно перебрать набор для обучения и тестирования. Я пробовал по-разному, но я получаю эту ошибку list indices must be integers or slices, not list. Я пробовал ставить range() и len(), но все равно получаю ту же ошибку.

Код:

def minMaxNrom(training_data, testing_data):
    for i in training_data:
        for j in training_data:
            new_data = training_data[i][j] - min(j) / max(j) - min(j)    

    for i in testing_data:
        for j in testing_data:
            new_testing_data = testing_data[i][j] - min(j) / max(j) - min(j)


    return (new_data, new_testing_data) 

почему бы вам просто не использовать MinMaxScaler от sklearn.preprocessing

oreopot 31.05.2019 05:26

@dexter Это колледж, поэтому они не позволяют нам использовать библиотеки и хотят, чтобы мы сами кодировали их.

Stefan 31.05.2019 05:29

@TomKarzes Я пробовал, но тоже получил ошибку. Я также пробовал с len, но все равно получаю ошибку, поэтому я запутался.

Stefan 31.05.2019 05:35

@Стефан, какой университет не разрешал бы студентам пользоваться библиотеками?

oreopot 31.05.2019 05:35

@dexter Я думаю, они хотят, чтобы мы узнали, как работают библиотеки/код.

Stefan 31.05.2019 05:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете списки в качестве индексов. Вы можете использовать перечисление. Это исправит вашу ошибку:

def minMaxNrom(training_data, testing_data):
    for indi, i in enumerate(training_data):
        for indj, j in enumerate(training_data):
            new_data = training_data[indi][indj] - min(j) / max(j) - min(j)

    for indi, i in enumerate(testing_data):
        for indj, j in enumerate(testing_data):
            new_testing_data = testing_data[indi][indj] - min(j) / max(j) - min(j)

    return (new_data, new_testing_data)

Некоторые догадки о том, чего вы пытаетесь достичь

Без дополнительной информации трудно понять, почему ваш код дает сбой после устранения проблемы can't use list as index, но вот мое предположение:

def minMaxNrom(training_data, testing_data):
    new_data = []
    new_testing_data = []
    for indi, i in enumerate(training_data):
        for indj, j in enumerate(training_data):
            new_data.append((training_data[indi][indj] - min(j)) / (max(j) - min(j)))

    for indi, i in enumerate(testing_data):
        for indj, j in enumerate(testing_data):
            new_testing_data.append((testing_data[indi][indj] - min(j)) / (max(j) - min(j)))

    return (new_data, new_testing_data)

Объяснение

Скажем, у вас есть:

training_data = [[1, 2], [3, 4, 5], [4, 4, 4]]
for i in training_data:
    print(i)

Это напечатает:

[1, 2]
[3, 4, 5]
[4, 4, 4]

Как видите, i здесь каждый подсписок. Но чтобы получить доступ к этим подспискам со ссылкой, вы делаете:

print(training_data[0])  # gives first sublist
print('---')
print(training_data[1])  # gives second sublist
print('---')
print(training_data[2])  # gives third sublist

Это даст:

[1, 2]
---
[3, 4, 5]
---
[4, 4, 4]

Обратите внимание, что для доступа к этим подспискам мы используем число в качестве индекса, а не список (это то, что вы использовали). Итак, чтобы получить доступ к каждому списку и получить его индекс, мы используем перечисление (лучшее имя переменной для i было бы sublist):

for indi, i in enumerate(training_data):
    print('indi: ', indi)
    print('i: ', i)
    print('training_data[indi]: ', training_data[indi])
    print('---')

это дает:

indi:  0
i:  [1, 2]
training_data[indi]:  [1, 2]
---
indi:  1
i:  [3, 4, 5]
training_data[indi]:  [3, 4, 5]
---
indi:  2
i:  [4, 4, 4]
training_data[indi]:  [4, 4, 4]

Могу я спросить, почему вы используете indi, i и indj, j вместо одного?

Stefan 31.05.2019 05:40

Обновлен ответ на комментарий к ответу.

Perplexabot 31.05.2019 05:52

Спасибо за удивительное объяснение. Теперь я хочу спросить, почему мой индекс выходит за пределы допустимого диапазона?

Stefan 31.05.2019 07:16

Вы говорите о новой ошибке после использования целочисленных индексов? Один из способов, при котором функция может дать сбой, — это если training_data (или testing_data) пусто, т. е. testing_data = []. Другой способ, которым функция может дать сбой, — это если ваши подсписки пусты, например, testing_data = [[1,2,3],[3,4], []] (обратите внимание на третий пустой подсписок). Ваши функции max() и min() не будут работать в пустых списках, вы можете установить значения по умолчанию для max() и min() в случае пустого списка. Для какого входа функция не работает?

Perplexabot 31.05.2019 07:31

Обновлено дальше.

Perplexabot 31.05.2019 22:22

Похоже, мне нужно научиться правильно использовать (), спасибо.

Stefan 31.05.2019 22:24

Не только это, но и в обновленной версии вы добавляете к списку. С тем, что вы использовали изначально, вы выбрасывали все новые данные и просто сохраняли/возвращали последние. Первоначально я не исправлял это, поскольку вы упомянули, что это школьная работа, а это значит, что лучше глубоко погрузиться в отладку.

Perplexabot 31.05.2019 22:25

Другие вопросы по теме