summaryrefslogtreecommitdiff
path: root/numpy/lib/function_base.py
diff options
context:
space:
mode:
authorDenis Alevi <mail@denisalevi.de>2016-02-27 03:59:26 +0100
committerEren Sezener <erensezener@gmail.com>2016-03-20 14:41:40 +0100
commit7c76ef7ea3adbd9c70a08ee39fdf1b56fb940b3b (patch)
tree0ba0a9824993f010493d4c6549edbda72fc1ef83 /numpy/lib/function_base.py
parente7de401f5c9634a2a63eb8f44f2193be1a946191 (diff)
downloadnumpy-7c76ef7ea3adbd9c70a08ee39fdf1b56fb940b3b.tar.gz
ENH: generalize rot90 with axes kwarg, move to function_base.py, and add tests
Diffstat (limited to 'numpy/lib/function_base.py')
-rw-r--r--numpy/lib/function_base.py92
1 files changed, 89 insertions, 3 deletions
diff --git a/numpy/lib/function_base.py b/numpy/lib/function_base.py
index 84690e4e3..c88228354 100644
--- a/numpy/lib/function_base.py
+++ b/numpy/lib/function_base.py
@@ -7,11 +7,11 @@ import operator
import numpy as np
import numpy.core.numeric as _nx
-from numpy.core import linspace, atleast_1d, atleast_2d
+from numpy.core import linspace, atleast_1d, atleast_2d, transpose
from numpy.core.numeric import (
ones, zeros, arange, concatenate, array, asarray, asanyarray, empty,
empty_like, ndarray, around, floor, ceil, take, dot, where, intp,
- integer, isscalar
+ integer, isscalar, absolute
)
from numpy.core.umath import (
pi, multiply, add, arctan2, frompyfunc, cos, less_equal, sqrt, sin,
@@ -37,7 +37,7 @@ if sys.version_info[0] < 3:
__all__ = [
'select', 'piecewise', 'trim_zeros', 'copy', 'iterable', 'percentile',
'diff', 'gradient', 'angle', 'unwrap', 'sort_complex', 'disp', 'flip',
- 'extract', 'place', 'vectorize', 'asarray_chkfinite', 'average',
+ 'rot90', 'extract', 'place', 'vectorize', 'asarray_chkfinite', 'average',
'histogram', 'histogramdd', 'bincount', 'digitize', 'cov', 'corrcoef',
'msort', 'median', 'sinc', 'hamming', 'hanning', 'bartlett',
'blackman', 'kaiser', 'trapz', 'i0', 'add_newdoc', 'add_docstring',
@@ -45,6 +45,92 @@ __all__ = [
]
+def rot90(m, k=1, axes=(0,1)):
+ """
+ Rotate an array by 90 degrees in the plane specified by axes.
+
+ Rotation direction is from the first towards the second axis.
+
+ .. versionadded:: 1.12.0
+
+ Parameters
+ ----------
+ m : array_like
+ Array of two or more dimensions.
+ k : integer
+ Number of times the array is rotated by 90 degrees.
+ axes: (2,) array_like
+ The array is rotated in the plane defined by the axes.
+ Axes must be different.
+
+ Returns
+ -------
+ y : ndarray
+ A rotated view of `m`.
+
+ See Also
+ --------
+ flip : Reverse the order of elements in an array along the given axis.
+ fliplr : Flip an array horizontally.
+ flipud : Flip an array vertically.
+
+ Notes
+ -----
+ rot90(m, k=1, axes=(1,0)) is the reverse of rot90(m, k=1, axes=(0,1))
+ rot90(m, k=1, axes=(1,0)) is equivalent to rot90(m, k=-1, axes=(0,1))
+
+ Examples
+ --------
+ >>> m = np.array([[1,2],[3,4]], int)
+ >>> m
+ array([[1, 2],
+ [3, 4]])
+ >>> np.rot90(m)
+ array([[2, 4],
+ [1, 3]])
+ >>> np.rot90(m, 2)
+ array([[4, 3],
+ [2, 1]])
+ >>> m = np.arange(8).reshape((2,2,2))
+ >>> np.rot90(m, 1, (1,2))
+ array([[[1, 3],
+ [0, 2]],
+
+ [[5, 7],
+ [4, 6]]])
+
+ """
+ axes = tuple(axes)
+ if len(axes) != 2:
+ raise ValueError("len(axes) must be 2.")
+
+ m = asanyarray(m)
+
+ if axes[0] == axes[1] or absolute(axes[0] - axes[1]) == m.ndim:
+ raise ValueError("Axes must be different.")
+
+ if (axes[0] >= m.ndim or axes[0] < -m.ndim
+ or axes[1] >= m.ndim or axes[1] < -m.ndim):
+ raise ValueError("Axes={} out of range for array of ndim={}."
+ .format(axes, m.ndim))
+
+ k %= 4
+
+ if k == 0:
+ return m[:]
+ if k == 2:
+ return flip(flip(m, axes[0]), axes[1])
+
+ axes_list = arange(0, m.ndim)
+ axes_list[axes[0]], axes_list[axes[1]] = axes_list[axes[1]], axes_list[axes[0]]
+
+ if k == 1:
+ return transpose(flip(m,axes[1]), axes_list)
+ else:
+ # k == 3
+ return flip(transpose(m, axes_list), axes[1])
+
+
def flip(m, axis):
"""
Reverse the order of elements in an array along the given axis.