# Measuring the distance between NumPy matrixes

This takes two sets of five random points stored as a NumPy matrix, and then calculates the NumPy matrix between a point of the first set and a point of the second set. While the code works, I feel it's inelegant, as if I was writing in PHP or some other language. How can the function CalculateMatrixDistances be improved?

import random
import numpy as np
import scipy
from scipy import spatial

P=5
V=5

def CalculateMatrixDistances(MatRows,MatColums):
numberRows=MatRows.shape
numberColumns=MatColums.shape
MatrixDistances=np.matrix( [0 for c in range(numberColumns)] )
for r in range(numberRows):
d=[scipy.spatial.distance.euclidean (MatRows[r],MatColums[c]) for c in range(numberColumns)]
MatrixDistances = np.vstack([MatrixDistances, d])
MatrixDistances=np.delete(MatrixDistances, (0), axis=0)
return MatrixDistances

PositionP=np.random.rand(P,2)
PositionV=np.random.rand(V,2)

MatrixDistancesVP=CalculateMatrixDistances(PositionV,PositionP)

print PositionP
print PositionV
print MatrixDistancesVP


(This is already implemented as scipy.spatial.distance.cdist. I'm going to assume that it's more optimised too.)

• Why initialise MatrixDistances to zero if you're only going to delete the first column regardless? A matrix can also have zero for any dimension.

Some more general observations:

• As always, take a look at PEP8 for Python conventions, in particular naming of functions and variables, but also missing whitespace.
• The imports could be more consistent; the import spatial isn't being used.
• A zero matrix should probably be allocated with numpy.matlib.zeros since it's shorter.
• In Python 2 use xrange if you don't need the full list; also use the function form of print for compatibility with Python 3 (it's also more consistent to use it this way).
• The repeated vstack may not be the most efficient option, but you should consult a profiler for that.

When keeping the naming it should still rather look like this maybe.

import random
import numpy as np
import numpy.matlib
import scipy
import scipy.spatial

P, V = 5, 5

def CalculateMatrixDistances(MatRows, MatColums):
numberRows = MatRows.shape
numberColumns = MatColums.shape
MatrixDistances = np.matlib.zeros((0, 5))
for r in xrange(numberRows):
d = [scipy.spatial.distance.euclidean(MatRows[r], MatColums[c]) for c in xrange(numberColumns)]
MatrixDistances = np.vstack([MatrixDistances, d])
return MatrixDistances

PositionP = np.random.rand(P, 2)
PositionV = np.random.rand(V, 2)

MatrixDistancesVP = CalculateMatrixDistances(PositionV, PositionP)

print(PositionP)
print(PositionV)
print(MatrixDistancesVP)
print(scipy.spatial.distance.cdist(PositionV, PositionP))