Как эффективно вычислить евклидово расстояние между ссылочной строкой и каждой строкой в ​​массиве numpy? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть этот код, который я хочу сделать более эффективным:

distances = []
for row, lab in zip(train_set, train_labels):
    distance = np.sum(np.linalg.norm(row - exemple_row, axis=1))
    distances.append((distance, lab))
distances.sort()

, где train_set - это массив 3 измерений numpy, train_labels - это массив 1-мерного np и exemple является массивом из 2 измерений.

exemple - это строка, в которой каждая запись представляет собой координаты N измерений. Каждая строка в train_set имеет то же измерение, что и exemple, и каждая запись строки представляет собой координаты измерений N.

Чтобы прояснить ситуацию, вот пример:


exemple = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]

train_set =
[
    [[0, 0, 1], [0, 1, 0], [1, 0, 0]],
    [[0, 0, 1], [0, 1, 0], [0, 1, 0]],
    [[1, 0, 0], [1, 0, 0], [0, 1, 0]],
]

Расстояние между первой строкой train_set и instancele равно 0. Для второй строки это 1, а для последней строки - 3. Таким образом, distances будет списком или numpy массивом, содержащим [0 1 3] .

Я уже сделал это с помощью списка понимания, но, тем не менее, безусловно, есть способ улучшить его, возможно, с помощью некоторых numpy методов?

Спасибо!

PS: я не хочу добавлять в свой проект новую библиотеку (например, scipy или другую)

...