Python - векторы разного размера евклидова расстояния - PullRequest
0 голосов
/ 14 марта 2020

У меня есть размер массива numpy (9126,12) и две опорные точки кластера (2,12), для которых я пытаюсь вычислить расстояние для массива, чтобы пометить их. На практике я понимаю, как это должно происходить, но просто не могу реализовать это из-за отправки массивов другого размера.

Знаю, что могу использовать numpy .linalg, но это часть домашнего задания, поэтому не допускается сделать это.

ValueError: операнды не могут передаваться вместе с фигурами (9126,12) (2,12)

def euclid_dist(v1, v2):
    return np.sqrt(((v1-v2)**2).sum(axis = 1))


def check_euclid_dist(data, reference_vectors):
    npdata = data.to_numpy()
    dst = euclid_dist(npdata, reference_vectors)
    # Get the indices of minimum element in numpy array
    result = np.where(dst == np.amin(dst))
    print(result)
    return result

1 Ответ

0 голосов
/ 15 марта 2020

Вы можете вычислить расстояние каждого вектора до каждой из опорных точек, вставив дополнительное измерение в оба массива, и пусть Numpy транслирует их друг против друга:

distances = np.linalg.norm(npdata[:, None, ...] - reference_vectors[None, ...], axis=-1)

Затем вы можете найти ближайший кластер с помощью np.argmin:

cluster_id = np.argmin(distances, axis=1)
...