Python. Матрица расстояний
Нужно получить матрицу расстояний. Используя разные меры (евклидово, процент несогласия). Я знаю о методах в scipy, мне нужно сделать это самому. Мой код получает на входе:
[[ 2. 4. 5. 12. 14. 15.]
[ 8. 10. 7. 6. 6. 4.]]
Евклидово расстояние:
def euclidean(a):
r = np.zeros((a.shape[1], a.shape[1]))
r[:] = np.nan
i = 0
while i < a.shape[1]:
j = i + 1
while j < a.shape[1]:
r[i][j] = np.linalg.norm(a[:, i] - a[:, j])
j += 1
i += 1
return r
Вывод:
[[ nan 2.83 3.16 10.2 12.17 13.6 ]
[ nan nan 3.16 8.94 10.77 12.53]
[ nan nan nan 7.07 9.06 10.44]
[ nan nan nan nan 2. 3.61]
[ nan nan nan nan nan 2.24]
[ nan nan nan nan nan nan]]
Я использую nan, потому что потом нужно будет искать минимум. Код работает, но мне кажется не красивым. Хотелось бы знать как сделать его лучше и узнать о возможностях python и numpy которых я не знаю. Так же я бы хотел что бы делалась такая матрица по выбору пользователя:
[[ nan 2.83 3.16 10.2 12.17 13.6 ]
[ 2.83 nan 3.16 8.94 10.77 12.53]
[ 3.16 3.16 nan 7.07 9.06 10.44]
[10.2 8.94 7.07 nan 2. 3.61]
[12.17 10.77 9.06 2. nan 2.24]
[13.6 12.53 10.44 3.61 2.24 nan]]
Процент несогласия:
def dp(a):
r = np.zeros((a.shape[1], a.shape[1]))
r[:] = np.nan
i = 0
while i < a.shape[1]:
j = i + 1
while j < a.shape[1]:
z = a[:, i] - a[:, j]
count = np.count_nonzero(z)
r[i][j] = count / len(z)
j += 1
i += 1
return r