There are already many ways to do the euclidean distance in python, you don’t need to do it actually. But it is a very good exercise for programming as long as you do it by yourself.

summary:

I wrote the following script, just try it!

import numpy as np
import sys
import math
import matplotlib.pyplot as plt
from scipy.spatial import distance

vector1 = [3.0, 104.0]
vector2 = [18.0, 90.0]
vectorOther = [1.0, 2.0, 3.0]

v1 = np.array(vector1)
v2 = np.array(vector2)
vOther = np.array(vectorOther)

def diff_Length_Error():
    raise RuntimeWarning("The length of the two vectors are not the same!")

def euclidean0_0 (vector1, vector2):
''' calculate the euclidean distance
    input: numpy.arrays or lists
    return: 1. quard distance, 2. euclidean distance
'''
    quar_distance = 0
    try:
        if(len(vector1) != len(vector2)):
            diff_Length_Error()
        zipVector = zip(vector1, vector2)

        for member in zipVector:
            quar_distance += (member[1] - member[0]) ** 2

        return quar_distance, math.sqrt(quar_distance)

    except Exception, err:
        sys.stderr.write('WARNING: %s\n' % str(err))
        return -1, -1

def euclidean0_1(vector1, vector2):
    '''calculate the euclidean distance, no numpy
    input: numpy.arrays or lists
    return: euclidean distance
    '''
    dist = [(a - b)**2 for a, b in zip(vector1, vector2)]
    dist = math.sqrt(sum(dist))
    return dist

def euclidean2(vector1, vector2):
    '''calculate the euclidean distance, use numpy.dot() function
    input: numpy.arrays or lists
    return: euclidean distance
    '''
    try:
        if type(vector1) == list:
            vector1 = np.array(vector1)
        if type(vector2) == list:
            vector2 = np.array(vector2)
        diff = vector2 - vector1
        squareDistance = np.dot(diff.T, diff)
        return squareDistance, math.sqrt(squareDistance)
    except TypeError as e:
        print "Type error: {}".format(e.message)
        raise
    except ValueError as e:
        print "Value error: {}".format(e.message)
        raise
    except:
        print "Unexpected error:", sys.exc_info()[0]
        raise

def euclidean3(vector1, vector2):
    ''' use numpy.linalg.norm to calculate the euclidean distance. '''
    vector1, vector2 = list_to_npArray(vector1, vector2)
    distance = np.linalg.norm(vector1-vector2, 2, 0) # the third argument "0" means the column, and "1" means the line.
    return distance

def euclidean4(vector1, vector2):
    ''' use scipy to calculate the euclidean distance. '''
    dist = distance.euclidean(vector1, vector2)
    return dist

def euclidean5(vector1, vector2):
    ''' use matplotlib.mlab to calculate the euclidean distance. '''
    vector1, vector2 = list_to_npArray(vector1, vector2)
    dist = plt.mlab.dist(vector1, vector2)
    return dist

def list_to_npArray(vector1, vector2):
    '''convert the list to numpy array'''
    if type(vector1) == list:
        vector1 = np.array(vector1)
    if type(vector2) == list:
        vector2 = np.array(vector2)
    return vector1, vector2

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.