# Authors: Jake Vanderplas, Alex Rubinsteyn, Olivier Grisel
# License: MIT
import numpy as np
def pairwise_python_nested_for_loops(data):
n_samples, n_features = data.shape
distances = np.empty((n_samples, n_samples), dtype=data.dtype)
#"omp parallel for private(j, d, k, tmp)"
for i in range(n_samples):
for j in range(n_samples):
d = 0.0
for k in range(n_features):
tmp = data[i, k] - data[j, k]
d += tmp * tmp
distances[i, j] = np.sqrt(d)
return distances
def pairwise_python_inner_numpy(data):
n_samples = data.shape[0]
result = np.empty((n_samples, n_samples), dtype=data.dtype)
for i in xrange(n_samples):
for j in xrange(n_samples):
result[i, j] = np.sqrt(np.sum((data[i, :] - data[j, :]) ** 2))
return result
def pairwise_python_broadcast_numpy(data):
return np.sqrt(((data[:, None, :] - data) ** 2).sum(axis=2))
def pairwise_python_numpy_dot(data):
X_norm_2 = (data ** 2).sum(axis=1)
dists = np.sqrt(2 * X_norm_2 - np.dot(data, data.T))
return dists
benchmarks = (
pairwise_python_nested_for_loops,
pairwise_python_inner_numpy,
pairwise_python_broadcast_numpy,
pairwise_python_numpy_dot,
)