#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)
, так что это вряд ли произойдет.. Спасибо вам за вашу помощь <32. @AhmadEbrahim О, извините, я полностью ожидал, что внутренний цикл for будет ошибкой отступа, но в этом случае students_grades никогда не содержит более одного элемента (поскольку в том же цикле for самого низкого уровня вы добавляете один элемент и удаляете хотя бы один элемент). (на самом деле, это может быть проблемой: вы добавляете один элемент и пытаетесь удалить k элементов)