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

Ответы (0 шт):