123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- """
- Functions in the ``as*array`` family that promote array-likes into arrays.
- `require` fits this category despite its name not matching this pattern.
- """
- from .overrides import (
- array_function_dispatch,
- set_array_function_like_doc,
- set_module,
- )
- from .multiarray import array, asanyarray
- __all__ = ["require"]
- POSSIBLE_FLAGS = {
- 'C': 'C', 'C_CONTIGUOUS': 'C', 'CONTIGUOUS': 'C',
- 'F': 'F', 'F_CONTIGUOUS': 'F', 'FORTRAN': 'F',
- 'A': 'A', 'ALIGNED': 'A',
- 'W': 'W', 'WRITEABLE': 'W',
- 'O': 'O', 'OWNDATA': 'O',
- 'E': 'E', 'ENSUREARRAY': 'E'
- }
- def _require_dispatcher(a, dtype=None, requirements=None, *, like=None):
- return (like,)
- @set_array_function_like_doc
- @set_module('numpy')
- def require(a, dtype=None, requirements=None, *, like=None):
- """
- Return an ndarray of the provided type that satisfies requirements.
- This function is useful to be sure that an array with the correct flags
- is returned for passing to compiled code (perhaps through ctypes).
- Parameters
- ----------
- a : array_like
- The object to be converted to a type-and-requirement-satisfying array.
- dtype : data-type
- The required data-type. If None preserve the current dtype. If your
- application requires the data to be in native byteorder, include
- a byteorder specification as a part of the dtype specification.
- requirements : str or sequence of str
- The requirements list can be any of the following
- * 'F_CONTIGUOUS' ('F') - ensure a Fortran-contiguous array
- * 'C_CONTIGUOUS' ('C') - ensure a C-contiguous array
- * 'ALIGNED' ('A') - ensure a data-type aligned array
- * 'WRITEABLE' ('W') - ensure a writable array
- * 'OWNDATA' ('O') - ensure an array that owns its own data
- * 'ENSUREARRAY', ('E') - ensure a base array, instead of a subclass
- ${ARRAY_FUNCTION_LIKE}
- .. versionadded:: 1.20.0
- Returns
- -------
- out : ndarray
- Array with specified requirements and type if given.
- See Also
- --------
- asarray : Convert input to an ndarray.
- asanyarray : Convert to an ndarray, but pass through ndarray subclasses.
- ascontiguousarray : Convert input to a contiguous array.
- asfortranarray : Convert input to an ndarray with column-major
- memory order.
- ndarray.flags : Information about the memory layout of the array.
- Notes
- -----
- The returned array will be guaranteed to have the listed requirements
- by making a copy if needed.
- Examples
- --------
- >>> x = np.arange(6).reshape(2,3)
- >>> x.flags
- C_CONTIGUOUS : True
- F_CONTIGUOUS : False
- OWNDATA : False
- WRITEABLE : True
- ALIGNED : True
- WRITEBACKIFCOPY : False
- >>> y = np.require(x, dtype=np.float32, requirements=['A', 'O', 'W', 'F'])
- >>> y.flags
- C_CONTIGUOUS : False
- F_CONTIGUOUS : True
- OWNDATA : True
- WRITEABLE : True
- ALIGNED : True
- WRITEBACKIFCOPY : False
- """
- if like is not None:
- return _require_with_like(
- a,
- dtype=dtype,
- requirements=requirements,
- like=like,
- )
- if not requirements:
- return asanyarray(a, dtype=dtype)
- requirements = {POSSIBLE_FLAGS[x.upper()] for x in requirements}
- if 'E' in requirements:
- requirements.remove('E')
- subok = False
- else:
- subok = True
- order = 'A'
- if requirements >= {'C', 'F'}:
- raise ValueError('Cannot specify both "C" and "F" order')
- elif 'F' in requirements:
- order = 'F'
- requirements.remove('F')
- elif 'C' in requirements:
- order = 'C'
- requirements.remove('C')
- arr = array(a, dtype=dtype, order=order, copy=False, subok=subok)
- for prop in requirements:
- if not arr.flags[prop]:
- return arr.copy(order)
- return arr
- _require_with_like = array_function_dispatch(
- _require_dispatcher, use_like=True
- )(require)
|