From 114209abd7b191c7261828f1d80d0581a141b8c5 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Wed, 19 Dec 2018 11:04:39 +0100 Subject: [PATCH] Deprecate proj3d.mod. Having a function named mod that doesn't do % but computes the norm of a vector is just a good way to trip the reader (yes, I know about the term "modulus of a vector", but still). Also vectorize a normals calculation. Also we can use % instead of np.mod elsewhere. --- lib/matplotlib/quiver.py | 4 ++-- lib/matplotlib/tri/triinterpolate.py | 2 +- lib/mpl_toolkits/mplot3d/axes3d.py | 8 ++++---- lib/mpl_toolkits/mplot3d/proj3d.py | 20 +++++++------------- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index b64a58b24527..2355ac60537d 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -983,10 +983,10 @@ def _find_tails(self, mag, rounding=True, half=5, full=10, flag=50): mag = half * (mag / half + 0.5).astype(int) num_flags = np.floor(mag / flag).astype(int) - mag = np.mod(mag, flag) + mag = mag % flag num_barb = np.floor(mag / full).astype(int) - mag = np.mod(mag, full) + mag = mag % full half_flag = mag >= half empty_flag = ~(half_flag | (num_flags > 0) | (num_barb > 0)) diff --git a/lib/matplotlib/tri/triinterpolate.py b/lib/matplotlib/tri/triinterpolate.py index ed0813746e76..37b960e85137 100644 --- a/lib/matplotlib/tri/triinterpolate.py +++ b/lib/matplotlib/tri/triinterpolate.py @@ -1135,7 +1135,7 @@ def compute_geom_weights(self): alpha2 = np.arctan2(p2[:, 1]-p0[:, 1], p2[:, 0]-p0[:, 0]) # In the below formula we could take modulo 2. but # modulo 1. is safer regarding round-off errors (flat triangles). - angle = np.abs(np.mod((alpha2-alpha1) / np.pi, 1.)) + angle = np.abs(((alpha2-alpha1) / np.pi) % 1) # Weight proportional to angle up np.pi/2; null weight for # degenerated cases 0 and np.pi (note that `angle` is normalized # by np.pi). diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 468b3aa4cc0e..dd31670fd58e 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -1027,7 +1027,7 @@ def get_proj(self): self.eye = E self.vvec = R - E - self.vvec = self.vvec / proj3d._mod(self.vvec) + self.vvec = self.vvec / np.linalg.norm(self.vvec) if abs(relev) > np.pi/2: # upside down @@ -1762,9 +1762,9 @@ def _shade_colors(self, color, normals, lightsource=None): # chosen for backwards-compatibility lightsource = LightSource(azdeg=225, altdeg=19.4712) - shade = np.array([np.dot(n / proj3d._mod(n), lightsource.direction) - if proj3d._mod(n) else np.nan - for n in normals]) + with np.errstate(invalid="ignore"): + shade = ((normals / np.linalg.norm(normals, axis=1, keepdims=True)) + @ lightsource.direction) mask = ~np.isnan(shade) if mask.any(): diff --git a/lib/mpl_toolkits/mplot3d/proj3d.py b/lib/mpl_toolkits/mplot3d/proj3d.py index 41a5df3845f8..e9081b9a6e51 100644 --- a/lib/mpl_toolkits/mplot3d/proj3d.py +++ b/lib/mpl_toolkits/mplot3d/proj3d.py @@ -1,8 +1,7 @@ -# 3dproj.py -# """ Various transforms used for by the 3D code """ + import numpy as np import numpy.linalg as linalg @@ -79,15 +78,10 @@ def line2d_seg_dist(p1, p2, p0): return _line2d_seg_dist(p1, p2, p0) -def _mod(v): - """3d vector length""" - return np.sqrt(v[0]**2+v[1]**2+v[2]**2) - - -@cbook.deprecated("3.1") +@cbook.deprecated("3.1", alternative="np.linalg.norm") def mod(v): """3d vector length""" - return _mod(v) + return np.sqrt(v[0]**2+v[1]**2+v[2]**2) def world_transformation(xmin, xmax, @@ -103,9 +97,9 @@ def world_transformation(xmin, xmax, def view_transformation(E, R, V): n = (E - R) ## new -# n /= mod(n) +# n /= np.linalg.norm(n) # u = np.cross(V,n) -# u /= mod(u) +# u /= np.linalg.norm(u) # v = np.cross(n,u) # Mr = np.diag([1.]*4) # Mt = np.diag([1.]*4) @@ -114,9 +108,9 @@ def view_transformation(E, R, V): ## end new ## old - n = n / _mod(n) + n = n / np.linalg.norm(n) u = np.cross(V, n) - u = u / _mod(u) + u = u / np.linalg.norm(u) v = np.cross(n, u) Mr = [[u[0], u[1], u[2], 0], [v[0], v[1], v[2], 0],