diff --git a/scripts/tcd/Basis_Function.py b/scripts/tcd/Basis_Function.py
index b5463d58df8c3e43ae7799c34a625eea7a33580c..01eaf271f62e3c003a45bce4074fb13123f94ba4 100644
--- a/scripts/tcd/Basis_Function.py
+++ b/scripts/tcd/Basis_Function.py
@@ -533,17 +533,44 @@ class OrthonormalLegendre(Legendre):
 
         Notes
         -----
-            To increase speed. this function uses a simplified calculation
+            To increase speed, this function uses a simplified calculation
             specific to the orthonormal Legendre polynomial basis.
 
         """
-        left_reconstructions = [
-            sum(projection[degree][cell] * (-1)**degree
-                * np.sqrt(degree + 0.5)
-                for degree in range(self._polynomial_degree+1))
-            for cell in range(len(projection[0]))]
-        right_reconstructions = [
-            sum(projection[degree][cell] * np.sqrt(degree + 0.5)
-                for degree in range(self._polynomial_degree+1))
-            for cell in range(len(projection[0]))]
-        return left_reconstructions, right_reconstructions
+        left_reconstruction = projection.T @ (self._root_vector *
+                                              self._sign_vector)
+        right_reconstruction = projection.T @ self._sign_vector
+
+        return left_reconstruction, right_reconstruction
+
+    @property
+    @cache
+    def _root_vector(self):
+        """Return root vector.
+
+        Return vector with the roots of all degrees plus 0.5.
+
+        Returns
+        -------
+        ndarray
+            Root vector.
+
+        """
+        return np.array([np.sqrt(degree+0.5)
+                         for degree in range(self.polynomial_degree+1)])
+
+    @property
+    @cache
+    def _sign_vector(self):
+        """Return sign vector.
+
+        Return identity vector with sign changes for all even degrees.
+
+        Returns
+        -------
+        ndarray
+            Sign vector.
+
+        """
+        return np.array([-1 if degree % 2 else 1
+                         for degree in range(self._polynomial_degree+1)])