From 7e85a8894dca17e3c70747265f090ff620f90a60 Mon Sep 17 00:00:00 2001 From: Lukas Geiger Date: Fri, 24 Nov 2023 00:58:05 +0000 Subject: [PATCH] ENH: Use `np.dot` to speedup `spatial.distance.correlation` --- scipy/spatial/distance.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scipy/spatial/distance.py b/scipy/spatial/distance.py index f0530cf8778a..b8c6cb2de363 100644 --- a/scipy/spatial/distance.py +++ b/scipy/spatial/distance.py @@ -628,9 +628,15 @@ def correlation(u, v, w=None, centered=True): vmu = np.average(v, weights=w) u = u - umu v = v - vmu - uv = np.average(u * v, weights=w) - uu = np.average(np.square(u), weights=w) - vv = np.average(np.square(v), weights=w) + if w is not None: + w /= w.sum() + vw = v * w + uw = u * w + else: + vw, uw = v, u + uv = np.dot(u, vw) + uu = np.dot(u, uw) + vv = np.dot(v, vw) dist = 1.0 - uv / np.sqrt(uu * vv) # Return absolute value to avoid small negative value due to rounding return np.abs(dist)