IndexError: только целые числа, кусочки (`:`), многоточие (`...`), `Ошибка во фрагменте python в numpy - PullRequest
0 голосов
/ 18 октября 2018

Я использую следующий фрагмент кода Python для своих данных (матрица 1500x2) и пытаюсь реализовать алгоритм KMeans с нуля: -

def closestCentroids(arr, centroids):
idx = np.zeros(arr.shape[0]);
for i in range(0, arr.shape[0]):
    idx[i] = 0
    for j in range(0, centroids.shape[0]):
        if(np.linalg.norm(arr[i]-centroids[j]) < np.linalg.norm(arr[i]-centroids[idx[i]])):
            idx[i] = j
return idx

def computeCentroids(arr, idx, k = 3):
    centroids = np.zeros((k, arr.shape[1]))

    for i in range(0, k):
        idx_k = (idx==i).sum()
        centroids[i] = (arr[np.where(idx == i)].sum(axis=0))/idx_k
    return centroids

def kMeans(arr, k = 3):
    centroids = arr[np.random.randint(arr.shape[0], size = k), :]
    idx = np.zeros(arr.shape[0])
    for i in range(0, 50):
        idx = closestCentroids(arr, centroids)
        centroids = computeCentroids(arr, idx, k=3)
    return centroids

Ошибка возникает в строке if(np.linalg.norm(arr[i]-centroids[j]) < np.linalg.norm(arr[i]-centroids[idx[i]])):, когда ясравнивая евкдову дистанцию ​​точек.Я не знаю, где я иду не так.

1 Ответ

0 голосов
/ 18 октября 2018

По умолчанию numpy.zeros() создает массив значений с плавающей запятой, поэтому ваш массив idx является массивом с плавающей запятой.Вы используете значения idx для индексирования массива centroids, а numpy не позволяет индексировать значениями с плавающей запятой, поэтому idx должен быть целочисленным массивом.

Изменить создание idx до

idx = np.zeros(arr.shape[0], dtype=int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...