Я действительно не могу сказать, что находится вне пределов досягаемости

#python

#python

Вопрос:

Я продолжаю получать эту ошибку, и я даже не знаю, что не так, поэтому происходит то, что я получаю несколько случайных индексов из массива temp, который содержит только целые числа от 0 до len(students_grades) , после чего я перехожу к students_grades и получаю значение индексов, которые я только что получил, и сохраняю его в объекте с именем cluster -> иметь два атрибута (центроид и индивидуумы)

Что я хочу сделать, так это следующее: я хочу сгенерировать несколько случайных индексов из массива temp, а затем взять эти индексы и получить их значения из массива students_grades , а затем я хочу удалить этот индекс из students_grades .. может кто-нибудь помочь?

         data = pd.read_csv("CourseEvaluation.csv", header=None)
        students_grades = []
        for i in range(1, 151):
        students_grades.append([float(data.values[i, j]) for j in range(1, 21)])
    
        k = int(input("enter how many clusters :"))
        indices = numpy.random.choice(temp, k, False)
        initial_clusters = []
        for i in range(0, len(indices)):
            print("product number:", indices[i]   1)
            cluster = Cluster(students_grades[indices[i]], 
            students_grades[indices[i]])
            students_grades.pop(indices[i])
            initial_clusters.append(cluster)
 

Ошибка:

 Traceback (most recent call last):
  File "", line 103, in <module>
    cluster = Cluster(students_grades[indices[i]], students_grades[indices[i]])
IndexError: list index out of range
 

Комментарии:

1. Трудно сказать, поскольку ваш фрагмент не определяет students_grades .

2. Что находится внутри переменной students_grades ?

3. Просто распечатайте len(indices) , и len(students_grade) вы узнаете, почему

4. student_grades — это массив массивов, а внутренние массивы содержат значения с плавающей запятой

5. Утверждение, что это поплавки, не отвечает на цель вопроса, который состоял в том, чтобы выяснить, сколько поплавков он содержит.

Ответ №1:

Возможно, вы захотите немного реорганизовать свой код 😉 В любом случае, я не могу быть уверен на сто процентов, но я предполагаю, что ваша проблема заключается в следующем: вы создаете массив случайных индексов, именованных индексов, с потенциально наибольшим значением temp — 1, которое может возникнуть в любой точке этого массива (но только один раз):

 indices = numpy.random.choice(temp, k, False)
 

Затем вы перебираете эти индексы, и на каждом шаге вы уменьшаете размер своего списка students_grades:
students_grades.pop(indices[i])

Итак, предполагая, что temp = len(students_grades) в начале этого, после i шагов длина students_grades равна только temp — i, но индекс, который вы получаете из своего массива индексов, может достигать temp — 1, чтобы вы могли получить индекс из связанных ошибок. Чтобы исправить это, помните, что

 indices = numpy.random.choice(temp, k, False)
 

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

Кстати, просто некоторые общие рекомендации в стиле python: вместо

 for i in range(len(some_list)):
    stuff with some_list[i]
 

вы можете использовать

 for element in some_list:
    stuff with element
 

для более читаемого, «питонического», кода 😉

Комментарии:

1. Спасибо за совет, но дело в том, что: indices = numpy.random.choice(temp, k, False) вызывается только в цикле for, который зацикливается от 0 до len(indices) которого в основном k , и нет способа k больше, чем len(students_grades) , так что это вряд ли произойдет.. Спасибо вам за вашу помощь <3

2. @AhmadEbrahim О, извините, я полностью ожидал, что внутренний цикл for будет ошибкой отступа, но в этом случае students_grades никогда не содержит более одного элемента (поскольку в том же цикле for самого низкого уровня вы добавляете один элемент и удаляете хотя бы один элемент). (на самом деле, это может быть проблемой: вы добавляете один элемент и пытаетесь удалить k элементов)