summaryrefslogtreecommitdiff
path: root/numpy/lib/stride_tricks.py
diff options
context:
space:
mode:
authorSebastian Berg <sebastian@sipsolutions.net>2016-01-21 22:23:53 +0100
committerSebastian Berg <sebastian@sipsolutions.net>2016-02-13 22:26:40 +0100
commitf7e64cc699567124114e41ad7f518d6825807cc3 (patch)
tree42808673dcf3c1daa99ce960889cc15fa47a75c4 /numpy/lib/stride_tricks.py
parentdb0304e4fe483a9d591424b35affd0d0e197000d (diff)
downloadnumpy-f7e64cc699567124114e41ad7f518d6825807cc3.tar.gz
DOC: Add documentation for as_strided
Diffstat (limited to 'numpy/lib/stride_tricks.py')
-rw-r--r--numpy/lib/stride_tricks.py65
1 files changed, 62 insertions, 3 deletions
diff --git a/numpy/lib/stride_tricks.py b/numpy/lib/stride_tricks.py
index 4c23ab355..af09fd373 100644
--- a/numpy/lib/stride_tricks.py
+++ b/numpy/lib/stride_tricks.py
@@ -35,8 +35,61 @@ def _maybe_view_as_subclass(original_array, new_array):
return new_array
-def as_strided(x, shape=None, strides=None, subok=False):
- """ Make an ndarray from the given array with the given shape and strides.
+def as_strided(x, shape=None, strides=None, subok=False, writeable=True):
+ """
+ Create a view into the array with the given shape and strides.
+
+ .. warning:: This function has to be used with extreme care, see notes.
+
+ Parameters
+ ----------
+ x : ndarray
+ Array to create a new.
+ shape : sequence of int, optional
+ The shape of the new array. Defaults to ``x.shape``.
+ strides : sequence of int, optional
+ The strides of the new array. Defaults to ``x.strides``.
+ subok : bool, optional
+ .. versionadded:: 1.10
+
+ If True, subclasses are preserved.
+ writeable : bool, optional
+ .. versionadded:: 1.12
+
+ If set to False, the returned array will always be readonly.
+ Otherwise it will be writable if the original array was. It
+ is advisable to set this to False if possible (see Notes).
+
+ Returns
+ -------
+ view : ndarray
+
+ See also
+ --------
+ broadcast_to: broadcast an array to a given shape.
+ reshape : reshape an array.
+
+ Notes
+ -----
+ ``as_strided`` creates a view into the array given the exact strides
+ and shape. This means it manipulates the internal data structure of
+ ndarray and, if done incorrectly, the array elements can point to
+ invalid memory and can corrupt results or crash your program.
+ It is advisable to always use the original ``x.strides`` when
+ calculating new strides to avoid reliance on a contiguous memory
+ layout.
+
+ Furthermore, arrays created with this function often contain self
+ overlapping memory, so that two elements are identical.
+ Vectorized write operations on such arrays will typically be
+ unpredictable. They may even give different results for small, large,
+ or transposed arrays.
+ Since writing to these arrays has to be tested and done with great
+ care, you may want to use ``writeable=False`` to avoid accidental write
+ operations.
+
+ For these reasons it is advisable to avoid ``as_strided`` when
+ possible.
"""
# first convert input to array, possibly keeping subclass
x = np.array(x, copy=False, subok=subok)
@@ -45,13 +98,19 @@ def as_strided(x, shape=None, strides=None, subok=False):
interface['shape'] = tuple(shape)
if strides is not None:
interface['strides'] = tuple(strides)
+
array = np.asarray(DummyArray(interface, base=x))
if array.dtype.fields is None and x.dtype.fields is not None:
# This should only happen if x.dtype is [('', 'Vx')]
array.dtype = x.dtype
- return _maybe_view_as_subclass(x, array)
+ view = _maybe_view_as_subclass(x, array)
+
+ if view.flags.writeable and not writeable:
+ view.flags.writeable = False
+
+ return view
def _broadcast_to(array, shape, subok, readonly):