# Array API standard compatibility
NumPy’s main namespace as well as the `numpy.fft` and `numpy.linalg` namespaces are compatible [1] with the 2022.12 version of the Python array API standard.
NumPy aims to implement support for the 2023.12 version and future versions of the standard - assuming that those future versions can be upgraded to given NumPy’s backwards compatibility policy.
For usage guidelines for downstream libraries and end users who want to write code that will work with both NumPy and other array libraries, we refer to the documentation of the array API standard itself and to code and developer-focused documentation in SciPy and scikit-learn.
Note that in order to use standard-complaint code with older NumPy versions (< 2.0), the array-api-compat package may be useful. For testing whether NumPy-using code is only using standard-compliant features rather than anything NumPy-specific, the array-api-strict package can be used.
History
NumPy 1.22.0 was the first version to include support for the array API standard, via a separate `numpy.array_api` submodule. This module was marked as experimental (it emitted a warning on import) and removed in NumPy 2.0 because full support was included in the main namespace. NEP 47 and NEP 56 describe the motivation and scope for implementing the array API standard in NumPy.
## Entry point
NumPy installs an entry point that can be used for discovery purposes:
    
    >>> from importlib.metadata import entry_points
    >>> entry_points(group='array_api', name='numpy')
    [EntryPoint(name='numpy', value='numpy', group='array_api')]
    
Note that leaving out `name='numpy'` will cause a list of entry points to be returned for all array API standard compatible implementations that installed an entry point.
#### Footnotes
[1]
With a few very minor exceptions, as documented in NEP 56. The `sum`, `prod` and `trace` behavior adheres to the 2023.12 version instead, as do function signatures; the only known incompatibility that may remain is that the standard forbids unsafe casts for in-place operators while NumPy supports those.
## Inspection
NumPy implements the array API inspection utilities. These functions can be accessed via the `__array_namespace_info__()` function, which returns a namespace containing the inspection utilities.
`__array_namespace_info__`()
Get the array API inspection namespace for NumPy.  
# Standard array subclasses
Note
Subclassing a `numpy.ndarray` is possible but if your goal is to create an array with modified behavior, as do dask arrays for distributed computation and cupy arrays for GPU-based computation, subclassing is discouraged. Instead, using numpy’s dispatch mechanism is recommended.
The `ndarray` can be inherited from (in Python or in C) if desired. Therefore, it can form a foundation for many useful classes. Often whether to sub-class the array object or to simply use the core array component as an internal part of a new class is a difficult decision, and can be simply a matter of choice. NumPy has several tools for simplifying how your new object interacts with other array objects, and so the choice may not be significant in the end. One way to simplify the question is by asking yourself if the object you are interested in can be replaced as a single array or does it really require two or more arrays at its core.
Note that `asarray` always returns the base-class ndarray. If you are confident that your use of the array object can handle any subclass of an ndarray, then `asanyarray` can be used to allow subclasses to propagate more cleanly through your subroutine. In principal a subclass could redefine any aspect of the array and therefore, under strict guidelines, `asanyarray` would rarely be useful. However, most subclasses of the array object will not redefine certain aspects of the array object such as the buffer interface, or the attributes of the array. One important example, however, of why your subroutine may not be able to handle an arbitrary subclass of an array is that matrices redefine the “*” operator to be matrix-multiplication, rather than element-by-element multiplication.
## Special attributes and methods
See also
Subclassing ndarray
NumPy provides several hooks that classes can customize:
class.__array_ufunc__(ufunc, method, *inputs, **kwargs)
    
Any class, ndarray subclass or not, can define this method or set it to None in order to override the behavior of NumPy’s ufuncs. This works quite similarly to Python’s `__mul__` and other binary operation routines.
  * ufunc is the ufunc object that was called.
  * method is a string indicating which Ufunc method was called (one of `"__call__"`, `"reduce"`, `"reduceat"`, `"accumulate"`, `"outer"`, `"inner"`).
  * inputs is a tuple of the input arguments to the `ufunc`.
  * kwargs is a dictionary containing the optional input arguments of the ufunc. If given, any `out` arguments, both positional and keyword, are passed as a `tuple` in kwargs. See the discussion in Universal functions (ufunc) for details.


The method should return either the result of the operation, or `NotImplemented` if the operation requested is not implemented.
If one of the input, output, or `where` arguments has a `__array_ufunc__` method, it is executed instead of the ufunc. If more than one of the arguments implements `__array_ufunc__`, they are tried in the order: subclasses before superclasses, inputs before outputs, outputs before `where`, otherwise left to right. The first routine returning something other than `NotImplemented` determines the result. If all of the `__array_ufunc__` operations return `NotImplemented`, a `TypeError` is raised.
Note
We intend to re-implement numpy functions as (generalized) Ufunc, in which case it will become possible for them to be overridden by the `__array_ufunc__` method. A prime candidate is `matmul`, which currently is not a Ufunc, but could be relatively easily be rewritten as a (set of) generalized Ufuncs. The same may happen with functions such as `median`, `amin`, and `argsort`.
Like with some other special methods in python, such as `__hash__` and `__iter__`, it is possible to indicate that your class does not support ufuncs by setting `__array_ufunc__ = None`. Ufuncs always raise `TypeError` when called on an object that sets `__array_ufunc__ = None`.
The presence of `__array_ufunc__` also influences how `ndarray` handles binary operations like `arr + obj` and `arr < obj` when `arr` is an `ndarray` and `obj` is an instance of a custom class. There are two possibilities. If `obj.__array_ufunc__` is present and not None, then `ndarray.__add__` and friends will delegate to the ufunc machinery, meaning that `arr + obj` becomes `np.add(arr, obj)`, and then `add` invokes `obj.__array_ufunc__`. This is useful if you want to define an object that acts like an array.
Alternatively, if `obj.__array_ufunc__` is set to None, then as a special case, special methods like `ndarray.__add__` will notice this and unconditionally raise `TypeError`. This is useful if you want to create objects that interact with arrays via binary operations, but are not themselves arrays. For example, a units handling system might have an object `m` representing the “meters” unit, and want to support the syntax `arr * m` to represent that the array has units of “meters”, but not want to otherwise interact with arrays via ufuncs or otherwise. This can be done by setting `__array_ufunc__ = None` and defining `__mul__` and `__rmul__` methods. (Note that this means that writing an `__array_ufunc__` that always returns `NotImplemented` is not quite the same as setting `__array_ufunc__ = None`: in the former case, `arr + obj` will raise `TypeError`, while in the latter case it is possible to define a `__radd__` method to prevent this.)
The above does not hold for in-place operators, for which `ndarray` never returns `NotImplemented`. Hence, `arr += obj` would always lead to a `TypeError`. This is because for arrays in-place operations cannot generically be replaced by a simple reverse operation. (For instance, by default, `arr += obj` would be translated to `arr = arr + obj`, i.e., `arr` would be replaced, contrary to what is expected for in-place array operations.)
Note
If you define `__array_ufunc__`:
  * If you are not a subclass of `ndarray`, we recommend your class define special methods like `__add__` and `__lt__` that delegate to ufuncs just like ndarray does. An easy way to do this is to subclass from `NDArrayOperatorsMixin`.
  * If you subclass `ndarray`, we recommend that you put all your override logic in `__array_ufunc__` and not also override special methods. This ensures the class hierarchy is determined in only one place rather than separately by the ufunc machinery and by the binary operation rules (which gives preference to special methods of subclasses; the alternative way to enforce a one-place only hierarchy, of setting `__array_ufunc__` to None, would seem very unexpected and thus confusing, as then the subclass would not work at all with ufuncs).
  * `ndarray` defines its own `__array_ufunc__`, which, evaluates the ufunc if no arguments have overrides, and returns `NotImplemented` otherwise. This may be useful for subclasses for which `__array_ufunc__` converts any instances of its own class to `ndarray`: it can then pass these on to its superclass using `super().__array_ufunc__(*inputs, **kwargs)`, and finally return the results after possible back-conversion. The advantage of this practice is that it ensures that it is possible to have a hierarchy of subclasses that extend the behaviour. See Subclassing ndarray for details.


class.__array_function__(func, types, args, kwargs)
    
  * `func` is an arbitrary callable exposed by NumPy’s public API, which was called in the form `func(*args, **kwargs)`.
  * `types` is a collection `collections.abc.Collection` of unique argument types from the original NumPy function call that implement `__array_function__`.
  * The tuple `args` and dict `kwargs` are directly passed on from the original call.


As a convenience for `__array_function__` implementers, `types` provides all argument types with an `'__array_function__'` attribute. This allows implementers to quickly identify cases where they should defer to `__array_function__` implementations on other arguments. Implementations should not rely on the iteration order of `types`.
Most implementations of `__array_function__` will start with two checks:
  1. Is the given function something that we know how to overload?
  2. Are all arguments of a type that we know how to handle?


If these conditions hold, `__array_function__` should return the result from calling its implementation for `func(*args, **kwargs)`. Otherwise, it should return the sentinel value `NotImplemented`, indicating that the function is not implemented by these types.
There are no general requirements on the return value from `__array_function__`, although most sensible implementations should probably return array(s) with the same type as one of the function’s arguments.
It may also be convenient to define a custom decorators (`implements` below) for registering `__array_function__` implementations.
    
    HANDLED_FUNCTIONS = {}
    
    class MyArray:
        def __array_function__(self, func, types, args, kwargs):
            if func not in HANDLED_FUNCTIONS:
                return NotImplemented
            # Note: this allows subclasses that don't override
            # __array_function__ to handle MyArray objects
            if not all(issubclass(t, MyArray) for t in types):
                return NotImplemented
            return HANDLED_FUNCTIONS[func](*args, **kwargs)
    
    def implements(numpy_function):
        """Register an __array_function__ implementation for MyArray objects."""
        def decorator(func):
            HANDLED_FUNCTIONS[numpy_function] = func
            return func
        return decorator
    
    @implements(np.concatenate)
    def concatenate(arrays, axis=0, out=None):
        ...  # implementation of concatenate for MyArray objects
    
    @implements(np.broadcast_to)
    def broadcast_to(array, shape):
        ...  # implementation of broadcast_to for MyArray objects
    
Note that it is not required for `__array_function__` implementations to include all of the corresponding NumPy function’s optional arguments (e.g., `broadcast_to` above omits the irrelevant `subok` argument). Optional arguments are only passed in to `__array_function__` if they were explicitly used in the NumPy function call.
Just like the case for builtin special methods like `__add__`, properly written `__array_function__` methods should always return `NotImplemented` when an unknown type is encountered. Otherwise, it will be impossible to correctly override NumPy functions from another object if the operation also includes one of your objects.
For the most part, the rules for dispatch with `__array_function__` match those for `__array_ufunc__`. In particular:
  * NumPy will gather implementations of `__array_function__` from all specified inputs and call them in order: subclasses before superclasses, and otherwise left to right. Note that in some edge cases involving subclasses, this differs slightly from the current behavior of Python.
  * Implementations of `__array_function__` indicate that they can handle the operation by returning any value other than `NotImplemented`.
  * If all `__array_function__` methods return `NotImplemented`, NumPy will raise `TypeError`.


If no `__array_function__` methods exists, NumPy will default to calling its own implementation, intended for use on NumPy arrays. This case arises, for example, when all array-like arguments are Python numbers or lists. (NumPy arrays do have a `__array_function__` method, given below, but it always returns `NotImplemented` if any argument other than a NumPy array subclass implements `__array_function__`.)
One deviation from the current behavior of `__array_ufunc__` is that NumPy will only call `__array_function__` on the first argument of each unique type. This matches Python’s rule for calling reflected methods, and this ensures that checking overloads has acceptable performance even when there are a large number of overloaded arguments.
class.__array_finalize__(obj)
    
This method is called whenever the system internally allocates a new array from obj, where obj is a subclass (subtype) of the `ndarray`. It can be used to change attributes of self after construction (so as to ensure a 2-d matrix for example), or to update meta-information from the “parent.” Subclasses inherit a default implementation of this method that does nothing.
class.__array_wrap__(array, context=None, return_scalar=False)
    
At the end of every ufunc, this method is called on the input object with the highest array priority, or the output object if one was specified. The ufunc-computed array is passed in and whatever is returned is passed to the user. Subclasses inherit a default implementation of this method, which transforms the array into a new instance of the object’s class. Subclasses may opt to use this method to transform the output array into an instance of the subclass and update metadata before returning the array to the user.
NumPy may also call this function without a context from non-ufuncs to allow preserving subclass information.
Changed in version 2.0: `return_scalar` is now passed as either `False` (usually) or `True` indicating that NumPy would return a scalar. Subclasses may ignore the value, or return `array[()]` to behave more like NumPy.
Note
It is hoped to eventually deprecate this method in favour of `__array_ufunc__` for ufuncs (and `__array_function__` for a few other functions like `numpy.squeeze`).
class.__array_priority__
    
The value of this attribute is used to determine what type of object to return in situations where there is more than one possibility for the Python type of the returned object. Subclasses inherit a default value of 0.0 for this attribute.
Note
For ufuncs, it is hoped to eventually deprecate this method in favour of `__array_ufunc__`.
class.__array__(dtype=None, copy=None)
    
If defined on an object, should return an `ndarray`. This method is called by array-coercion functions like np.array() if an object implementing this interface is passed to those functions. The third-party implementations of `__array__` must take `dtype` and `copy` keyword arguments, as ignoring them might break third-party code or NumPy itself.
  * `dtype` is a data type of the returned array.
  * `copy` is an optional boolean that indicates whether a copy should be returned. For `True` a copy should always be made, for `None` only if required (e.g. due to passed `dtype` value), and for `False` a copy should never be made (if a copy is still required, an appropriate exception should be raised).


Please refer to Interoperability with NumPy for the protocol hierarchy, of which `__array__` is the oldest and least desirable.
Note
If a class (ndarray subclass or not) having the `__array__` method is used as the output object of an ufunc, results will not be written to the object returned by `__array__`. This practice will return `TypeError`.
## Matrix objects
Note
It is strongly advised not to use the matrix subclass. As described below, it makes writing functions that deal consistently with matrices and regular arrays very difficult. Currently, they are mainly used for interacting with `scipy.sparse`. We hope to provide an alternative for this use, however, and eventually remove the `matrix` subclass.
`matrix` objects inherit from the ndarray and therefore, they have the same attributes and methods of ndarrays. There are six important differences of matrix objects, however, that may lead to unexpected results when you use matrices but expect them to act like arrays:
  1. Matrix objects can be created using a string notation to allow Matlab-style syntax where spaces separate columns and semicolons (‘;’) separate rows.
  2. Matrix objects are always two-dimensional. This has far-reaching implications, in that m.ravel() is still two-dimensional (with a 1 in the first dimension) and item selection returns two-dimensional objects so that sequence behavior is fundamentally different than arrays.
  3. Matrix objects over-ride multiplication to be matrix-multiplication. Make sure you understand this for functions that you may want to receive matrices. Especially in light of the fact that asanyarray(m) returns a matrix when m is a matrix. 
  4. Matrix objects over-ride power to be matrix raised to a power. The same warning about using power inside a function that uses asanyarray(…) to get an array object holds for this fact.
  5. The default __array_priority__ of matrix objects is 10.0, and therefore mixed operations with ndarrays always produce matrices.
  6. Matrices have special attributes which make calculations easier. These are
`matrix.T`
Returns the transpose of the matrix.  
`matrix.H`
Returns the (complex) conjugate transpose of `self`.  
`matrix.I`
Returns the (multiplicative) inverse of invertible `self`.  
`matrix.A`
Return `self` as an `ndarray` object.  


Warning
Matrix objects over-ride multiplication, ‘*’, and power, ‘**’, to be matrix-multiplication and matrix power, respectively. If your subroutine can accept sub-classes and you do not convert to base- class arrays, then you must use the ufuncs multiply and power to be sure that you are performing the correct operation for all inputs.
The matrix class is a Python subclass of the ndarray and can be used as a reference for how to construct your own subclass of the ndarray. Matrices can be created from other matrices, strings, and anything else that can be converted to an `ndarray` . The name “mat “is an alias for “matrix “in NumPy.
`matrix`(data[, dtype, copy])
Returns a matrix from an array-like object, or from a string of data.  
`asmatrix`(data[, dtype])
Interpret the input as a matrix.  
`bmat`(obj[, ldict, gdict])
Build a matrix object from a string, nested sequence, or array.  
Example 1: Matrix creation from a string
    
    >>> import numpy as np
    >>> a = np.asmatrix('1 2 3; 4 5 3')
    >>> print((a*a.T).I)
      [[ 0.29239766 -0.13450292]
       [-0.13450292  0.08187135]]
    
Example 2: Matrix creation from a nested sequence
    
    >>> import numpy as np
    >>> np.asmatrix([[1,5,10],[1.0,3,4j]])
    matrix([[  1.+0.j,   5.+0.j,  10.+0.j],
            [  1.+0.j,   3.+0.j,   0.+4.j]])
    
Example 3: Matrix creation from an array
    
    >>> import numpy as np
    >>> np.asmatrix(np.random.rand(3,3)).T
    matrix([[4.17022005e-01, 3.02332573e-01, 1.86260211e-01],
            [7.20324493e-01, 1.46755891e-01, 3.45560727e-01],
            [1.14374817e-04, 9.23385948e-02, 3.96767474e-01]])
    
## Memory-mapped file arrays
Memory-mapped files are useful for reading and/or modifying small segments of a large file with regular layout, without reading the entire file into memory. A simple subclass of the ndarray uses a memory-mapped file for the data buffer of the array. For small files, the over-head of reading the entire file into memory is typically not significant, however for large files using memory mapping can save considerable resources.
Memory-mapped-file arrays have one additional method (besides those they inherit from the ndarray): `.flush()` which must be called manually by the user to ensure that any changes to the array actually get written to disk.
`memmap`(filename[, dtype, mode, offset, ...])
Create a memory-map to an array stored in a binary file on disk.  
`memmap.flush`()
Write any changes in the array to the file on disk.  
Example:
    
    >>> import numpy as np
    
    
    >>> a = np.memmap('newfile.dat', dtype=float, mode='w+', shape=1000)
    >>> a[10] = 10.0
    >>> a[30] = 30.0
    >>> del a
    
    
    >>> b = np.fromfile('newfile.dat', dtype=float)
    >>> print(b[10], b[30])
    10.0 30.0
    
    
    >>> a = np.memmap('newfile.dat', dtype=float)
    >>> print(a[10], a[30])
    10.0 30.0
    
## Character arrays (numpy.char)
See also
Creating character arrays (numpy.char)
Note
The `chararray` class exists for backwards compatibility with Numarray, it is not recommended for new development. Starting from numpy 1.4, if one needs arrays of strings, it is recommended to use arrays of `dtype` `object_`, `bytes_` or `str_`, and use the free functions in the `numpy.char` module for fast vectorized string operations.
These are enhanced arrays of either `str_` type or `bytes_` type. These arrays inherit from the `ndarray`, but specially-define the operations `+`, `*`, and `%` on a (broadcasting) element-by-element basis. These operations are not available on the standard `ndarray` of character type. In addition, the `chararray` has all of the standard `str` (and `bytes`) methods, executing them on an element-by-element basis. Perhaps the easiest way to create a chararray is to use `self.view(chararray)` where self is an ndarray of str or unicode data-type. However, a chararray can also be created using the `chararray` constructor, or via the `numpy.char.array` function:
`char.chararray`(shape[, itemsize, unicode, ...])
Provides a convenient view on arrays of string and unicode values.  
`char.array`(obj[, itemsize, copy, unicode, order])
Create a `chararray`.  
Another difference with the standard ndarray of str data-type is that the chararray inherits the feature introduced by Numarray that white-space at the end of any element in the array will be ignored on item retrieval and comparison operations.
## Record arrays
See also
Creating record arrays, Data type routines, Data type objects (dtype).
NumPy provides the `recarray` class which allows accessing the fields of a structured array as attributes, and a corresponding scalar data type object `record`.
`recarray`(shape[, dtype, buf, offset, ...])
Construct an ndarray that allows field access using attributes.  
`record`
A data-type scalar that allows field access as attribute lookup.  
Note
The pandas DataFrame is more powerful than record array. If possible, please use pandas DataFrame instead.
## Masked arrays (numpy.ma)
See also
Masked arrays
## Standard container class
For backward compatibility and as a standard “container “class, the UserArray from Numeric has been brought over to NumPy and named `numpy.lib.user_array.container` The container class is a Python class whose self.array attribute is an ndarray. Multiple inheritance is probably easier with numpy.lib.user_array.container than with the ndarray itself and so it is included by default. It is not documented here beyond mentioning its existence because you are encouraged to use the ndarray class directly if you can.
`numpy.lib.user_array.container`(data[, ...])
Standard container-class for easy multiple-inheritance.  
## Array iterators
Iterators are a powerful concept for array processing. Essentially, iterators implement a generalized for-loop. If myiter is an iterator object, then the Python code:
    
    for val in myiter:
        ...
        some code involving val
        ...
    
calls `val = next(myiter)` repeatedly until `StopIteration` is raised by the iterator. There are several ways to iterate over an array that may be useful: default iteration, flat iteration, and \\(N\\)-dimensional enumeration.
### Default iteration
The default iterator of an ndarray object is the default Python iterator of a sequence type. Thus, when the array object itself is used as an iterator. The default behavior is equivalent to:
    
    for i in range(arr.shape[0]):
        val = arr[i]
    
This default iterator selects a sub-array of dimension \\(N-1\\) from the array. This can be a useful construct for defining recursive algorithms. To loop over the entire array requires \\(N\\) for-loops.
    
    >>> import numpy as np
    >>> a = np.arange(24).reshape(3,2,4) + 10
    >>> for val in a:
    ...     print('item:', val)
    item: [[10 11 12 13]
    [14 15 16 17]]
    item: [[18 19 20 21]
    [22 23 24 25]]
    item: [[26 27 28 29]
    [30 31 32 33]]
    
### Flat iteration
`ndarray.flat`
A 1-D iterator over the array.  
As mentioned previously, the flat attribute of ndarray objects returns an iterator that will cycle over the entire array in C-style contiguous order.
    
    >>> import numpy as np
    >>> a = np.arange(24).reshape(3,2,4) + 10
    >>> for i, val in enumerate(a.flat):
    ...     if i%5 == 0: print(i, val)
    0 10
    5 15
    10 20
    15 25
    20 30
    
Here, I’ve used the built-in enumerate iterator to return the iterator index as well as the value.
### N-dimensional enumeration
`ndenumerate`(arr)
Multidimensional index iterator.  
Sometimes it may be useful to get the N-dimensional index while iterating. The ndenumerate iterator can achieve this.
    
    >>> import numpy as np
    >>> for i, val in np.ndenumerate(a):
    ...     if sum(i)%5 == 0: print(i, val)
    (0, 0, 0) 10
    (1, 1, 3) 25
    (2, 0, 3) 29
    (2, 1, 2) 32
    
### Iterator for broadcasting
`broadcast`
Produce an object that mimics broadcasting.  
The general concept of broadcasting is also available from Python using the `broadcast` iterator. This object takes \\(N\\) objects as inputs and returns an iterator that returns tuples providing each of the input sequence elements in the broadcasted result.
    
    >>> import numpy as np
    >>> for val in np.broadcast([[1, 0], [2, 3]], [0, 1]):
    ...     print(val)
    (np.int64(1), np.int64(0))
    (np.int64(0), np.int64(1))
    (np.int64(2), np.int64(0))
    (np.int64(3), np.int64(1))
    
# Datetimes and timedeltas
Starting in NumPy 1.7, there are core array data types which natively support datetime functionality. The data type is called `datetime64`, so named because `datetime` is already taken by the Python standard library.
## Datetime64 conventions and assumptions
Similar to the Python `date` class, dates are expressed in the current Gregorian Calendar, indefinitely extended both in the future and in the past. [1] Contrary to Python `date`, which supports only years in the 1 AD — 9999 AD range, `datetime64` allows also for dates BC; years BC follow the Astronomical year numbering convention, i.e. year 2 BC is numbered −1, year 1 BC is numbered 0, year 1 AD is numbered 1.
Time instants, say 16:23:32.234, are represented counting hours, minutes, seconds and fractions from midnight: i.e. 00:00:00.000 is midnight, 12:00:00.000 is noon, etc. Each calendar day has exactly 86400 seconds. This is a “naive” time, with no explicit notion of timezones or specific time scales (UT1, UTC, TAI, etc.). [2]
[1]
The calendar obtained by extending the Gregorian calendar before its official adoption on Oct. 15, 1582 is called Proleptic Gregorian Calendar
[2]
The assumption of 86400 seconds per calendar day is not valid for UTC, the present day civil time scale. In fact due to the presence of leap seconds on rare occasions a day may be 86401 or 86399 seconds long. On the contrary the 86400s day assumption holds for the TAI timescale. An explicit support for TAI and TAI to UTC conversion, accounting for leap seconds, is proposed but not yet implemented. See also the shortcomings section below.
## Basic datetimes
The most basic way to create datetimes is from strings in ISO 8601 date or datetime format. It is also possible to create datetimes from an integer by offset relative to the Unix epoch (00:00:00 UTC on 1 January 1970). The unit for internal storage is automatically selected from the form of the string, and can be either a date unit or a time unit. The date units are years (‘Y’), months (‘M’), weeks (‘W’), and days (‘D’), while the time units are hours (‘h’), minutes (‘m’), seconds (‘s’), milliseconds (‘ms’), and some additional SI-prefix seconds-based units. The `datetime64` data type also accepts the string “NAT”, in any combination of lowercase/uppercase letters, for a “Not A Time” value.
#### Example
A simple ISO date:
    
    >>> import numpy as np
    
    
    >>> np.datetime64('2005-02-25')
    np.datetime64('2005-02-25')
    
From an integer and a date unit, 1 year since the UNIX epoch:
    
    >>> np.datetime64(1, 'Y')
    np.datetime64('1971')
    
Using months for the unit:
    
    >>> np.datetime64('2005-02')
    np.datetime64('2005-02')
    
Specifying just the month, but forcing a ‘days’ unit:
    
    >>> np.datetime64('2005-02', 'D')
    np.datetime64('2005-02-01')
    
From a date and time:
    
    >>> np.datetime64('2005-02-25T03:30')
    np.datetime64('2005-02-25T03:30')
    
NAT (not a time):
    
    >>> np.datetime64('nat')
    np.datetime64('NaT')
    
When creating an array of datetimes from a string, it is still possible to automatically select the unit from the inputs, by using the datetime type with generic units.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64')
    array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64[D]')
    
    
    >>> np.array(['2001-01-01T12:00', '2002-02-03T13:56:03.172'], dtype='datetime64')
    array(['2001-01-01T12:00:00.000', '2002-02-03T13:56:03.172'],
          dtype='datetime64[ms]')
    
An array of datetimes can be constructed from integers representing POSIX timestamps with the given unit.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.array([0, 1577836800], dtype='datetime64[s]')
    array(['1970-01-01T00:00:00', '2020-01-01T00:00:00'],
          dtype='datetime64[s]')
    
    
    >>> np.array([0, 1577836800000]).astype('datetime64[ms]')
    array(['1970-01-01T00:00:00.000', '2020-01-01T00:00:00.000'],
          dtype='datetime64[ms]')
    
The datetime type works with many common NumPy functions, for example `arange` can be used to generate ranges of dates.
#### Example
All the dates for one month:
    
    >>> import numpy as np
    
    
    >>> np.arange('2005-02', '2005-03', dtype='datetime64[D]')
    array(['2005-02-01', '2005-02-02', '2005-02-03', '2005-02-04',
           '2005-02-05', '2005-02-06', '2005-02-07', '2005-02-08',
           '2005-02-09', '2005-02-10', '2005-02-11', '2005-02-12',
           '2005-02-13', '2005-02-14', '2005-02-15', '2005-02-16',
           '2005-02-17', '2005-02-18', '2005-02-19', '2005-02-20',
           '2005-02-21', '2005-02-22', '2005-02-23', '2005-02-24',
           '2005-02-25', '2005-02-26', '2005-02-27', '2005-02-28'],
          dtype='datetime64[D]')
    
The datetime object represents a single moment in time. If two datetimes have different units, they may still be representing the same moment of time, and converting from a bigger unit like months to a smaller unit like days is considered a ‘safe’ cast because the moment of time is still being represented exactly.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.datetime64('2005') == np.datetime64('2005-01-01')
    True
    
    
    >>> np.datetime64('2010-03-14T15') == np.datetime64('2010-03-14T15:00:00.00')
    True
    
Deprecated since version 1.11.0: NumPy does not store timezone information. For backwards compatibility, datetime64 still parses timezone offsets, which it handles by converting to UTC±00:00 (Zulu time). This behaviour is deprecated and will raise an error in the future.
## Datetime and timedelta arithmetic
NumPy allows the subtraction of two datetime values, an operation which produces a number with a time unit. Because NumPy doesn’t have a physical quantities system in its core, the `timedelta64` data type was created to complement `datetime64`. The arguments for `timedelta64` are a number, to represent the number of units, and a date/time unit, such as (D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes, or (s)econds. The `timedelta64` data type also accepts the string “NAT” in place of the number for a “Not A Time” value.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.timedelta64(1, 'D')
    np.timedelta64(1,'D')
    
    
    >>> np.timedelta64(4, 'h')
    np.timedelta64(4,'h')
    
    
    >>> np.timedelta64('nAt')
    np.timedelta64('NaT')
    
Datetimes and Timedeltas work together to provide ways for simple datetime calculations.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.datetime64('2009-01-01') - np.datetime64('2008-01-01')
    np.timedelta64(366,'D')
    
    
    >>> np.datetime64('2009') + np.timedelta64(20, 'D')
    np.datetime64('2009-01-21')
    
    
    >>> np.datetime64('2011-06-15T00:00') + np.timedelta64(12, 'h')
    np.datetime64('2011-06-15T12:00')
    
    
    >>> np.timedelta64(1,'W') / np.timedelta64(1,'D')
    7.0
    
    
    >>> np.timedelta64(1,'W') % np.timedelta64(10,'D')
    np.timedelta64(7,'D')
    
    
    >>> np.datetime64('nat') - np.datetime64('2009-01-01')
    np.timedelta64('NaT','D')
    
    
    >>> np.datetime64('2009-01-01') + np.timedelta64('nat')
    np.datetime64('NaT')
    
There are two Timedelta units (‘Y’, years and ‘M’, months) which are treated specially, because how much time they represent changes depending on when they are used. While a timedelta day unit is equivalent to 24 hours, month and year units cannot be converted directly into days without using ‘unsafe’ casting.
The `numpy.ndarray.astype` method can be used for unsafe conversion of months/years to days. The conversion follows calculating the averaged values from the 400 year leap-year cycle.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.timedelta64(1, 'Y')
    
    
    >>> np.timedelta64(a, 'M')
    numpy.timedelta64(12,'M')
    
    
    >>> np.timedelta64(a, 'D')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'
    
## Datetime units
The Datetime and Timedelta data types support a large number of time units, as well as generic units which can be coerced into any of the other units based on input data.
Datetimes are always stored with an epoch of 1970-01-01T00:00. This means the supported dates are always a symmetric interval around the epoch, called “time span” in the table below.
The length of the span is the range of a 64-bit integer times the length of the date or unit. For example, the time span for ‘W’ (week) is exactly 7 times longer than the time span for ‘D’ (day), and the time span for ‘D’ (day) is exactly 24 times longer than the time span for ‘h’ (hour).
Here are the date units:
Code
Meaning
Time span (relative)
Time span (absolute)  
Y
year
+/- 9.2e18 years
[9.2e18 BC, 9.2e18 AD]  
M
month
+/- 7.6e17 years
[7.6e17 BC, 7.6e17 AD]  
W
week
+/- 1.7e17 years
[1.7e17 BC, 1.7e17 AD]  
D
day
+/- 2.5e16 years
[2.5e16 BC, 2.5e16 AD]  
And here are the time units:
Code
Meaning
Time span (relative)
Time span (absolute)  
h
hour
+/- 1.0e15 years
[1.0e15 BC, 1.0e15 AD]  
m
minute
+/- 1.7e13 years
[1.7e13 BC, 1.7e13 AD]  
s
second
+/- 2.9e11 years
[2.9e11 BC, 2.9e11 AD]  
ms
millisecond
+/- 2.9e8 years
[ 2.9e8 BC, 2.9e8 AD]  
us / μs
microsecond
+/- 2.9e5 years
[290301 BC, 294241 AD]  
ns
nanosecond
+/- 292 years
[ 1678 AD, 2262 AD]  
ps
picosecond
+/- 106 days
[ 1969 AD, 1970 AD]  
fs
femtosecond
+/- 2.6 hours
[ 1969 AD, 1970 AD]  
as
attosecond
+/- 9.2 seconds
[ 1969 AD, 1970 AD]  
## Business day functionality
To allow the datetime to be used in contexts where only certain days of the week are valid, NumPy includes a set of “busday” (business day) functions.
The default for busday functions is that the only valid days are Monday through Friday (the usual business days). The implementation is based on a “weekmask” containing 7 Boolean flags to indicate valid days; custom weekmasks are possible that specify other sets of valid days.
The “busday” functions can additionally check a list of “holiday” dates, specific dates that are not valid days.
The function `busday_offset` allows you to apply offsets specified in business days to datetimes with a unit of ‘D’ (day).
#### Example
    
    >>> import numpy as np
    
    
    >>> np.busday_offset('2011-06-23', 1)
    np.datetime64('2011-06-24')
    
    
    >>> np.busday_offset('2011-06-23', 2)
    np.datetime64('2011-06-27')
    
When an input date falls on the weekend or a holiday, `busday_offset` first applies a rule to roll the date to a valid business day, then applies the offset. The default rule is ‘raise’, which simply raises an exception. The rules most typically used are ‘forward’ and ‘backward’.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.busday_offset('2011-06-25', 2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: Non-business day date in busday_offset
    
    
    >>> np.busday_offset('2011-06-25', 0, roll='forward')
    np.datetime64('2011-06-27')
    
    
    >>> np.busday_offset('2011-06-25', 2, roll='forward')
    np.datetime64('2011-06-29')
    
    
    >>> np.busday_offset('2011-06-25', 0, roll='backward')
    np.datetime64('2011-06-24')
    
    
    >>> np.busday_offset('2011-06-25', 2, roll='backward')
    np.datetime64('2011-06-28')
    
In some cases, an appropriate use of the roll and the offset is necessary to get a desired answer.
#### Example
The first business day on or after a date:
    
    >>> import numpy as np
    
    
    >>> np.busday_offset('2011-03-20', 0, roll='forward')
    np.datetime64('2011-03-21')
    >>> np.busday_offset('2011-03-22', 0, roll='forward')
    np.datetime64('2011-03-22')
    
The first business day strictly after a date:
    
    >>> np.busday_offset('2011-03-20', 1, roll='backward')
    np.datetime64('2011-03-21')
    >>> np.busday_offset('2011-03-22', 1, roll='backward')
    np.datetime64('2011-03-23')
    
The function is also useful for computing some kinds of days like holidays. In Canada and the U.S., Mother’s day is on the second Sunday in May, which can be computed with a custom weekmask.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.busday_offset('2012-05', 1, roll='forward', weekmask='Sun')
    np.datetime64('2012-05-13')
    
When performance is important for manipulating many business dates with one particular choice of weekmask and holidays, there is an object `busdaycalendar` which stores the data necessary in an optimized form.
### np.is_busday():
To test a `datetime64` value to see if it is a valid day, use `is_busday`.
#### Example
    
    >>> import numpy as np
    
    
    >>> np.is_busday(np.datetime64('2011-07-15'))  # a Friday
    True
    >>> np.is_busday(np.datetime64('2011-07-16')) # a Saturday
    False
    >>> np.is_busday(np.datetime64('2011-07-16'), weekmask="Sat Sun")
    True
    >>> a = np.arange(np.datetime64('2011-07-11'), np.datetime64('2011-07-18'))
    >>> np.is_busday(a)
    array([ True,  True,  True,  True,  True, False, False])
    
### np.busday_count():
To find how many valid days there are in a specified range of datetime64 dates, use `busday_count`:
#### Example
    
    >>> import numpy as np
    
    
    >>> np.busday_count(np.datetime64('2011-07-11'), np.datetime64('2011-07-18'))
    5
    >>> np.busday_count(np.datetime64('2011-07-18'), np.datetime64('2011-07-11'))
    -5
    
If you have an array of datetime64 day values, and you want a count of how many of them are valid dates, you can do this:
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(np.datetime64('2011-07-11'), np.datetime64('2011-07-18'))
    >>> np.count_nonzero(np.is_busday(a))
    5
    
### Custom weekmasks
Here are several examples of custom weekmask values. These examples specify the “busday” default of Monday through Friday being valid days.
Some examples:
    
    # Positional sequences; positions are Monday through Sunday.
    # Length of the sequence must be exactly 7.
    weekmask = [1, 1, 1, 1, 1, 0, 0]
    # list or other sequence; 0 == invalid day, 1 == valid day
    weekmask = "1111100"
    # string '0' == invalid day, '1' == valid day
    
    # string abbreviations from this list: Mon Tue Wed Thu Fri Sat Sun
    weekmask = "Mon Tue Wed Thu Fri"
    # any amount of whitespace is allowed; abbreviations are case-sensitive.
    weekmask = "MonTue Wed  Thu\tFri"
    
## Datetime64 shortcomings
The assumption that all days are exactly 86400 seconds long makes `datetime64` largely compatible with Python `datetime` and “POSIX time” semantics; therefore they all share the same well known shortcomings with respect to the UTC timescale and historical time determination. A brief non exhaustive summary is given below.
  * It is impossible to parse valid UTC timestamps occurring during a positive leap second.
#### Example
“2016-12-31 23:59:60 UTC” was a leap second, therefore “2016-12-31 23:59:60.450 UTC” is a valid timestamp which is not parseable by `datetime64`:
        >>> import numpy as np
        
        >>> np.datetime64("2016-12-31 23:59:60.450")
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        ValueError: Seconds out of range in datetime string "2016-12-31 23:59:60.450"
        
  * Timedelta64 computations between two UTC dates can be wrong by an integer number of SI seconds.
#### Example
Compute the number of SI seconds between “2021-01-01 12:56:23.423 UTC” and “2001-01-01 00:00:00.000 UTC”:
        >>> import numpy as np
        
        >>> (
        ...   np.datetime64("2021-01-01 12:56:23.423")
        ...   - np.datetime64("2001-01-01")
        ... ) / np.timedelta64(1, "s")
        631198583.423
        
However, the correct answer is `631198588.423` SI seconds, because there were 5 leap seconds between 2001 and 2021.
  * Timedelta64 computations for dates in the past do not return SI seconds, as one would expect.
#### Example
Compute the number of seconds between “000-01-01 UT” and “1600-01-01 UT”, where UT is universal time:
        >>> import numpy as np
        
        >>> a = np.datetime64("0000-01-01", "us")
        >>> b = np.datetime64("1600-01-01", "us")
        >>> b - a
        numpy.timedelta64(50491123200000000,'us')
        
The computed results, `50491123200` seconds, are obtained as the elapsed number of days (`584388`) times `86400` seconds; this is the number of seconds of a clock in sync with the Earth’s rotation. The exact value in SI seconds can only be estimated, e.g., using data published in Measurement of the Earth’s rotation: 720 BC to AD 2015, 2016, Royal Society’s Proceedings A 472, by Stephenson et.al.. A sensible estimate is `50491112870 ± 90` seconds, with a difference of 10330 seconds.


# Data type objects (dtype)
A data type object (an instance of `numpy.dtype` class) describes how the bytes in the fixed-size block of memory corresponding to an array item should be interpreted. It describes the following aspects of the data:
  1. Type of the data (integer, float, Python object, etc.)
  2. Size of the data (how many bytes is in e.g. the integer)
  3. Byte order of the data (little-endian or big-endian)
  4. If the data type is structured data type, an aggregate of other data types, (e.g., describing an array item consisting of an integer and a float),
     1. what are the names of the “fields” of the structure, by which they can be accessed,
     2. what is the data-type of each field, and
     3. which part of the memory block each field takes.
  5. If the data type is a sub-array, what is its shape and data type.


To describe the type of scalar data, there are several built-in scalar types in NumPy for various precision of integers, floating-point numbers, etc. An item extracted from an array, e.g., by indexing, will be a Python object whose type is the scalar type associated with the data type of the array.
Note that the scalar types are not `dtype` objects, even though they can be used in place of one whenever a data type specification is needed in NumPy.
Structured data types are formed by creating a data type whose field contain other data types. Each field has a name by which it can be accessed. The parent data type should be of sufficient size to contain all its fields; the parent is nearly always based on the `void` type which allows an arbitrary item size. Structured data types may also contain nested structured sub-array data types in their fields.
Finally, a data type can describe items that are themselves arrays of items of another data type. These sub-arrays must, however, be of a fixed size.
If an array is created using a data-type describing a sub-array, the dimensions of the sub-array are appended to the shape of the array when the array is created. Sub-arrays in a field of a structured type behave differently, see Field access.
Sub-arrays always have a C-contiguous memory layout.
#### Example
A simple data type containing a 32-bit big-endian integer: (see Specifying and constructing data types for details on construction)
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype('>i4')
    >>> dt.byteorder
    '>'
    >>> dt.itemsize
    4
    >>> dt.name
    'int32'
    >>> dt.type is np.int32
    True
    
The corresponding array scalar type is `int32`.
#### Example
A structured data type containing a 16-character string (in field ‘name’) and a sub-array of two 64-bit floating-point number (in field ‘grades’):
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
    >>> dt['name']
    dtype('<U16')
    >>> dt['grades']
    dtype(('<f8', (2,)))
    
Items of an array of this data type are wrapped in an array scalar type that also has two fields:
    
    >>> import numpy as np
    
    
    >>> x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)
    >>> x[1]
    ('John', [6., 7.])
    >>> x[1]['grades']
    array([6.,  7.])
    >>> type(x[1])
    <class 'numpy.void'>
    >>> type(x[1]['grades'])
    <class 'numpy.ndarray'>
    
## Specifying and constructing data types
Whenever a data-type is required in a NumPy function or method, either a `dtype` object or something that can be converted to one can be supplied. Such conversions are done by the `dtype` constructor:
`dtype`(dtype[, align, copy])
Create a data type object.  
What can be converted to a data-type object is described below:
`dtype` object
    
Used as-is.
None
    
The default data type: `float64`.
Array-scalar types
    
The 24 built-in array scalar type objects all convert to an associated data-type object. This is true for their sub-classes as well.
Note that not all data-type information can be supplied with a type-object: for example, `flexible` data-types have a default itemsize of 0, and require an explicitly given size to be useful.
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype(np.int32)      # 32-bit integer
    >>> dt = np.dtype(np.complex128) # 128-bit complex floating-point number
    
Generic types
    
The generic hierarchical type objects convert to corresponding type objects according to the associations:
`number`, `inexact`, `floating`
`float64`  
`complexfloating`
`complex128`  
`integer`, `signedinteger`
`int_`  
`unsignedinteger`
`uint`  
`generic`, `flexible`
`void`  
Deprecated since version 1.19: This conversion of generic scalar types is deprecated. This is because it can be unexpected in a context such as `arr.astype(dtype=np.floating)`, which casts an array of `float32` to an array of `float64`, even though `float32` is a subdtype of `np.floating`.
Built-in Python types
    
Several python types are equivalent to a corresponding array scalar when used to generate a `dtype` object:
`int`
`int_`  
`bool`
`bool_`  
`float`
`float64`  
`complex`
`complex128`  
`bytes`
`bytes_`  
`str`
`str_`  
`memoryview`
`void`  
(all others)
`object_`  
Note that `str_` corresponds to UCS4 encoded unicode strings.
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype(float)   # Python-compatible floating-point number
    >>> dt = np.dtype(int)     # Python-compatible integer
    >>> dt = np.dtype(object)  # Python object
    
Note
All other types map to `object_` for convenience. Code should expect that such types may map to a specific (new) dtype in the future.
Types with `.dtype`
    
Any type object with a `dtype` attribute: The attribute will be accessed and used directly. The attribute must return something that is convertible into a dtype object.
Several kinds of strings can be converted. Recognized strings can be prepended with `'>'` (big-endian), `'<'` (little-endian), or `'='` (hardware-native, the default), to specify the byte order.
One-character strings
    
Each built-in data-type has a character code (the updated Numeric typecodes), that uniquely identifies it.
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype('b')  # byte, native byte order
    >>> dt = np.dtype('>H') # big-endian unsigned short
    >>> dt = np.dtype('<f') # little-endian single-precision float
    >>> dt = np.dtype('d')  # double-precision floating-point number
    
Array-protocol type strings (see The array interface protocol)
    
The first character specifies the kind of data and the remaining characters specify the number of bytes per item, except for Unicode, where it is interpreted as the number of characters. The item size must correspond to an existing type, or an error will be raised. The supported kinds are
`'?'`
boolean  
`'b'`
(signed) byte  
`'B'`
unsigned byte  
`'i'`
(signed) integer  
`'u'`
unsigned integer  
`'f'`
floating-point  
`'c'`
complex-floating point  
`'m'`
timedelta  
`'M'`
datetime  
`'O'`
(Python) objects  
`'S'`, `'a'`
zero-terminated bytes (not recommended)  
`'U'`
Unicode string  
`'V'`
raw data (`void`)  
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype('i4')   # 32-bit signed integer
    >>> dt = np.dtype('f8')   # 64-bit floating-point number
    >>> dt = np.dtype('c16')  # 128-bit complex floating-point number
    >>> dt = np.dtype('S25')  # 25-length zero-terminated bytes
    >>> dt = np.dtype('U25')  # 25-character string
    
Note on string types
For backward compatibility with existing code originally written to support Python 2, `S` and `a` typestrings are zero-terminated bytes. For unicode strings, use `U`, `numpy.str_`. For signed bytes that do not need zero-termination `b` or `i1` can be used.
String with comma-separated fields
    
A short-hand notation for specifying the format of a structured data type is a comma-separated string of basic formats.
A basic format in this context is an optional shape specifier followed by an array-protocol type string. Parenthesis are required on the shape if it has more than one dimension. NumPy allows a modification on the format in that any string that can uniquely identify the type can be used to specify the data-type in a field. The generated data-type fields are named `'f0'`, `'f1'`, …, `'f<N-1>'` where N (>1) is the number of comma-separated basic formats in the string. If the optional shape specifier is provided, then the data-type for the corresponding field describes a sub-array.
#### Example
  * field named `f0` containing a 32-bit integer
  * field named `f1` containing a 2 x 3 sub-array of 64-bit floating-point numbers
  * field named `f2` containing a 32-bit floating-point number
        >>> import numpy as np
        >>> dt = np.dtype("i4, (2,3)f8, f4")
        
  * field named `f0` containing a 3-character string
  * field named `f1` containing a sub-array of shape (3,) containing 64-bit unsigned integers
  * field named `f2` containing a 3 x 4 sub-array containing 10-character strings
        >>> import numpy as np
        >>> dt = np.dtype("S3, 3u8, (3,4)S10")
        


Type strings
    
Any string name of a NumPy dtype, e.g.:
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype('uint32')   # 32-bit unsigned integer
    >>> dt = np.dtype('float64')  # 64-bit floating-point number
    
`(flexible_dtype, itemsize)`
    
The first argument must be an object that is converted to a zero-sized flexible data-type object, the second argument is an integer providing the desired itemsize.
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype((np.void, 10))  # 10-byte wide data block
    >>> dt = np.dtype(('U', 10))   # 10-character unicode string
    
`(fixed_dtype, shape)`
    
The first argument is any object that can be converted into a fixed-size data-type object. The second argument is the desired shape of this type. If the shape parameter is 1, then the data-type object used to be equivalent to fixed dtype. This behaviour is deprecated since NumPy 1.17 and will raise an error in the future. If shape is a tuple, then the new dtype defines a sub-array of the given shape.
#### Example
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype((np.int32, (2,2)))          # 2 x 2 integer sub-array
    >>> dt = np.dtype(('i4, (2,3)f8, f4', (2,3))) # 2 x 3 structured sub-array
    
`[(field_name, field_dtype, field_shape), ...]`
    
obj should be a list of fields where each field is described by a tuple of length 2 or 3. (Equivalent to the `descr` item in the `__array_interface__` attribute.)
The first element, field_name, is the field name (if this is `''` then a standard field name, `'f#'`, is assigned). The field name may also be a 2-tuple of strings where the first string is either a “title” (which may be any string or unicode string) or meta-data for the field which can be any object, and the second string is the “name” which must be a valid Python identifier.
The second element, field_dtype, can be anything that can be interpreted as a data-type.
The optional third element field_shape contains the shape if this field represents an array of the data-type in the second element. Note that a 3-tuple with a third argument equal to 1 is equivalent to a 2-tuple.
This style does not accept align in the `dtype` constructor as it is assumed that all of the memory is accounted for by the array interface description.
#### Example
Data-type with fields `big` (big-endian 32-bit integer) and `little` (little-endian 32-bit integer):
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype([('big', '>i4'), ('little', '<i4')])
    
Data-type with fields `R`, `G`, `B`, `A`, each being an unsigned 8-bit integer:
    
    >>> dt = np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
    
`{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}`
    
This style has two required and three optional keys. The names and formats keys are required. Their respective values are equal-length lists with the field names and the field formats. The field names must be strings and the field formats can be any object accepted by `dtype` constructor.
When the optional keys offsets and titles are provided, their values must each be lists of the same length as the names and formats lists. The offsets value is a list of byte offsets (limited to `ctypes.c_int`) for each field, while the titles value is a list of titles for each field (`None` can be used if no title is desired for that field). The titles can be any object, but when a `str` object will add another entry to the fields dictionary keyed by the title and referencing the same field tuple which will contain the title as an additional tuple member.
The itemsize key allows the total size of the dtype to be set, and must be an integer large enough so all the fields are within the dtype. If the dtype being constructed is aligned, the itemsize must also be divisible by the struct alignment. Total dtype itemsize is limited to `ctypes.c_int`.
#### Example
Data type with fields `r`, `g`, `b`, `a`, each being an 8-bit unsigned integer:
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype({'names': ['r','g','b','a'],
    ...                'formats': [np.uint8, np.uint8, np.uint8, np.uint8]})
    
Data type with fields `r` and `b` (with the given titles), both being 8-bit unsigned integers, the first at byte position 0 from the start of the field and the second at position 2:
    
    >>> dt = np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'],
    ...                'offsets': [0, 2],
    ...                'titles': ['Red pixel', 'Blue pixel']})
    
`{'field1': ..., 'field2': ..., ...}`
    
This usage is discouraged, because it is ambiguous with the other dict-based construction method. If you have a field called ‘names’ and a field called ‘formats’ there will be a conflict.
This style allows passing in the `fields` attribute of a data-type object.
obj should contain string or unicode keys that refer to `(data-type, offset)` or `(data-type, offset, title)` tuples.
#### Example
Data type containing field `col1` (10-character string at byte position 0), `col2` (32-bit float at byte position 10), and `col3` (integers at byte position 14):
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype({'col1': ('U10', 0), 'col2': (np.float32, 10),
    ...                'col3': (int, 14)})
    
`(base_dtype, new_dtype)`
    
In NumPy 1.7 and later, this form allows `base_dtype` to be interpreted as a structured dtype. Arrays created with this dtype will have underlying dtype `base_dtype` but will have fields and flags taken from `new_dtype`. This is useful for creating custom structured dtypes, as done in record arrays.
This form also makes it possible to specify struct dtypes with overlapping fields, functioning like the ‘union’ type in C. This usage is discouraged, however, and the union mechanism is preferred.
Both arguments must be convertible to data-type objects with the same total size.
#### Example
32-bit integer, whose first two bytes are interpreted as an integer via field `real`, and the following two bytes via field `imag`.
    
    >>> import numpy as np
    
    
    >>> dt = np.dtype((np.int32,{'real':(np.int16, 0),'imag':(np.int16, 2)}))
    
32-bit integer, which is interpreted as consisting of a sub-array of shape `(4,)` containing 8-bit integers:
    
    >>> dt = np.dtype((np.int32, (np.int8, 4)))
    
32-bit integer, containing fields `r`, `g`, `b`, `a` that interpret the 4 bytes in the integer as four unsigned integers:
    
    >>> dt = np.dtype(('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')]))
    
## Checking the data type
When checking for a specific data type, use `==` comparison.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.array([1, 2], dtype=np.float32)
    >>> a.dtype == np.float32
    True
    
As opposed to Python types, a comparison using `is` should not be used.
First, NumPy treats data type specifications (everything that can be passed to the `dtype` constructor) as equivalent to the data type object itself. This equivalence can only be handled through `==`, not through `is`.
#### Example
A `dtype` object is equal to all data type specifications that are equivalent to it.
    
    >>> import numpy as np
    
    
    >>> a = np.array([1, 2], dtype=float)
    >>> a.dtype == np.dtype(np.float64)
    True
    >>> a.dtype == np.float64
    True
    >>> a.dtype == float
    True
    >>> a.dtype == "float64"
    True
    >>> a.dtype == "d"
    True
    
Second, there is no guarantee that data type objects are singletons.
#### Example
Do not use `is` because data type objects may or may not be singletons.
    
    >>> import numpy as np
    
    
    >>> np.dtype(float) is np.dtype(float)
    True
    >>> np.dtype([('a', float)]) is np.dtype([('a', float)])
    False
    
## dtype
NumPy data type descriptions are instances of the `dtype` class.
### Attributes
The type of the data is described by the following `dtype` attributes:
`dtype.type`  
`dtype.kind`
A character code (one of 'biufcmMOSUV') identifying the general kind of data.  
`dtype.char`
A unique character code for each of the 21 different built-in types.  
`dtype.num`
A unique number for each of the 21 different built-in types.  
`dtype.str`
The array-protocol typestring of this data-type object.  
Size of the data is in turn described by:
`dtype.name`
A bit-width name for this data-type.  
`dtype.itemsize`
The element size of this data-type object.  
Endianness of this data:
`dtype.byteorder`
A character indicating the byte-order of this data-type object.  
Information about sub-data-types in a structured data type:
`dtype.fields`
Dictionary of named fields defined for this data type, or `None`.  
`dtype.names`
Ordered list of field names, or `None` if there are no fields.  
For data types that describe sub-arrays:
`dtype.subdtype`
Tuple `(item_dtype, shape)` if this `dtype` describes a sub-array, and None otherwise.  
`dtype.shape`
Shape tuple of the sub-array if this data type describes a sub-array, and `()` otherwise.  
Attributes providing additional information:
`dtype.hasobject`
Boolean indicating whether this dtype contains any reference-counted objects in any fields or sub-dtypes.  
`dtype.flags`
Bit-flags describing how this data type is to be interpreted.  
`dtype.isbuiltin`
Integer indicating how this dtype relates to the built-in dtypes.  
`dtype.isnative`
Boolean indicating whether the byte order of this dtype is native to the platform.  
`dtype.descr`
`__array_interface__` description of the data-type.  
`dtype.alignment`
The required alignment (bytes) of this data-type according to the compiler.  
`dtype.base`
Returns dtype for the base element of the subarrays, regardless of their dimension or shape.  
Metadata attached by the user:
`dtype.metadata`
Either `None` or a readonly dictionary of metadata (mappingproxy).  
### Methods
Data types have the following method for changing the byte order:
`dtype.newbyteorder`([new_order])
Return a new dtype with a different byte order.  
The following methods implement the pickle protocol:
`dtype.__reduce__`
Helper for pickle.  
`dtype.__setstate__`  
Utility method for typing:
`dtype.__class_getitem__`(item, /)
Return a parametrized wrapper around the `dtype` type.  
Comparison operations:
`dtype.__ge__`(value, /)
Return self>=value.  
`dtype.__gt__`(value, /)
Return self>value.  
`dtype.__le__`(value, /)
Return self<=value.  
`dtype.__lt__`(value, /)
Return self<value.  
# Array objects
NumPy provides an N-dimensional array type, the ndarray, which describes a collection of “items” of the same type. The items can be indexed using for example N integers.
All ndarrays are homogeneous: every item takes up the same size block of memory, and all blocks are interpreted in exactly the same way. How each item in the array is to be interpreted is specified by a separate data-type object, one of which is associated with every array. In addition to basic types (integers, floats, etc.), the data type objects can also represent data structures.
An item extracted from an array, e.g., by indexing, is represented by a Python object whose type is one of the array scalar types built in NumPy. The array scalars allow easy manipulation of also more complicated arrangements of data.
Figure Conceptual diagram showing the relationship between the three fundamental objects used to describe the data in an array: 1) the ndarray itself, 2) the data-type object that describes the layout of a single fixed-size element of the array, 3) the array-scalar Python object that is returned when a single element of the array is accessed.
  * The N-dimensional array (`ndarray`)
    * Constructing arrays
    * Indexing arrays
    * Internal memory layout of an ndarray
    * Array attributes
    * Array methods
    * Arithmetic, matrix multiplication, and comparison operations
    * Special methods
  * Scalars
    * Built-in scalar types
    * Attributes
    * Indexing
    * Methods
    * Defining new types
  * Data type objects (`dtype`)
    * Specifying and constructing data types
    * Checking the data type
    * `dtype`
  * Data type promotion in NumPy
    * Detailed behavior of Python scalars
    * Numerical promotion
    * Exceptions to the general promotion rules
    * Promotion of non-numerical datatypes
    * Details of promoted `dtype` instances
  * Iterating over arrays
    * Single array iteration
    * Broadcasting array iteration
    * Putting the inner loop in Cython
  * Standard array subclasses
    * Special attributes and methods
    * Matrix objects
    * Memory-mapped file arrays
    * Character arrays (`numpy.char`)
    * Record arrays
    * Masked arrays (`numpy.ma`)
    * Standard container class
    * Array iterators
  * Masked arrays
    * The `numpy.ma` module
    * Using numpy.ma
    * Examples
    * Constants of the `numpy.ma` module
    * The `MaskedArray` class
    * `MaskedArray` methods
    * Masked array operations
  * The array interface protocol
    * Python side
    * C-struct access
    * Type description examples
    * Differences with array interface (version 2)
  * Datetimes and timedeltas
    * Datetime64 conventions and assumptions
    * Basic datetimes
    * Datetime and timedelta arithmetic
    * Datetime units
    * Business day functionality
    * Datetime64 shortcomings


# The array interface protocol
Note
This page describes the NumPy-specific API for accessing the contents of a NumPy array from other C extensions. PEP 3118 – `The Revised Buffer Protocol` introduces similar, standardized API to Python 2.6 and 3.0 for any extension module to use. Cython’s buffer array support uses the PEP 3118 API; see the Cython NumPy tutorial. Cython provides a way to write code that supports the buffer protocol with Python versions older than 2.6 because it has a backward-compatible implementation utilizing the array interface described here.
version:
    
3
The array interface (sometimes called array protocol) was created in 2005 as a means for array-like Python objects to reuse each other’s data buffers intelligently whenever possible. The homogeneous N-dimensional array interface is a default mechanism for objects to share N-dimensional array memory and information. The interface consists of a Python-side and a C-side using two attributes. Objects wishing to be considered an N-dimensional array in application code should support at least one of these attributes. Objects wishing to support an N-dimensional array in application code should look for at least one of these attributes and use the information provided appropriately.
This interface describes homogeneous arrays in the sense that each item of the array has the same “type”. This type can be very simple or it can be a quite arbitrary and complicated C-like structure.
There are two ways to use the interface: A Python side and a C-side. Both are separate attributes.
## Python side
This approach to the interface consists of the object having an `__array_interface__` attribute.
object.__array_interface__
    
A dictionary of items (3 required and 5 optional). The optional keys in the dictionary have implied defaults if they are not provided.
The keys are:
shape (required)
    
Tuple whose elements are the array size in each dimension. Each entry is an integer (a Python `int`). Note that these integers could be larger than the platform `int` or `long` could hold (a Python `int` is a C `long`). It is up to the code using this attribute to handle this appropriately; either by raising an error when overflow is possible, or by using `long long` as the C type for the shapes.
typestr (required)
    
A string providing the basic type of the homogeneous array The basic string format consists of 3 parts: a character describing the byteorder of the data (`<`: little-endian, `>`: big-endian, `|`: not-relevant), a character code giving the basic type of the array, and an integer providing the number of bytes the type uses.
The basic type character codes are:
`t`
Bit field (following integer gives the number of bits in the bit field).  
`b`
Boolean (integer type where all values are only `True` or `False`)  
`i`
Integer  
`u`
Unsigned integer  
`f`
Floating point  
`c`
Complex floating point  
`m`
Timedelta  
`M`
Datetime  
`O`
Object (i.e. the memory contains a pointer to `PyObject`)  
`S`
String (fixed-length sequence of char)  
`U`
Unicode (fixed-length sequence of `Py_UCS4`)  
`V`
Other (void * – each item is a fixed-size chunk of memory)  
descr (optional)
    
A list of tuples providing a more detailed description of the memory layout for each item in the homogeneous array. Each tuple in the list has two or three elements. Normally, this attribute would be used when typestr is `V[0-9]+`, but this is not a requirement. The only requirement is that the number of bytes represented in the typestr key is the same as the total number of bytes represented here. The idea is to support descriptions of C-like structs that make up array elements. The elements of each tuple in the list are
  1. A string providing a name associated with this portion of the datatype. This could also be a tuple of `('full name', 'basic_name')` where basic name would be a valid Python variable name representing the full name of the field.
  2. Either a basic-type description string as in typestr or another list (for nested structured types)
  3. An optional shape tuple providing how many times this part of the structure should be repeated. No repeats are assumed if this is not given. Very complicated structures can be described using this generic interface. Notice, however, that each element of the array is still of the same data-type. Some examples of using this interface are given below.


Default: `[('', typestr)]`
data (optional)
    
A 2-tuple whose first argument is a Python integer that points to the data-area storing the array contents.
Note
When converting from C/C++ via `PyLong_From*` or high-level bindings such as Cython or pybind11, make sure to use an integer of sufficiently large bitness.
This pointer must point to the first element of data (in other words any offset is always ignored in this case). The second entry in the tuple is a read-only flag (true means the data area is read-only).
This attribute can also be an object exposing the buffer interface which will be used to share the data. If this key is not present (or returns None), then memory sharing will be done through the buffer interface of the object itself. In this case, the offset key can be used to indicate the start of the buffer. A reference to the object exposing the array interface must be stored by the new object if the memory area is to be secured.
Default: `None`
strides (optional)
    
Either `None` to indicate a C-style contiguous array or a tuple of strides which provides the number of bytes needed to jump to the next array element in the corresponding dimension. Each entry must be an integer (a Python `int`). As with shape, the values may be larger than can be represented by a C `int` or `long`; the calling code should handle this appropriately, either by raising an error, or by using `long long` in C. The default is `None` which implies a C-style contiguous memory buffer. In this model, the last dimension of the array varies the fastest. For example, the default strides tuple for an object whose array entries are 8 bytes long and whose shape is `(10, 20, 30)` would be `(4800, 240, 8)`.
Default: `None` (C-style contiguous)
mask (optional)
    
`None` or an object exposing the array interface. All elements of the mask array should be interpreted only as true or not true indicating which elements of this array are valid. The shape of this object should be `“broadcastable”` to the shape of the original array.
Default: `None` (All array values are valid)
offset (optional)
    
An integer offset into the array data region. This can only be used when data is `None` or returns a `memoryview` object.
Default: `0`.
version (required)
    
An integer showing the version of the interface (i.e. 3 for this version). Be careful not to use this to invalidate objects exposing future versions of the interface.
## C-struct access
This approach to the array interface allows for faster access to an array using only one attribute lookup and a well-defined C-structure.
object.__array_struct__
    
A `PyCapsule` whose `pointer` member contains a pointer to a filled `PyArrayInterface` structure. Memory for the structure is dynamically created and the `PyCapsule` is also created with an appropriate destructor so the retriever of this attribute simply has to apply `Py_DECREF` to the object returned by this attribute when it is finished. Also, either the data needs to be copied out, or a reference to the object exposing this attribute must be held to ensure the data is not freed. Objects exposing the `__array_struct__` interface must also not reallocate their memory if other objects are referencing them.
The `PyArrayInterface` structure is defined in `numpy/ndarrayobject.h` as:
    
    typedef struct {
      int two;              /* contains the integer 2 -- simple sanity check */
      int nd;               /* number of dimensions */
      char typekind;        /* kind in array --- character code of typestr */
      int itemsize;         /* size of each element */
      int flags;            /* flags indicating how the data should be interpreted */
                            /*   must set ARR_HAS_DESCR bit to validate descr */
      Py_ssize_t *shape;    /* A length-nd array of shape information */
      Py_ssize_t *strides;  /* A length-nd array of stride information */
      void *data;           /* A pointer to the first element of the array */
      PyObject *descr;      /* NULL or data-description (same as descr key
                                    of __array_interface__) -- must set ARR_HAS_DESCR
                                    flag or this will be ignored. */
    } PyArrayInterface;
    
The flags member may consist of 5 bits showing how the data should be interpreted and one bit showing how the Interface should be interpreted. The data-bits are `NPY_ARRAY_C_CONTIGUOUS` (0x1), `NPY_ARRAY_F_CONTIGUOUS` (0x2), `NPY_ARRAY_ALIGNED` (0x100), `NPY_ARRAY_NOTSWAPPED` (0x200), and `NPY_ARRAY_WRITEABLE` (0x400). A final flag `NPY_ARR_HAS_DESCR` (0x800) indicates whether or not this structure has the arrdescr field. The field should not be accessed unless this flag is present.
NPY_ARR_HAS_DESCR  

New since June 16, 2006:
In the past most implementations used the `desc` member of the `PyCObject` (now `PyCapsule`) itself (do not confuse this with the “descr” member of the `PyArrayInterface` structure above — they are two separate things) to hold the pointer to the object exposing the interface. This is now an explicit part of the interface. Be sure to take a reference to the object and call `PyCapsule_SetContext` before returning the `PyCapsule`, and configure a destructor to decref this reference.
Note
`__array_struct__` is considered legacy and should not be used for new code. Use the buffer protocol or the DLPack protocol `numpy.from_dlpack` instead.
## Type description examples
For clarity it is useful to provide some examples of the type description and corresponding `__array_interface__` ‘descr’ entries. Thanks to Scott Gilbert for these examples:
In every case, the ‘descr’ key is optional, but of course provides more information which may be important for various applications:
    
    * Float data
        typestr == '>f4'
        descr == [('','>f4')]
    
    * Complex double
        typestr == '>c8'
        descr == [('real','>f4'), ('imag','>f4')]
    
    * RGB Pixel data
        typestr == '|V3'
        descr == [('r','|u1'), ('g','|u1'), ('b','|u1')]
    
    * Mixed endian (weird but could happen).
        typestr == '|V8' (or '>u8')
        descr == [('big','>i4'), ('little','<i4')]
    
    * Nested structure
        struct {
            int ival;
            struct {
                unsigned short sval;
                unsigned char bval;
                unsigned char cval;
            } sub;
        }
        typestr == '|V8' (or '<u8' if you want)
        descr == [('ival','<i4'), ('sub', [('sval','<u2'), ('bval','|u1'), ('cval','|u1') ]) ]
    
    * Nested array
        struct {
            int ival;
            double data[16*4];
        }
        typestr == '|V516'
        descr == [('ival','>i4'), ('data','>f8',(16,4))]
    
    * Padded structure
        struct {
            int ival;
            double dval;
        }
        typestr == '|V16'
        descr == [('ival','>i4'),('','|V4'),('dval','>f8')]
    
It should be clear that any structured type could be described using this interface.
## Differences with array interface (version 2)
The version 2 interface was very similar. The differences were largely aesthetic. In particular:
  1. The PyArrayInterface structure had no descr member at the end (and therefore no flag ARR_HAS_DESCR)
  2. The `context` member of the `PyCapsule` (formally the `desc` member of the `PyCObject`) returned from `__array_struct__` was not specified. Usually, it was the object exposing the array (so that a reference to it could be kept and destroyed when the C-object was destroyed). It is now an explicit requirement that this field be used in some way to hold a reference to the owning object.
Note
Until August 2020, this said:
Now it must be a tuple whose first element is a string with “PyArrayInterface Version #” and whose second element is the object exposing the array.
This design was retracted almost immediately after it was proposed, in <https://mail.python.org/pipermail/numpy-discussion/2006-June/020995.html>. Despite 14 years of documentation to the contrary, at no point was it valid to assume that `__array_interface__` capsules held this tuple content.
  3. The tuple returned from `__array_interface__['data']` used to be a hex-string (now it is an integer or a long integer).
  4. There was no `__array_interface__` attribute instead all of the keys (except for version) in the `__array_interface__` dictionary were their own attribute: Thus to obtain the Python-side information you had to access separately the attributes:
     * `__array_data__`
     * `__array_shape__`
     * `__array_strides__`
     * `__array_typestr__`
     * `__array_descr__`
     * `__array_offset__`
     * `__array_mask__`


# The N-dimensional array (ndarray)
An `ndarray` is a (usually fixed-size) multidimensional container of items of the same type and size. The number of dimensions and items in an array is defined by its `shape`, which is a `tuple` of N non-negative integers that specify the sizes of each dimension. The type of items in the array is specified by a separate data-type object (dtype), one of which is associated with each ndarray.
As with other container objects in Python, the contents of an `ndarray` can be accessed and modified by indexing or slicing the array (using, for example, N integers), and via the methods and attributes of the `ndarray`.
Different `ndarrays` can share the same data, so that changes made in one `ndarray` may be visible in another. That is, an ndarray can be a “view” to another ndarray, and the data it is referring to is taken care of by the “base” ndarray. ndarrays can also be views to memory owned by Python `strings` or objects implementing the `memoryview` or array interfaces.
#### Example
A 2-dimensional array of size 2 x 3, composed of 4-byte integer elements:
    
    >>> import numpy as np
    
    
    >>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
    >>> type(x)
    <class 'numpy.ndarray'>
    >>> x.shape
    (2, 3)
    >>> x.dtype
    dtype('int32')
    
The array can be indexed using Python container-like syntax:
    
    >>> # The element of x in the *second* row, *third* column, namely, 6.
    >>> x[1, 2]
       6
    
For example slicing can produce views of the array:
    
    >>> y = x[:,1]
    >>> y
    array([2, 5], dtype=int32)
    >>> y[0] = 9 # this also changes the corresponding element in x
    >>> y
    array([9, 5], dtype=int32)
    >>> x
    array([[1, 9, 3],
           [4, 5, 6]], dtype=int32)
    
## Constructing arrays
New arrays can be constructed using the routines detailed in Array creation routines, and also by using the low-level `ndarray` constructor:
`ndarray`(shape[, dtype, buffer, offset, ...])
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Indexing arrays
Arrays can be indexed using an extended Python slicing syntax, `array[selection]`. Similar syntax is also used for accessing fields in a structured data type.
See also
Array Indexing.
## Internal memory layout of an ndarray
An instance of class `ndarray` consists of a contiguous one-dimensional segment of computer memory (owned by the array, or by some other object), combined with an indexing scheme that maps N integers into the location of an item in the block. The ranges in which the indices can vary is specified by the `shape` of the array. How many bytes each item takes and how the bytes are interpreted is defined by the data-type object associated with the array.
A segment of memory is inherently 1-dimensional, and there are many different schemes for arranging the items of an N-dimensional array in a 1-dimensional block. NumPy is flexible, and `ndarray` objects can accommodate any strided indexing scheme. In a strided scheme, the N-dimensional index \\((n_0, n_1, ..., n_{N-1})\\) corresponds to the offset (in bytes):
\\[n_{\mathrm{offset}} = \sum_{k=0}^{N-1} s_k n_k\\]
from the beginning of the memory block associated with the array. Here, \\(s_k\\) are integers which specify the `strides` of the array. The column-major order (used, for example, in the Fortran language and in Matlab) and row-major order (used in C) schemes are just specific kinds of strided scheme, and correspond to memory that can be addressed by the strides:
\\[s_k^{\mathrm{column}} = \mathrm{itemsize} \prod_{j=0}^{k-1} d_j , \quad s_k^{\mathrm{row}} = \mathrm{itemsize} \prod_{j=k+1}^{N-1} d_j .\\]
where \\(d_j\\) `= self.shape[j]`.
Both the C and Fortran orders are contiguous, i.e., single-segment, memory layouts, in which every part of the memory block can be accessed by some combination of the indices.
Note
Contiguous arrays and single-segment arrays are synonymous and are used interchangeably throughout the documentation.
While a C-style and Fortran-style contiguous array, which has the corresponding flags set, can be addressed with the above strides, the actual strides may be different. This can happen in two cases:
  1. If `self.shape[k] == 1` then for any legal index `index[k] == 0`. This means that in the formula for the offset \\(n_k = 0\\) and thus \\(s_k n_k = 0\\) and the value of \\(s_k\\) `= self.strides[k]` is arbitrary.
  2. If an array has no elements (`self.size == 0`) there is no legal index and the strides are never used. Any array with no elements may be considered C-style and Fortran-style contiguous.


Point 1. means that `self` and `self.squeeze()` always have the same contiguity and `aligned` flags value. This also means that even a high dimensional array could be C-style and Fortran-style contiguous at the same time.
An array is considered aligned if the memory offsets for all elements and the base offset itself is a multiple of `self.itemsize`. Understanding memory-alignment leads to better performance on most hardware.
Warning
It does not generally hold that `self.strides[-1] == self.itemsize` for C-style contiguous arrays or `self.strides[0] == self.itemsize` for Fortran-style contiguous arrays is true.
Data in new `ndarrays` is in the row-major (C) order, unless otherwise specified, but, for example, basic array slicing often produces views in a different scheme.
Note
Several algorithms in NumPy work on arbitrarily strided arrays. However, some algorithms require single-segment arrays. When an irregularly strided array is passed in to such algorithms, a copy is automatically made.
## Array attributes
Array attributes reflect information that is intrinsic to the array itself. Generally, accessing an array through its attributes allows you to get and sometimes set intrinsic properties of the array without creating a new array. The exposed attributes are the core parts of an array and only some of them can be reset meaningfully without creating a new array. Information on each attribute is given below.
### Memory layout
The following attributes contain information about the memory layout of the array:
`ndarray.flags`
Information about the memory layout of the array.  
`ndarray.shape`
Tuple of array dimensions.  
`ndarray.strides`
Tuple of bytes to step in each dimension when traversing an array.  
`ndarray.ndim`
Number of array dimensions.  
`ndarray.data`
Python buffer object pointing to the start of the array's data.  
`ndarray.size`
Number of elements in the array.  
`ndarray.itemsize`
Length of one array element in bytes.  
`ndarray.nbytes`
Total bytes consumed by the elements of the array.  
`ndarray.base`
Base object if memory is from some other object.  
### Data type
See also
Data type objects
The data type object associated with the array can be found in the `dtype` attribute:
`ndarray.dtype`
Data-type of the array's elements.  
### Other attributes
`ndarray.T`
View of the transposed array.  
`ndarray.real`
The real part of the array.  
`ndarray.imag`
The imaginary part of the array.  
`ndarray.flat`
A 1-D iterator over the array.  
### Array interface
See also
The array interface protocol.
`__array_interface__`
Python-side of the array interface  
`__array_struct__`
C-side of the array interface  
###  `ctypes` foreign function interface
`ndarray.ctypes`
An object to simplify the interaction of the array with the ctypes module.  
## Array methods
An `ndarray` object has many methods which operate on or with the array in some fashion, typically returning an array result. These methods are briefly explained below. (Each method’s docstring has a more complete description.)
For the following methods there are also corresponding functions in `numpy`: `all`, `any`, `argmax`, `argmin`, `argpartition`, `argsort`, `choose`, `clip`, `compress`, `copy`, `cumprod`, `cumsum`, `diagonal`, `imag`, `max`, `mean`, `min`, `nonzero`, `partition`, `prod`, `put`, `ravel`, `real`, `repeat`, `reshape`, `round`, `searchsorted`, `sort`, `squeeze`, `std`, `sum`, `swapaxes`, `take`, `trace`, `transpose`, `var`.
### Array conversion
`ndarray.item`(*args)
Copy an element of an array to a standard Python scalar and return it.  
`ndarray.tolist`()
Return the array as an `a.ndim`-levels deep nested list of Python scalars.  
`ndarray.tostring`([order])
A compatibility alias for `tobytes`, with exactly the same behavior.  
`ndarray.tobytes`([order])
Construct Python bytes containing the raw data bytes in the array.  
`ndarray.tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
`ndarray.dump`(file)
Dump a pickle of the array to the specified file.  
`ndarray.dumps`()
Returns the pickle of the array as a string.  
`ndarray.astype`(dtype[, order, casting, ...])
Copy of the array, cast to a specified type.  
`ndarray.byteswap`([inplace])
Swap the bytes of the array elements  
`ndarray.copy`([order])
Return a copy of the array.  
`ndarray.view`([dtype][, type])
New view of array with the same data.  
`ndarray.getfield`(dtype[, offset])
Returns a field of the given array as a certain type.  
`ndarray.setflags`([write, align, uic])
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.  
`ndarray.fill`(value)
Fill the array with a scalar value.  
### Shape manipulation
For reshape, resize, and transpose, the single tuple argument may be replaced with `n` integers which will be interpreted as an n-tuple.
`ndarray.reshape`(shape, /, *[, order, copy])
Returns an array containing the same data with a new shape.  
`ndarray.resize`(new_shape[, refcheck])
Change shape and size of array in-place.  
`ndarray.transpose`(*axes)
Returns a view of the array with axes transposed.  
`ndarray.swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`ndarray.flatten`([order])
Return a copy of the array collapsed into one dimension.  
`ndarray.ravel`([order])
Return a flattened array.  
`ndarray.squeeze`([axis])
Remove axes of length one from `a`.  
### Item selection and manipulation
For array methods that take an axis keyword, it defaults to None. If axis is None, then the array is treated as a 1-D array. Any other value for axis represents the dimension along which the operation should proceed.
`ndarray.take`(indices[, axis, out, mode])
Return an array formed from the elements of `a` at the given indices.  
`ndarray.put`(indices, values[, mode])
Set `a.flat[n] = values[n]` for all `n` in indices.  
`ndarray.repeat`(repeats[, axis])
Repeat elements of an array.  
`ndarray.choose`(choices[, out, mode])
Use an index array to construct a new array from a set of choices.  
`ndarray.sort`([axis, kind, order])
Sort an array in-place.  
`ndarray.argsort`([axis, kind, order])
Returns the indices that would sort this array.  
`ndarray.partition`(kth[, axis, kind, order])
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array.  
`ndarray.argpartition`(kth[, axis, kind, order])
Returns the indices that would partition this array.  
`ndarray.searchsorted`(v[, side, sorter])
Find indices where elements of v should be inserted in a to maintain order.  
`ndarray.nonzero`()
Return the indices of the elements that are non-zero.  
`ndarray.compress`(condition[, axis, out])
Return selected slices of this array along given axis.  
`ndarray.diagonal`([offset, axis1, axis2])
Return specified diagonals.  
### Calculation
Many of these methods take an argument named axis. In such cases,
  * If axis is None (the default), the array is treated as a 1-D array and the operation is performed over the entire array. This behavior is also the default if self is a 0-dimensional array or array scalar. (An array scalar is an instance of the types/classes float32, float64, etc., whereas a 0-dimensional array is an ndarray instance containing precisely one array scalar.)
  * If axis is an integer, then the operation is done over the given axis (for each 1-D subarray that can be created along the given axis).


Example of the axis argument
A 3-dimensional array of size 3 x 3 x 3, summed over each of its three axes:
    
    >>> import numpy as np
    
    
    >>> x = np.arange(27).reshape((3,3,3))
    >>> x
    array([[[ 0,  1,  2],
          [ 3,  4,  5],
          [ 6,  7,  8]],
          [[ 9, 10, 11],
          [12, 13, 14],
          [15, 16, 17]],
          [[18, 19, 20],
          [21, 22, 23],
          [24, 25, 26]]])
    >>> x.sum(axis=0)
    array([[27, 30, 33],
          [36, 39, 42],
          [45, 48, 51]])
    >>> # for sum, axis is the first keyword, so we may omit it,
    >>> # specifying only its value
    >>> x.sum(0), x.sum(1), x.sum(2)
    (array([[27, 30, 33],
          [36, 39, 42],
          [45, 48, 51]]),
    array([[ 9, 12, 15],
          [36, 39, 42],
          [63, 66, 69]]),
    array([[ 3, 12, 21],
          [30, 39, 48],
          [57, 66, 75]]))
    
The parameter dtype specifies the data type over which a reduction operation (like summing) should take place. The default reduce data type is the same as the data type of self. To avoid overflow, it can be useful to perform the reduction using a larger data type.
For several methods, an optional out argument can also be provided and the result will be placed into the output array given. The out argument must be an `ndarray` and have the same number of elements. It can have a different data type in which case casting will be performed.
`ndarray.max`([axis, out, keepdims, initial, ...])
Return the maximum along a given axis.  
`ndarray.argmax`([axis, out, keepdims])
Return indices of the maximum values along the given axis.  
`ndarray.min`([axis, out, keepdims, initial, ...])
Return the minimum along a given axis.  
`ndarray.argmin`([axis, out, keepdims])
Return indices of the minimum values along the given axis.  
`ndarray.clip`([min, max, out])
Return an array whose values are limited to `[min, max]`.  
`ndarray.conj`()
Complex-conjugate all elements.  
`ndarray.round`([decimals, out])
Return `a` with each element rounded to the given number of decimals.  
`ndarray.trace`([offset, axis1, axis2, dtype, out])
Return the sum along diagonals of the array.  
`ndarray.sum`([axis, dtype, out, keepdims, ...])
Return the sum of the array elements over the given axis.  
`ndarray.cumsum`([axis, dtype, out])
Return the cumulative sum of the elements along the given axis.  
`ndarray.mean`([axis, dtype, out, keepdims, where])
Returns the average of the array elements along given axis.  
`ndarray.var`([axis, dtype, out, ddof, ...])
Returns the variance of the array elements, along given axis.  
`ndarray.std`([axis, dtype, out, ddof, ...])
Returns the standard deviation of the array elements along given axis.  
`ndarray.prod`([axis, dtype, out, keepdims, ...])
Return the product of the array elements over the given axis  
`ndarray.cumprod`([axis, dtype, out])
Return the cumulative product of the elements along the given axis.  
`ndarray.all`([axis, out, keepdims, where])
Returns True if all elements evaluate to True.  
`ndarray.any`([axis, out, keepdims, where])
Returns True if any of the elements of `a` evaluate to True.  
## Arithmetic, matrix multiplication, and comparison operations
Arithmetic and comparison operations on `ndarrays` are defined as element-wise operations, and generally yield `ndarray` objects as results.
Each of the arithmetic operations (`+`, `-`, `*`, `/`, `//`, `%`, `divmod()`, `**` or `pow()`, `<<`, `>>`, `&`, `^`, `|`, `~`) and the comparisons (`==`, `<`, `>`, `<=`, `>=`, `!=`) is equivalent to the corresponding universal function (or ufunc for short) in NumPy. For more information, see the section on Universal Functions.
Comparison operators:
`ndarray.__lt__`(value, /)
Return self<value.  
`ndarray.__le__`(value, /)
Return self<=value.  
`ndarray.__gt__`(value, /)
Return self>value.  
`ndarray.__ge__`(value, /)
Return self>=value.  
`ndarray.__eq__`(value, /)
Return self==value.  
`ndarray.__ne__`(value, /)
Return self!=value.  
Truth value of an array (`bool()`):
`ndarray.__bool__`(/)
True if self else False  
Note
Truth-value testing of an array invokes `ndarray.__bool__`, which raises an error if the number of elements in the array is not 1, because the truth value of such arrays is ambiguous. Use `.any()` and `.all()` instead to be clear about what is meant in such cases. (If you wish to check for whether an array is empty, use for example `.size > 0`.)
Unary operations:
`ndarray.__neg__`(/)
-self  
`ndarray.__pos__`(/)
+self  
`ndarray.__abs__`(self)  
`ndarray.__invert__`(/)
~self  
Arithmetic:
`ndarray.__add__`(value, /)
Return self+value.  
`ndarray.__sub__`(value, /)
Return self-value.  
`ndarray.__mul__`(value, /)
Return self*value.  
`ndarray.__truediv__`(value, /)
Return self/value.  
`ndarray.__floordiv__`(value, /)
Return self//value.  
`ndarray.__mod__`(value, /)
Return self%value.  
`ndarray.__divmod__`(value, /)
Return divmod(self, value).  
`ndarray.__pow__`(value[, mod])
Return pow(self, value, mod).  
`ndarray.__lshift__`(value, /)
Return self<<value.  
`ndarray.__rshift__`(value, /)
Return self>>value.  
`ndarray.__and__`(value, /)
Return self&value.  
`ndarray.__or__`(value, /)
Return self|value.  
`ndarray.__xor__`(value, /)
Return self^value.  
Note
  * Any third argument to `pow` is silently ignored, as the underlying `ufunc` takes only two arguments.
  * Because `ndarray` is a built-in type (written in C), the `__r{op}__` special methods are not directly defined.
  * The functions called to implement many arithmetic special methods for arrays can be modified using `__array_ufunc__`.


Arithmetic, in-place:
`ndarray.__iadd__`(value, /)
Return self+=value.  
`ndarray.__isub__`(value, /)
Return self-=value.  
`ndarray.__imul__`(value, /)
Return self*=value.  
`ndarray.__itruediv__`(value, /)
Return self/=value.  
`ndarray.__ifloordiv__`(value, /)
Return self//=value.  
`ndarray.__imod__`(value, /)
Return self%=value.  
`ndarray.__ipow__`(value, /)
Return self**=value.  
`ndarray.__ilshift__`(value, /)
Return self<<=value.  
`ndarray.__irshift__`(value, /)
Return self>>=value.  
`ndarray.__iand__`(value, /)
Return self&=value.  
`ndarray.__ior__`(value, /)
Return self|=value.  
`ndarray.__ixor__`(value, /)
Return self^=value.  
Warning
In place operations will perform the calculation using the precision decided by the data type of the two operands, but will silently downcast the result (if necessary) so it can fit back into the array. Therefore, for mixed precision calculations, `A {op}= B` can be different than `A = A {op} B`. For example, suppose `a = ones((3,3))`. Then, `a += 3j` is different than `a = a + 3j`: while they both perform the same computation, `a += 3` casts the result to fit back in `a`, whereas `a = a + 3j` re-binds the name `a` to the result.
Matrix Multiplication:
`ndarray.__matmul__`(value, /)
Return self@value.  
Note
Matrix operators `@` and `@=` were introduced in Python 3.5 following PEP 465, and the `@` operator has been introduced in NumPy 1.10.0. Further information can be found in the `matmul` documentation.
## Special methods
For standard library functions:
`ndarray.__copy__`()
Used if `copy.copy` is called on an array.  
`ndarray.__deepcopy__`(memo, /)
Used if `copy.deepcopy` is called on an array.  
`ndarray.__reduce__`()
For pickling.  
`ndarray.__setstate__`(state, /)
For unpickling.  
Basic customization:
`ndarray.__new__`(*args, **kwargs)  
`ndarray.__array__`([dtype], *[, copy])
For `dtype` parameter it returns a new reference to self if `dtype` is not given or it matches array's data type.  
`ndarray.__array_wrap__`(array[, context], /)
Returns a view of `array` with the same type as self.  
Container customization: (see Indexing)
`ndarray.__len__`(/)
Return len(self).  
`ndarray.__getitem__`(key, /)
Return self[key].  
`ndarray.__setitem__`(key, value, /)
Set self[key] to value.  
`ndarray.__contains__`(key, /)
Return key in self.  
Conversion; the operations `int()`, `float()` and `complex()`. They work only on arrays that have one element in them and return the appropriate scalar.
`ndarray.__int__`(self)  
`ndarray.__float__`(self)  
`ndarray.__complex__`  
String representations:
`ndarray.__str__`(/)
Return str(self).  
`ndarray.__repr__`(/)
Return repr(self).  
Utility method for typing:
`ndarray.__class_getitem__`(item, /)
Return a parametrized wrapper around the `ndarray` type.  
# Iterating over arrays
Note
Arrays support the iterator protocol and can be iterated over like Python lists. See the Indexing, slicing and iterating section in the Quickstart guide for basic usage and examples. The remainder of this document presents the `nditer` object and covers more advanced usage.
The iterator object `nditer`, introduced in NumPy 1.6, provides many flexible ways to visit all the elements of one or more arrays in a systematic fashion. This page introduces some basic ways to use the object for computations on arrays in Python, then concludes with how one can accelerate the inner loop in Cython. Since the Python exposure of `nditer` is a relatively straightforward mapping of the C array iterator API, these ideas will also provide help working with array iteration from C or C++.
## Single array iteration
The most basic task that can be done with the `nditer` is to visit every element of an array. Each element is provided one by one using the standard Python iterator interface.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> for x in np.nditer(a):
    ...     print(x, end=' ')
    ...
    0 1 2 3 4 5
    
An important thing to be aware of for this iteration is that the order is chosen to match the memory layout of the array instead of using a standard C or Fortran ordering. This is done for access efficiency, reflecting the idea that by default one simply wants to visit each element without concern for a particular ordering. We can see this by iterating over the transpose of our previous array, compared to taking a copy of that transpose in C order.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> for x in np.nditer(a.T):
    ...     print(x, end=' ')
    ...
    0 1 2 3 4 5
    
    
    >>> for x in np.nditer(a.T.copy(order='C')):
    ...     print(x, end=' ')
    ...
    0 3 1 4 2 5
    
The elements of both `a` and `a.T` get traversed in the same order, namely the order they are stored in memory, whereas the elements of `a.T.copy(order=’C’)` get visited in a different order because they have been put into a different memory layout.
### Controlling iteration order
There are times when it is important to visit the elements of an array in a specific order, irrespective of the layout of the elements in memory. The `nditer` object provides an `order` parameter to control this aspect of iteration. The default, having the behavior described above, is order=’K’ to keep the existing order. This can be overridden with order=’C’ for C order and order=’F’ for Fortran order.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> for x in np.nditer(a, order='F'):
    ...     print(x, end=' ')
    ...
    0 3 1 4 2 5
    >>> for x in np.nditer(a.T, order='C'):
    ...     print(x, end=' ')
    ...
    0 3 1 4 2 5
    
### Modifying array values
By default, the `nditer` treats the input operand as a read-only object. To be able to modify the array elements, you must specify either read-write or write-only mode using the `‘readwrite’` or `‘writeonly’` per-operand flags.
The nditer will then yield writeable buffer arrays which you may modify. However, because the nditer must copy this buffer data back to the original array once iteration is finished, you must signal when the iteration is ended, by one of two methods. You may either:
  * used the nditer as a context manager using the `with` statement, and the temporary data will be written back when the context is exited.
  * call the iterator’s `close` method once finished iterating, which will trigger the write-back.


The nditer can no longer be iterated once either `close` is called or its context is exited.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> with np.nditer(a, op_flags=['readwrite']) as it:
    ...    for x in it:
    ...        x[...] = 2 * x
    ...
    >>> a
    array([[ 0,  2,  4],
           [ 6,  8, 10]])
    
If you are writing code that needs to support older versions of numpy, note that prior to 1.15, `nditer` was not a context manager and did not have a `close` method. Instead it relied on the destructor to initiate the writeback of the buffer.
### Using an external loop
In all the examples so far, the elements of `a` are provided by the iterator one at a time, because all the looping logic is internal to the iterator. While this is simple and convenient, it is not very efficient. A better approach is to move the one-dimensional innermost loop into your code, external to the iterator. This way, NumPy’s vectorized operations can be used on larger chunks of the elements being visited.
The `nditer` will try to provide chunks that are as large as possible to the inner loop. By forcing ‘C’ and ‘F’ order, we get different external loop sizes. This mode is enabled by specifying an iterator flag.
Observe that with the default of keeping native memory order, the iterator is able to provide a single one-dimensional chunk, whereas when forcing Fortran order, it has to provide three chunks of two elements each.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> for x in np.nditer(a, flags=['external_loop']):
    ...     print(x, end=' ')
    ...
    [0 1 2 3 4 5]
    
    
    >>> for x in np.nditer(a, flags=['external_loop'], order='F'):
    ...     print(x, end=' ')
    ...
    [0 3] [1 4] [2 5]
    
### Tracking an index or multi-index
During iteration, you may want to use the index of the current element in a computation. For example, you may want to visit the elements of an array in memory order, but use a C-order, Fortran-order, or multidimensional index to look up values in a different array.
The index is tracked by the iterator object itself, and accessible through the `index` or `multi_index` properties, depending on what was requested. The examples below show printouts demonstrating the progression of the index:
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> it = np.nditer(a, flags=['f_index'])
    >>> for x in it:
    ...     print("%d <%d>" % (x, it.index), end=' ')
    ...
    0 <0> 1 <2> 2 <4> 3 <1> 4 <3> 5 <5>
    
    
    >>> it = np.nditer(a, flags=['multi_index'])
    >>> for x in it:
    ...     print("%d <%s>" % (x, it.multi_index), end=' ')
    ...
    0 <(0, 0)> 1 <(0, 1)> 2 <(0, 2)> 3 <(1, 0)> 4 <(1, 1)> 5 <(1, 2)>
    
    
    >>> with np.nditer(a, flags=['multi_index'], op_flags=['writeonly']) as it:
    ...     for x in it:
    ...         x[...] = it.multi_index[1] - it.multi_index[0]
    ...
    >>> a
    array([[ 0,  1,  2],
           [-1,  0,  1]])
    
Tracking an index or multi-index is incompatible with using an external loop, because it requires a different index value per element. If you try to combine these flags, the `nditer` object will raise an exception.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.zeros((2,3))
    >>> it = np.nditer(a, flags=['c_index', 'external_loop'])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: Iterator flag EXTERNAL_LOOP cannot be used if an index or multi-index is being tracked
    
### Alternative looping and element access
To make its properties more readily accessible during iteration, `nditer` has an alternative syntax for iterating, which works explicitly with the iterator object itself. With this looping construct, the current value is accessible by indexing into the iterator. Other properties, such as tracked indices remain as before. The examples below produce identical results to the ones in the previous section.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> it = np.nditer(a, flags=['f_index'])
    >>> while not it.finished:
    ...     print("%d <%d>" % (it[0], it.index), end=' ')
    ...     is_not_finished = it.iternext()
    ...
    0 <0> 1 <2> 2 <4> 3 <1> 4 <3> 5 <5>
    
    
    >>> it = np.nditer(a, flags=['multi_index'])
    >>> while not it.finished:
    ...     print("%d <%s>" % (it[0], it.multi_index), end=' ')
    ...     is_not_finished = it.iternext()
    ...
    0 <(0, 0)> 1 <(0, 1)> 2 <(0, 2)> 3 <(1, 0)> 4 <(1, 1)> 5 <(1, 2)>
    
    
    >>> with np.nditer(a, flags=['multi_index'], op_flags=['writeonly']) as it:
    ...     while not it.finished:
    ...         it[0] = it.multi_index[1] - it.multi_index[0]
    ...         is_not_finished = it.iternext()
    ...
    >>> a
    array([[ 0,  1,  2],
           [-1,  0,  1]])
    
### Buffering the array elements
When forcing an iteration order, we observed that the external loop option may provide the elements in smaller chunks because the elements can’t be visited in the appropriate order with a constant stride. When writing C code, this is generally fine, however in pure Python code this can cause a significant reduction in performance.
By enabling buffering mode, the chunks provided by the iterator to the inner loop can be made larger, significantly reducing the overhead of the Python interpreter. In the example forcing Fortran iteration order, the inner loop gets to see all the elements in one go when buffering is enabled.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3)
    >>> for x in np.nditer(a, flags=['external_loop'], order='F'):
    ...     print(x, end=' ')
    ...
    [0 3] [1 4] [2 5]
    
    
    >>> for x in np.nditer(a, flags=['external_loop','buffered'], order='F'):
    ...     print(x, end=' ')
    ...
    [0 3 1 4 2 5]
    
### Iterating as a specific data type
There are times when it is necessary to treat an array as a different data type than it is stored as. For instance, one may want to do all computations on 64-bit floats, even if the arrays being manipulated are 32-bit floats. Except when writing low-level C code, it’s generally better to let the iterator handle the copying or buffering instead of casting the data type yourself in the inner loop.
There are two mechanisms which allow this to be done, temporary copies and buffering mode. With temporary copies, a copy of the entire array is made with the new data type, then iteration is done in the copy. Write access is permitted through a mode which updates the original array after all the iteration is complete. The major drawback of temporary copies is that the temporary copy may consume a large amount of memory, particularly if the iteration data type has a larger itemsize than the original one.
Buffering mode mitigates the memory usage issue and is more cache-friendly than making temporary copies. Except for special cases, where the whole array is needed at once outside the iterator, buffering is recommended over temporary copying. Within NumPy, buffering is used by the ufuncs and other functions to support flexible inputs with minimal memory overhead.
In our examples, we will treat the input array with a complex data type, so that we can take square roots of negative numbers. Without enabling copies or buffering mode, the iterator will raise an exception if the data type doesn’t match precisely.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3) - 3
    >>> for x in np.nditer(a, op_dtypes=['complex128']):
    ...     print(np.sqrt(x), end=' ')
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Iterator operand required copying or buffering, but neither copying nor buffering was enabled
    
In copying mode, ‘copy’ is specified as a per-operand flag. This is done to provide control in a per-operand fashion. Buffering mode is specified as an iterator flag.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6).reshape(2,3) - 3
    >>> for x in np.nditer(a, op_flags=['readonly','copy'],
    ...                 op_dtypes=['complex128']):
    ...     print(np.sqrt(x), end=' ')
    ...
    1.7320508075688772j 1.4142135623730951j 1j 0j (1+0j) (1.4142135623730951+0j)
    
    
    >>> for x in np.nditer(a, flags=['buffered'], op_dtypes=['complex128']):
    ...     print(np.sqrt(x), end=' ')
    ...
    1.7320508075688772j 1.4142135623730951j 1j 0j (1+0j) (1.4142135623730951+0j)
    
The iterator uses NumPy’s casting rules to determine whether a specific conversion is permitted. By default, it enforces ‘safe’ casting. This means, for example, that it will raise an exception if you try to treat a 64-bit float array as a 32-bit float array. In many cases, the rule ‘same_kind’ is the most reasonable rule to use, since it will allow conversion from 64 to 32-bit float, but not from float to int or from complex to float.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6.)
    >>> for x in np.nditer(a, flags=['buffered'], op_dtypes=['float32']):
    ...     print(x, end=' ')
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Iterator operand 0 dtype could not be cast from dtype('float64') to dtype('float32') according to the rule 'safe'
    
    
    >>> for x in np.nditer(a, flags=['buffered'], op_dtypes=['float32'],
    ...                 casting='same_kind'):
    ...     print(x, end=' ')
    ...
    0.0 1.0 2.0 3.0 4.0 5.0
    
    
    >>> for x in np.nditer(a, flags=['buffered'], op_dtypes=['int32'], casting='same_kind'):
    ...     print(x, end=' ')
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Iterator operand 0 dtype could not be cast from dtype('float64') to dtype('int32') according to the rule 'same_kind'
    
One thing to watch out for is conversions back to the original data type when using a read-write or write-only operand. A common case is to implement the inner loop in terms of 64-bit floats, and use ‘same_kind’ casting to allow the other floating-point types to be processed as well. While in read-only mode, an integer array could be provided, read-write mode will raise an exception because conversion back to the array would violate the casting rule.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(6)
    >>> for x in np.nditer(a, flags=['buffered'], op_flags=['readwrite'],
    ...                 op_dtypes=['float64'], casting='same_kind'):
    ...     x[...] = x / 2.0
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    TypeError: Iterator requested dtype could not be cast from dtype('float64') to dtype('int64'), the operand 0 dtype, according to the rule 'same_kind'
    
## Broadcasting array iteration
NumPy has a set of rules for dealing with arrays that have differing shapes which are applied whenever functions take multiple operands which combine element-wise. This is called broadcasting. The `nditer` object can apply these rules for you when you need to write such a function.
As an example, we print out the result of broadcasting a one and a two dimensional array together.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(3)
    >>> b = np.arange(6).reshape(2,3)
    >>> for x, y in np.nditer([a,b]):
    ...     print("%d:%d" % (x,y), end=' ')
    ...
    0:0 1:1 2:2 0:3 1:4 2:5
    
When a broadcasting error occurs, the iterator raises an exception which includes the input shapes to help diagnose the problem.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(2)
    >>> b = np.arange(6).reshape(2,3)
    >>> for x, y in np.nditer([a,b]):
    ...     print("%d:%d" % (x,y), end=' ')
    ...
    Traceback (most recent call last):
    ...
    ValueError: operands could not be broadcast together with shapes (2,) (2,3)
    
### Iterator-allocated output arrays
A common case in NumPy functions is to have outputs allocated based on the broadcasting of the input, and additionally have an optional parameter called ‘out’ where the result will be placed when it is provided. The `nditer` object provides a convenient idiom that makes it very easy to support this mechanism.
We’ll show how this works by creating a function `square` which squares its input. Let’s start with a minimal function definition excluding ‘out’ parameter support.
#### Example
    
    >>> import numpy as np
    
    
    >>> def square(a):
    ...     with np.nditer([a, None]) as it:
    ...         for x, y in it:
    ...             y[...] = x*x
    ...         return it.operands[1]
    ...
    >>> square([1,2,3])
    array([1, 4, 9])
    
By default, the `nditer` uses the flags ‘allocate’ and ‘writeonly’ for operands that are passed in as None. This means we were able to provide just the two operands to the iterator, and it handled the rest.
When adding the ‘out’ parameter, we have to explicitly provide those flags, because if someone passes in an array as ‘out’, the iterator will default to ‘readonly’, and our inner loop would fail. The reason ‘readonly’ is the default for input arrays is to prevent confusion about unintentionally triggering a reduction operation. If the default were ‘readwrite’, any broadcasting operation would also trigger a reduction, a topic which is covered later in this document.
While we’re at it, let’s also introduce the ‘no_broadcast’ flag, which will prevent the output from being broadcast. This is important, because we only want one input value for each output. Aggregating more than one input value is a reduction operation which requires special handling. It would already raise an error because reductions must be explicitly enabled in an iterator flag, but the error message that results from disabling broadcasting is much more understandable for end-users. To see how to generalize the square function to a reduction, look at the sum of squares function in the section about Cython.
For completeness, we’ll also add the ‘external_loop’ and ‘buffered’ flags, as these are what you will typically want for performance reasons.
#### Example
    
    >>> import numpy as np
    
    
    >>> def square(a, out=None):
    ...     it = np.nditer([a, out],
    ...             flags = ['external_loop', 'buffered'],
    ...             op_flags = [['readonly'],
    ...                         ['writeonly', 'allocate', 'no_broadcast']])
    ...     with it:
    ...         for x, y in it:
    ...             y[...] = x*x
    ...         return it.operands[1]
    ...
    
    
    >>> square([1,2,3])
    array([1, 4, 9])
    
    
    >>> b = np.zeros((3,))
    >>> square([1,2,3], out=b)
    array([1.,  4.,  9.])
    >>> b
    array([1.,  4.,  9.])
    
    
    >>> square(np.arange(6).reshape(2,3), out=b)
    Traceback (most recent call last):
      ...
    ValueError: non-broadcastable output operand with shape (3,) doesn't
    match the broadcast shape (2,3)
    
### Outer product iteration
Any binary operation can be extended to an array operation in an outer product fashion like in `outer`, and the `nditer` object provides a way to accomplish this by explicitly mapping the axes of the operands. It is also possible to do this with `newaxis` indexing, but we will show you how to directly use the nditer `op_axes` parameter to accomplish this with no intermediate views.
We’ll do a simple outer product, placing the dimensions of the first operand before the dimensions of the second operand. The `op_axes` parameter needs one list of axes for each operand, and provides a mapping from the iterator’s axes to the axes of the operand.
Suppose the first operand is one dimensional and the second operand is two dimensional. The iterator will have three dimensions, so `op_axes` will have two 3-element lists. The first list picks out the one axis of the first operand, and is -1 for the rest of the iterator axes, with a final result of [0, -1, -1]. The second list picks out the two axes of the second operand, but shouldn’t overlap with the axes picked out in the first operand. Its list is [-1, 0, 1]. The output operand maps onto the iterator axes in the standard manner, so we can provide None instead of constructing another list.
The operation in the inner loop is a straightforward multiplication. Everything to do with the outer product is handled by the iterator setup.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(3)
    >>> b = np.arange(8).reshape(2,4)
    >>> it = np.nditer([a, b, None], flags=['external_loop'],
    ...             op_axes=[[0, -1, -1], [-1, 0, 1], None])
    >>> with it:
    ...     for x, y, z in it:
    ...         z[...] = x*y
    ...     result = it.operands[2]  # same as z
    ...
    >>> result
    array([[[ 0,  0,  0,  0],
            [ 0,  0,  0,  0]],
            [[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
            [[ 0,  2,  4,  6],
            [ 8, 10, 12, 14]]])
    
Note that once the iterator is closed we can not access `operands` and must use a reference created inside the context manager.
### Reduction iteration
Whenever a writeable operand has fewer elements than the full iteration space, that operand is undergoing a reduction. The `nditer` object requires that any reduction operand be flagged as read-write, and only allows reductions when ‘reduce_ok’ is provided as an iterator flag.
For a simple example, consider taking the sum of all elements in an array.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(24).reshape(2,3,4)
    >>> b = np.array(0)
    >>> with np.nditer([a, b], flags=['reduce_ok'],
    ...                     op_flags=[['readonly'], ['readwrite']]) as it:
    ...     for x,y in it:
    ...         y[...] += x
    ...
    >>> b
    array(276)
    >>> np.sum(a)
    276
    
Things are a little bit more tricky when combining reduction and allocated operands. Before iteration is started, any reduction operand must be initialized to its starting values. Here’s how we can do this, taking sums along the last axis of `a`.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(24).reshape(2,3,4)
    >>> it = np.nditer([a, None], flags=['reduce_ok'],
    ...             op_flags=[['readonly'], ['readwrite', 'allocate']],
    ...             op_axes=[None, [0,1,-1]])
    >>> with it:
    ...     it.operands[1][...] = 0
    ...     for x, y in it:
    ...         y[...] += x
    ...     result = it.operands[1]
    ...
    >>> result
    array([[ 6, 22, 38],
           [54, 70, 86]])
    >>> np.sum(a, axis=2)
    array([[ 6, 22, 38],
           [54, 70, 86]])
    
To do buffered reduction requires yet another adjustment during the setup. Normally the iterator construction involves copying the first buffer of data from the readable arrays into the buffer. Any reduction operand is readable, so it may be read into a buffer. Unfortunately, initialization of the operand after this buffering operation is complete will not be reflected in the buffer that the iteration starts with, and garbage results will be produced.
The iterator flag “delay_bufalloc” is there to allow iterator-allocated reduction operands to exist together with buffering. When this flag is set, the iterator will leave its buffers uninitialized until it receives a reset, after which it will be ready for regular iteration. Here’s how the previous example looks if we also enable buffering.
#### Example
    
    >>> import numpy as np
    
    
    >>> a = np.arange(24).reshape(2,3,4)
    >>> it = np.nditer([a, None], flags=['reduce_ok',
    ...                                  'buffered', 'delay_bufalloc'],
    ...             op_flags=[['readonly'], ['readwrite', 'allocate']],
    ...             op_axes=[None, [0,1,-1]])
    >>> with it:
    ...     it.operands[1][...] = 0
    ...     it.reset()
    ...     for x, y in it:
    ...         y[...] += x
    ...     result = it.operands[1]
    ...
    >>> result
    array([[ 6, 22, 38],
           [54, 70, 86]])
    
## Putting the inner loop in Cython
Those who want really good performance out of their low level operations should strongly consider directly using the iteration API provided in C, but for those who are not comfortable with C or C++, Cython is a good middle ground with reasonable performance tradeoffs. For the `nditer` object, this means letting the iterator take care of broadcasting, dtype conversion, and buffering, while giving the inner loop to Cython.
For our example, we’ll create a sum of squares function. To start, let’s implement this function in straightforward Python. We want to support an ‘axis’ parameter similar to the numpy `sum` function, so we will need to construct a list for the `op_axes` parameter. Here’s how this looks.
#### Example
    
    >>> def axis_to_axeslist(axis, ndim):
    ...     if axis is None:
    ...         return [-1] * ndim
    ...     else:
    ...         if type(axis) is not tuple:
    ...             axis = (axis,)
    ...         axeslist = [1] * ndim
    ...         for i in axis:
    ...             axeslist[i] = -1
    ...         ax = 0
    ...         for i in range(ndim):
    ...             if axeslist[i] != -1:
    ...                 axeslist[i] = ax
    ...                 ax += 1
    ...         return axeslist
    ...
    >>> def sum_squares_py(arr, axis=None, out=None):
    ...     axeslist = axis_to_axeslist(axis, arr.ndim)
    ...     it = np.nditer([arr, out], flags=['reduce_ok',
    ...                                       'buffered', 'delay_bufalloc'],
    ...                 op_flags=[['readonly'], ['readwrite', 'allocate']],
    ...                 op_axes=[None, axeslist],
    ...                 op_dtypes=['float64', 'float64'])
    ...     with it:
    ...         it.operands[1][...] = 0
    ...         it.reset()
    ...         for x, y in it:
    ...             y[...] += x*x
    ...         return it.operands[1]
    ...
    >>> a = np.arange(6).reshape(2,3)
    >>> sum_squares_py(a)
    array(55.)
    >>> sum_squares_py(a, axis=-1)
    array([  5.,  50.])
    
To Cython-ize this function, we replace the inner loop (y[…] += x*x) with Cython code that’s specialized for the float64 dtype. With the ‘external_loop’ flag enabled, the arrays provided to the inner loop will always be one-dimensional, so very little checking needs to be done.
Here’s the listing of sum_squares.pyx:
    
    import numpy as np
    cimport numpy as np
    cimport cython
    
    def axis_to_axeslist(axis, ndim):
        if axis is None:
            return [-1] * ndim
        else:
            if type(axis) is not tuple:
                axis = (axis,)
            axeslist = [1] * ndim
            for i in axis:
                axeslist[i] = -1
            ax = 0
            for i in range(ndim):
                if axeslist[i] != -1:
                    axeslist[i] = ax
                    ax += 1
            return axeslist
    
    @cython.boundscheck(False)
    def sum_squares_cy(arr, axis=None, out=None):
        cdef np.ndarray[double] x
        cdef np.ndarray[double] y
        cdef int size
        cdef double value
    
        axeslist = axis_to_axeslist(axis, arr.ndim)
        it = np.nditer([arr, out], flags=['reduce_ok', 'external_loop',
                                          'buffered', 'delay_bufalloc'],
                    op_flags=[['readonly'], ['readwrite', 'allocate']],
                    op_axes=[None, axeslist],
                    op_dtypes=['float64', 'float64'])
        with it:
            it.operands[1][...] = 0
            it.reset()
            for xarr, yarr in it:
                x = xarr
                y = yarr
                size = x.shape[0]
                for i in range(size):
                   value = x[i]
                   y[i] = y[i] + value * value
            return it.operands[1]
    
On this machine, building the .pyx file into a module looked like the following, but you may have to find some Cython tutorials to tell you the specifics for your system configuration.:
    
    $ cython sum_squares.pyx
    $ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -I/usr/include/python2.7 -fno-strict-aliasing -o sum_squares.so sum_squares.c
    
Running this from the Python interpreter produces the same answers as our native Python/NumPy code did.
#### Example
    
    >>> from sum_squares import sum_squares_cy 
    >>> a = np.arange(6).reshape(2,3)
    >>> sum_squares_cy(a) 
    array(55.0)
    >>> sum_squares_cy(a, axis=-1) 
    array([  5.,  50.])
    
Doing a little timing in IPython shows that the reduced overhead and memory allocation of the Cython inner loop is providing a very nice speedup over both the straightforward Python code and an expression using NumPy’s built-in sum function.:
    
    >>> a = np.random.rand(1000,1000)
    
    >>> timeit sum_squares_py(a, axis=-1)
    10 loops, best of 3: 37.1 ms per loop
    
    >>> timeit np.sum(a*a, axis=-1)
    10 loops, best of 3: 20.9 ms per loop
    
    >>> timeit sum_squares_cy(a, axis=-1)
    100 loops, best of 3: 11.8 ms per loop
    
    >>> np.all(sum_squares_cy(a, axis=-1) == np.sum(a*a, axis=-1))
    True
    
    >>> np.all(sum_squares_py(a, axis=-1) == np.sum(a*a, axis=-1))
    True
    
# Data type promotion in NumPy
When mixing two different data types, NumPy has to determine the appropriate dtype for the result of the operation. This step is referred to as promotion or finding the common dtype.
In typical cases, the user does not need to worry about the details of promotion, since the promotion step usually ensures that the result will either match or exceed the precision of the input.
For example, when the inputs are of the same dtype, the dtype of the result matches the dtype of the inputs:
    
    >>> np.int8(1) + np.int8(1)
    np.int8(2)
    
Mixing two different dtypes normally produces a result with the dtype of the higher precision input:
    
    >>> np.int8(4) + np.int64(8)  # 64 > 8
    np.int64(12)
    >>> np.float32(3) + np.float16(3)  # 32 > 16
    np.float32(6.0)
    
In typical cases, this does not lead to surprises. However, if you work with non-default dtypes like unsigned integers and low-precision floats, or if you mix NumPy integers, NumPy floats, and Python scalars, some details of NumPy promotion rules may be relevant. Note that these detailed rules do not always match those of other languages [1].
Numerical dtypes come in four “kinds” with a natural hierarchy.
  1. unsigned integers (`uint`)
  2. signed integers (`int`)
  3. float (`float`)
  4. complex (`complex`)


In addition to kind, NumPy numerical dtypes also have an associated precision, specified in bits. Together, the kind and precision specify the dtype. For example, a `uint8` is an unsigned integer stored using 8 bits.
The result of an operation will always be of an equal or higher kind of any of the inputs. Furthermore, the result will always have a precision greater than or equal to those of the inputs. Already, this can lead to some examples which may be unexpected:
  1. When mixing floating point numbers and integers, the precision of the integer may force the result to a higher precision floating point. For example, the result of an operation involving `int64` and `float16` is `float64`.
  2. When mixing unsigned and signed integers with the same precision, the result will have higher precision than either inputs. Additionally, if one of them has 64bit precision already, no higher precision integer is available and for example an operation involving `int64` and `uint64` gives `float64`.


Please see the `Numerical promotion` section and image below for details on both.
## Detailed behavior of Python scalars
Since NumPy 2.0 [2], an important point in our promotion rules is that although operations involving two NumPy dtypes never lose precision, operations involving a NumPy dtype and a Python scalar (`int`, `float`, or `complex`) can lose precision. For instance, it is probably intuitive that the result of an operation between a Python integer and a NumPy integer should be a NumPy integer. However, Python integers have arbitrary precision whereas all NumPy dtypes have fixed precision, so the arbitrary precision of Python integers cannot be preserved.
More generally, NumPy considers the “kind” of Python scalars, but ignores their precision when determining the result dtype. This is often convenient. For instance, when working with arrays of a low precision dtype, it is usually desirable for simple operations with Python scalars to preserve the dtype.
    
    >>> arr_float32 = np.array([1, 2.5, 2.1], dtype="float32")
    >>> arr_float32 + 10.0  # undesirable to promote to float64
    array([11. , 12.5, 12.1], dtype=float32)
    >>> arr_int16 = np.array([3, 5, 7], dtype="int16")
    >>> arr_int16 + 10  # undesirable to promote to int64
    array([13, 15, 17], dtype=int16)
    
In both cases, the result precision is dictated by the NumPy dtype. Because of this, `arr_float32 + 3.0` behaves the same as `arr_float32 + np.float32(3.0)`, and `arr_int16 + 10` behaves as `arr_int16 + np.int16(10.)`.
As another example, when mixing NumPy integers with a Python `float` or `complex`, the result always has type `float64` or `complex128`:
>> np.int16(1) + 1.0 np.float64(2.0)
However, these rules can also lead to surprising behavior when working with low precision dtypes.
First, since the Python value is converted to a NumPy one before the operation can by performed, operations can fail with an error when the result seems obvious. For instance, `np.int8(1) + 1000` cannot continue because `1000` exceeds the maximum value of an `int8`. When the Python scalar cannot be coerced to the NumPy dtype, an error is raised:
    
    >>> np.int8(1) + 1000
    Traceback (most recent call last):
      ...
    OverflowError: Python integer 1000 out of bounds for int8
    >>> np.int64(1) * 10**100
    Traceback (most recent call last):
    ...
    OverflowError: Python int too large to convert to C long
    >>> np.float32(1) + 1e300
    np.float32(inf)
    ... RuntimeWarning: overflow encountered in cast
    
Second, since the Python float or integer precision is always ignored, a low precision NumPy scalar will keep using its lower precision unless explicitly converted to a higher precision NumPy dtype or Python scalar (e.g. via `int()`, `float()`, or `scalar.item()`). This lower precision may be detrimental to some calculations or lead to incorrect results, especially in the case of integer overflows:
    
    >>> np.int8(100) + 100  # the result exceeds the capacity of int8
    np.int8(-56)
    ... RuntimeWarning: overflow encountered in scalar add
    
Note that NumPy warns when overflows occur for scalars, but not for arrays; e.g., `np.array(100, dtype="uint8") + 100` will not warn.
## Numerical promotion
The following image shows the numerical promotion rules with the kinds on the vertical axis and the precision on the horizontal axis.
The input dtype with the higher kind determines the kind of the result dtype. The result dtype has a precision as low as possible without appearing to the left of either input dtype in the diagram.
Note the following specific rules and observations:
  1. When a Python `float` or `complex` interacts with a NumPy integer the result will be `float64` or `complex128` (yellow border). NumPy booleans will also be cast to the default integer [3]. This is not relevant when additionally NumPy floating point values are involved.
  2. The precision is drawn such that `float16 < int16 < uint16` because large `uint16` do not fit `int16` and large `int16` will lose precision when stored in a `float16`. This pattern however is broken since NumPy always considers `float64` and `complex128` to be acceptable promotion results for any integer value.
  3. A special case is that NumPy promotes many combinations of signed and unsigned integers to `float64`. A higher kind is used here because no signed integer dtype is sufficiently precise to hold a `uint64`.


## Exceptions to the general promotion rules
In NumPy promotion refers to what specific functions do with the result and in some cases, this means that NumPy may deviate from what the `np.result_type` would give.
### Behavior of `sum` and `prod`
`np.sum` and `np.prod` will always return the default integer type when summing over integer values (or booleans). This is usually an `int64`. The reason for this is that integer summations are otherwise very likely to overflow and give confusing results. This rule also applies to the underlying `np.add.reduce` and `np.multiply.reduce`.
### Notable behavior with NumPy or Python integer scalars
NumPy promotion refers to the result dtype and operation precision, but the operation will sometimes dictate that result. Division always returns floating point values and comparison always booleans.
This leads to what may appear as “exceptions” to the rules:
  * NumPy comparisons with Python integers or mixed precision integers always return the correct result. The inputs will never be cast in a way which loses precision.
  * Equality comparisons between types which cannot be promoted will be considered all `False` (equality) or all `True` (not-equal).
  * Unary math functions like `np.sin` that always return floating point values, accept any Python integer input by converting it to `float64`.
  * Division always returns floating point values and thus also allows divisions between any NumPy integer with any Python integer value by casting both to `float64`.


In principle, some of these exceptions may make sense for other functions. Please raise an issue if you feel this is the case.
## Promotion of non-numerical datatypes
NumPy extends the promotion to non-numerical types, although in many cases promotion is not well defined and simply rejected.
The following rules apply:
  * NumPy byte strings (`np.bytes_`) can be promoted to unicode strings (`np.str_`). However, casting the bytes to unicode will fail for non-ascii characters.
  * For some purposes NumPy will promote almost any other datatype to strings. This applies to array creation or concatenation.
  * The array constructors like `np.array()` will use `object` dtype when there is no viable promotion.
  * Structured dtypes can promote when their field names and order matches. In that case all fields are promoted individually.
  * NumPy `timedelta` can in some cases promote with integers.


Note
Some of these rules are somewhat surprising, and are being considered for change in the future. However, any backward-incompatible changes have to be weighed against the risks of breaking existing code. Please raise an issue if you have particular ideas about how promotion should work.
## Details of promoted `dtype` instances
The above discussion has mainly dealt with the behavior when mixing different DType classes. A `dtype` instance attached to an array can carry additional information such as byte-order, metadata, string length, or exact structured dtype layout.
While the string length or field names of a structured dtype are important, NumPy considers byte-order, metadata, and the exact layout of a structured dtype as storage details. During promotion NumPy does not take these storage details into account: * Byte-order is converted to native byte-order. * Metadata attached to the dtype may or may not be preserved. * Resulting structured dtypes will be packed (but aligned if inputs were).
This behaviors is the best behavior for most programs where storage details are not relevant to the final results and where the use of incorrect byte-order could drastically slow down evaluation.
[1]
To a large degree, this may just be for choices made early on in NumPy’s predecessors. For more details, see NEP 50.
[2]
See also NEP 50 which changed the rules for NumPy 2.0. Previous versions of NumPy would sometimes return higher precision results based on the input value of Python scalars. Further, previous versions of NumPy would typically ignore the higher precision of NumPy scalars or 0-D arrays for promotion purposes.
[3]
The default integer is marked as `int64` in the schema but is `int32` on 32bit platforms. However, normal PCs are 64bit.
# Scalars
Python defines only one type of a particular data class (there is only one integer type, one floating-point type, etc.). This can be convenient in applications that don’t need to be concerned with all the ways data can be represented in a computer. For scientific computing, however, more control is often needed.
In NumPy, there are 24 new fundamental Python types to describe different types of scalars. These type descriptors are mostly based on the types available in the C language that CPython is written in, with several additional types compatible with Python’s types.
Array scalars have the same attributes and methods as `ndarrays`. [1] This allows one to treat items of an array partly on the same footing as arrays, smoothing out rough edges that result when mixing scalar and array operations.
Array scalars live in a hierarchy (see the Figure below) of data types. They can be detected using the hierarchy: For example, `isinstance(val, np.generic)` will return `True` if val is an array scalar object. Alternatively, what kind of array scalar is present can be determined using other members of the data type hierarchy. Thus, for example `isinstance(val, np.complexfloating)` will return `True` if val is a complex valued type, while `isinstance(val, np.flexible)` will return true if val is one of the flexible itemsize array types (`str_`, `bytes_`, `void`).
Figure: Hierarchy of type objects representing the array data types. Not shown are the two integer types `intp` and `uintp` which are used for indexing (the same as the default integer since NumPy 2).
[1]
However, array scalars are immutable, so none of the array scalar attributes are settable.
## Built-in scalar types
The built-in scalar types are shown below. The C-like names are associated with character codes, which are shown in their descriptions. Use of the character codes, however, is discouraged.
Some of the scalar types are essentially equivalent to fundamental Python types and therefore inherit from them as well as from the generic array scalar type:
Array scalar type
Related Python type
Inherits?  
`int_`
`int`
Python 2 only  
`double`
`float`
yes  
`cdouble`
`complex`
yes  
`bytes_`
`bytes`
yes  
`str_`
`str`
yes  
`bool_`
`bool`
no  
`datetime64`
`datetime.datetime`
no  
`timedelta64`
`datetime.timedelta`
no  
The `bool_` data type is very similar to the Python `bool` but does not inherit from it because Python’s `bool` does not allow itself to be inherited from, and on the C-level the size of the actual bool data is not the same as a Python Boolean scalar.
Warning
The `int_` type does not inherit from the `int` built-in under Python 3, because type `int` is no longer a fixed-width integer type.
Tip
The default data type in NumPy is `double`.
classnumpy.generic[source]
    
Base class for numpy scalar types.
Class from which most (all?) numpy scalar types are derived. For consistency, exposes the same API as `ndarray`, despite many consequent attributes being either “get-only,” or completely irrelevant. This is the class from which it is strongly suggested users should derive custom scalar types.
classnumpy.number[source]
    
Abstract base class of all numeric scalar types.
### Integer types
classnumpy.integer[source]
    
Abstract base class of all integer scalar types.
Note
The numpy integer types mirror the behavior of C integers, and can therefore be subject to Overflow errors.
#### Signed integer types
classnumpy.signedinteger[source]
    
Abstract base class of all signed integer scalar types.
classnumpy.byte[source]
    
Signed integer type, compatible with C `char`.
Character code:
    
`'b'`
Canonical name:
    
`numpy.byte`
Alias on this platform (Linux x86_64):
    
`numpy.int8`: 8-bit signed integer (`-128` to `127`).
classnumpy.short[source]
    
Signed integer type, compatible with C `short`.
Character code:
    
`'h'`
Canonical name:
    
`numpy.short`
Alias on this platform (Linux x86_64):
    
`numpy.int16`: 16-bit signed integer (`-32_768` to `32_767`).
classnumpy.intc[source]
    
Signed integer type, compatible with C `int`.
Character code:
    
`'i'`
Canonical name:
    
`numpy.intc`
Alias on this platform (Linux x86_64):
    
`numpy.int32`: 32-bit signed integer (`-2_147_483_648` to `2_147_483_647`).
classnumpy.int_[source]
    
Default signed integer type, 64bit on 64bit systems and 32bit on 32bit systems.
Character code:
    
`'l'`
Canonical name:
    
`numpy.int_`
Alias on this platform (Linux x86_64):
    
`numpy.int64`: 64-bit signed integer (`-9_223_372_036_854_775_808` to `9_223_372_036_854_775_807`).
Alias on this platform (Linux x86_64):
    
`numpy.intp`: Signed integer large enough to fit pointer, compatible with C `intptr_t`.
numpy.long[source]
    
alias of `int_`
classnumpy.longlong[source]
    
Signed integer type, compatible with C `long long`.
Character code:
    
`'q'`
#### Unsigned integer types
classnumpy.unsignedinteger[source]
    
Abstract base class of all unsigned integer scalar types.
classnumpy.ubyte[source]
    
Unsigned integer type, compatible with C `unsigned char`.
Character code:
    
`'B'`
Canonical name:
    
`numpy.ubyte`
Alias on this platform (Linux x86_64):
    
`numpy.uint8`: 8-bit unsigned integer (`0` to `255`).
classnumpy.ushort[source]
    
Unsigned integer type, compatible with C `unsigned short`.
Character code:
    
`'H'`
Canonical name:
    
`numpy.ushort`
Alias on this platform (Linux x86_64):
    
`numpy.uint16`: 16-bit unsigned integer (`0` to `65_535`).
classnumpy.uintc[source]
    
Unsigned integer type, compatible with C `unsigned int`.
Character code:
    
`'I'`
Canonical name:
    
`numpy.uintc`
Alias on this platform (Linux x86_64):
    
`numpy.uint32`: 32-bit unsigned integer (`0` to `4_294_967_295`).
classnumpy.uint[source]
    
Unsigned signed integer type, 64bit on 64bit systems and 32bit on 32bit systems.
Character code:
    
`'L'`
Canonical name:
    
`numpy.uint`
Alias on this platform (Linux x86_64):
    
`numpy.uint64`: 64-bit unsigned integer (`0` to `18_446_744_073_709_551_615`).
Alias on this platform (Linux x86_64):
    
`numpy.uintp`: Unsigned integer large enough to fit pointer, compatible with C `uintptr_t`.
numpy.ulong[source]
    
alias of `uint`
classnumpy.ulonglong[source]
    
Signed integer type, compatible with C `unsigned long long`.
Character code:
    
`'Q'`
### Inexact types
classnumpy.inexact[source]
    
Abstract base class of all numeric scalar types with a (potentially) inexact representation of the values in its range, such as floating-point numbers.
Note
Inexact scalars are printed using the fewest decimal digits needed to distinguish their value from other values of the same datatype, by judicious rounding. See the `unique` parameter of `format_float_positional` and `format_float_scientific`.
This means that variables with equal binary values but whose datatypes are of different precisions may display differently:
    
    >>> import numpy as np
    
    
    >>> f16 = np.float16("0.1")
    >>> f32 = np.float32(f16)
    >>> f64 = np.float64(f32)
    >>> f16 == f32 == f64
    True
    >>> f16, f32, f64
    (0.1, 0.099975586, 0.0999755859375)
    
Note that none of these floats hold the exact value \\(\frac{1}{10}\\); `f16` prints as `0.1` because it is as close to that value as possible, whereas the other types do not as they have more precision and therefore have closer values.
Conversely, floating-point scalars of different precisions which approximate the same decimal value may compare unequal despite printing identically:
    
    >>> f16 = np.float16("0.1")
    >>> f32 = np.float32("0.1")
    >>> f64 = np.float64("0.1")
    >>> f16 == f32 == f64
    False
    >>> f16, f32, f64
    (0.1, 0.1, 0.1)
    
#### Floating-point types
classnumpy.floating[source]
    
Abstract base class of all floating-point scalar types.
classnumpy.half[source]
    
Half-precision floating-point number type.
Character code:
    
`'e'`
Canonical name:
    
`numpy.half`
Alias on this platform (Linux x86_64):
    
`numpy.float16`: 16-bit-precision floating-point number type: sign bit, 5 bits exponent, 10 bits mantissa.
classnumpy.single[source]
    
Single-precision floating-point number type, compatible with C `float`.
Character code:
    
`'f'`
Canonical name:
    
`numpy.single`
Alias on this platform (Linux x86_64):
    
`numpy.float32`: 32-bit-precision floating-point number type: sign bit, 8 bits exponent, 23 bits mantissa.
classnumpy.double(x=0, /)[source]
    
Double-precision floating-point number type, compatible with Python `float` and C `double`.
Character code:
    
`'d'`
Canonical name:
    
`numpy.double`
Alias on this platform (Linux x86_64):
    
`numpy.float64`: 64-bit precision floating-point number type: sign bit, 11 bits exponent, 52 bits mantissa.
classnumpy.longdouble[source]
    
Extended-precision floating-point number type, compatible with C `long double` but not necessarily with IEEE 754 quadruple-precision.
Character code:
    
`'g'`
Alias on this platform (Linux x86_64):
    
`numpy.float128`: 128-bit extended-precision floating-point number type.
#### Complex floating-point types
classnumpy.complexfloating[source]
    
Abstract base class of all complex number scalar types that are made up of floating-point numbers.
classnumpy.csingle[source]
    
Complex number type composed of two single-precision floating-point numbers.
Character code:
    
`'F'`
Canonical name:
    
`numpy.csingle`
Alias on this platform (Linux x86_64):
    
`numpy.complex64`: Complex number type composed of 2 32-bit-precision floating-point numbers.
classnumpy.cdouble(real=0, imag=0)[source]
    
Complex number type composed of two double-precision floating-point numbers, compatible with Python `complex`.
Character code:
    
`'D'`
Canonical name:
    
`numpy.cdouble`
Alias on this platform (Linux x86_64):
    
`numpy.complex128`: Complex number type composed of 2 64-bit-precision floating-point numbers.
classnumpy.clongdouble[source]
    
Complex number type composed of two extended-precision floating-point numbers.
Character code:
    
`'G'`
Alias on this platform (Linux x86_64):
    
`numpy.complex256`: Complex number type composed of 2 128-bit extended-precision floating-point numbers.
### Other types
numpy.bool_[source]
    
alias of `bool`
classnumpy.bool[source]
    
Boolean type (True or False), stored as a byte.
Warning
The `bool` type is not a subclass of the `int_` type (the `bool` is not even a number type). This is different than Python’s default implementation of `bool` as a sub-class of `int`.
Character code:
    
`'?'`
classnumpy.datetime64[source]
    
If created from a 64-bit integer, it represents an offset from `1970-01-01T00:00:00`. If created from string, the string can be in ISO 8601 date or datetime format.
When parsing a string to create a datetime object, if the string contains a trailing timezone (A ‘Z’ or a timezone offset), the timezone will be dropped and a User Warning is given.
Datetime64 objects should be considered to be UTC and therefore have an offset of +0000.
    
    >>> np.datetime64(10, 'Y')
    np.datetime64('1980')
    >>> np.datetime64('1980', 'Y')
    np.datetime64('1980')
    >>> np.datetime64(10, 'D')
    np.datetime64('1970-01-11')
    
See Datetimes and timedeltas for more information.
Character code:
    
`'M'`
classnumpy.timedelta64[source]
    
A timedelta stored as a 64-bit integer.
See Datetimes and timedeltas for more information.
Character code:
    
`'m'`
classnumpy.object_[source]
    
Any Python object.
Character code:
    
`'O'`
Note
The data actually stored in object arrays (i.e., arrays having dtype `object_`) are references to Python objects, not the objects themselves. Hence, object arrays behave more like usual Python `lists`, in the sense that their contents need not be of the same Python type.
The object type is also special because an array containing `object_` items does not return an `object_` object on item access, but instead returns the actual object that the array item refers to.
The following data types are flexible: they have no predefined size and the data they describe can be of different length in different arrays. (In the character codes `#` is an integer denoting how many elements the data type consists of.)
classnumpy.flexible[source]
    
Abstract base class of all scalar types without predefined length. The actual size of these types depends on the specific `numpy.dtype` instantiation.
classnumpy.character[source]
    
Abstract base class of all character string scalar types.
classnumpy.bytes_[source]
    
A byte string.
When used in arrays, this type strips trailing null bytes.
Character code:
    
`'S'`
classnumpy.str_[source]
    
A unicode string.
This type strips trailing null codepoints.
    
    >>> s = np.str_("abc\x00")
    >>> s
    'abc'
    
Unlike the builtin `str`, this supports the Buffer Protocol, exposing its contents as UCS4:
    
    >>> m = memoryview(np.str_("abc"))
    >>> m.format
    '3w'
    >>> m.tobytes()
    b'a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00'
    
Character code:
    
`'U'`
classnumpy.void(length_or_data, /, dtype=None)[source]
    
Create a new structured or unstructured void scalar.
Parameters:
    
length_or_dataint, array-like, bytes-like, object
    
One of multiple meanings (see notes). The length or bytes data of an unstructured void. Or alternatively, the data to be stored in the new scalar when `dtype` is provided. This can be an array-like, in which case an array may be returned.
dtypedtype, optional
    
If provided the dtype of the new scalar. This dtype must be “void” dtype (i.e. a structured or unstructured void, see also Structured datatypes).
New in version 1.24.
#### Notes
For historical reasons and because void scalars can represent both arbitrary byte data and structured dtypes, the void constructor has three calling conventions:
  1. `np.void(5)` creates a `dtype="V5"` scalar filled with five `\0` bytes. The 5 can be a Python or NumPy integer.
  2. `np.void(b"bytes-like")` creates a void scalar from the byte string. The dtype itemsize will match the byte string length, here `"V10"`.
  3. When a `dtype=` is passed the call is roughly the same as an array creation. However, a void scalar rather than array is returned.


Please see the examples which show all three different conventions.
#### Examples
    
    >>> np.void(5)
    np.void(b'\x00\x00\x00\x00\x00')
    >>> np.void(b'abcd')
    np.void(b'\x61\x62\x63\x64')
    >>> np.void((3.2, b'eggs'), dtype="d,S5")
    np.void((3.2, b'eggs'), dtype=[('f0', '<f8'), ('f1', 'S5')])
    >>> np.void(3, dtype=[('x', np.int8), ('y', np.int8)])
    np.void((3, 3), dtype=[('x', 'i1'), ('y', 'i1')])
    
Character code:
    
`'V'`
Warning
See Note on string types.
Numeric Compatibility: If you used old typecode characters in your Numeric code (which was never recommended), you will need to change some of them to the new characters. In particular, the needed changes are `c -> S1`, `b -> B`, `1 -> b`, `s -> h`, `w -> H`, and `u -> I`. These changes make the type character convention more consistent with other Python modules such as the `struct` module.
### Sized aliases
Along with their (mostly) C-derived names, the integer, float, and complex data-types are also available using a bit-width convention so that an array of the right size can always be ensured. Two aliases (`numpy.intp` and `numpy.uintp`) pointing to the integer type that is sufficiently large to hold a C pointer are also provided.
numpy.int8[source]
numpy.int16
numpy.int32
numpy.int64
    
Aliases for the signed integer types (one of `numpy.byte`, `numpy.short`, `numpy.intc`, `numpy.int_`, `numpy.long` and `numpy.longlong`) with the specified number of bits.
Compatible with the C99 `int8_t`, `int16_t`, `int32_t`, and `int64_t`, respectively.
numpy.uint8[source]
numpy.uint16
numpy.uint32
numpy.uint64
    
Alias for the unsigned integer types (one of `numpy.ubyte`, `numpy.ushort`, `numpy.uintc`, `numpy.uint`, `numpy.ulong` and `numpy.ulonglong`) with the specified number of bits.
Compatible with the C99 `uint8_t`, `uint16_t`, `uint32_t`, and `uint64_t`, respectively.
numpy.intp[source]
    
Alias for the signed integer type (one of `numpy.byte`, `numpy.short`, `numpy.intc`, `numpy.int_`, `numpy.long` and `numpy.longlong`) that is used as a default integer and for indexing.
Compatible with the C `Py_ssize_t`.
Character code:
    
`'n'`
Changed in version 2.0: Before NumPy 2, this had the same size as a pointer. In practice this is almost always identical, but the character code `'p'` maps to the C `intptr_t`. The character code `'n'` was added in NumPy 2.0.
numpy.uintp[source]
    
Alias for the unsigned integer type that is the same size as `intp`.
Compatible with the C `size_t`.
Character code:
    
`'N'`
Changed in version 2.0: Before NumPy 2, this had the same size as a pointer. In practice this is almost always identical, but the character code `'P'` maps to the C `uintptr_t`. The character code `'N'` was added in NumPy 2.0.
numpy.float16[source]
    
alias of `half`
numpy.float32[source]
    
alias of `single`
numpy.float64[source]
    
alias of `double`
numpy.float96
numpy.float128[source]
    
Alias for `numpy.longdouble`, named after its size in bits. The existence of these aliases depends on the platform.
numpy.complex64[source]
    
alias of `csingle`
numpy.complex128[source]
    
alias of `cdouble`
numpy.complex192
numpy.complex256[source]
    
Alias for `numpy.clongdouble`, named after its size in bits. The existence of these aliases depends on the platform.
## Attributes
The array scalar objects have an `array priority` of `NPY_SCALAR_PRIORITY` (-1,000,000.0). They also do not (yet) have a `ctypes` attribute. Otherwise, they share the same attributes as arrays:
`generic.flags`
The integer value of flags.  
`generic.shape`
Tuple of array dimensions.  
`generic.strides`
Tuple of bytes steps in each dimension.  
`generic.ndim`
The number of array dimensions.  
`generic.data`
Pointer to start of data.  
`generic.size`
The number of elements in the gentype.  
`generic.itemsize`
The length of one element in bytes.  
`generic.base`
Scalar attribute identical to the corresponding array attribute.  
`generic.dtype`
Get array data-descriptor.  
`generic.real`
The real part of the scalar.  
`generic.imag`
The imaginary part of the scalar.  
`generic.flat`
A 1-D view of the scalar.  
`generic.T`
Scalar attribute identical to the corresponding array attribute.  
`generic.__array_interface__`
Array protocol: Python side  
`generic.__array_struct__`
Array protocol: struct  
`generic.__array_priority__`
Array priority.  
`generic.__array_wrap__`
__array_wrap__ implementation for scalar types  
## Indexing
See also
Indexing routines, Data type objects (dtype)
Array scalars can be indexed like 0-dimensional arrays: if x is an array scalar,
  * `x[()]` returns a copy of array scalar
  * `x[...]` returns a 0-dimensional `ndarray`
  * `x['field-name']` returns the array scalar in the field field-name. (x can have fields, for example, when it corresponds to a structured data type.)


## Methods
Array scalars have exactly the same methods as arrays. The default behavior of these methods is to internally convert the scalar to an equivalent 0-dimensional array and to call the corresponding array method. In addition, math operations on array scalars are defined so that the same hardware flags are set and used to interpret the results as for ufunc, so that the error state used for ufuncs also carries over to the math on array scalars.
The exceptions to the above rules are given below:
`generic.__array__`
sc.__array__(dtype) return 0-dim array from scalar with specified dtype  
`generic.__array_wrap__`
__array_wrap__ implementation for scalar types  
`generic.squeeze`
Scalar method identical to the corresponding array attribute.  
`generic.byteswap`
Scalar method identical to the corresponding array attribute.  
`generic.__reduce__`
Helper for pickle.  
`generic.__setstate__`  
`generic.setflags`
Scalar method identical to the corresponding array attribute.  
Utility method for typing:
`number.__class_getitem__`(item, /)
Return a parametrized wrapper around the `number` type.  
## Defining new types
There are two ways to effectively define a new array scalar type (apart from composing structured types dtypes from the built-in scalar types): One way is to simply subclass the `ndarray` and overwrite the methods of interest. This will work to a degree, but internally certain behaviors are fixed by the data type of the array. To fully customize the data type of an array you need to define a new data-type, and register it with NumPy. Such new types can only be defined in C, using the NumPy C-API.
# Constants
NumPy includes several constants:
numpy.e
    
Euler’s constant, base of natural logarithms, Napier’s constant.
`e = 2.71828182845904523536028747135266249775724709369995...`
#### See Also
exp : Exponential function log : Natural logarithm
#### References
https://en.wikipedia.org/wiki/E_%28mathematical_constant%29
numpy.euler_gamma
    
`γ = 0.5772156649015328606065120900824024310421...`
#### References
https://en.wikipedia.org/wiki/Euler%27s_constant
numpy.inf
    
IEEE 754 floating point representation of (positive) infinity.
#### Returns
yfloat
    
A floating point representation of positive infinity.
#### See Also
isinf : Shows which elements are positive or negative infinity
isposinf : Shows which elements are positive infinity
isneginf : Shows which elements are negative infinity
isnan : Shows which elements are Not a Number
isfinite : Shows which elements are finite (not one of Not a Number, positive infinity and negative infinity)
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Also that positive infinity is not equivalent to negative infinity. But infinity is equivalent to positive infinity.
#### Examples
    
    >>> import numpy as np
    >>> np.inf
    inf
    >>> np.array([1]) / 0.
    array([inf])
    
numpy.nan
    
IEEE 754 floating point representation of Not a Number (NaN).
#### Returns
y : A floating point representation of Not a Number.
#### See Also
isnan : Shows which elements are Not a Number.
isfinite : Shows which elements are finite (not one of Not a Number, positive infinity and negative infinity)
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity.
#### Examples
    
    >>> import numpy as np
    >>> np.nan
    nan
    >>> np.log(-1)
    np.float64(nan)
    >>> np.log([-1, 1, 2])
    array([       nan, 0.        , 0.69314718])
    
numpy.newaxis
    
A convenient alias for None, useful for indexing arrays.
#### Examples
    
    >>> import numpy as np
    >>> np.newaxis is None
    True
    >>> x = np.arange(3)
    >>> x
    array([0, 1, 2])
    >>> x[:, np.newaxis]
    array([[0],
    [1],
    [2]])
    >>> x[:, np.newaxis, np.newaxis]
    array([[[0]],
    [[1]],
    [[2]]])
    >>> x[:, np.newaxis] * x
    array([[0, 0, 0],
        [0, 1, 2],
        [0, 2, 4]])
    
Outer product, same as `outer(x, y)`:
    
    >>> y = np.arange(3, 6)
    >>> x[:, np.newaxis] * y
    array([[ 0,  0,  0],
        [ 3,  4,  5],
        [ 6,  8, 10]])
    
`x[np.newaxis, :]` is equivalent to `x[np.newaxis]` and `x[None]`:
    
    >>> x[np.newaxis, :].shape
    (1, 3)
    >>> x[np.newaxis].shape
    (1, 3)
    >>> x[None].shape
    (1, 3)
    >>> x[:, np.newaxis].shape
    (3, 1)
    
numpy.pi
    
`pi = 3.1415926535897932384626433...`
#### References
https://en.wikipedia.org/wiki/Pi
# numpy.__array_namespace_info__.capabilities
method
__array_namespace_info__.capabilities()[source]
    
Return a dictionary of array API library capabilities.
The resulting dictionary has the following keys:
  * “boolean indexing”: boolean indicating whether an array library supports boolean indexing. Always `True` for NumPy.
  * “data-dependent shapes”: boolean indicating whether an array library supports data-dependent output shapes. Always `True` for NumPy.


See https://data-apis.org/array-api/latest/API_specification/generated/array_api.info.capabilities.html for more details.
Returns:
    
capabilitiesdict
    
A dictionary of array API library capabilities.
See also
`__array_namespace_info__.default_device`
`__array_namespace_info__.default_dtypes`
`__array_namespace_info__.dtypes`
`__array_namespace_info__.devices`
#### Examples
    
    >>> info = np.__array_namespace_info__()
    >>> info.capabilities()
    {'boolean indexing': True,
     'data-dependent shapes': True}
    
# numpy.__array_namespace_info__.default_device
method
__array_namespace_info__.default_device()[source]
    
The default device used for new NumPy arrays.
For NumPy, this always returns `'cpu'`.
Returns:
    
devicestr
    
The default device used for new NumPy arrays.
See also
`__array_namespace_info__.capabilities`
`__array_namespace_info__.default_dtypes`
`__array_namespace_info__.dtypes`
`__array_namespace_info__.devices`
#### Examples
    
    >>> info = np.__array_namespace_info__()
    >>> info.default_device()
    'cpu'
    
# numpy.__array_namespace_info__.default_dtypes
method
__array_namespace_info__.default_dtypes(*, device=None)[source]
    
The default data types used for new NumPy arrays.
For NumPy, this always returns the following dictionary:
  * “real floating”: `numpy.float64`
  * “complex floating”: `numpy.complex128`
  * “integral”: `numpy.intp`
  * “indexing”: `numpy.intp`


Parameters:
    
devicestr, optional
    
The device to get the default data types for. For NumPy, only `'cpu'` is allowed.
Returns:
    
dtypesdict
    
A dictionary describing the default data types used for new NumPy arrays.
See also
`__array_namespace_info__.capabilities`
`__array_namespace_info__.default_device`
`__array_namespace_info__.dtypes`
`__array_namespace_info__.devices`
#### Examples
    
    >>> info = np.__array_namespace_info__()
    >>> info.default_dtypes()
    {'real floating': numpy.float64,
     'complex floating': numpy.complex128,
     'integral': numpy.int64,
     'indexing': numpy.int64}
    
# numpy.__array_namespace_info__.devices
method
__array_namespace_info__.devices()[source]
    
The devices supported by NumPy.
For NumPy, this always returns `['cpu']`.
Returns:
    
deviceslist of str
    
The devices supported by NumPy.
See also
`__array_namespace_info__.capabilities`
`__array_namespace_info__.default_device`
`__array_namespace_info__.default_dtypes`
`__array_namespace_info__.dtypes`
#### Examples
    
    >>> info = np.__array_namespace_info__()
    >>> info.devices()
    ['cpu']
    
# numpy.__array_namespace_info__.dtypes
method
__array_namespace_info__.dtypes(*, device=None, kind=None)[source]
    
The array API data types supported by NumPy.
Note that this function only returns data types that are defined by the array API.
Parameters:
    
devicestr, optional
    
The device to get the data types for. For NumPy, only `'cpu'` is allowed.
kindstr or tuple of str, optional
    
The kind of data types to return. If `None`, all data types are returned. If a string, only data types of that kind are returned. If a tuple, a dictionary containing the union of the given kinds is returned. The following kinds are supported:
  * `'bool'`: boolean data types (i.e., `bool`).
  * `'signed integer'`: signed integer data types (i.e., `int8`, `int16`, `int32`, `int64`).
  * `'unsigned integer'`: unsigned integer data types (i.e., `uint8`, `uint16`, `uint32`, `uint64`).
  * `'integral'`: integer data types. Shorthand for `('signed integer', 'unsigned integer')`.
  * `'real floating'`: real-valued floating-point data types (i.e., `float32`, `float64`).
  * `'complex floating'`: complex floating-point data types (i.e., `complex64`, `complex128`).
  * `'numeric'`: numeric data types. Shorthand for `('integral', 'real floating', 'complex floating')`.


Returns:
    
dtypesdict
    
A dictionary mapping the names of data types to the corresponding NumPy data types.
See also
`__array_namespace_info__.capabilities`
`__array_namespace_info__.default_device`
`__array_namespace_info__.default_dtypes`
`__array_namespace_info__.devices`
#### Examples
    
    >>> info = np.__array_namespace_info__()
    >>> info.dtypes(kind='signed integer')
    {'int8': numpy.int8,
     'int16': numpy.int16,
     'int32': numpy.int32,
     'int64': numpy.int64}
    
# numpy.__array_namespace_info__
classnumpy.__array_namespace_info__[source]
    
Get the array API inspection namespace for NumPy.
The array API inspection namespace defines the following functions:
  * capabilities()
  * default_device()
  * default_dtypes()
  * dtypes()
  * devices()


See https://data-apis.org/array-api/latest/API_specification/inspection.html for more details.
Returns:
    
infoModuleType
    
The array API inspection namespace for NumPy.
#### Examples
    
    >>> info = np.__array_namespace_info__()
    >>> info.default_dtypes()
    {'real floating': numpy.float64,
     'complex floating': numpy.complex128,
     'integral': numpy.int64,
     'indexing': numpy.int64}
    
#### Methods
`capabilities`()
Return a dictionary of array API library capabilities.  
`default_device`()
The default device used for new NumPy arrays.  
`default_dtypes`(*[, device])
The default data types used for new NumPy arrays.  
`devices`()
The devices supported by NumPy.  
`dtypes`(*[, device, kind])
The array API data types supported by NumPy.  
# numpy.absolute
numpy.absolute(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'absolute'>
    
Calculate the absolute value element-wise.
`np.abs` is a shorthand for this function.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
absolutendarray
    
An ndarray containing the absolute value of each element in `x`. For complex input, `a + ib`, the absolute value is \\(\sqrt{ a^2 + b^2 }\\). This is a scalar if `x` is a scalar.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([-1.2, 1.2])
    >>> np.absolute(x)
    array([ 1.2,  1.2])
    >>> np.absolute(1.2 + 1j)
    1.5620499351813308
    
Plot the function over `[-10, 10]`:
    
    >>> import matplotlib.pyplot as plt
    
    
    >>> x = np.linspace(start=-10, stop=10, num=101)
    >>> plt.plot(x, np.absolute(x))
    >>> plt.show()
    
Plot the function over the complex plane:
    
    >>> xx = x + 1j * x[:, np.newaxis]
    >>> plt.imshow(np.abs(xx), extent=[-10, 10, -10, 10], cmap='gray')
    >>> plt.show()
    
The `abs` function can be used as a shorthand for `np.absolute` on ndarrays.
    
    >>> x = np.array([-1.2, 1.2])
    >>> abs(x)
    array([1.2, 1.2])
    
# numpy.acos
numpy.acos(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arccos'>
    
Trigonometric inverse cosine, element-wise.
The inverse of `cos` so that, if `y = cos(x)`, then `x = arccos(y)`.
Parameters:
    
xarray_like
    
`x`-coordinate on the unit circle. For real arguments, the domain is [-1, 1].
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
anglendarray
    
The angle of the ray intersecting the unit circle at the given `x`-coordinate in radians [0, pi]. This is a scalar if `x` is a scalar.
See also
`cos`, `arctan`, `arcsin`, `emath.arccos`
#### Notes
`arccos` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `cos(z) = x`. The convention is to return the angle `z` whose real part lies in `[0, pi]`.
For real-valued input data types, `arccos` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arccos` is a complex analytic function that has branch cuts `[-inf, -1]` and `[1, inf]` and is continuous from above on the former and from below on the latter.
The inverse `cos` is also known as `acos` or cos^-1.
#### References
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 79. https://personal.math.ubc.ca/~cbm/aands/page_79.htm
#### Examples
    
    >>> import numpy as np
    
We expect the arccos of 1 to be 0, and of -1 to be pi:
    
    >>> np.arccos([1, -1])
    array([ 0.        ,  3.14159265])
    
Plot arccos:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(-1, 1, num=100)
    >>> plt.plot(x, np.arccos(x))
    >>> plt.axis('tight')
    >>> plt.show()
    
# numpy.acosh
numpy.acosh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arccosh'>
    
Inverse hyperbolic cosine, element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
arccoshndarray
    
Array of the same shape as `x`. This is a scalar if `x` is a scalar.
See also
`cosh`, `arcsinh`, `sinh`, `arctanh`, `tanh`
#### Notes
`arccosh` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `cosh(z) = x`. The convention is to return the `z` whose imaginary part lies in `[-pi, pi]` and the real part in `[0, inf]`.
For real-valued input data types, `arccosh` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arccosh` is a complex analytical function that has a branch cut `[-inf, 1]` and is continuous from above on it.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 86. https://personal.math.ubc.ca/~cbm/aands/page_86.htm
[2]
Wikipedia, “Inverse hyperbolic function”, https://en.wikipedia.org/wiki/Arccosh
#### Examples
    
    >>> import numpy as np
    >>> np.arccosh([np.e, 10.0])
    array([ 1.65745445,  2.99322285])
    >>> np.arccosh(1)
    0.0
    
# numpy.add
numpy.add(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'add'>
    
Add arguments element-wise.
Parameters:
    
x1, x2array_like
    
The arrays to be added. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
addndarray or scalar
    
The sum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
#### Notes
Equivalent to `x1` \+ `x2` in terms of array broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.add(1.0, 4.0)
    5.0
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.add(x1, x2)
    array([[  0.,   2.,   4.],
           [  3.,   5.,   7.],
           [  6.,   8.,  10.]])
    
The `+` operator can be used as a shorthand for `np.add` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> x1 + x2
    array([[ 0.,  2.,  4.],
           [ 3.,  5.,  7.],
           [ 6.,  8., 10.]])
    
# numpy.all
numpy.all(a, axis=None, out=None, keepdims=<no value>, *, where=<no value>)[source]
    
Test whether all array elements along a given axis evaluate to True.
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array.
axisNone or int or tuple of ints, optional
    
Axis or axes along which a logical AND reduction is performed. The default (`axis=None`) is to perform a logical AND over all the dimensions of the input array. `axis` may be negative, in which case it counts from the last to the first axis. If this is a tuple of ints, a reduction is performed on multiple axes, instead of a single axis or all the axes as before.
outndarray, optional
    
Alternate output array in which to place the result. It must have the same shape as the expected output and its type is preserved (e.g., if `dtype(out)` is float, the result will consist of 0.0’s and 1.0’s). See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `all` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in checking for all `True` values. See `reduce` for details.
New in version 1.20.0.
Returns:
    
allndarray, bool
    
A new boolean or array is returned unless `out` is specified, in which case a reference to `out` is returned.
See also
`ndarray.all`
    
equivalent method
`any`
    
Test whether any element along a given axis evaluates to True.
#### Notes
Not a Number (NaN), positive infinity and negative infinity evaluate to `True` because these are not equal to zero.
Changed in version 2.0: Before NumPy 2.0, `all` did not return booleans for object dtype input arrays. This behavior is still available via `np.logical_and.reduce`.
#### Examples
    
    >>> import numpy as np
    >>> np.all([[True,False],[True,True]])
    False
    
    
    >>> np.all([[True,False],[True,True]], axis=0)
    array([ True, False])
    
    
    >>> np.all([-1, 4, 5])
    True
    
    
    >>> np.all([1.0, np.nan])
    True
    
    
    >>> np.all([[True, True], [False, True]], where=[[True], [False]])
    True
    
    
    >>> o=np.array(False)
    >>> z=np.all([-1, 4, 5], out=o)
    >>> id(z), id(o), z
    (28293632, 28293632, array(True)) # may vary
    
# numpy.allclose
numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)[source]
    
Returns True if two arrays are element-wise equal within a tolerance.
The tolerance values are positive, typically very small numbers. The relative difference (`rtol` * abs(`b`)) and the absolute difference `atol` are added together to compare against the absolute difference between `a` and `b`.
Warning
The default `atol` is not appropriate for comparing numbers with magnitudes much smaller than one (see Notes).
NaNs are treated as equal if they are in the same place and if `equal_nan=True`. Infs are treated as equal if they are in the same place and of the same sign in both arrays.
Parameters:
    
a, barray_like
    
Input arrays to compare.
rtolarray_like
    
The relative tolerance parameter (see Notes).
atolarray_like
    
The absolute tolerance parameter (see Notes).
equal_nanbool
    
Whether to compare NaN’s as equal. If True, NaN’s in `a` will be considered equal to NaN’s in `b` in the output array.
Returns:
    
allclosebool
    
Returns True if the two arrays are equal within the given tolerance; False otherwise.
See also
`isclose`, `all`, `any`, `equal`
#### Notes
If the following equation is element-wise True, then allclose returns True.:
    
    absolute(a - b) <= (atol + rtol * absolute(b))
    
The above equation is not symmetric in `a` and `b`, so that `allclose(a, b)` might be different from `allclose(b, a)` in some rare cases.
The default value of `atol` is not appropriate when the reference value `b` has magnitude smaller than one. For example, it is unlikely that `a = 1e-9` and `b = 2e-9` should be considered “close”, yet `allclose(1e-9, 2e-9)` is `True` with default settings. Be sure to select `atol` for the use case at hand, especially for defining the threshold below which a non-zero value in `a` will be considered “close” to a very small or zero value in `b`.
The comparison of `a` and `b` uses standard broadcasting, which means that `a` and `b` need not have the same shape in order for `allclose(a, b)` to evaluate to True. The same is true for `equal` but not `array_equal`.
`allclose` is not defined for non-numeric data types. `bool` is considered a numeric data-type for this purpose.
#### Examples
    
    >>> import numpy as np
    >>> np.allclose([1e10,1e-7], [1.00001e10,1e-8])
    False
    
    
    >>> np.allclose([1e10,1e-8], [1.00001e10,1e-9])
    True
    
    
    >>> np.allclose([1e10,1e-8], [1.0001e10,1e-9])
    False
    
    
    >>> np.allclose([1.0, np.nan], [1.0, np.nan])
    False
    
    
    >>> np.allclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
    True
    
# numpy.amax
numpy.amax(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the maximum of an array or maximum along an axis.
`amax` is an alias of `max`.
See also
`max`
    
alias of this function
`ndarray.max`
    
equivalent method
# numpy.amin
numpy.amin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the minimum of an array or minimum along an axis.
`amin` is an alias of `min`.
See also
`min`
    
alias of this function
`ndarray.min`
    
equivalent method
# numpy.angle
numpy.angle(z, deg=False)[source]
    
Return the angle of the complex argument.
Parameters:
    
zarray_like
    
A complex number or sequence of complex numbers.
degbool, optional
    
Return angle in degrees if True, radians if False (default).
Returns:
    
anglendarray or scalar
    
The counterclockwise angle from the positive real axis on the complex plane in the range `(-pi, pi]`, with dtype as numpy.float64.
See also
`arctan2`
`absolute`
#### Notes
This function passes the imaginary and real parts of the argument to `arctan2` to compute the result; consequently, it follows the convention of `arctan2` when the magnitude of the argument is zero. See example.
#### Examples
    
    >>> import numpy as np
    >>> np.angle([1.0, 1.0j, 1+1j])               # in radians
    array([ 0.        ,  1.57079633,  0.78539816]) # may vary
    >>> np.angle(1+1j, deg=True)                  # in degrees
    45.0
    >>> np.angle([0., -0., complex(0., -0.), complex(-0., -0.)])  # convention
    array([ 0.        ,  3.14159265, -0.        , -3.14159265])
    
# numpy.any
numpy.any(a, axis=None, out=None, keepdims=<no value>, *, where=<no value>)[source]
    
Test whether any array element along a given axis evaluates to True.
Returns single boolean if `axis` is `None`
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array.
axisNone or int or tuple of ints, optional
    
Axis or axes along which a logical OR reduction is performed. The default (`axis=None`) is to perform a logical OR over all the dimensions of the input array. `axis` may be negative, in which case it counts from the last to the first axis. If this is a tuple of ints, a reduction is performed on multiple axes, instead of a single axis or all the axes as before.
outndarray, optional
    
Alternate output array in which to place the result. It must have the same shape as the expected output and its type is preserved (e.g., if it is of type float, then it will remain so, returning 1.0 for True and 0.0 for False, regardless of the type of `a`). See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `any` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in checking for any `True` values. See `reduce` for details.
New in version 1.20.0.
Returns:
    
anybool or ndarray
    
A new boolean or `ndarray` is returned unless `out` is specified, in which case a reference to `out` is returned.
See also
`ndarray.any`
    
equivalent method
`all`
    
Test whether all elements along a given axis evaluate to True.
#### Notes
Not a Number (NaN), positive infinity and negative infinity evaluate to `True` because these are not equal to zero.
Changed in version 2.0: Before NumPy 2.0, `any` did not return booleans for object dtype input arrays. This behavior is still available via `np.logical_or.reduce`.
#### Examples
    
    >>> import numpy as np
    >>> np.any([[True, False], [True, True]])
    True
    
    
    >>> np.any([[True,  False, True ],
    ...         [False, False, False]], axis=0)
    array([ True, False, True])
    
    
    >>> np.any([-1, 0, 5])
    True
    
    
    >>> np.any([[np.nan], [np.inf]], axis=1, keepdims=True)
    array([[ True],
           [ True]])
    
    
    >>> np.any([[True, False], [False, False]], where=[[False], [True]])
    False
    
    
    >>> a = np.array([[1, 0, 0],
    ...               [0, 0, 1],
    ...               [0, 0, 0]])
    >>> np.any(a, axis=0)
    array([ True, False,  True])
    >>> np.any(a, axis=1)
    array([ True,  True, False])
    
    
    >>> o=np.array(False)
    >>> z=np.any([-1, 4, 5], out=o)
    >>> z, o
    (array(True), array(True))
    >>> # Check now that z is a reference to o
    >>> z is o
    True
    >>> id(z), id(o) # identity of z and o              
    (191614240, 191614240)
    
# numpy.append
numpy.append(arr, values, axis=None)[source]
    
Append values to the end of an array.
Parameters:
    
arrarray_like
    
Values are appended to a copy of this array.
valuesarray_like
    
These values are appended to a copy of `arr`. It must be of the correct shape (the same shape as `arr`, excluding `axis`). If `axis` is not specified, `values` can be any shape and will be flattened before use.
axisint, optional
    
The axis along which `values` are appended. If `axis` is not given, both `arr` and `values` are flattened before use.
Returns:
    
appendndarray
    
A copy of `arr` with `values` appended to `axis`. Note that `append` does not occur in-place: a new array is allocated and filled. If `axis` is None, `out` is a flattened array.
See also
`insert`
    
Insert elements into an array.
`delete`
    
Delete elements from an array.
#### Examples
    
    >>> import numpy as np
    >>> np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]])
    array([1, 2, 3, ..., 7, 8, 9])
    
When `axis` is specified, `values` must have the correct shape.
    
    >>> np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0)
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    
    >>> np.append([[1, 2, 3], [4, 5, 6]], [7, 8, 9], axis=0)
    Traceback (most recent call last):
        ...
    ValueError: all the input arrays must have same number of dimensions, but
    the array at index 0 has 2 dimension(s) and the array at index 1 has 1
    dimension(s)
    
    
    >>> a = np.array([1, 2], dtype=int)
    >>> c = np.append(a, [])
    >>> c
    array([1., 2.])
    >>> c.dtype
    float64
    
Default dtype for empty ndarrays is `float64` thus making the output of dtype `float64` when appended with dtype `int64`
# numpy.apply_along_axis
numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)[source]
    
Apply a function to 1-D slices along the given axis.
Execute `func1d(a, *args, **kwargs)` where `func1d` operates on 1-D arrays and `a` is a 1-D slice of `arr` along `axis`.
This is equivalent to (but faster than) the following use of `ndindex` and `s_`, which sets each of `ii`, `jj`, and `kk` to a tuple of indices:
    
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            f = func1d(arr[ii + s_[:,] + kk])
            Nj = f.shape
            for jj in ndindex(Nj):
                out[ii + jj + kk] = f[jj]
    
Equivalently, eliminating the inner loop, this can be expressed as:
    
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            out[ii + s_[...,] + kk] = func1d(arr[ii + s_[:,] + kk])
    
Parameters:
    
func1dfunction (M,) -> (Nj…)
    
This function should accept 1-D arrays. It is applied to 1-D slices of `arr` along the specified axis.
axisinteger
    
Axis along which `arr` is sliced.
arrndarray (Ni…, M, Nk…)
    
Input array.
argsany
    
Additional arguments to `func1d`.
kwargsany
    
Additional named arguments to `func1d`.
Returns:
    
outndarray (Ni…, Nj…, Nk…)
    
The output array. The shape of `out` is identical to the shape of `arr`, except along the `axis` dimension. This axis is removed, and replaced with new dimensions equal to the shape of the return value of `func1d`. So if `func1d` returns a scalar `out` will have one fewer dimensions than `arr`.
See also
`apply_over_axes`
    
Apply a function repeatedly over multiple axes.
#### Examples
    
    >>> import numpy as np
    >>> def my_func(a):
    ...     """Average first and last element of a 1-D array"""
    ...     return (a[0] + a[-1]) * 0.5
    >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
    >>> np.apply_along_axis(my_func, 0, b)
    array([4., 5., 6.])
    >>> np.apply_along_axis(my_func, 1, b)
    array([2.,  5.,  8.])
    
For a function that returns a 1D array, the number of dimensions in `outarr` is the same as `arr`.
    
    >>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])
    >>> np.apply_along_axis(sorted, 1, b)
    array([[1, 7, 8],
           [3, 4, 9],
           [2, 5, 6]])
    
For a function that returns a higher dimensional array, those dimensions are inserted in place of the `axis` dimension.
    
    >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
    >>> np.apply_along_axis(np.diag, -1, b)
    array([[[1, 0, 0],
            [0, 2, 0],
            [0, 0, 3]],
           [[4, 0, 0],
            [0, 5, 0],
            [0, 0, 6]],
           [[7, 0, 0],
            [0, 8, 0],
            [0, 0, 9]]])
    
# numpy.apply_over_axes
numpy.apply_over_axes(func, a, axes)[source]
    
Apply a function repeatedly over multiple axes.
`func` is called as `res = func(a, axis)`, where `axis` is the first element of `axes`. The result `res` of the function call must have either the same dimensions as `a` or one less dimension. If `res` has one less dimension than `a`, a dimension is inserted before `axis`. The call to `func` is then repeated for each axis in `axes`, with `res` as the first argument.
Parameters:
    
funcfunction
    
This function must take two arguments, `func(a, axis)`.
aarray_like
    
Input array.
axesarray_like
    
Axes over which `func` is applied; the elements must be integers.
Returns:
    
apply_over_axisndarray
    
The output array. The number of dimensions is the same as `a`, but the shape can be different. This depends on whether `func` changes the shape of its output with respect to its input.
See also
`apply_along_axis`
    
Apply a function to 1-D slices of an array along the given axis.
#### Notes
This function is equivalent to tuple axis arguments to reorderable ufuncs with keepdims=True. Tuple axis arguments to ufuncs have been available since version 1.7.0.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(24).reshape(2,3,4)
    >>> a
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    
Sum over axes 0 and 2. The result has same number of dimensions as the original array:
    
    >>> np.apply_over_axes(np.sum, a, [0,2])
    array([[[ 60],
            [ 92],
            [124]]])
    
Tuple axis arguments to ufuncs are equivalent:
    
    >>> np.sum(a, axis=(0,2), keepdims=True)
    array([[[ 60],
            [ 92],
            [124]]])
    
# numpy.arange
numpy.arange([start, ]stop, [step, ]dtype=None, *, device=None, like=None)
    
Return evenly spaced values within a given interval.
`arange` can be called with a varying number of positional arguments:
  * `arange(stop)`: Values are generated within the half-open interval `[0, stop)` (in other words, the interval including `start` but excluding `stop`).
  * `arange(start, stop)`: Values are generated within the half-open interval `[start, stop)`.
  * `arange(start, stop, step)` Values are generated within the half-open interval `[start, stop)`, with spacing between values given by `step`.


For integer arguments the function is roughly equivalent to the Python built-in `range`, but returns an ndarray rather than a `range` instance.
When using a non-integer step, such as 0.1, it is often better to use `numpy.linspace`.
See the Warning sections below for more information.
Parameters:
    
startinteger or real, optional
    
Start of interval. The interval includes this value. The default start value is 0.
stopinteger or real
    
End of interval. The interval does not include this value, except in some cases where `step` is not an integer and floating point round-off affects the length of `out`.
stepinteger or real, optional
    
Spacing between values. For any output `out`, this is the distance between two adjacent values, `out[i+1] - out[i]`. The default step size is 1. If `step` is specified as a position argument, `start` must also be given.
dtypedtype, optional
    
The type of the output array. If `dtype` is not given, infer the data type from the other input arguments.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
arangendarray
    
Array of evenly spaced values.
For floating point arguments, the length of the result is `ceil((stop - start)/step)`. Because of floating point overflow, this rule may result in the last element of `out` being greater than `stop`.
Warning
The length of the output might not be numerically stable.
Another stability issue is due to the internal implementation of `numpy.arange`. The actual step value used to populate the array is `dtype(start + step) - dtype(start)` and not `step`. Precision loss can occur here, due to casting or due to using floating points when `start` is much larger than `step`. This can lead to unexpected behaviour. For example:
    
    >>> np.arange(0, 5, 0.5, dtype=int)
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    >>> np.arange(-3, 3, 0.5, dtype=int)
    array([-3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8])
    
In such cases, the use of `numpy.linspace` should be preferred.
The built-in `range` generates Python built-in integers that have arbitrary size, while `numpy.arange` produces `numpy.int32` or `numpy.int64` numbers. This may result in incorrect results for large integer values:
    
    >>> power = 40
    >>> modulo = 10000
    >>> x1 = [(n ** power) % modulo for n in range(8)]
    >>> x2 = [(n ** power) % modulo for n in np.arange(8)]
    >>> print(x1)
    [0, 1, 7776, 8801, 6176, 625, 6576, 4001]  # correct
    >>> print(x2)
    [0, 1, 7776, 7185, 0, 5969, 4816, 3361]  # incorrect
    
See also
`numpy.linspace`
    
Evenly spaced numbers with careful handling of endpoints.
`numpy.ogrid`
    
Arrays of evenly spaced numbers in N-dimensions.
`numpy.mgrid`
    
Grid-shaped arrays of evenly spaced numbers in N-dimensions.
How to create arrays with regularly-spaced values
#### Examples
    
    >>> import numpy as np
    >>> np.arange(3)
    array([0, 1, 2])
    >>> np.arange(3.0)
    array([ 0.,  1.,  2.])
    >>> np.arange(3,7)
    array([3, 4, 5, 6])
    >>> np.arange(3,7,2)
    array([3, 5])
    
# numpy.arccos
numpy.arccos(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arccos'>
    
Trigonometric inverse cosine, element-wise.
The inverse of `cos` so that, if `y = cos(x)`, then `x = arccos(y)`.
Parameters:
    
xarray_like
    
`x`-coordinate on the unit circle. For real arguments, the domain is [-1, 1].
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
anglendarray
    
The angle of the ray intersecting the unit circle at the given `x`-coordinate in radians [0, pi]. This is a scalar if `x` is a scalar.
See also
`cos`, `arctan`, `arcsin`, `emath.arccos`
#### Notes
`arccos` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `cos(z) = x`. The convention is to return the angle `z` whose real part lies in `[0, pi]`.
For real-valued input data types, `arccos` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arccos` is a complex analytic function that has branch cuts `[-inf, -1]` and `[1, inf]` and is continuous from above on the former and from below on the latter.
The inverse `cos` is also known as `acos` or cos^-1.
#### References
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 79. https://personal.math.ubc.ca/~cbm/aands/page_79.htm
#### Examples
    
    >>> import numpy as np
    
We expect the arccos of 1 to be 0, and of -1 to be pi:
    
    >>> np.arccos([1, -1])
    array([ 0.        ,  3.14159265])
    
Plot arccos:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(-1, 1, num=100)
    >>> plt.plot(x, np.arccos(x))
    >>> plt.axis('tight')
    >>> plt.show()
    
# numpy.arccosh
numpy.arccosh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arccosh'>
    
Inverse hyperbolic cosine, element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
arccoshndarray
    
Array of the same shape as `x`. This is a scalar if `x` is a scalar.
See also
`cosh`, `arcsinh`, `sinh`, `arctanh`, `tanh`
#### Notes
`arccosh` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `cosh(z) = x`. The convention is to return the `z` whose imaginary part lies in `[-pi, pi]` and the real part in `[0, inf]`.
For real-valued input data types, `arccosh` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arccosh` is a complex analytical function that has a branch cut `[-inf, 1]` and is continuous from above on it.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 86. https://personal.math.ubc.ca/~cbm/aands/page_86.htm
[2]
Wikipedia, “Inverse hyperbolic function”, https://en.wikipedia.org/wiki/Arccosh
#### Examples
    
    >>> import numpy as np
    >>> np.arccosh([np.e, 10.0])
    array([ 1.65745445,  2.99322285])
    >>> np.arccosh(1)
    0.0
    
# numpy.arcsin
numpy.arcsin(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arcsin'>
    
Inverse sine, element-wise.
Parameters:
    
xarray_like
    
`y`-coordinate on the unit circle.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
anglendarray
    
The inverse sine of each element in `x`, in radians and in the closed interval `[-pi/2, pi/2]`. This is a scalar if `x` is a scalar.
See also
`sin`, `cos`, `arccos`, `tan`, `arctan`, `arctan2`, `emath.arcsin`
#### Notes
`arcsin` is a multivalued function: for each `x` there are infinitely many numbers `z` such that \\(sin(z) = x\\). The convention is to return the angle `z` whose real part lies in [-pi/2, pi/2].
For real-valued input data types, arcsin always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arcsin` is a complex analytic function that has, by convention, the branch cuts [-inf, -1] and [1, inf] and is continuous from above on the former and from below on the latter.
The inverse sine is also known as `asin` or sin^{-1}.
#### References
Abramowitz, M. and Stegun, I. A., Handbook of Mathematical Functions, 10th printing, New York: Dover, 1964, pp. 79ff. https://personal.math.ubc.ca/~cbm/aands/page_79.htm
#### Examples
    
    >>> import numpy as np
    >>> np.arcsin(1)     # pi/2
    1.5707963267948966
    >>> np.arcsin(-1)    # -pi/2
    -1.5707963267948966
    >>> np.arcsin(0)
    0.0
    
# numpy.arcsinh
numpy.arcsinh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arcsinh'>
    
Inverse hyperbolic sine element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Array of the same shape as `x`. This is a scalar if `x` is a scalar.
#### Notes
`arcsinh` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `sinh(z) = x`. The convention is to return the `z` whose imaginary part lies in `[-pi/2, pi/2]`.
For real-valued input data types, `arcsinh` always returns real output. For each value that cannot be expressed as a real number or infinity, it returns `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arcsinh` is a complex analytical function that has branch cuts `[1j, infj]` and `[-1j, -infj]` and is continuous from the right on the former and from the left on the latter.
The inverse hyperbolic sine is also known as `asinh` or `sinh^-1`.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 86. https://personal.math.ubc.ca/~cbm/aands/page_86.htm
[2]
Wikipedia, “Inverse hyperbolic function”, https://en.wikipedia.org/wiki/Arcsinh
#### Examples
    
    >>> import numpy as np
    >>> np.arcsinh(np.array([np.e, 10.0]))
    array([ 1.72538256,  2.99822295])
    
# numpy.arctan
numpy.arctan(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arctan'>
    
Trigonometric inverse tangent, element-wise.
The inverse of tan, so that if `y = tan(x)` then `x = arctan(y)`.
Parameters:
    
xarray_like
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Out has the same shape as `x`. Its real part is in `[-pi/2, pi/2]` (`arctan(+/-inf)` returns `+/-pi/2`). This is a scalar if `x` is a scalar.
See also
`arctan2`
    
The “four quadrant” arctan of the angle formed by (`x`, `y`) and the positive `x`-axis.
`angle`
    
Argument of complex values.
#### Notes
`arctan` is a multi-valued function: for each `x` there are infinitely many numbers `z` such that tan(`z`) = `x`. The convention is to return the angle `z` whose real part lies in [-pi/2, pi/2].
For real-valued input data types, `arctan` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arctan` is a complex analytic function that has [`1j, infj`] and [`-1j, -infj`] as branch cuts, and is continuous from the left on the former and from the right on the latter.
The inverse tangent is also known as `atan` or tan^{-1}.
#### References
Abramowitz, M. and Stegun, I. A., Handbook of Mathematical Functions, 10th printing, New York: Dover, 1964, pp. 79. https://personal.math.ubc.ca/~cbm/aands/page_79.htm
#### Examples
We expect the arctan of 0 to be 0, and of 1 to be pi/4:
    
    >>> import numpy as np
    
    
    >>> np.arctan([0, 1])
    array([ 0.        ,  0.78539816])
    
    
    >>> np.pi/4
    0.78539816339744828
    
Plot arctan:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(-10, 10)
    >>> plt.plot(x, np.arctan(x))
    >>> plt.axis('tight')
    >>> plt.show()
    
# numpy.arctan2
numpy.arctan2(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arctan2'>
    
Element-wise arc tangent of `x1/x2` choosing the quadrant correctly.
The quadrant (i.e., branch) is chosen so that `arctan2(x1, x2)` is the signed angle in radians between the ray ending at the origin and passing through the point (1,0), and the ray ending at the origin and passing through the point (`x2`, `x1`). (Note the role reversal: the “`y`-coordinate” is the first function parameter, the “`x`-coordinate” is the second.) By IEEE convention, this function is defined for `x2` = +/-0 and for either or both of `x1` and `x2` = +/-inf (see Notes for specific values).
This function is not defined for complex-valued arguments; for the so-called argument of complex values, use `angle`.
Parameters:
    
x1array_like, real-valued
    
`y`-coordinates.
x2array_like, real-valued
    
`x`-coordinates. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
anglendarray
    
Array of angles in radians, in the range `[-pi, pi]`. This is a scalar if both `x1` and `x2` are scalars.
See also
`arctan`, `tan`, `angle`
#### Notes
arctan2 is identical to the `atan2` function of the underlying C library. The following special values are defined in the C standard: [1]
`x1`
`x2`
`arctan2(x1,x2)`  
+/- 0
+0
+/- 0  
+/- 0
-0
+/- pi  
> 0
+/-inf
+0 / +pi  
< 0
+/-inf
-0 / -pi  
+/-inf
+inf
+/- (pi/4)  
+/-inf
-inf
+/- (3*pi/4)  
Note that +0 and -0 are distinct floating point numbers, as are +inf and -inf.
#### References
[1]
ISO/IEC standard 9899:1999, “Programming language C.”
#### Examples
Consider four points in different quadrants:
    
    >>> import numpy as np
    
    
    >>> x = np.array([-1, +1, +1, -1])
    >>> y = np.array([-1, -1, +1, +1])
    >>> np.arctan2(y, x) * 180 / np.pi
    array([-135.,  -45.,   45.,  135.])
    
Note the order of the parameters. `arctan2` is defined also when `x2` = 0 and at several other special points, obtaining values in the range `[-pi, pi]`:
    
    >>> np.arctan2([1., -1.], [0., 0.])
    array([ 1.57079633, -1.57079633])
    >>> np.arctan2([0., 0., np.inf], [+0., -0., np.inf])
    array([0.        , 3.14159265, 0.78539816])
    
# numpy.arctanh
numpy.arctanh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arctanh'>
    
Inverse hyperbolic tangent element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Array of the same shape as `x`. This is a scalar if `x` is a scalar.
See also
`emath.arctanh`
#### Notes
`arctanh` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `tanh(z) = x`. The convention is to return the `z` whose imaginary part lies in `[-pi/2, pi/2]`.
For real-valued input data types, `arctanh` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arctanh` is a complex analytical function that has branch cuts `[-1, -inf]` and `[1, inf]` and is continuous from above on the former and from below on the latter.
The inverse hyperbolic tangent is also known as `atanh` or `tanh^-1`.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 86. https://personal.math.ubc.ca/~cbm/aands/page_86.htm
[2]
Wikipedia, “Inverse hyperbolic function”, https://en.wikipedia.org/wiki/Arctanh
#### Examples
    
    >>> import numpy as np
    >>> np.arctanh([0, -0.5])
    array([ 0.        , -0.54930614])
    
# numpy.argmax
numpy.argmax(a, axis=None, out=None, *, keepdims=<no value>)[source]
    
Returns the indices of the maximum values along an axis.
Parameters:
    
aarray_like
    
Input array.
axisint, optional
    
By default, the index is into the flattened array, otherwise along the specified axis.
outarray, optional
    
If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
New in version 1.22.0.
Returns:
    
index_arrayndarray of ints
    
Array of indices into the array. It has the same shape as `a.shape` with the dimension along `axis` removed. If `keepdims` is set to True, then the size of `axis` will be 1 with the resulting array having same shape as `a.shape`.
See also
`ndarray.argmax`, `argmin`
`amax`
    
The maximum value along a given axis.
`unravel_index`
    
Convert a flat index into an index tuple.
`take_along_axis`
    
Apply `np.expand_dims(index_array, axis)` from argmax to an array as if by calling max.
#### Notes
In case of multiple occurrences of the maximum values, the indices corresponding to the first occurrence are returned.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(6).reshape(2,3) + 10
    >>> a
    array([[10, 11, 12],
           [13, 14, 15]])
    >>> np.argmax(a)
    5
    >>> np.argmax(a, axis=0)
    array([1, 1, 1])
    >>> np.argmax(a, axis=1)
    array([2, 2])
    
Indexes of the maximal elements of a N-dimensional array:
    
    >>> ind = np.unravel_index(np.argmax(a, axis=None), a.shape)
    >>> ind
    (1, 2)
    >>> a[ind]
    15
    
    
    >>> b = np.arange(6)
    >>> b[1] = 5
    >>> b
    array([0, 5, 2, 3, 4, 5])
    >>> np.argmax(b)  # Only the first occurrence is returned.
    1
    
    
    >>> x = np.array([[4,2,3], [1,0,3]])
    >>> index_array = np.argmax(x, axis=-1)
    >>> # Same as np.amax(x, axis=-1, keepdims=True)
    >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1), axis=-1)
    array([[4],
           [3]])
    >>> # Same as np.amax(x, axis=-1)
    >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1),
    ...     axis=-1).squeeze(axis=-1)
    array([4, 3])
    
Setting `keepdims` to `True`,
    
    >>> x = np.arange(24).reshape((2, 3, 4))
    >>> res = np.argmax(x, axis=1, keepdims=True)
    >>> res.shape
    (2, 1, 4)
    
# numpy.argmin
numpy.argmin(a, axis=None, out=None, *, keepdims=<no value>)[source]
    
Returns the indices of the minimum values along an axis.
Parameters:
    
aarray_like
    
Input array.
axisint, optional
    
By default, the index is into the flattened array, otherwise along the specified axis.
outarray, optional
    
If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
New in version 1.22.0.
Returns:
    
index_arrayndarray of ints
    
Array of indices into the array. It has the same shape as `a.shape` with the dimension along `axis` removed. If `keepdims` is set to True, then the size of `axis` will be 1 with the resulting array having same shape as `a.shape`.
See also
`ndarray.argmin`, `argmax`
`amin`
    
The minimum value along a given axis.
`unravel_index`
    
Convert a flat index into an index tuple.
`take_along_axis`
    
Apply `np.expand_dims(index_array, axis)` from argmin to an array as if by calling min.
#### Notes
In case of multiple occurrences of the minimum values, the indices corresponding to the first occurrence are returned.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(6).reshape(2,3) + 10
    >>> a
    array([[10, 11, 12],
           [13, 14, 15]])
    >>> np.argmin(a)
    0
    >>> np.argmin(a, axis=0)
    array([0, 0, 0])
    >>> np.argmin(a, axis=1)
    array([0, 0])
    
Indices of the minimum elements of a N-dimensional array:
    
    >>> ind = np.unravel_index(np.argmin(a, axis=None), a.shape)
    >>> ind
    (0, 0)
    >>> a[ind]
    10
    
    
    >>> b = np.arange(6) + 10
    >>> b[4] = 10
    >>> b
    array([10, 11, 12, 13, 10, 15])
    >>> np.argmin(b)  # Only the first occurrence is returned.
    0
    
    
    >>> x = np.array([[4,2,3], [1,0,3]])
    >>> index_array = np.argmin(x, axis=-1)
    >>> # Same as np.amin(x, axis=-1, keepdims=True)
    >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1), axis=-1)
    array([[2],
           [0]])
    >>> # Same as np.amax(x, axis=-1)
    >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1),
    ...     axis=-1).squeeze(axis=-1)
    array([2, 0])
    
Setting `keepdims` to `True`,
    
    >>> x = np.arange(24).reshape((2, 3, 4))
    >>> res = np.argmin(x, axis=1, keepdims=True)
    >>> res.shape
    (2, 1, 4)
    
# numpy.argpartition
numpy.argpartition(a, kth, axis=-1, kind='introselect', order=None)[source]
    
Perform an indirect partition along the given axis using the algorithm specified by the `kind` keyword. It returns an array of indices of the same shape as `a` that index data along the given axis in partitioned order.
Parameters:
    
aarray_like
    
Array to sort.
kthint or sequence of ints
    
Element index to partition by. The k-th element will be in its final sorted position and all smaller elements will be moved before it and all larger elements behind it. The order of all elements in the partitions is undefined. If provided with a sequence of k-th it will partition all of them into their sorted position at once.
Deprecated since version 1.22.0: Passing booleans as index is deprecated.
axisint or None, optional
    
Axis along which to sort. The default is -1 (the last axis). If None, the flattened array is used.
kind{‘introselect’}, optional
    
Selection algorithm. Default is ‘introselect’
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
Returns:
    
index_arrayndarray, int
    
Array of indices that partition `a` along the specified axis. If `a` is one-dimensional, `a[index_array]` yields a partitioned `a`. More generally, `np.take_along_axis(a, index_array, axis=axis)` always yields the partitioned `a`, irrespective of dimensionality.
See also
`partition`
    
Describes partition algorithms used.
`ndarray.partition`
    
Inplace partition.
`argsort`
    
Full indirect sort.
`take_along_axis`
    
Apply `index_array` from argpartition to an array as if by calling partition.
#### Notes
The returned indices are not guaranteed to be sorted according to the values. Furthermore, the default selection algorithm `introselect` is unstable, and hence the returned indices are not guaranteed to be the earliest/latest occurrence of the element.
`argpartition` works for real/complex inputs with nan values, see `partition` for notes on the enhanced sort order and different selection algorithms.
#### Examples
One dimensional array:
    
    >>> import numpy as np
    >>> x = np.array([3, 4, 2, 1])
    >>> x[np.argpartition(x, 3)]
    array([2, 1, 3, 4]) # may vary
    >>> x[np.argpartition(x, (1, 3))]
    array([1, 2, 3, 4]) # may vary
    
    
    >>> x = [3, 4, 2, 1]
    >>> np.array(x)[np.argpartition(x, 3)]
    array([2, 1, 3, 4]) # may vary
    
Multi-dimensional array:
    
    >>> x = np.array([[3, 4, 2], [1, 3, 1]])
    >>> index_array = np.argpartition(x, kth=1, axis=-1)
    >>> # below is the same as np.partition(x, kth=1)
    >>> np.take_along_axis(x, index_array, axis=-1)
    array([[2, 3, 4],
           [1, 1, 3]])
    
# numpy.argsort
numpy.argsort(a, axis=-1, kind=None, order=None, *, stable=None)[source]
    
Returns the indices that would sort an array.
Perform an indirect sort along the given axis using the algorithm specified by the `kind` keyword. It returns an array of indices of the same shape as `a` that index data along the given axis in sorted order.
Parameters:
    
aarray_like
    
Array to sort.
axisint or None, optional
    
Axis along which to sort. The default is -1 (the last axis). If None, the flattened array is used.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort under the covers and, in general, the actual implementation will vary with data type. The ‘mergesort’ option is retained for backwards compatibility.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
stablebool, optional
    
Sort stability. If `True`, the returned array will maintain the relative order of `a` values which compare as equal. If `False` or `None`, this is not guaranteed. Internally, this option selects `kind='stable'`. Default: `None`.
New in version 2.0.0.
Returns:
    
index_arrayndarray, int
    
Array of indices that sort `a` along the specified `axis`. If `a` is one-dimensional, `a[index_array]` yields a sorted `a`. More generally, `np.take_along_axis(a, index_array, axis=axis)` always yields the sorted `a`, irrespective of dimensionality.
See also
`sort`
    
Describes sorting algorithms used.
`lexsort`
    
Indirect stable sort with multiple keys.
`ndarray.sort`
    
Inplace sort.
`argpartition`
    
Indirect partial sort.
`take_along_axis`
    
Apply `index_array` from argsort to an array as if by calling sort.
#### Notes
See `sort` for notes on the different sorting algorithms.
As of NumPy 1.4.0 `argsort` works with real/complex arrays containing nan values. The enhanced sort order is documented in `sort`.
#### Examples
One dimensional array:
    
    >>> import numpy as np
    >>> x = np.array([3, 1, 2])
    >>> np.argsort(x)
    array([1, 2, 0])
    
Two-dimensional array:
    
    >>> x = np.array([[0, 3], [2, 2]])
    >>> x
    array([[0, 3],
           [2, 2]])
    
    
    >>> ind = np.argsort(x, axis=0)  # sorts along first axis (down)
    >>> ind
    array([[0, 1],
           [1, 0]])
    >>> np.take_along_axis(x, ind, axis=0)  # same as np.sort(x, axis=0)
    array([[0, 2],
           [2, 3]])
    
    
    >>> ind = np.argsort(x, axis=1)  # sorts along last axis (across)
    >>> ind
    array([[0, 1],
           [0, 1]])
    >>> np.take_along_axis(x, ind, axis=1)  # same as np.sort(x, axis=1)
    array([[0, 3],
           [2, 2]])
    
Indices of the sorted elements of a N-dimensional array:
    
    >>> ind = np.unravel_index(np.argsort(x, axis=None), x.shape)
    >>> ind
    (array([0, 1, 1, 0]), array([0, 0, 1, 1]))
    >>> x[ind]  # same as np.sort(x, axis=None)
    array([0, 2, 2, 3])
    
Sorting with keys:
    
    >>> x = np.array([(1, 0), (0, 1)], dtype=[('x', '<i4'), ('y', '<i4')])
    >>> x
    array([(1, 0), (0, 1)],
          dtype=[('x', '<i4'), ('y', '<i4')])
    
    
    >>> np.argsort(x, order=('x','y'))
    array([1, 0])
    
    
    >>> np.argsort(x, order=('y','x'))
    array([0, 1])
    
# numpy.argwhere
numpy.argwhere(a)[source]
    
Find the indices of array elements that are non-zero, grouped by element.
Parameters:
    
aarray_like
    
Input data.
Returns:
    
index_array(N, a.ndim) ndarray
    
Indices of elements that are non-zero. Indices are grouped by element. This array will have shape `(N, a.ndim)` where `N` is the number of non-zero items.
See also
`where`, `nonzero`
#### Notes
`np.argwhere(a)` is almost the same as `np.transpose(np.nonzero(a))`, but produces a result of the correct shape for a 0D array.
The output of `argwhere` is not suitable for indexing arrays. For this purpose use `nonzero(a)` instead.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6).reshape(2,3)
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.argwhere(x>1)
    array([[0, 2],
           [1, 0],
           [1, 1],
           [1, 2]])
    
# numpy.around
numpy.around(a, decimals=0, out=None)[source]
    
Round an array to the given number of decimals.
`around` is an alias of `round`.
See also
`ndarray.round`
    
equivalent method
`round`
    
alias for this function
`ceil`, `fix`, `floor`, `rint`, `trunc`
# numpy.array
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)
    
Create an array.
Parameters:
    
objectarray_like
    
An array, any object exposing the array interface, an object whose `__array__` method returns an array, or any (nested) sequence. If object is a scalar, a 0-dimensional array containing object is returned.
dtypedata-type, optional
    
The desired data-type for the array. If not given, NumPy will try to use a default `dtype` that can represent the values (by applying promotion rules when necessary.)
copybool, optional
    
If `True` (default), then the array data is copied. If `None`, a copy will only be made if `__array__` returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`dtype`, `order`, etc.). Note that any copy of the data is shallow, i.e., for arrays with object dtype, the new array will point to the same objects. See Examples for `ndarray.copy`. For `False` it raises a `ValueError` if a copy cannot be avoided. Default: `True`.
order{‘K’, ‘A’, ‘C’, ‘F’}, optional
    
Specify the memory layout of the array. If object is not an array, the newly created array will be in C order (row major) unless ‘F’ is specified, in which case it will be in Fortran order (column major). If object is an array the following holds.
order
no copy
copy=True  
‘K’
unchanged
F & C order preserved, otherwise most similar order  
‘A’
unchanged
F order if input is F and not C, otherwise C order  
‘C’
C order
C order  
‘F’
F order
F order  
When `copy=None` and a copy is made for other reasons, the result is the same as if `copy=True`, with some exceptions for ‘A’, see the Notes section. The default order is ‘K’.
subokbool, optional
    
If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default).
ndminint, optional
    
Specifies the minimum number of dimensions that the resulting array should have. Ones will be prepended to the shape as needed to meet this requirement.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
An array object satisfying the specified requirements.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`ones_like`
    
Return an array of ones with shape and type of input.
`zeros_like`
    
Return an array of zeros with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`empty`
    
Return a new uninitialized array.
`ones`
    
Return a new array setting values to one.
`zeros`
    
Return a new array setting values to zero.
`full`
    
Return a new array of given shape filled with value.
`copy`
    
Return an array copy of the given object.
#### Notes
When order is ‘A’ and `object` is an array in neither ‘C’ nor ‘F’ order, and a copy is forced by a change in dtype, then the order of the result is not necessarily ‘C’ as expected. This is likely a bug.
#### Examples
    
    >>> import numpy as np
    >>> np.array([1, 2, 3])
    array([1, 2, 3])
    
Upcasting:
    
    >>> np.array([1, 2, 3.0])
    array([ 1.,  2.,  3.])
    
More than one dimension:
    
    >>> np.array([[1, 2], [3, 4]])
    array([[1, 2],
           [3, 4]])
    
Minimum dimensions 2:
    
    >>> np.array([1, 2, 3], ndmin=2)
    array([[1, 2, 3]])
    
Type provided:
    
    >>> np.array([1, 2, 3], dtype=complex)
    array([ 1.+0.j,  2.+0.j,  3.+0.j])
    
Data-type consisting of more than one element:
    
    >>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])
    >>> x['a']
    array([1, 3], dtype=int32)
    
Creating an array from sub-classes:
    
    >>> np.array(np.asmatrix('1 2; 3 4'))
    array([[1, 2],
           [3, 4]])
    
    
    >>> np.array(np.asmatrix('1 2; 3 4'), subok=True)
    matrix([[1, 2],
            [3, 4]])
    
# numpy.array2string
numpy.array2string(a, max_line_width=None, precision=None, suppress_small=None, separator=' ', prefix='', style=<no value>, formatter=None, threshold=None, edgeitems=None, sign=None, floatmode=None, suffix='', *, legacy=None)[source]
    
Return a string representation of an array.
Parameters:
    
andarray
    
Input array.
max_line_widthint, optional
    
Inserts newlines if text is longer than `max_line_width`. Defaults to `numpy.get_printoptions()['linewidth']`.
precisionint or None, optional
    
Floating point precision. Defaults to `numpy.get_printoptions()['precision']`.
suppress_smallbool, optional
    
Represent numbers “very close” to zero as zero; default is False. Very close is defined by precision: if the precision is 8, e.g., numbers smaller (in absolute value) than 5e-9 are represented as zero. Defaults to `numpy.get_printoptions()['suppress']`.
separatorstr, optional
    
Inserted between elements.
prefixstr, optional
suffixstr, optional
    
The length of the prefix and suffix strings are used to respectively align and wrap the output. An array is typically printed as:
    
    prefix + array2string(a) + suffix
    
The output is left-padded by the length of the prefix string, and wrapping is forced at the column `max_line_width - len(suffix)`. It should be noted that the content of prefix and suffix strings are not included in the output.
style_NoValue, optional
    
Has no effect, do not use.
Deprecated since version 1.14.0.
formatterdict of callables, optional
    
If not None, the keys should indicate the type(s) that the respective formatting function applies to. Callables should return a string. Types that are not specified (by their corresponding keys) are handled by the default formatters. Individual types for which a formatter can be set are:
  * ‘bool’
  * ‘int’
  * ‘timedelta’ : a `numpy.timedelta64`
  * ‘datetime’ : a `numpy.datetime64`
  * ‘float’
  * ‘longfloat’ : 128-bit floats
  * ‘complexfloat’
  * ‘longcomplexfloat’ : composed of two 128-bit floats
  * ‘void’ : type `numpy.void`
  * ‘numpystr’ : types `numpy.bytes_` and `numpy.str_`


Other keys that can be used to set a group of types at once are:
  * ‘all’ : sets all types
  * ‘int_kind’ : sets ‘int’
  * ‘float_kind’ : sets ‘float’ and ‘longfloat’
  * ‘complex_kind’ : sets ‘complexfloat’ and ‘longcomplexfloat’
  * ‘str_kind’ : sets ‘numpystr’


thresholdint, optional
    
Total number of array elements which trigger summarization rather than full repr. Defaults to `numpy.get_printoptions()['threshold']`.
edgeitemsint, optional
    
Number of array items in summary at beginning and end of each dimension. Defaults to `numpy.get_printoptions()['edgeitems']`.
signstring, either ‘-’, ‘+’, or ‘ ‘, optional
    
Controls printing of the sign of floating-point types. If ‘+’, always print the sign of positive values. If ‘ ‘, always prints a space (whitespace character) in the sign position of positive values. If ‘-’, omit the sign character of positive values. Defaults to `numpy.get_printoptions()['sign']`.
Changed in version 2.0: The sign parameter can now be an integer type, previously types were floating-point types.
floatmodestr, optional
    
Controls the interpretation of the `precision` option for floating-point types. Defaults to `numpy.get_printoptions()['floatmode']`. Can take the following values:
  * ‘fixed’: Always print exactly `precision` fractional digits, even if this would print more or fewer digits than necessary to specify the value uniquely.
  * ‘unique’: Print the minimum number of fractional digits necessary to represent each value uniquely. Different elements may have a different number of digits. The value of the `precision` option is ignored.
  * ‘maxprec’: Print at most `precision` fractional digits, but if an element can be uniquely represented with fewer digits only print it with that many.
  * ‘maxprec_equal’: Print at most `precision` fractional digits, but if every element in the array can be uniquely represented with an equal number of fewer digits, use that many digits for all elements.


legacystring or `False`, optional
    
If set to the string `'1.13'` enables 1.13 legacy printing mode. This approximates numpy 1.13 print output by including a space in the sign position of floats and different behavior for 0d arrays. If set to `False`, disables legacy mode. Unrecognized strings will be ignored with a warning for forward compatibility.
Returns:
    
array_strstr
    
String representation of the array.
Raises:
    
TypeError
    
if a callable in `formatter` does not return a string.
See also
`array_str`, `array_repr`, `set_printoptions`, `get_printoptions`
#### Notes
If a formatter is specified for a certain type, the `precision` keyword is ignored for that type.
This is a very flexible function; `array_repr` and `array_str` are using `array2string` internally so keywords with the same name should work identically in all three functions.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1e-16,1,2,3])
    >>> np.array2string(x, precision=2, separator=',',
    ...                       suppress_small=True)
    '[0.,1.,2.,3.]'
    
    
    >>> x  = np.arange(3.)
    >>> np.array2string(x, formatter={'float_kind':lambda x: "%.2f" % x})
    '[0.00 1.00 2.00]'
    
    
    >>> x  = np.arange(3)
    >>> np.array2string(x, formatter={'int':lambda x: hex(x)})
    '[0x0 0x1 0x2]'
    
# numpy.array_equal
numpy.array_equal(a1, a2, equal_nan=False)[source]
    
True if two arrays have the same shape and elements, False otherwise.
Parameters:
    
a1, a2array_like
    
Input arrays.
equal_nanbool
    
Whether to compare NaN’s as equal. If the dtype of a1 and a2 is complex, values will be considered equal if either the real or the imaginary component of a given value is `nan`.
Returns:
    
bbool
    
Returns True if the arrays are equal.
See also
`allclose`
    
Returns True if two arrays are element-wise equal within a tolerance.
`array_equiv`
    
Returns True if input arrays are shape consistent and all elements equal.
#### Examples
    
    >>> import numpy as np
    
    
    >>> np.array_equal([1, 2], [1, 2])
    True
    
    
    >>> np.array_equal(np.array([1, 2]), np.array([1, 2]))
    True
    
    
    >>> np.array_equal([1, 2], [1, 2, 3])
    False
    
    
    >>> np.array_equal([1, 2], [1, 4])
    False
    
    
    >>> a = np.array([1, np.nan])
    >>> np.array_equal(a, a)
    False
    
    
    >>> np.array_equal(a, a, equal_nan=True)
    True
    
When `equal_nan` is True, complex values with nan components are considered equal if either the real or the imaginary components are nan.
    
    >>> a = np.array([1 + 1j])
    >>> b = a.copy()
    >>> a.real = np.nan
    >>> b.imag = np.nan
    >>> np.array_equal(a, b, equal_nan=True)
    True
    
# numpy.array_equiv
numpy.array_equiv(a1, a2)[source]
    
Returns True if input arrays are shape consistent and all elements equal.
Shape consistent means they are either the same shape, or one input array can be broadcasted to create the same shape as the other one.
Parameters:
    
a1, a2array_like
    
Input arrays.
Returns:
    
outbool
    
True if equivalent, False otherwise.
#### Examples
    
    >>> import numpy as np
    >>> np.array_equiv([1, 2], [1, 2])
    True
    >>> np.array_equiv([1, 2], [1, 3])
    False
    
Showing the shape equivalence:
    
    >>> np.array_equiv([1, 2], [[1, 2], [1, 2]])
    True
    >>> np.array_equiv([1, 2], [[1, 2, 1, 2], [1, 2, 1, 2]])
    False
    
    
    >>> np.array_equiv([1, 2], [[1, 2], [1, 3]])
    False
    
# numpy.array_repr
numpy.array_repr(arr, max_line_width=None, precision=None, suppress_small=None)[source]
    
Return the string representation of an array.
Parameters:
    
arrndarray
    
Input array.
max_line_widthint, optional
    
Inserts newlines if text is longer than `max_line_width`. Defaults to `numpy.get_printoptions()['linewidth']`.
precisionint, optional
    
Floating point precision. Defaults to `numpy.get_printoptions()['precision']`.
suppress_smallbool, optional
    
Represent numbers “very close” to zero as zero; default is False. Very close is defined by precision: if the precision is 8, e.g., numbers smaller (in absolute value) than 5e-9 are represented as zero. Defaults to `numpy.get_printoptions()['suppress']`.
Returns:
    
stringstr
    
The string representation of an array.
See also
`array_str`, `array2string`, `set_printoptions`
#### Examples
    
    >>> import numpy as np
    >>> np.array_repr(np.array([1,2]))
    'array([1, 2])'
    >>> np.array_repr(np.ma.array([0.]))
    'MaskedArray([0.])'
    >>> np.array_repr(np.array([], np.int32))
    'array([], dtype=int32)'
    
    
    >>> x = np.array([1e-6, 4e-7, 2, 3])
    >>> np.array_repr(x, precision=6, suppress_small=True)
    'array([0.000001,  0.      ,  2.      ,  3.      ])'
    
# numpy.array_split
numpy.array_split(ary, indices_or_sections, axis=0)[source]
    
Split an array into multiple sub-arrays.
Please refer to the `split` documentation. The only difference between these functions is that `array_split` allows `indices_or_sections` to be an integer that does not equally divide the axis. For an array of length l that should be split into n sections, it returns l % n sub-arrays of size l//n + 1 and the rest of size l//n.
See also
`split`
    
Split array into multiple sub-arrays of equal size.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(8.0)
    >>> np.array_split(x, 3)
    [array([0.,  1.,  2.]), array([3.,  4.,  5.]), array([6.,  7.])]
    
    
    >>> x = np.arange(9)
    >>> np.array_split(x, 4)
    [array([0, 1, 2]), array([3, 4]), array([5, 6]), array([7, 8])]
    
# numpy.array_str
numpy.array_str(a, max_line_width=None, precision=None, suppress_small=None)[source]
    
Return a string representation of the data in an array.
The data in the array is returned as a single string. This function is similar to `array_repr`, the difference being that `array_repr` also returns information on the kind of array and its data type.
Parameters:
    
andarray
    
Input array.
max_line_widthint, optional
    
Inserts newlines if text is longer than `max_line_width`. Defaults to `numpy.get_printoptions()['linewidth']`.
precisionint, optional
    
Floating point precision. Defaults to `numpy.get_printoptions()['precision']`.
suppress_smallbool, optional
    
Represent numbers “very close” to zero as zero; default is False. Very close is defined by precision: if the precision is 8, e.g., numbers smaller (in absolute value) than 5e-9 are represented as zero. Defaults to `numpy.get_printoptions()['suppress']`.
See also
`array2string`, `array_repr`, `set_printoptions`
#### Examples
    
    >>> import numpy as np
    >>> np.array_str(np.arange(3))
    '[0 1 2]'
    
# numpy.asanyarray
numpy.asanyarray(a, dtype=None, order=None, *, device=None, copy=None, like=None)
    
Convert the input to an ndarray, but pass ndarray subclasses through.
Parameters:
    
aarray_like
    
Input data, in any form that can be converted to an array. This includes scalars, lists, lists of tuples, tuples, tuples of tuples, tuples of lists, and ndarrays.
dtypedata-type, optional
    
By default, the data-type is inferred from the input data.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Memory layout. ‘A’ and ‘K’ depend on the order of input array a. ‘C’ row-major (C-style), ‘F’ column-major (Fortran-style) memory representation. ‘A’ (any) means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise ‘K’ (keep) preserve input order Defaults to ‘C’.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.1.0.
copybool, optional
    
If `True`, then the object is copied. If `None` then the object is copied only if needed, i.e. if `__array__` returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`dtype`, `order`, etc.). For `False` it raises a `ValueError` if a copy cannot be avoided. Default: `None`.
New in version 2.1.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray or an ndarray subclass
    
Array interpretation of `a`. If `a` is an ndarray or a subclass of ndarray, it is returned as-is and no copy is performed.
See also
`asarray`
    
Similar function which always returns ndarrays.
`ascontiguousarray`
    
Convert input to a contiguous array.
`asfortranarray`
    
Convert input to an ndarray with column-major memory order.
`asarray_chkfinite`
    
Similar function which checks input for NaNs and Infs.
`fromiter`
    
Create an array from an iterator.
`fromfunction`
    
Construct an array by executing a function on grid positions.
#### Examples
Convert a list into an array:
    
    >>> a = [1, 2]
    >>> import numpy as np
    >>> np.asanyarray(a)
    array([1, 2])
    
Instances of `ndarray` subclasses are passed through as-is:
    
    >>> a = np.array([(1., 2), (3., 4)], dtype='f4,i4').view(np.recarray)
    >>> np.asanyarray(a) is a
    True
    
# numpy.asarray
numpy.asarray(a, dtype=None, order=None, *, device=None, copy=None, like=None)
    
Convert the input to an array.
Parameters:
    
aarray_like
    
Input data, in any form that can be converted to an array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays.
dtypedata-type, optional
    
By default, the data-type is inferred from the input data.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Memory layout. ‘A’ and ‘K’ depend on the order of input array a. ‘C’ row-major (C-style), ‘F’ column-major (Fortran-style) memory representation. ‘A’ (any) means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise ‘K’ (keep) preserve input order Defaults to ‘K’.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
copybool, optional
    
If `True`, then the object is copied. If `None` then the object is copied only if needed, i.e. if `__array__` returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`dtype`, `order`, etc.). For `False` it raises a `ValueError` if a copy cannot be avoided. Default: `None`.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Array interpretation of `a`. No copy is performed if the input is already an ndarray with matching dtype and order. If `a` is a subclass of ndarray, a base class ndarray is returned.
See also
`asanyarray`
    
Similar function which passes through subclasses.
`ascontiguousarray`
    
Convert input to a contiguous array.
`asfortranarray`
    
Convert input to an ndarray with column-major memory order.
`asarray_chkfinite`
    
Similar function which checks input for NaNs and Infs.
`fromiter`
    
Create an array from an iterator.
`fromfunction`
    
Construct an array by executing a function on grid positions.
#### Examples
Convert a list into an array:
    
    >>> a = [1, 2]
    >>> import numpy as np
    >>> np.asarray(a)
    array([1, 2])
    
Existing arrays are not copied:
    
    >>> a = np.array([1, 2])
    >>> np.asarray(a) is a
    True
    
If `dtype` is set, array is copied only if dtype does not match:
    
    >>> a = np.array([1, 2], dtype=np.float32)
    >>> np.shares_memory(np.asarray(a, dtype=np.float32), a)
    True
    >>> np.shares_memory(np.asarray(a, dtype=np.float64), a)
    False
    
Contrary to `asanyarray`, ndarray subclasses are not passed through:
    
    >>> issubclass(np.recarray, np.ndarray)
    True
    >>> a = np.array([(1., 2), (3., 4)], dtype='f4,i4').view(np.recarray)
    >>> np.asarray(a) is a
    False
    >>> np.asanyarray(a) is a
    True
    
# numpy.asarray_chkfinite
numpy.asarray_chkfinite(a, dtype=None, order=None)[source]
    
Convert the input to an array, checking for NaNs or Infs.
Parameters:
    
aarray_like
    
Input data, in any form that can be converted to an array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays. Success requires no NaNs or Infs.
dtypedata-type, optional
    
By default, the data-type is inferred from the input data.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Memory layout. ‘A’ and ‘K’ depend on the order of input array a. ‘C’ row-major (C-style), ‘F’ column-major (Fortran-style) memory representation. ‘A’ (any) means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise ‘K’ (keep) preserve input order Defaults to ‘C’.
Returns:
    
outndarray
    
Array interpretation of `a`. No copy is performed if the input is already an ndarray. If `a` is a subclass of ndarray, a base class ndarray is returned.
Raises:
    
ValueError
    
Raises ValueError if `a` contains NaN (Not a Number) or Inf (Infinity).
See also
`asarray`
    
Create and array.
`asanyarray`
    
Similar function which passes through subclasses.
`ascontiguousarray`
    
Convert input to a contiguous array.
`asfortranarray`
    
Convert input to an ndarray with column-major memory order.
`fromiter`
    
Create an array from an iterator.
`fromfunction`
    
Construct an array by executing a function on grid positions.
#### Examples
    
    >>> import numpy as np
    
Convert a list into an array. If all elements are finite, then `asarray_chkfinite` is identical to `asarray`.
    
    >>> a = [1, 2]
    >>> np.asarray_chkfinite(a, dtype=float)
    array([1., 2.])
    
Raises ValueError if array_like contains Nans or Infs.
    
    >>> a = [1, 2, np.inf]
    >>> try:
    ...     np.asarray_chkfinite(a)
    ... except ValueError:
    ...     print('ValueError')
    ...
    ValueError
    
# numpy.ascontiguousarray
numpy.ascontiguousarray(a, dtype=None, *, like=None)
    
Return a contiguous array (ndim >= 1) in memory (C order).
Parameters:
    
aarray_like
    
Input array.
dtypestr or dtype object, optional
    
Data-type of returned array.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Contiguous array of same shape and content as `a`, with type `dtype` if specified.
See also
`asfortranarray`
    
Convert input to an ndarray with column-major memory order.
`require`
    
Return an ndarray that satisfies requirements.
`ndarray.flags`
    
Information about the memory layout of the array.
#### Examples
Starting with a Fortran-contiguous array:
    
    >>> import numpy as np
    >>> x = np.ones((2, 3), order='F')
    >>> x.flags['F_CONTIGUOUS']
    True
    
Calling `ascontiguousarray` makes a C-contiguous copy:
    
    >>> y = np.ascontiguousarray(x)
    >>> y.flags['C_CONTIGUOUS']
    True
    >>> np.may_share_memory(x, y)
    False
    
Now, starting with a C-contiguous array:
    
    >>> x = np.ones((2, 3), order='C')
    >>> x.flags['C_CONTIGUOUS']
    True
    
Then, calling `ascontiguousarray` returns the same object:
    
    >>> y = np.ascontiguousarray(x)
    >>> x is y
    True
    
Note: This function returns an array with at least one-dimension (1-d) so it will not preserve 0-d arrays.
# numpy.asfortranarray
numpy.asfortranarray(a, dtype=None, *, like=None)
    
Return an array (ndim >= 1) laid out in Fortran order in memory.
Parameters:
    
aarray_like
    
Input array.
dtypestr or dtype object, optional
    
By default, the data-type is inferred from the input data.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
The input `a` in Fortran, or column-major, order.
See also
`ascontiguousarray`
    
Convert input to a contiguous (C order) array.
`asanyarray`
    
Convert input to an ndarray with either row or column-major memory order.
`require`
    
Return an ndarray that satisfies requirements.
`ndarray.flags`
    
Information about the memory layout of the array.
#### Examples
Starting with a C-contiguous array:
    
    >>> import numpy as np
    >>> x = np.ones((2, 3), order='C')
    >>> x.flags['C_CONTIGUOUS']
    True
    
Calling `asfortranarray` makes a Fortran-contiguous copy:
    
    >>> y = np.asfortranarray(x)
    >>> y.flags['F_CONTIGUOUS']
    True
    >>> np.may_share_memory(x, y)
    False
    
Now, starting with a Fortran-contiguous array:
    
    >>> x = np.ones((2, 3), order='F')
    >>> x.flags['F_CONTIGUOUS']
    True
    
Then, calling `asfortranarray` returns the same object:
    
    >>> y = np.asfortranarray(x)
    >>> x is y
    True
    
Note: This function returns an array with at least one-dimension (1-d) so it will not preserve 0-d arrays.
# numpy.asin
numpy.asin(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arcsin'>
    
Inverse sine, element-wise.
Parameters:
    
xarray_like
    
`y`-coordinate on the unit circle.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
anglendarray
    
The inverse sine of each element in `x`, in radians and in the closed interval `[-pi/2, pi/2]`. This is a scalar if `x` is a scalar.
See also
`sin`, `cos`, `arccos`, `tan`, `arctan`, `arctan2`, `emath.arcsin`
#### Notes
`arcsin` is a multivalued function: for each `x` there are infinitely many numbers `z` such that \\(sin(z) = x\\). The convention is to return the angle `z` whose real part lies in [-pi/2, pi/2].
For real-valued input data types, arcsin always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arcsin` is a complex analytic function that has, by convention, the branch cuts [-inf, -1] and [1, inf] and is continuous from above on the former and from below on the latter.
The inverse sine is also known as `asin` or sin^{-1}.
#### References
Abramowitz, M. and Stegun, I. A., Handbook of Mathematical Functions, 10th printing, New York: Dover, 1964, pp. 79ff. https://personal.math.ubc.ca/~cbm/aands/page_79.htm
#### Examples
    
    >>> import numpy as np
    >>> np.arcsin(1)     # pi/2
    1.5707963267948966
    >>> np.arcsin(-1)    # -pi/2
    -1.5707963267948966
    >>> np.arcsin(0)
    0.0
    
# numpy.asinh
numpy.asinh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arcsinh'>
    
Inverse hyperbolic sine element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Array of the same shape as `x`. This is a scalar if `x` is a scalar.
#### Notes
`arcsinh` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `sinh(z) = x`. The convention is to return the `z` whose imaginary part lies in `[-pi/2, pi/2]`.
For real-valued input data types, `arcsinh` always returns real output. For each value that cannot be expressed as a real number or infinity, it returns `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arcsinh` is a complex analytical function that has branch cuts `[1j, infj]` and `[-1j, -infj]` and is continuous from the right on the former and from the left on the latter.
The inverse hyperbolic sine is also known as `asinh` or `sinh^-1`.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 86. https://personal.math.ubc.ca/~cbm/aands/page_86.htm
[2]
Wikipedia, “Inverse hyperbolic function”, https://en.wikipedia.org/wiki/Arcsinh
#### Examples
    
    >>> import numpy as np
    >>> np.arcsinh(np.array([np.e, 10.0]))
    array([ 1.72538256,  2.99822295])
    
# numpy.asmatrix
numpy.asmatrix(data, dtype=None)[source]
    
Interpret the input as a matrix.
Unlike `matrix`, `asmatrix` does not make a copy if the input is already a matrix or an ndarray. Equivalent to `matrix(data, copy=False)`.
Parameters:
    
dataarray_like
    
Input data.
dtypedata-type
    
Data-type of the output matrix.
Returns:
    
matmatrix
    
`data` interpreted as a matrix.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1, 2], [3, 4]])
    
    
    >>> m = np.asmatrix(x)
    
    
    >>> x[0,0] = 5
    
    
    >>> m
    matrix([[5, 2],
            [3, 4]])
    
# numpy.astype
numpy.astype(x, dtype, /, *, copy=True, device=None)[source]
    
Copies an array to a specified data type.
This function is an Array API compatible alternative to `numpy.ndarray.astype`.
Parameters:
    
xndarray
    
Input NumPy array to cast. `array_likes` are explicitly not supported here.
dtypedtype
    
Data type of the result.
copybool, optional
    
Specifies whether to copy an array when the specified dtype matches the data type of the input array `x`. If `True`, a newly allocated array must always be returned. If `False` and the specified dtype matches the data type of the input array, the input array must be returned; otherwise, a newly allocated array must be returned. Defaults to `True`.
devicestr, optional
    
The device on which to place the returned array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.1.0.
Returns:
    
outndarray
    
An array having the specified data type.
See also
`ndarray.astype`
#### Examples
    
    >>> import numpy as np
    >>> arr = np.array([1, 2, 3]); arr
    array([1, 2, 3])
    >>> np.astype(arr, np.float64)
    array([1., 2., 3.])
    
Non-copy case:
    
    >>> arr = np.array([1, 2, 3])
    >>> arr_noncpy = np.astype(arr, arr.dtype, copy=False)
    >>> np.shares_memory(arr, arr_noncpy)
    True
    
# numpy.atan
numpy.atan(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arctan'>
    
Trigonometric inverse tangent, element-wise.
The inverse of tan, so that if `y = tan(x)` then `x = arctan(y)`.
Parameters:
    
xarray_like
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Out has the same shape as `x`. Its real part is in `[-pi/2, pi/2]` (`arctan(+/-inf)` returns `+/-pi/2`). This is a scalar if `x` is a scalar.
See also
`arctan2`
    
The “four quadrant” arctan of the angle formed by (`x`, `y`) and the positive `x`-axis.
`angle`
    
Argument of complex values.
#### Notes
`arctan` is a multi-valued function: for each `x` there are infinitely many numbers `z` such that tan(`z`) = `x`. The convention is to return the angle `z` whose real part lies in [-pi/2, pi/2].
For real-valued input data types, `arctan` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arctan` is a complex analytic function that has [`1j, infj`] and [`-1j, -infj`] as branch cuts, and is continuous from the left on the former and from the right on the latter.
The inverse tangent is also known as `atan` or tan^{-1}.
#### References
Abramowitz, M. and Stegun, I. A., Handbook of Mathematical Functions, 10th printing, New York: Dover, 1964, pp. 79. https://personal.math.ubc.ca/~cbm/aands/page_79.htm
#### Examples
We expect the arctan of 0 to be 0, and of 1 to be pi/4:
    
    >>> import numpy as np
    
    
    >>> np.arctan([0, 1])
    array([ 0.        ,  0.78539816])
    
    
    >>> np.pi/4
    0.78539816339744828
    
Plot arctan:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(-10, 10)
    >>> plt.plot(x, np.arctan(x))
    >>> plt.axis('tight')
    >>> plt.show()
    
# numpy.atan2
numpy.atan2(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arctan2'>
    
Element-wise arc tangent of `x1/x2` choosing the quadrant correctly.
The quadrant (i.e., branch) is chosen so that `arctan2(x1, x2)` is the signed angle in radians between the ray ending at the origin and passing through the point (1,0), and the ray ending at the origin and passing through the point (`x2`, `x1`). (Note the role reversal: the “`y`-coordinate” is the first function parameter, the “`x`-coordinate” is the second.) By IEEE convention, this function is defined for `x2` = +/-0 and for either or both of `x1` and `x2` = +/-inf (see Notes for specific values).
This function is not defined for complex-valued arguments; for the so-called argument of complex values, use `angle`.
Parameters:
    
x1array_like, real-valued
    
`y`-coordinates.
x2array_like, real-valued
    
`x`-coordinates. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
anglendarray
    
Array of angles in radians, in the range `[-pi, pi]`. This is a scalar if both `x1` and `x2` are scalars.
See also
`arctan`, `tan`, `angle`
#### Notes
arctan2 is identical to the `atan2` function of the underlying C library. The following special values are defined in the C standard: [1]
`x1`
`x2`
`arctan2(x1,x2)`  
+/- 0
+0
+/- 0  
+/- 0
-0
+/- pi  
> 0
+/-inf
+0 / +pi  
< 0
+/-inf
-0 / -pi  
+/-inf
+inf
+/- (pi/4)  
+/-inf
-inf
+/- (3*pi/4)  
Note that +0 and -0 are distinct floating point numbers, as are +inf and -inf.
#### References
[1]
ISO/IEC standard 9899:1999, “Programming language C.”
#### Examples
Consider four points in different quadrants:
    
    >>> import numpy as np
    
    
    >>> x = np.array([-1, +1, +1, -1])
    >>> y = np.array([-1, -1, +1, +1])
    >>> np.arctan2(y, x) * 180 / np.pi
    array([-135.,  -45.,   45.,  135.])
    
Note the order of the parameters. `arctan2` is defined also when `x2` = 0 and at several other special points, obtaining values in the range `[-pi, pi]`:
    
    >>> np.arctan2([1., -1.], [0., 0.])
    array([ 1.57079633, -1.57079633])
    >>> np.arctan2([0., 0., np.inf], [+0., -0., np.inf])
    array([0.        , 3.14159265, 0.78539816])
    
# numpy.atanh
numpy.atanh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'arctanh'>
    
Inverse hyperbolic tangent element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Array of the same shape as `x`. This is a scalar if `x` is a scalar.
See also
`emath.arctanh`
#### Notes
`arctanh` is a multivalued function: for each `x` there are infinitely many numbers `z` such that `tanh(z) = x`. The convention is to return the `z` whose imaginary part lies in `[-pi/2, pi/2]`.
For real-valued input data types, `arctanh` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `arctanh` is a complex analytical function that has branch cuts `[-1, -inf]` and `[1, inf]` and is continuous from above on the former and from below on the latter.
The inverse hyperbolic tangent is also known as `atanh` or `tanh^-1`.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 86. https://personal.math.ubc.ca/~cbm/aands/page_86.htm
[2]
Wikipedia, “Inverse hyperbolic function”, https://en.wikipedia.org/wiki/Arctanh
#### Examples
    
    >>> import numpy as np
    >>> np.arctanh([0, -0.5])
    array([ 0.        , -0.54930614])
    
# numpy.atleast_1d
numpy.atleast_1d(*arys)[source]
    
Convert inputs to arrays with at least one dimension.
Scalar inputs are converted to 1-dimensional arrays, whilst higher-dimensional inputs are preserved.
Parameters:
    
arys1, arys2, …array_like
    
One or more input arrays.
Returns:
    
retndarray
    
An array, or tuple of arrays, each with `a.ndim >= 1`. Copies are made only if necessary.
See also
`atleast_2d`, `atleast_3d`
#### Examples
    
    >>> import numpy as np
    >>> np.atleast_1d(1.0)
    array([1.])
    
    
    >>> x = np.arange(9.0).reshape(3,3)
    >>> np.atleast_1d(x)
    array([[0., 1., 2.],
           [3., 4., 5.],
           [6., 7., 8.]])
    >>> np.atleast_1d(x) is x
    True
    
    
    >>> np.atleast_1d(1, [3, 4])
    (array([1]), array([3, 4]))
    
# numpy.atleast_2d
numpy.atleast_2d(*arys)[source]
    
View inputs as arrays with at least two dimensions.
Parameters:
    
arys1, arys2, …array_like
    
One or more array-like sequences. Non-array inputs are converted to arrays. Arrays that already have two or more dimensions are preserved.
Returns:
    
res, res2, …ndarray
    
An array, or tuple of arrays, each with `a.ndim >= 2`. Copies are avoided where possible, and views with two or more dimensions are returned.
See also
`atleast_1d`, `atleast_3d`
#### Examples
    
    >>> import numpy as np
    >>> np.atleast_2d(3.0)
    array([[3.]])
    
    
    >>> x = np.arange(3.0)
    >>> np.atleast_2d(x)
    array([[0., 1., 2.]])
    >>> np.atleast_2d(x).base is x
    True
    
    
    >>> np.atleast_2d(1, [1, 2], [[1, 2]])
    (array([[1]]), array([[1, 2]]), array([[1, 2]]))
    
# numpy.atleast_3d
numpy.atleast_3d(*arys)[source]
    
View inputs as arrays with at least three dimensions.
Parameters:
    
arys1, arys2, …array_like
    
One or more array-like sequences. Non-array inputs are converted to arrays. Arrays that already have three or more dimensions are preserved.
Returns:
    
res1, res2, …ndarray
    
An array, or tuple of arrays, each with `a.ndim >= 3`. Copies are avoided where possible, and views with three or more dimensions are returned. For example, a 1-D array of shape `(N,)` becomes a view of shape `(1, N, 1)`, and a 2-D array of shape `(M, N)` becomes a view of shape `(M, N, 1)`.
See also
`atleast_1d`, `atleast_2d`
#### Examples
    
    >>> import numpy as np
    >>> np.atleast_3d(3.0)
    array([[[3.]]])
    
    
    >>> x = np.arange(3.0)
    >>> np.atleast_3d(x).shape
    (1, 3, 1)
    
    
    >>> x = np.arange(12.0).reshape(4,3)
    >>> np.atleast_3d(x).shape
    (4, 3, 1)
    >>> np.atleast_3d(x).base is x.base  # x is a reshape, so not base itself
    True
    
    
    >>> for arr in np.atleast_3d([1, 2], [[1, 2]], [[[1, 2]]]):
    ...     print(arr, arr.shape) 
    ...
    [[[1]
      [2]]] (1, 2, 1)
    [[[1]
      [2]]] (1, 2, 1)
    [[[1 2]]] (1, 1, 2)
    
# numpy.average
numpy.average(a, axis=None, weights=None, returned=False, *, keepdims=<no value>)[source]
    
Compute the weighted average along the specified axis.
Parameters:
    
aarray_like
    
Array containing data to be averaged. If `a` is not an array, a conversion is attempted.
axisNone or int or tuple of ints, optional
    
Axis or axes along which to average `a`. The default, `axis=None`, will average over all of the elements of the input array. If axis is negative it counts from the last to the first axis. If axis is a tuple of ints, averaging is performed on all of the axes specified in the tuple instead of a single axis or all the axes as before.
weightsarray_like, optional
    
An array of weights associated with the values in `a`. Each value in `a` contributes to the average according to its associated weight. The array of weights must be the same shape as `a` if no axis is specified, otherwise the weights must have dimensions and shape consistent with `a` along the specified axis. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. The calculation is:
    
    avg = sum(a * weights) / sum(weights)
    
where the sum is over all included elements. The only constraint on the values of `weights` is that `sum(weights)` must not be 0.
returnedbool, optional
    
Default is `False`. If `True`, the tuple (`average`, `sum_of_weights`) is returned, otherwise only the average is returned. If `weights=None`, `sum_of_weights` is equivalent to the number of elements over which the average is taken.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`. Note: `keepdims` will not work with instances of `numpy.matrix` or other classes whose methods do not support `keepdims`.
New in version 1.23.0.
Returns:
    
retval, [sum_of_weights]array_type or double
    
Return the average along the specified axis. When `returned` is `True`, return a tuple with the average as the first element and the sum of the weights as the second element. `sum_of_weights` is of the same type as `retval`. The result dtype follows a general pattern. If `weights` is None, the result dtype will be that of `a` , or `float64` if `a` is integral. Otherwise, if `weights` is not None and `a` is non- integral, the result type will be the type of lowest precision capable of representing values of both `a` and `weights`. If `a` happens to be integral, the previous rules still applies but the result dtype will at least be `float64`.
Raises:
    
ZeroDivisionError
    
When all weights along axis are zero. See `numpy.ma.average` for a version robust to this type of error.
TypeError
    
When `weights` does not have the same shape as `a`, and `axis=None`.
ValueError
    
When `weights` does not have dimensions and shape consistent with `a` along specified `axis`.
See also
`mean`
`ma.average`
    
average for masked arrays – useful if your data contains “missing” values
`numpy.result_type`
    
Returns the type that results from applying the numpy type promotion rules to the arguments.
#### Examples
    
    >>> import numpy as np
    >>> data = np.arange(1, 5)
    >>> data
    array([1, 2, 3, 4])
    >>> np.average(data)
    2.5
    >>> np.average(np.arange(1, 11), weights=np.arange(10, 0, -1))
    4.0
    
    
    >>> data = np.arange(6).reshape((3, 2))
    >>> data
    array([[0, 1],
           [2, 3],
           [4, 5]])
    >>> np.average(data, axis=1, weights=[1./4, 3./4])
    array([0.75, 2.75, 4.75])
    >>> np.average(data, weights=[1./4, 3./4])
    Traceback (most recent call last):
        ...
    TypeError: Axis must be specified when shapes of a and weights differ.
    
With `keepdims=True`, the following result has shape (3, 1).
    
    >>> np.average(data, axis=1, keepdims=True)
    array([[0.5],
           [2.5],
           [4.5]])
    
    
    >>> data = np.arange(8).reshape((2, 2, 2))
    >>> data
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    >>> np.average(data, axis=(0, 1), weights=[[1./4, 3./4], [1., 1./2]])
    array([3.4, 4.4])
    >>> np.average(data, axis=0, weights=[[1./4, 3./4], [1., 1./2]])
    Traceback (most recent call last):
        ...
    ValueError: Shape of weights must be consistent
    with shape of a along specified axis.
    
# numpy.bartlett
numpy.bartlett(M)[source]
    
Return the Bartlett window.
The Bartlett window is very similar to a triangular window, except that the end points are at zero. It is often used in signal processing for tapering a signal, without generating too much ripple in the frequency domain.
Parameters:
    
Mint
    
Number of points in the output window. If zero or less, an empty array is returned.
Returns:
    
outarray
    
The triangular window, with the maximum value normalized to one (the value one appears only if the number of samples is odd), with the first and last samples equal to zero.
See also
`blackman`, `hamming`, `hanning`, `kaiser`
#### Notes
The Bartlett window is defined as
\\[w(n) = \frac{2}{M-1} \left( \frac{M-1}{2} - \left|n - \frac{M-1}{2}\right| \right)\\]
Most references to the Bartlett window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. Note that convolution with this window produces linear interpolation. It is also known as an apodization (which means “removing the foot”, i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. The Fourier transform of the Bartlett window is the product of two sinc functions. Note the excellent discussion in Kanasewich [2].
#### References
[1]
M.S. Bartlett, “Periodogram Analysis and Continuous Spectra”, Biometrika 37, 1-16, 1950.
[2]
E.R. Kanasewich, “Time Sequence Analysis in Geophysics”, The University of Alberta Press, 1975, pp. 109-110.
[3]
A.V. Oppenheim and R.W. Schafer, “Discrete-Time Signal Processing”, Prentice-Hall, 1999, pp. 468-471.
[4]
Wikipedia, “Window function”, https://en.wikipedia.org/wiki/Window_function
[5]
W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling, “Numerical Recipes”, Cambridge University Press, 1986, page 429.
#### Examples
    
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> np.bartlett(12)
    array([ 0.        ,  0.18181818,  0.36363636,  0.54545455,  0.72727273, # may vary
            0.90909091,  0.90909091,  0.72727273,  0.54545455,  0.36363636,
            0.18181818,  0.        ])
    
Plot the window and its frequency response (requires SciPy and matplotlib).
    
    import matplotlib.pyplot as plt
    from numpy.fft import fft, fftshift
    window = np.bartlett(51)
    plt.plot(window)
    plt.title("Bartlett window")
    plt.ylabel("Amplitude")
    plt.xlabel("Sample")
    plt.show()
    
    
    plt.figure()
    A = fft(window, 2048) / 25.5
    mag = np.abs(fftshift(A))
    freq = np.linspace(-0.5, 0.5, len(A))
    with np.errstate(divide='ignore', invalid='ignore'):
        response = 20 * np.log10(mag)
    response = np.clip(response, -100, 100)
    plt.plot(freq, response)
    plt.title("Frequency response of Bartlett window")
    plt.ylabel("Magnitude [dB]")
    plt.xlabel("Normalized frequency [cycles per sample]")
    plt.axis('tight')
    plt.show()
    
# numpy.base_repr
numpy.base_repr(number, base=2, padding=0)[source]
    
Return a string representation of a number in the given base system.
Parameters:
    
numberint
    
The value to convert. Positive and negative values are handled.
baseint, optional
    
Convert `number` to the `base` number system. The valid range is 2-36, the default value is 2.
paddingint, optional
    
Number of zeros padded on the left. Default is 0 (no padding).
Returns:
    
outstr
    
String representation of `number` in `base` system.
See also
`binary_repr`
    
Faster version of `base_repr` for base 2.
#### Examples
    
    >>> import numpy as np
    >>> np.base_repr(5)
    '101'
    >>> np.base_repr(6, 5)
    '11'
    >>> np.base_repr(7, base=5, padding=3)
    '00012'
    
    
    >>> np.base_repr(10, base=16)
    'A'
    >>> np.base_repr(32, base=16)
    '20'
    
# numpy.binary_repr
numpy.binary_repr(num, width=None)[source]
    
Return the binary representation of the input number as a string.
For negative numbers, if width is not given, a minus sign is added to the front. If width is given, the two’s complement of the number is returned, with respect to that width.
In a two’s-complement system negative numbers are represented by the two’s complement of the absolute value. This is the most common method of representing signed integers on computers [1]. A N-bit two’s-complement system can represent every integer in the range \\(-2^{N-1}\\) to \\(+2^{N-1}-1\\).
Parameters:
    
numint
    
Only an integer decimal number can be used.
widthint, optional
    
The length of the returned string if `num` is positive, or the length of the two’s complement if `num` is negative, provided that `width` is at least a sufficient number of bits for `num` to be represented in the designated form. If the `width` value is insufficient, an error is raised.
Returns:
    
binstr
    
Binary representation of `num` or two’s complement of `num`.
See also
`base_repr`
    
Return a string representation of a number in the given base system.
`bin`
    
Python’s built-in binary representation generator of an integer.
#### Notes
`binary_repr` is equivalent to using `base_repr` with base 2, but about 25x faster.
#### References
[1]
Wikipedia, “Two’s complement”, https://en.wikipedia.org/wiki/Two’s_complement
#### Examples
    
    >>> import numpy as np
    >>> np.binary_repr(3)
    '11'
    >>> np.binary_repr(-3)
    '-11'
    >>> np.binary_repr(3, width=4)
    '0011'
    
The two’s complement is returned when the input number is negative and width is specified:
    
    >>> np.binary_repr(-3, width=3)
    '101'
    >>> np.binary_repr(-3, width=5)
    '11101'
    
# numpy.bincount
numpy.bincount(x, /, weights=None, minlength=0)
    
Count number of occurrences of each value in array of non-negative ints.
The number of bins (of size 1) is one larger than the largest value in `x`. If `minlength` is specified, there will be at least this number of bins in the output array (though it will be longer if necessary, depending on the contents of `x`). Each bin gives the number of occurrences of its index value in `x`. If `weights` is specified the input array is weighted by it, i.e. if a value `n` is found at position `i`, `out[n] += weight[i]` instead of `out[n] += 1`.
Parameters:
    
xarray_like, 1 dimension, nonnegative ints
    
Input array.
weightsarray_like, optional
    
Weights, array of the same shape as `x`.
minlengthint, optional
    
A minimum number of bins for the output array.
Returns:
    
outndarray of ints
    
The result of binning the input array. The length of `out` is equal to `np.amax(x)+1`.
Raises:
    
ValueError
    
If the input is not 1-dimensional, or contains elements with negative values, or if `minlength` is negative.
TypeError
    
If the type of the input is float or complex.
See also
`histogram`, `digitize`, `unique`
#### Examples
    
    >>> import numpy as np
    >>> np.bincount(np.arange(5))
    array([1, 1, 1, 1, 1])
    >>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7]))
    array([1, 3, 1, 1, 0, 0, 0, 1])
    
    
    >>> x = np.array([0, 1, 1, 3, 2, 1, 7, 23])
    >>> np.bincount(x).size == np.amax(x)+1
    True
    
The input array needs to be of integer dtype, otherwise a TypeError is raised:
    
    >>> np.bincount(np.arange(5, dtype=float))
    Traceback (most recent call last):
      ...
    TypeError: Cannot cast array data from dtype('float64') to dtype('int64')
    according to the rule 'safe'
    
A possible use of `bincount` is to perform sums over variable-size chunks of an array, using the `weights` keyword.
    
    >>> w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6]) # weights
    >>> x = np.array([0, 1, 1, 2, 2, 2])
    >>> np.bincount(x,  weights=w)
    array([ 0.3,  0.7,  1.1])
    
# numpy.bitwise_and
numpy.bitwise_and(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'bitwise_and'>
    
Compute the bit-wise AND of two arrays element-wise.
Computes the bit-wise AND of the underlying binary representation of the integers in the input arrays. This ufunc implements the C/Python operator `&`.
Parameters:
    
x1, x2array_like
    
Only integer and boolean types are handled. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Result. This is a scalar if both `x1` and `x2` are scalars.
See also
`logical_and`
`bitwise_or`
`bitwise_xor`
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    
The number 13 is represented by `00001101`. Likewise, 17 is represented by `00010001`. The bit-wise AND of 13 and 17 is therefore `000000001`, or 1:
    
    >>> np.bitwise_and(13, 17)
    1
    
    
    >>> np.bitwise_and(14, 13)
    12
    >>> np.binary_repr(12)
    '1100'
    >>> np.bitwise_and([14,3], 13)
    array([12,  1])
    
    
    >>> np.bitwise_and([11,7], [4,25])
    array([0, 1])
    >>> np.bitwise_and(np.array([2,5,255]), np.array([3,14,16]))
    array([ 2,  4, 16])
    >>> np.bitwise_and([True, True], [False, True])
    array([False,  True])
    
The `&` operator can be used as a shorthand for `np.bitwise_and` on ndarrays.
    
    >>> x1 = np.array([2, 5, 255])
    >>> x2 = np.array([3, 14, 16])
    >>> x1 & x2
    array([ 2,  4, 16])
    
# numpy.bitwise_count
numpy.bitwise_count(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'bitwise_count'>
    
Computes the number of 1-bits in the absolute value of `x`. Analogous to the builtin `int.bit_count` or `popcount` in C++.
Parameters:
    
xarray_like, unsigned int
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding number of 1-bits in the input. Returns uint8 for all integer types This is a scalar if `x` is a scalar.
#### References
[1]
https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
[2]
Wikipedia, “Hamming weight”, https://en.wikipedia.org/wiki/Hamming_weight
[3]
http://aggregate.ee.engr.uky.edu/MAGIC/#Population%20Count%20(Ones%20Count)
#### Examples
    
    >>> import numpy as np
    >>> np.bitwise_count(1023)
    np.uint8(10)
    >>> a = np.array([2**i - 1 for i in range(16)])
    >>> np.bitwise_count(a)
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
          dtype=uint8)
    
# numpy.bitwise_invert
numpy.bitwise_invert(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'invert'>
    
Compute bit-wise inversion, or bit-wise NOT, element-wise.
Computes the bit-wise NOT of the underlying binary representation of the integers in the input arrays. This ufunc implements the C/Python operator `~`.
For signed integer inputs, the bit-wise NOT of the absolute value is returned. In a two’s-complement system, this operation effectively flips all the bits, resulting in a representation that corresponds to the negative of the input plus one. This is the most common method of representing signed integers on computers [1]. A N-bit two’s-complement system can represent every integer in the range \\(-2^{N-1}\\) to \\(+2^{N-1}-1\\).
Parameters:
    
xarray_like
    
Only integer and boolean types are handled.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Result. This is a scalar if `x` is a scalar.
See also
`bitwise_and`, `bitwise_or`, `bitwise_xor`
`logical_not`
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Notes
`numpy.bitwise_not` is an alias for `invert`:
    
    >>> np.bitwise_not is np.invert
    True
    
#### References
[1]
Wikipedia, “Two’s complement”, https://en.wikipedia.org/wiki/Two’s_complement
#### Examples
    
    >>> import numpy as np
    
We’ve seen that 13 is represented by `00001101`. The invert or bit-wise NOT of 13 is then:
    
    >>> x = np.invert(np.array(13, dtype=np.uint8))
    >>> x
    np.uint8(242)
    >>> np.binary_repr(x, width=8)
    '11110010'
    
The result depends on the bit-width:
    
    >>> x = np.invert(np.array(13, dtype=np.uint16))
    >>> x
    np.uint16(65522)
    >>> np.binary_repr(x, width=16)
    '1111111111110010'
    
When using signed integer types, the result is the bit-wise NOT of the unsigned type, interpreted as a signed integer:
    
    >>> np.invert(np.array([13], dtype=np.int8))
    array([-14], dtype=int8)
    >>> np.binary_repr(-14, width=8)
    '11110010'
    
Booleans are accepted as well:
    
    >>> np.invert(np.array([True, False]))
    array([False,  True])
    
The `~` operator can be used as a shorthand for `np.invert` on ndarrays.
    
    >>> x1 = np.array([True, False])
    >>> ~x1
    array([False,  True])
    
# numpy.bitwise_left_shift
numpy.bitwise_left_shift(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'left_shift'>
    
Shift the bits of an integer to the left.
Bits are shifted to the left by appending `x2` 0s at the right of `x1`. Since the internal representation of numbers is in binary format, this operation is equivalent to multiplying `x1` by `2**x2`.
Parameters:
    
x1array_like of integer type
    
Input values.
x2array_like of integer type
    
Number of zeros to append to `x1`. Has to be non-negative. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outarray of integer type
    
Return `x1` with bits shifted `x2` times to the left. This is a scalar if both `x1` and `x2` are scalars.
See also
`right_shift`
    
Shift the bits of an integer to the right.
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    >>> np.binary_repr(5)
    '101'
    >>> np.left_shift(5, 2)
    20
    >>> np.binary_repr(20)
    '10100'
    
    
    >>> np.left_shift(5, [1,2,3])
    array([10, 20, 40])
    
Note that the dtype of the second argument may change the dtype of the result and can lead to unexpected results in some cases (see Casting Rules):
    
    >>> a = np.left_shift(np.uint8(255), np.int64(1))  # Expect 254
    >>> print(a, type(a)) # Unexpected result due to upcasting
    510 <class 'numpy.int64'>
    >>> b = np.left_shift(np.uint8(255), np.uint8(1))
    >>> print(b, type(b))
    254 <class 'numpy.uint8'>
    
The `<<` operator can be used as a shorthand for `np.left_shift` on ndarrays.
    
    >>> x1 = 5
    >>> x2 = np.array([1, 2, 3])
    >>> x1 << x2
    array([10, 20, 40])
    
# numpy.bitwise_or
numpy.bitwise_or(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'bitwise_or'>
    
Compute the bit-wise OR of two arrays element-wise.
Computes the bit-wise OR of the underlying binary representation of the integers in the input arrays. This ufunc implements the C/Python operator `|`.
Parameters:
    
x1, x2array_like
    
Only integer and boolean types are handled. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Result. This is a scalar if both `x1` and `x2` are scalars.
See also
`logical_or`
`bitwise_and`
`bitwise_xor`
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    
The number 13 has the binary representation `00001101`. Likewise, 16 is represented by `00010000`. The bit-wise OR of 13 and 16 is then `00011101`, or 29:
    
    >>> np.bitwise_or(13, 16)
    29
    >>> np.binary_repr(29)
    '11101'
    
    
    >>> np.bitwise_or(32, 2)
    34
    >>> np.bitwise_or([33, 4], 1)
    array([33,  5])
    >>> np.bitwise_or([33, 4], [1, 2])
    array([33,  6])
    
    
    >>> np.bitwise_or(np.array([2, 5, 255]), np.array([4, 4, 4]))
    array([  6,   5, 255])
    >>> np.array([2, 5, 255]) | np.array([4, 4, 4])
    array([  6,   5, 255])
    >>> np.bitwise_or(np.array([2, 5, 255, 2147483647], dtype=np.int32),
    ...               np.array([4, 4, 4, 2147483647], dtype=np.int32))
    array([         6,          5,        255, 2147483647], dtype=int32)
    >>> np.bitwise_or([True, True], [False, True])
    array([ True,  True])
    
The `|` operator can be used as a shorthand for `np.bitwise_or` on ndarrays.
    
    >>> x1 = np.array([2, 5, 255])
    >>> x2 = np.array([4, 4, 4])
    >>> x1 | x2
    array([  6,   5, 255])
    
# numpy.bitwise_right_shift
numpy.bitwise_right_shift(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'right_shift'>
    
Shift the bits of an integer to the right.
Bits are shifted to the right `x2`. Because the internal representation of numbers is in binary format, this operation is equivalent to dividing `x1` by `2**x2`.
Parameters:
    
x1array_like, int
    
Input values.
x2array_like, int
    
Number of bits to remove at the right of `x1`. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray, int
    
Return `x1` with bits shifted `x2` times to the right. This is a scalar if both `x1` and `x2` are scalars.
See also
`left_shift`
    
Shift the bits of an integer to the left.
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    >>> np.binary_repr(10)
    '1010'
    >>> np.right_shift(10, 1)
    5
    >>> np.binary_repr(5)
    '101'
    
    
    >>> np.right_shift(10, [1,2,3])
    array([5, 2, 1])
    
The `>>` operator can be used as a shorthand for `np.right_shift` on ndarrays.
    
    >>> x1 = 10
    >>> x2 = np.array([1,2,3])
    >>> x1 >> x2
    array([5, 2, 1])
    
# numpy.bitwise_xor
numpy.bitwise_xor(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'bitwise_xor'>
    
Compute the bit-wise XOR of two arrays element-wise.
Computes the bit-wise XOR of the underlying binary representation of the integers in the input arrays. This ufunc implements the C/Python operator `^`.
Parameters:
    
x1, x2array_like
    
Only integer and boolean types are handled. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Result. This is a scalar if both `x1` and `x2` are scalars.
See also
`logical_xor`
`bitwise_and`
`bitwise_or`
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    
The number 13 is represented by `00001101`. Likewise, 17 is represented by `00010001`. The bit-wise XOR of 13 and 17 is therefore `00011100`, or 28:
    
    >>> np.bitwise_xor(13, 17)
    28
    >>> np.binary_repr(28)
    '11100'
    
    
    >>> np.bitwise_xor(31, 5)
    26
    >>> np.bitwise_xor([31,3], 5)
    array([26,  6])
    
    
    >>> np.bitwise_xor([31,3], [5,6])
    array([26,  5])
    >>> np.bitwise_xor([True, True], [False, True])
    array([ True, False])
    
The `^` operator can be used as a shorthand for `np.bitwise_xor` on ndarrays.
    
    >>> x1 = np.array([True, True])
    >>> x2 = np.array([False, True])
    >>> x1 ^ x2
    array([ True, False])
    
# numpy.blackman
numpy.blackman(M)[source]
    
Return the Blackman window.
The Blackman window is a taper formed by using the first three terms of a summation of cosines. It was designed to have close to the minimal leakage possible. It is close to optimal, only slightly worse than a Kaiser window.
Parameters:
    
Mint
    
Number of points in the output window. If zero or less, an empty array is returned.
Returns:
    
outndarray
    
The window, with the maximum value normalized to one (the value one appears only if the number of samples is odd).
See also
`bartlett`, `hamming`, `hanning`, `kaiser`
#### Notes
The Blackman window is defined as
\\[w(n) = 0.42 - 0.5 \cos(2\pi n/M) + 0.08 \cos(4\pi n/M)\\]
Most references to the Blackman window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means “removing the foot”, i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. It is known as a “near optimal” tapering function, almost as good (by some measures) as the kaiser window.
#### References
Blackman, R.B. and Tukey, J.W., (1958) The measurement of power spectra, Dover Publications, New York.
Oppenheim, A.V., and R.W. Schafer. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice-Hall, 1999, pp. 468-471.
#### Examples
    
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> np.blackman(12)
    array([-1.38777878e-17,   3.26064346e-02,   1.59903635e-01, # may vary
            4.14397981e-01,   7.36045180e-01,   9.67046769e-01,
            9.67046769e-01,   7.36045180e-01,   4.14397981e-01,
            1.59903635e-01,   3.26064346e-02,  -1.38777878e-17])
    
Plot the window and the frequency response.
    
    import matplotlib.pyplot as plt
    from numpy.fft import fft, fftshift
    window = np.blackman(51)
    plt.plot(window)
    plt.title("Blackman window")
    plt.ylabel("Amplitude")
    plt.xlabel("Sample")
    plt.show()  # doctest: +SKIP
    
    
    plt.figure()
    A = fft(window, 2048) / 25.5
    mag = np.abs(fftshift(A))
    freq = np.linspace(-0.5, 0.5, len(A))
    with np.errstate(divide='ignore', invalid='ignore'):
        response = 20 * np.log10(mag)
    response = np.clip(response, -100, 100)
    plt.plot(freq, response)
    plt.title("Frequency response of Blackman window")
    plt.ylabel("Magnitude [dB]")
    plt.xlabel("Normalized frequency [cycles per sample]")
    plt.axis('tight')
    plt.show()
    
# numpy.block
numpy.block(arrays)[source]
    
Assemble an nd-array from nested lists of blocks.
Blocks in the innermost lists are concatenated (see `concatenate`) along the last dimension (-1), then these are concatenated along the second-last dimension (-2), and so on until the outermost list is reached.
Blocks can be of any dimension, but will not be broadcasted using the normal rules. Instead, leading axes of size 1 are inserted, to make `block.ndim` the same for all blocks. This is primarily useful for working with scalars, and means that code like `np.block([v, 1])` is valid, where `v.ndim == 1`.
When the nested list is two levels deep, this allows block matrices to be constructed from their components.
Parameters:
    
arraysnested list of array_like or scalars (but not tuples)
    
If passed a single ndarray or scalar (a nested list of depth 0), this is returned unmodified (and not copied).
Elements shapes must match along the appropriate axes (without broadcasting), but leading 1s will be prepended to the shape as necessary to make the dimensions match.
Returns:
    
block_arrayndarray
    
The array assembled from the given blocks.
The dimensionality of the output is equal to the greatest of:
  * the dimensionality of all the inputs
  * the depth to which the input list is nested


Raises:
    
ValueError
    
  * If list depths are mismatched - for instance, `[[a, b], c]` is illegal, and should be spelt `[[a, b], [c]]`
  * If lists are empty - for instance, `[[a, b], []]`


See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`vstack`
    
Stack arrays in sequence vertically (row wise).
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`dstack`
    
Stack arrays in sequence depth wise (along third axis).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`vsplit`
    
Split an array into multiple sub-arrays vertically (row-wise).
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Notes
When called with only scalars, `np.block` is equivalent to an ndarray call. So `np.block([[1, 2], [3, 4]])` is equivalent to `np.array([[1, 2], [3, 4]])`.
This function does not enforce that the blocks lie on a fixed grid. `np.block([[a, b], [c, d]])` is not restricted to arrays of the form:
    
    AAAbb
    AAAbb
    cccDD
    
But is also allowed to produce, for some `a, b, c, d`:
    
    AAAbb
    AAAbb
    cDDDD
    
Since concatenation happens along the last axis first, `block` is not capable of producing the following directly:
    
    AAAbb
    cccbb
    cccDD
    
Matlab’s “square bracket stacking”, `[A, B, ...; p, q, ...]`, is equivalent to `np.block([[A, B, ...], [p, q, ...]])`.
#### Examples
The most common use of this function is to build a block matrix:
    
    >>> import numpy as np
    >>> A = np.eye(2) * 2
    >>> B = np.eye(3) * 3
    >>> np.block([
    ...     [A,               np.zeros((2, 3))],
    ...     [np.ones((3, 2)), B               ]
    ... ])
    array([[2., 0., 0., 0., 0.],
           [0., 2., 0., 0., 0.],
           [1., 1., 3., 0., 0.],
           [1., 1., 0., 3., 0.],
           [1., 1., 0., 0., 3.]])
    
With a list of depth 1, `block` can be used as `hstack`:
    
    >>> np.block([1, 2, 3])              # hstack([1, 2, 3])
    array([1, 2, 3])
    
    
    >>> a = np.array([1, 2, 3])
    >>> b = np.array([4, 5, 6])
    >>> np.block([a, b, 10])             # hstack([a, b, 10])
    array([ 1,  2,  3,  4,  5,  6, 10])
    
    
    >>> A = np.ones((2, 2), int)
    >>> B = 2 * A
    >>> np.block([A, B])                 # hstack([A, B])
    array([[1, 1, 2, 2],
           [1, 1, 2, 2]])
    
With a list of depth 2, `block` can be used in place of `vstack`:
    
    >>> a = np.array([1, 2, 3])
    >>> b = np.array([4, 5, 6])
    >>> np.block([[a], [b]])             # vstack([a, b])
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> A = np.ones((2, 2), int)
    >>> B = 2 * A
    >>> np.block([[A], [B]])             # vstack([A, B])
    array([[1, 1],
           [1, 1],
           [2, 2],
           [2, 2]])
    
It can also be used in place of `atleast_1d` and `atleast_2d`:
    
    >>> a = np.array(0)
    >>> b = np.array([1])
    >>> np.block([a])                    # atleast_1d(a)
    array([0])
    >>> np.block([b])                    # atleast_1d(b)
    array([1])
    
    
    >>> np.block([[a]])                  # atleast_2d(a)
    array([[0]])
    >>> np.block([[b]])                  # atleast_2d(b)
    array([[1]])
    
# numpy.bmat
numpy.bmat(obj, ldict=None, gdict=None)[source]
    
Build a matrix object from a string, nested sequence, or array.
Parameters:
    
objstr or array_like
    
Input data. If a string, variables in the current scope may be referenced by name.
ldictdict, optional
    
A dictionary that replaces local operands in current frame. Ignored if `obj` is not a string or `gdict` is None.
gdictdict, optional
    
A dictionary that replaces global operands in current frame. Ignored if `obj` is not a string.
Returns:
    
outmatrix
    
Returns a matrix object, which is a specialized 2-D array.
See also
`block`
    
A generalization of this function for N-d arrays, that returns normal ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> A = np.asmatrix('1 1; 1 1')
    >>> B = np.asmatrix('2 2; 2 2')
    >>> C = np.asmatrix('3 4; 5 6')
    >>> D = np.asmatrix('7 8; 9 0')
    
All the following expressions construct the same block matrix:
    
    >>> np.bmat([[A, B], [C, D]])
    matrix([[1, 1, 2, 2],
            [1, 1, 2, 2],
            [3, 4, 7, 8],
            [5, 6, 9, 0]])
    >>> np.bmat(np.r_[np.c_[A, B], np.c_[C, D]])
    matrix([[1, 1, 2, 2],
            [1, 1, 2, 2],
            [3, 4, 7, 8],
            [5, 6, 9, 0]])
    >>> np.bmat('A,B; C,D')
    matrix([[1, 1, 2, 2],
            [1, 1, 2, 2],
            [3, 4, 7, 8],
            [5, 6, 9, 0]])
    
# numpy.broadcast
classnumpy.broadcast[source]
    
Produce an object that mimics broadcasting.
Parameters:
    
in1, in2, …array_like
    
Input parameters.
Returns:
    
bbroadcast object
    
Broadcast the input parameters against one another, and return an object that encapsulates the result. Amongst others, it has `shape` and `nd` properties, and may be used as an iterator.
See also
`broadcast_arrays`
`broadcast_to`
`broadcast_shapes`
#### Examples
Manually adding two vectors, using broadcasting:
    
    >>> import numpy as np
    >>> x = np.array([[1], [2], [3]])
    >>> y = np.array([4, 5, 6])
    >>> b = np.broadcast(x, y)
    
    
    >>> out = np.empty(b.shape)
    >>> out.flat = [u+v for (u,v) in b]
    >>> out
    array([[5.,  6.,  7.],
           [6.,  7.,  8.],
           [7.,  8.,  9.]])
    
Compare against built-in broadcasting:
    
    >>> x + y
    array([[5, 6, 7],
           [6, 7, 8],
           [7, 8, 9]])
    
Attributes:
    
`index`
    
current index in broadcasted result
`iters`
    
tuple of iterators along `self`’s “components.”
`nd`
    
Number of dimensions of broadcasted result.
`ndim`
    
Number of dimensions of broadcasted result.
`numiter`
    
Number of iterators possessed by the broadcasted result.
`shape`
    
Shape of broadcasted result.
`size`
    
Total size of broadcasted result.
#### Methods
`reset`()
Reset the broadcasted result's iterator(s).  
# numpy.broadcast.index
attribute
broadcast.index
    
current index in broadcasted result
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1], [2], [3]])
    >>> y = np.array([4, 5, 6])
    >>> b = np.broadcast(x, y)
    >>> b.index
    0
    >>> next(b), next(b), next(b)
    ((1, 4), (1, 5), (1, 6))
    >>> b.index
    3
    
# numpy.broadcast.iters
attribute
broadcast.iters
    
tuple of iterators along `self`’s “components.”
Returns a tuple of `numpy.flatiter` objects, one for each “component” of `self`.
See also
`numpy.flatiter`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> y = np.array([[4], [5], [6]])
    >>> b = np.broadcast(x, y)
    >>> row, col = b.iters
    >>> next(row), next(col)
    (1, 4)
    
# numpy.broadcast.nd
attribute
broadcast.nd
    
Number of dimensions of broadcasted result. For code intended for NumPy 1.12.0 and later the more consistent `ndim` is preferred.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> y = np.array([[4], [5], [6]])
    >>> b = np.broadcast(x, y)
    >>> b.nd
    2
    
# numpy.broadcast.numiter
attribute
broadcast.numiter
    
Number of iterators possessed by the broadcasted result.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> y = np.array([[4], [5], [6]])
    >>> b = np.broadcast(x, y)
    >>> b.numiter
    2
    
# numpy.broadcast.reset
method
broadcast.reset()
    
Reset the broadcasted result’s iterator(s).
Parameters:
    
None
Returns:
    
None
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> y = np.array([[4], [5], [6]])
    >>> b = np.broadcast(x, y)
    >>> b.index
    0
    >>> next(b), next(b), next(b)
    ((1, 4), (2, 4), (3, 4))
    >>> b.index
    3
    >>> b.reset()
    >>> b.index
    0
    
# numpy.broadcast_arrays
numpy.broadcast_arrays(*args, subok=False)[source]
    
Broadcast any number of arrays against each other.
Parameters:
    
*argsarray_likes
    
The arrays to broadcast.
subokbool, optional
    
If True, then sub-classes will be passed-through, otherwise the returned arrays will be forced to be a base-class array (default).
Returns:
    
broadcastedtuple of arrays
    
These arrays are views on the original arrays. They are typically not contiguous. Furthermore, more than one element of a broadcasted array may refer to a single memory location. If you need to write to the arrays, make copies first. While you can set the `writable` flag True, writing to a single output value may end up changing more than one location in the output array.
Deprecated since version 1.17: The output is currently marked so that if written to, a deprecation warning will be emitted. A future version will set the `writable` flag False so writing to it will raise an error.
See also
`broadcast`
`broadcast_to`
`broadcast_shapes`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3]])
    >>> y = np.array([[4],[5]])
    >>> np.broadcast_arrays(x, y)
    (array([[1, 2, 3],
            [1, 2, 3]]),
     array([[4, 4, 4],
            [5, 5, 5]]))
    
Here is a useful idiom for getting contiguous copies instead of non-contiguous views.
    
    >>> [np.array(a) for a in np.broadcast_arrays(x, y)]
    [array([[1, 2, 3],
            [1, 2, 3]]),
     array([[4, 4, 4],
            [5, 5, 5]])]
    
# numpy.broadcast_shapes
numpy.broadcast_shapes(*args)[source]
    
Broadcast the input shapes into a single shape.
Learn more about broadcasting here.
New in version 1.20.0.
Parameters:
    
*argstuples of ints, or ints
    
The shapes to be broadcast against each other.
Returns:
    
tuple
    
Broadcasted shape.
Raises:
    
ValueError
    
If the shapes are not compatible and cannot be broadcast according to NumPy’s broadcasting rules.
See also
`broadcast`
`broadcast_arrays`
`broadcast_to`
#### Examples
    
    >>> import numpy as np
    >>> np.broadcast_shapes((1, 2), (3, 1), (3, 2))
    (3, 2)
    
    
    >>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
    (5, 6, 7)
    
# numpy.broadcast_to
numpy.broadcast_to(array, shape, subok=False)[source]
    
Broadcast an array to a new shape.
Parameters:
    
arrayarray_like
    
The array to broadcast.
shapetuple or int
    
The shape of the desired array. A single integer `i` is interpreted as `(i,)`.
subokbool, optional
    
If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default).
Returns:
    
broadcastarray
    
A readonly view on the original array with the given shape. It is typically not contiguous. Furthermore, more than one element of a broadcasted array may refer to a single memory location.
Raises:
    
ValueError
    
If the array is not compatible with the new shape according to NumPy’s broadcasting rules.
See also
`broadcast`
`broadcast_arrays`
`broadcast_shapes`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> np.broadcast_to(x, (3, 3))
    array([[1, 2, 3],
           [1, 2, 3],
           [1, 2, 3]])
    
# numpy.busday_count
numpy.busday_count(begindates, enddates, weekmask='1111100', holidays=[], busdaycal=None, out=None)
    
Counts the number of valid days between `begindates` and `enddates`, not including the day of `enddates`.
If `enddates` specifies a date value that is earlier than the corresponding `begindates` date value, the count will be negative.
Parameters:
    
begindatesarray_like of datetime64[D]
    
The array of the first dates for counting.
enddatesarray_like of datetime64[D]
    
The array of the end dates for counting, which are excluded from the count themselves.
weekmaskstr or array_like of bool, optional
    
A seven-element array indicating which of Monday through Sunday are valid days. May be specified as a length-seven list or array, like [1,1,1,1,1,0,0]; a length-seven string, like ‘1111100’; or a string like “Mon Tue Wed Thu Fri”, made up of 3-character abbreviations for weekdays, optionally separated by white space. Valid abbreviations are: Mon Tue Wed Thu Fri Sat Sun
holidaysarray_like of datetime64[D], optional
    
An array of dates to consider as invalid dates. They may be specified in any order, and NaT (not-a-time) dates are ignored. This list is saved in a normalized form that is suited for fast calculations of valid days.
busdaycalbusdaycalendar, optional
    
A `busdaycalendar` object which specifies the valid days. If this parameter is provided, neither weekmask nor holidays may be provided.
outarray of int, optional
    
If provided, this array is filled with the result.
Returns:
    
outarray of int
    
An array with a shape from broadcasting `begindates` and `enddates` together, containing the number of valid days between the begin and end dates.
See also
`busdaycalendar`
    
An object that specifies a custom set of valid days.
`is_busday`
    
Returns a boolean array indicating valid days.
`busday_offset`
    
Applies an offset counted in valid days.
#### Examples
    
    >>> import numpy as np
    >>> # Number of weekdays in January 2011
    ... np.busday_count('2011-01', '2011-02')
    21
    >>> # Number of weekdays in 2011
    >>> np.busday_count('2011', '2012')
    260
    >>> # Number of Saturdays in 2011
    ... np.busday_count('2011', '2012', weekmask='Sat')
    53
    
# numpy.busday_offset
numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)
    
First adjusts the date to fall on a valid day according to the `roll` rule, then applies offsets to the given dates counted in valid days.
Parameters:
    
datesarray_like of datetime64[D]
    
The array of dates to process.
offsetsarray_like of int
    
The array of offsets, which is broadcast with `dates`.
roll{‘raise’, ‘nat’, ‘forward’, ‘following’, ‘backward’, ‘preceding’, ‘modifiedfollowing’, ‘modifiedpreceding’}, optional
    
How to treat dates that do not fall on a valid day. The default is ‘raise’.
  * ‘raise’ means to raise an exception for an invalid day.
  * ‘nat’ means to return a NaT (not-a-time) for an invalid day.
  * ‘forward’ and ‘following’ mean to take the first valid day later in time.
  * ‘backward’ and ‘preceding’ mean to take the first valid day earlier in time.
  * ‘modifiedfollowing’ means to take the first valid day later in time unless it is across a Month boundary, in which case to take the first valid day earlier in time.
  * ‘modifiedpreceding’ means to take the first valid day earlier in time unless it is across a Month boundary, in which case to take the first valid day later in time.


weekmaskstr or array_like of bool, optional
    
A seven-element array indicating which of Monday through Sunday are valid days. May be specified as a length-seven list or array, like [1,1,1,1,1,0,0]; a length-seven string, like ‘1111100’; or a string like “Mon Tue Wed Thu Fri”, made up of 3-character abbreviations for weekdays, optionally separated by white space. Valid abbreviations are: Mon Tue Wed Thu Fri Sat Sun
holidaysarray_like of datetime64[D], optional
    
An array of dates to consider as invalid dates. They may be specified in any order, and NaT (not-a-time) dates are ignored. This list is saved in a normalized form that is suited for fast calculations of valid days.
busdaycalbusdaycalendar, optional
    
A `busdaycalendar` object which specifies the valid days. If this parameter is provided, neither weekmask nor holidays may be provided.
outarray of datetime64[D], optional
    
If provided, this array is filled with the result.
Returns:
    
outarray of datetime64[D]
    
An array with a shape from broadcasting `dates` and `offsets` together, containing the dates with offsets applied.
See also
`busdaycalendar`
    
An object that specifies a custom set of valid days.
`is_busday`
    
Returns a boolean array indicating valid days.
`busday_count`
    
Counts how many valid days are in a half-open date range.
#### Examples
    
    >>> import numpy as np
    >>> # First business day in October 2011 (not accounting for holidays)
    ... np.busday_offset('2011-10', 0, roll='forward')
    np.datetime64('2011-10-03')
    >>> # Last business day in February 2012 (not accounting for holidays)
    ... np.busday_offset('2012-03', -1, roll='forward')
    np.datetime64('2012-02-29')
    >>> # Third Wednesday in January 2011
    ... np.busday_offset('2011-01', 2, roll='forward', weekmask='Wed')
    np.datetime64('2011-01-19')
    >>> # 2012 Mother's Day in Canada and the U.S.
    ... np.busday_offset('2012-05', 1, roll='forward', weekmask='Sun')
    np.datetime64('2012-05-13')
    
    
    >>> # First business day on or after a date
    ... np.busday_offset('2011-03-20', 0, roll='forward')
    np.datetime64('2011-03-21')
    >>> np.busday_offset('2011-03-22', 0, roll='forward')
    np.datetime64('2011-03-22')
    >>> # First business day after a date
    ... np.busday_offset('2011-03-20', 1, roll='backward')
    np.datetime64('2011-03-21')
    >>> np.busday_offset('2011-03-22', 1, roll='backward')
    np.datetime64('2011-03-23')
    
# numpy.busdaycalendar.holidays
attribute
busdaycalendar.holidays
    
A copy of the holiday array indicating additional invalid days.
# numpy.busdaycalendar
classnumpy.busdaycalendar(weekmask='1111100', holidays=None)[source]
    
A business day calendar object that efficiently stores information defining valid days for the busday family of functions.
The default valid days are Monday through Friday (“business days”). A busdaycalendar object can be specified with any set of weekly valid days, plus an optional “holiday” dates that always will be invalid.
Once a busdaycalendar object is created, the weekmask and holidays cannot be modified.
Parameters:
    
weekmaskstr or array_like of bool, optional
    
A seven-element array indicating which of Monday through Sunday are valid days. May be specified as a length-seven list or array, like [1,1,1,1,1,0,0]; a length-seven string, like ‘1111100’; or a string like “Mon Tue Wed Thu Fri”, made up of 3-character abbreviations for weekdays, optionally separated by white space. Valid abbreviations are: Mon Tue Wed Thu Fri Sat Sun
holidaysarray_like of datetime64[D], optional
    
An array of dates to consider as invalid dates, no matter which weekday they fall upon. Holiday dates may be specified in any order, and NaT (not-a-time) dates are ignored. This list is saved in a normalized form that is suited for fast calculations of valid days.
Returns:
    
outbusdaycalendar
    
A business day calendar object containing the specified weekmask and holidays values.
See also
`is_busday`
    
Returns a boolean array indicating valid days.
`busday_offset`
    
Applies an offset counted in valid days.
`busday_count`
    
Counts how many valid days are in a half-open date range.
#### Notes
Once a busdaycalendar object is created, you cannot modify the weekmask or holidays. The attributes return copies of internal data.
#### Examples
    
    >>> import numpy as np
    >>> # Some important days in July
    ... bdd = np.busdaycalendar(
    ...             holidays=['2011-07-01', '2011-07-04', '2011-07-17'])
    >>> # Default is Monday to Friday weekdays
    ... bdd.weekmask
    array([ True,  True,  True,  True,  True, False, False])
    >>> # Any holidays already on the weekend are removed
    ... bdd.holidays
    array(['2011-07-01', '2011-07-04'], dtype='datetime64[D]')
    
Attributes:
    
`weekmask`(copy) seven-element array of bool
    
A copy of the seven-element boolean mask indicating valid days.
`holidays`(copy) sorted array of datetime64[D]
    
A copy of the holiday array indicating additional invalid days.
# numpy.busdaycalendar.weekmask
attribute
busdaycalendar.weekmask
    
A copy of the seven-element boolean mask indicating valid days.
# numpy.c_
numpy.c_=<numpy.lib._index_tricks_impl.CClass object>
    
Translates slice objects to concatenation along the second axis.
This is short-hand for `np.r_['-1,2,0', index expression]`, which is useful because of its common occurrence. In particular, arrays will be stacked along their last axis after being upgraded to at least 2-D with 1’s post-pended to the shape (column vectors made out of 1-D arrays).
See also
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`r_`
    
For more detailed documentation.
#### Examples
    
    >>> import numpy as np
    >>> np.c_[np.array([1,2,3]), np.array([4,5,6])]
    array([[1, 4],
           [2, 5],
           [3, 6]])
    >>> np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
    array([[1, 2, 3, ..., 4, 5, 6]])
    
# numpy.can_cast
numpy.can_cast(from_, to, casting='safe')
    
Returns True if cast between data types can occur according to the casting rule.
Parameters:
    
from_dtype, dtype specifier, NumPy scalar, or array
    
Data type, NumPy scalar, or array to cast from.
todtype or dtype specifier
    
Data type to cast to.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


Returns:
    
outbool
    
True if cast can occur according to the casting rule.
See also
`dtype`, `result_type`
#### Notes
Changed in version 2.0: This function does not support Python scalars anymore and does not apply any value-based logic for 0-D arrays and NumPy scalars.
#### Examples
Basic examples
    
    >>> import numpy as np
    >>> np.can_cast(np.int32, np.int64)
    True
    >>> np.can_cast(np.float64, complex)
    True
    >>> np.can_cast(complex, float)
    False
    
    
    >>> np.can_cast('i8', 'f8')
    True
    >>> np.can_cast('i8', 'f4')
    False
    >>> np.can_cast('i4', 'S4')
    False
    
# numpy.cbrt
numpy.cbrt(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'cbrt'>
    
Return the cube-root of an array, element-wise.
Parameters:
    
xarray_like
    
The values whose cube-roots are required.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
An array of the same shape as `x`, containing the cube root of each element in `x`. If `out` was provided, `y` is a reference to it. This is a scalar if `x` is a scalar.
#### Examples
    
    >>> import numpy as np
    >>> np.cbrt([1,8,27])
    array([ 1.,  2.,  3.])
    
# numpy.ceil
numpy.ceil(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'ceil'>
    
Return the ceiling of the input, element-wise.
The ceil of the scalar `x` is the smallest integer `i`, such that `i >= x`. It is often denoted as \\(\lceil x \rceil\\).
Parameters:
    
xarray_like
    
Input data.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The ceiling of each element in `x`. This is a scalar if `x` is a scalar.
See also
`floor`, `trunc`, `rint`, `fix`
#### Examples
    
    >>> import numpy as np
    
    
    >>> a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0])
    >>> np.ceil(a)
    array([-1., -1., -0.,  1.,  2.,  2.,  2.])
    
# numpy.char.add
char.add(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'add'>
    
Add arguments element-wise.
Parameters:
    
x1, x2array_like
    
The arrays to be added. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
addndarray or scalar
    
The sum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
#### Notes
Equivalent to `x1` \+ `x2` in terms of array broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.add(1.0, 4.0)
    5.0
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.add(x1, x2)
    array([[  0.,   2.,   4.],
           [  3.,   5.,   7.],
           [  6.,   8.,  10.]])
    
The `+` operator can be used as a shorthand for `np.add` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> x1 + x2
    array([[ 0.,  2.,  4.],
           [ 3.,  5.,  7.],
           [ 6.,  8., 10.]])
    
# numpy.char.array
char.array(obj, itemsize=None, copy=True, unicode=None, order=None)[source]
    
Create a `chararray`.
Note
This class is provided for numarray backward-compatibility. New code (not concerned with numarray compatibility) should use arrays of type `bytes_` or `str_` and use the free functions in `numpy.char` for fast vectorized string operations instead.
Versus a NumPy array of dtype `bytes_` or `str_`, this class adds the following functionality:
  1. values automatically have whitespace removed from the end when indexed
  2. comparison operators automatically remove whitespace from the end when comparing values
  3. vectorized string operations are provided as methods (e.g. `chararray.endswith`) and infix operators (e.g. `+, *, %`)


Parameters:
    
objarray of str or unicode-like
itemsizeint, optional
    
`itemsize` is the number of characters per scalar in the resulting array. If `itemsize` is None, and `obj` is an object array or a Python list, the `itemsize` will be automatically determined. If `itemsize` is provided and `obj` is of type str or unicode, then the `obj` string will be chunked into `itemsize` pieces.
copybool, optional
    
If true (default), then the object is copied. Otherwise, a copy will only be made if `__array__` returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`itemsize`, unicode, `order`, etc.).
unicodebool, optional
    
When true, the resulting `chararray` can contain Unicode characters, when false only 8-bit characters. If unicode is None and `obj` is one of the following:
  * a `chararray`,
  * an ndarray of type `str_` or `bytes_`
  * a Python `str` or `bytes` object,


then the unicode setting of the output array will be automatically determined.
order{‘C’, ‘F’, ‘A’}, optional
    
Specify the order of the array. If order is ‘C’ (default), then the array will be in C-contiguous order (last-index varies the fastest). If order is ‘F’, then the returned array will be in Fortran-contiguous order (first-index varies the fastest). If order is ‘A’, then the returned array may be in any order (either C-, Fortran-contiguous, or even discontiguous).
#### Examples
    
    >>> import numpy as np
    >>> char_array = np.char.array(['hello', 'world', 'numpy','array'])
    >>> char_array
    chararray(['hello', 'world', 'numpy', 'array'], dtype='<U5')
    
# numpy.char.asarray
char.asarray(obj, itemsize=None, unicode=None, order=None)[source]
    
Convert the input to a `chararray`, copying the data only if necessary.
Versus a NumPy array of dtype `bytes_` or `str_`, this class adds the following functionality:
  1. values automatically have whitespace removed from the end when indexed
  2. comparison operators automatically remove whitespace from the end when comparing values
  3. vectorized string operations are provided as methods (e.g. `chararray.endswith`) and infix operators (e.g. `+`, `*`, `%`)


Parameters:
    
objarray of str or unicode-like
itemsizeint, optional
    
`itemsize` is the number of characters per scalar in the resulting array. If `itemsize` is None, and `obj` is an object array or a Python list, the `itemsize` will be automatically determined. If `itemsize` is provided and `obj` is of type str or unicode, then the `obj` string will be chunked into `itemsize` pieces.
unicodebool, optional
    
When true, the resulting `chararray` can contain Unicode characters, when false only 8-bit characters. If unicode is None and `obj` is one of the following:
  * a `chararray`,
  * an ndarray of type `str_` or `unicode_`
  * a Python str or unicode object,


then the unicode setting of the output array will be automatically determined.
order{‘C’, ‘F’}, optional
    
Specify the order of the array. If order is ‘C’ (default), then the array will be in C-contiguous order (last-index varies the fastest). If order is ‘F’, then the returned array will be in Fortran-contiguous order (first-index varies the fastest).
#### Examples
    
    >>> import numpy as np
    >>> np.char.asarray(['hello', 'world'])
    chararray(['hello', 'world'], dtype='<U5')
    
# numpy.char.capitalize
char.capitalize(a)[source]
    
Return a copy of `a` with only the first character of each element capitalized.
Calls `str.capitalize` element-wise.
For byte strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array of strings to capitalize.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.capitalize`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['a1b2','1b2a','b2a1','2a1b'],'S4'); c
    array(['a1b2', '1b2a', 'b2a1', '2a1b'],
        dtype='|S4')
    >>> np.strings.capitalize(c)
    array(['A1b2', '1b2a', 'B2a1', '2a1b'],
        dtype='|S4')
    
# numpy.char.center
char.center(a, width, fillchar=' ')[source]
    
Return a copy of `a` with its elements centered in a string of length `width`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
The length of the resulting strings, unless `width < str_len(a)`.
fillchararray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Optional padding character to use (default is space).
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.center`
#### Notes
While it is possible for `a` and `fillchar` to have different dtypes, passing a non-ASCII character in `fillchar` when `a` is of dtype “S” is not allowed, and a `ValueError` is raised.
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['a1b2','1b2a','b2a1','2a1b']); c
    array(['a1b2', '1b2a', 'b2a1', '2a1b'], dtype='<U4')
    >>> np.strings.center(c, width=9)
    array(['   a1b2  ', '   1b2a  ', '   b2a1  ', '   2a1b  '], dtype='<U9')
    >>> np.strings.center(c, width=9, fillchar='*')
    array(['***a1b2**', '***1b2a**', '***b2a1**', '***2a1b**'], dtype='<U9')
    >>> np.strings.center(c, width=1)
    array(['a1b2', '1b2a', 'b2a1', '2a1b'], dtype='<U4')
    
# numpy.char.chararray.argsort
method
char.chararray.argsort(axis=-1, kind=None, order=None)[source]
    
Returns the indices that would sort this array.
Refer to `numpy.argsort` for full documentation.
See also
`numpy.argsort`
    
equivalent function
# numpy.char.chararray.astype
method
char.chararray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
    
Copy of the array, cast to a specified type.
Parameters:
    
dtypestr or dtype
    
Typecode or data-type to which the array is cast.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout order of the result. ‘C’ means C order, ‘F’ means Fortran order, ‘A’ means ‘F’ order if all the arrays are Fortran contiguous, ‘C’ order otherwise, and ‘K’ means as close to the order the array elements appear in memory as possible. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘unsafe’ for backwards compatibility.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


subokbool, optional
    
If True, then sub-classes will be passed-through (default), otherwise the returned array will be forced to be a base-class array.
copybool, optional
    
By default, astype always returns a newly allocated array. If this is set to false, and the `dtype`, `order`, and `subok` requirements are satisfied, the input array is returned instead of a copy.
Returns:
    
arr_tndarray
    
Unless `copy` is False and the other conditions for returning the input array are satisfied (see description for `copy` input parameter), `arr_t` is a new array of the same shape as the input array, with dtype, order given by `dtype`, `order`.
Raises:
    
ComplexWarning
    
When casting from complex to float or int. To avoid this, one should use `a.real.astype(t)`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 2.5])
    >>> x
    array([1. ,  2. ,  2.5])
    
    
    >>> x.astype(int)
    array([1, 2, 2])
    
# numpy.char.chararray.base
attribute
char.chararray.base
    
Base object if memory is from some other object.
#### Examples
The base of an array that owns its memory is None:
    
    >>> import numpy as np
    >>> x = np.array([1,2,3,4])
    >>> x.base is None
    True
    
Slicing creates a view, whose memory is shared with x:
    
    >>> y = x[2:]
    >>> y.base is x
    True
    
# numpy.char.chararray.copy
method
char.chararray.copy(order='C')
    
Return a copy of the array.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `numpy.copy` are very similar but have different default values for their order= arguments, and this function always passes sub-classes through.)
See also
`numpy.copy`
    
Similar function with different default behavior
`numpy.copyto`
#### Notes
This function is the preferred method for creating an array copy. The function `numpy.copy` is similar, but it defaults to using order ‘K’, and will not pass sub-classes through by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3],[4,5,6]], order='F')
    
    
    >>> y = x.copy()
    
    
    >>> x.fill(0)
    
    
    >>> x
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> y.flags['C_CONTIGUOUS']
    True
    
For arrays containing Python objects (e.g. dtype=object), the copy is a shallow one. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):
    
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> b = a.copy()
    >>> b[2][0] = 10
    >>> a
    array([1, 'm', list([10, 3, 4])], dtype=object)
    
To ensure all elements within an `object` array are copied, use `copy.deepcopy`:
    
    >>> import copy
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> c = copy.deepcopy(a)
    >>> c[2][0] = 10
    >>> c
    array([1, 'm', list([10, 3, 4])], dtype=object)
    >>> a
    array([1, 'm', list([2, 3, 4])], dtype=object)
    
# numpy.char.chararray.count
method
char.chararray.count(sub, start=0, end=None)[source]
    
Returns an array with the number of non-overlapping occurrences of substring `sub` in the range [`start`, `end`].
See also
`char.count`
# numpy.char.chararray.ctypes
attribute
char.chararray.ctypes
    
An object to simplify the interaction of the array with the ctypes module.
This attribute creates an object that makes it easier to use arrays when calling shared libraries with the ctypes module. The returned object has, among others, data, shape, and strides attributes (see Notes below) which themselves return ctypes objects that can be used as arguments to a shared library.
Parameters:
    
None
Returns:
    
cPython object
    
Possessing attributes data, shape, strides, etc.
See also
`numpy.ctypeslib`
#### Notes
Below are the public attributes of this object which were documented in “Guide to NumPy” (we have omitted undocumented public attributes, as well as documented private attributes):
_ctypes.data
    
A pointer to the memory area of the array as a Python integer. This memory area may contain data that is not aligned, or not in correct byte-order. The memory area may not even be writeable. The array flags and data-type of this array should be respected when passing this attribute to arbitrary C-code to avoid trouble that can include Python crashing. User Beware! The value of this attribute is exactly the same as: `self._array_interface_['data'][0]`.
Note that unlike `data_as`, a reference won’t be kept to the array: code like `ctypes.c_void_p((a + b).ctypes.data)` will result in a pointer to a deallocated array, and should be spelt `(a + b).ctypes.data_as(ctypes.c_void_p)`
_ctypes.shape
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the C-integer corresponding to `dtype('p')` on this platform (see `c_intp`). This base-type could be `ctypes.c_int`, `ctypes.c_long`, or `ctypes.c_longlong` depending on the platform. The ctypes array contains the shape of the underlying array.
_ctypes.strides
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the same as for the shape attribute. This ctypes array contains the strides information from the underlying array. This strides information is important for showing how many bytes must be jumped to get to the next element in the array.
_ctypes.data_as(obj)[source]
    
Return the data pointer cast to a particular c-types object. For example, calling `self._as_parameter_` is equivalent to `self.data_as(ctypes.c_void_p)`. Perhaps you want to use the data as a pointer to a ctypes array of floating-point data: `self.data_as(ctypes.POINTER(ctypes.c_double))`.
The returned pointer will keep a reference to the array.
_ctypes.shape_as(obj)[source]
    
Return the shape tuple as an array of some other c-types type. For example: `self.shape_as(ctypes.c_short)`.
_ctypes.strides_as(obj)[source]
    
Return the strides tuple as an array of some other c-types type. For example: `self.strides_as(ctypes.c_longlong)`.
If the ctypes module is not available, then the ctypes attribute of array objects still returns something useful, but ctypes objects are not returned and errors may be raised instead. In particular, the object will still have the `as_parameter` attribute which will return an integer equal to the data attribute.
#### Examples
    
    >>> import numpy as np
    >>> import ctypes
    >>> x = np.array([[0, 1], [2, 3]], dtype=np.int32)
    >>> x
    array([[0, 1],
           [2, 3]], dtype=int32)
    >>> x.ctypes.data
    31962608 # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32))
    <__main__.LP_c_uint object at 0x7ff2fc1fc200> # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32)).contents
    c_uint(0)
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint64)).contents
    c_ulong(4294967296)
    >>> x.ctypes.shape
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1fce60> # may vary
    >>> x.ctypes.strides
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1ff320> # may vary
    
# numpy.char.chararray.data
attribute
char.chararray.data
    
Python buffer object pointing to the start of the array’s data.
# numpy.char.chararray.decode
method
char.chararray.decode(encoding=None, errors=None)[source]
    
Calls `bytes.decode` element-wise.
See also
`char.decode`
# numpy.char.chararray.dtype
attribute
char.chararray.dtype
    
Data-type of the array’s elements.
Warning
Setting `arr.dtype` is discouraged and may be deprecated in the future. Setting will replace the `dtype` without modifying the memory (see also `ndarray.view` and `ndarray.astype`).
Parameters:
    
None
Returns:
    
dnumpy dtype object
See also
`ndarray.astype`
    
Cast the values contained in the array to a new data-type.
`ndarray.view`
    
Create a view of the same data but a different data-type.
`numpy.dtype`
#### Examples
    
    >>> x
    array([[0, 1],
           [2, 3]])
    >>> x.dtype
    dtype('int32')
    >>> type(x.dtype)
    <type 'numpy.dtype'>
    
# numpy.char.chararray.dump
method
char.chararray.dump(file)
    
Dump a pickle of the array to the specified file. The array can be read back with pickle.load or numpy.load.
Parameters:
    
filestr or Path
    
A string naming the dump file.
# numpy.char.chararray.dumps
method
char.chararray.dumps()
    
Returns the pickle of the array as a string. pickle.loads will convert the string back to an array.
Parameters:
    
None
# numpy.char.chararray.encode
method
char.chararray.encode(encoding=None, errors=None)[source]
    
Calls `str.encode` element-wise.
See also
`char.encode`
# numpy.char.chararray.endswith
method
char.chararray.endswith(suffix, start=0, end=None)[source]
    
Returns a boolean array which is `True` where the string element in `self` ends with `suffix`, otherwise `False`.
See also
`char.endswith`
# numpy.char.chararray.expandtabs
method
char.chararray.expandtabs(tabsize=8)[source]
    
Return a copy of each string element where all tab characters are replaced by one or more spaces.
See also
`char.expandtabs`
# numpy.char.chararray.fill
method
char.chararray.fill(value)
    
Fill the array with a scalar value.
Parameters:
    
valuescalar
    
All elements of `a` will be assigned this value.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2])
    >>> a.fill(0)
    >>> a
    array([0, 0])
    >>> a = np.empty(2)
    >>> a.fill(1)
    >>> a
    array([1.,  1.])
    
Fill expects a scalar value and always behaves the same as assigning to a single array element. The following is a rare example where this distinction is important:
    
    >>> a = np.array([None, None], dtype=object)
    >>> a[0] = np.array(3)
    >>> a
    array([array(3), None], dtype=object)
    >>> a.fill(np.array(3))
    >>> a
    array([array(3), array(3)], dtype=object)
    
Where other forms of assignments will unpack the array being assigned:
    
    >>> a[...] = np.array(3)
    >>> a
    array([3, 3], dtype=object)
    
# numpy.char.chararray.find
method
char.chararray.find(sub, start=0, end=None)[source]
    
For each element, return the lowest index in the string where substring `sub` is found.
See also
`char.find`
# numpy.char.chararray.flags
attribute
char.chararray.flags
    
Information about the memory layout of the array.
#### Notes
The `flags` object can be accessed dictionary-like (as in `a.flags['WRITEABLE']`), or by using lowercased attribute names (as in `a.flags.writeable`). Short flag names are only supported in dictionary access.
Only the WRITEBACKIFCOPY, WRITEABLE, and ALIGNED flags can be changed by the user, via direct assignment to the attribute or dictionary entry, or by calling `ndarray.setflags`.
The array flags cannot be set arbitrarily:
  * WRITEBACKIFCOPY can only be set `False`.
  * ALIGNED can only be set `True` if the data is truly aligned.
  * WRITEABLE can only be set `True` if the array owns its own memory or the ultimate owner of the memory exposes a writeable buffer interface or is a string.


Arrays can be both C-style and Fortran-style contiguous simultaneously. This is clear for 1-dimensional arrays, but can also be true for higher dimensional arrays.
Even for contiguous arrays a stride for a given dimension `arr.strides[dim]` may be arbitrary if `arr.shape[dim] == 1` or the array has no elements. It does not generally hold that `self.strides[-1] == self.itemsize` for C-style contiguous arrays or `self.strides[0] == self.itemsize` for Fortran-style contiguous arrays is true.
Attributes:
    
C_CONTIGUOUS (C)
    
The data is in a single, C-style contiguous segment.
F_CONTIGUOUS (F)
    
The data is in a single, Fortran-style contiguous segment.
OWNDATA (O)
    
The array owns the memory it uses or borrows it from another object.
WRITEABLE (W)
    
The data area can be written to. Setting this to False locks the data, making it read-only. A view (slice, etc.) inherits WRITEABLE from its base array at creation time, but a view of a writeable array may be subsequently locked while the base array remains writeable. (The opposite is not true, in that a view of a locked array may not be made writeable. However, currently, locking a base object does not lock any views that already reference it, so under that circumstance it is possible to alter the contents of a locked array via a previously created writeable view onto it.) Attempting to change a non-writeable array raises a RuntimeError exception.
ALIGNED (A)
    
The data and all elements are aligned appropriately for the hardware.
WRITEBACKIFCOPY (X)
    
This array is a copy of some other array. The C-API function PyArray_ResolveWritebackIfCopy must be called before deallocating to the base array will be updated with the contents of this array.
FNC
    
F_CONTIGUOUS and not C_CONTIGUOUS.
FORC
    
F_CONTIGUOUS or C_CONTIGUOUS (one-segment test).
BEHAVED (B)
    
ALIGNED and WRITEABLE.
CARRAY (CA)
    
BEHAVED and C_CONTIGUOUS.
FARRAY (FA)
    
BEHAVED and F_CONTIGUOUS and not C_CONTIGUOUS.
# numpy.char.chararray.flat
attribute
char.chararray.flat
    
A 1-D iterator over the array.
This is a `numpy.flatiter` instance, which acts similarly to, but is not a subclass of, Python’s built-in iterator object.
See also
`flatten`
    
Return a copy of the array collapsed into one dimension.
`flatiter`
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(1, 7).reshape(2, 3)
    >>> x
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> x.flat[3]
    4
    >>> x.T
    array([[1, 4],
           [2, 5],
           [3, 6]])
    >>> x.T.flat[3]
    5
    >>> type(x.flat)
    <class 'numpy.flatiter'>
    
An assignment example:
    
    >>> x.flat = 3; x
    array([[3, 3, 3],
           [3, 3, 3]])
    >>> x.flat[[1,4]] = 1; x
    array([[3, 1, 3],
           [3, 1, 3]])
    
# numpy.char.chararray.flatten
method
char.chararray.flatten(order='C')
    
Return a copy of the array collapsed into one dimension.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran- style) order. ‘A’ means to flatten in column-major order if `a` is Fortran contiguous in memory, row-major order otherwise. ‘K’ means to flatten `a` in the order the elements occur in memory. The default is ‘C’.
Returns:
    
yndarray
    
A copy of the input array, flattened to one dimension.
See also
`ravel`
    
Return a flattened array.
`flat`
    
A 1-D flat iterator over the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2], [3,4]])
    >>> a.flatten()
    array([1, 2, 3, 4])
    >>> a.flatten('F')
    array([1, 3, 2, 4])
    
# numpy.char.chararray.getfield
method
char.chararray.getfield(dtype, offset=0)
    
Returns a field of the given array as a certain type.
A field is a view of the array data with a given data-type. The values in the view are determined by the given type and the offset into the current array in bytes. The offset needs to be such that the view dtype fits in the array dtype; for example an array of dtype complex128 has 16-byte elements. If taking a view with a 32-bit integer (4 bytes), the offset needs to be between 0 and 12 bytes.
Parameters:
    
dtypestr or dtype
    
The data type of the view. The dtype size of the view can not be larger than that of the array itself.
offsetint
    
Number of bytes to skip before beginning the element view.
#### Examples
    
    >>> import numpy as np
    >>> x = np.diag([1.+1.j]*2)
    >>> x[1, 1] = 2 + 4.j
    >>> x
    array([[1.+1.j,  0.+0.j],
           [0.+0.j,  2.+4.j]])
    >>> x.getfield(np.float64)
    array([[1.,  0.],
           [0.,  2.]])
    
By choosing an offset of 8 bytes we can select the complex part of the array for our view:
    
    >>> x.getfield(np.float64, offset=8)
    array([[1.,  0.],
           [0.,  4.]])
    
# numpy.char.chararray
classnumpy.char.chararray(shape, itemsize=1, unicode=False, buffer=None, offset=0, strides=None, order=None)[source]
    
Provides a convenient view on arrays of string and unicode values.
Note
The `chararray` class exists for backwards compatibility with Numarray, it is not recommended for new development. Starting from numpy 1.4, if one needs arrays of strings, it is recommended to use arrays of `dtype` `object_`, `bytes_` or `str_`, and use the free functions in the `numpy.char` module for fast vectorized string operations.
Versus a NumPy array of dtype `bytes_` or `str_`, this class adds the following functionality:
  1. values automatically have whitespace removed from the end when indexed
  2. comparison operators automatically remove whitespace from the end when comparing values
  3. vectorized string operations are provided as methods (e.g. `endswith`) and infix operators (e.g. `"+", "*", "%"`)


chararrays should be created using `numpy.char.array` or `numpy.char.asarray`, rather than this constructor directly.
This constructor creates the array, using `buffer` (with `offset` and `strides`) if it is not `None`. If `buffer` is `None`, then constructs a new array with `strides` in “C order”, unless both `len(shape) >= 2` and `order='F'`, in which case `strides` is in “Fortran order”.
Parameters:
    
shapetuple
    
Shape of the array.
itemsizeint, optional
    
Length of each array element, in number of characters. Default is 1.
unicodebool, optional
    
Are the array elements of type unicode (True) or string (False). Default is False.
bufferobject exposing the buffer interface or str, optional
    
Memory address of the start of the array data. Default is None, in which case a new array is created.
offsetint, optional
    
Fixed stride displacement from the beginning of an axis? Default is 0. Needs to be >=0.
stridesarray_like of ints, optional
    
Strides for the array (see `strides` for full description). Default is None.
order{‘C’, ‘F’}, optional
    
The order in which the array data is stored in memory: ‘C’ -> “row major” order (the default), ‘F’ -> “column major” (Fortran) order.
#### Examples
    
    >>> import numpy as np
    >>> charar = np.char.chararray((3, 3))
    >>> charar[:] = 'a'
    >>> charar
    chararray([[b'a', b'a', b'a'],
               [b'a', b'a', b'a'],
               [b'a', b'a', b'a']], dtype='|S1')
    
    
    >>> charar = np.char.chararray(charar.shape, itemsize=5)
    >>> charar[:] = 'abc'
    >>> charar
    chararray([[b'abc', b'abc', b'abc'],
               [b'abc', b'abc', b'abc'],
               [b'abc', b'abc', b'abc']], dtype='|S5')
    
Attributes:
    
`T`
    
View of the transposed array.
`base`
    
Base object if memory is from some other object.
`ctypes`
    
An object to simplify the interaction of the array with the ctypes module.
`data`
    
Python buffer object pointing to the start of the array’s data.
device
`dtype`
    
Data-type of the array’s elements.
`flags`
    
Information about the memory layout of the array.
`flat`
    
A 1-D iterator over the array.
`imag`
    
The imaginary part of the array.
itemset
`itemsize`
    
Length of one array element in bytes.
`mT`
    
View of the matrix transposed array.
`nbytes`
    
Total bytes consumed by the elements of the array.
`ndim`
    
Number of array dimensions.
newbyteorder
ptp
`real`
    
The real part of the array.
`shape`
    
Tuple of array dimensions.
`size`
    
Number of elements in the array.
`strides`
    
Tuple of bytes to step in each dimension when traversing an array.
#### Methods
`astype`(dtype[, order, casting, subok, copy])
Copy of the array, cast to a specified type.  
`argsort`([axis, kind, order])
Returns the indices that would sort this array.  
`copy`([order])
Return a copy of the array.  
`count`(sub[, start, end])
Returns an array with the number of non-overlapping occurrences of substring `sub` in the range [`start`, `end`].  
`decode`([encoding, errors])
Calls `bytes.decode` element-wise.  
`dump`(file)
Dump a pickle of the array to the specified file.  
`dumps`()
Returns the pickle of the array as a string.  
`encode`([encoding, errors])
Calls `str.encode` element-wise.  
`endswith`(suffix[, start, end])
Returns a boolean array which is `True` where the string element in `self` ends with `suffix`, otherwise `False`.  
`expandtabs`([tabsize])
Return a copy of each string element where all tab characters are replaced by one or more spaces.  
`fill`(value)
Fill the array with a scalar value.  
`find`(sub[, start, end])
For each element, return the lowest index in the string where substring `sub` is found.  
`flatten`([order])
Return a copy of the array collapsed into one dimension.  
`getfield`(dtype[, offset])
Returns a field of the given array as a certain type.  
`index`(sub[, start, end])
Like `find`, but raises `ValueError` when the substring is not found.  
`isalnum`()
Returns true for each element if all characters in the string are alphanumeric and there is at least one character, false otherwise.  
`isalpha`()
Returns true for each element if all characters in the string are alphabetic and there is at least one character, false otherwise.  
`isdecimal`()
For each element in `self`, return True if there are only decimal characters in the element.  
`isdigit`()
Returns true for each element if all characters in the string are digits and there is at least one character, false otherwise.  
`islower`()
Returns true for each element if all cased characters in the string are lowercase and there is at least one cased character, false otherwise.  
`isnumeric`()
For each element in `self`, return True if there are only numeric characters in the element.  
`isspace`()
Returns true for each element if there are only whitespace characters in the string and there is at least one character, false otherwise.  
`istitle`()
Returns true for each element if the element is a titlecased string and there is at least one character, false otherwise.  
`isupper`()
Returns true for each element if all cased characters in the string are uppercase and there is at least one character, false otherwise.  
`item`(*args)
Copy an element of an array to a standard Python scalar and return it.  
`join`(seq)
Return a string which is the concatenation of the strings in the sequence `seq`.  
`ljust`(width[, fillchar])
Return an array with the elements of `self` left-justified in a string of length `width`.  
`lower`()
Return an array with the elements of `self` converted to lowercase.  
`lstrip`([chars])
For each element in `self`, return a copy with the leading characters removed.  
`nonzero`()
Return the indices of the elements that are non-zero.  
`put`(indices, values[, mode])
Set `a.flat[n] = values[n]` for all `n` in indices.  
`ravel`([order])
Return a flattened array.  
`repeat`(repeats[, axis])
Repeat elements of an array.  
`replace`(old, new[, count])
For each element in `self`, return a copy of the string with all occurrences of substring `old` replaced by `new`.  
`reshape`(shape, /, *[, order, copy])
Returns an array containing the same data with a new shape.  
`resize`(new_shape[, refcheck])
Change shape and size of array in-place.  
`rfind`(sub[, start, end])
For each element in `self`, return the highest index in the string where substring `sub` is found, such that `sub` is contained within [`start`, `end`].  
`rindex`(sub[, start, end])
Like `rfind`, but raises `ValueError` when the substring `sub` is not found.  
`rjust`(width[, fillchar])
Return an array with the elements of `self` right-justified in a string of length `width`.  
`rsplit`([sep, maxsplit])
For each element in `self`, return a list of the words in the string, using `sep` as the delimiter string.  
`rstrip`([chars])
For each element in `self`, return a copy with the trailing characters removed.  
`searchsorted`(v[, side, sorter])
Find indices where elements of v should be inserted in a to maintain order.  
`setfield`(val, dtype[, offset])
Put a value into a specified place in a field defined by a data-type.  
`setflags`([write, align, uic])
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.  
`sort`([axis, kind, order])
Sort an array in-place.  
`split`([sep, maxsplit])
For each element in `self`, return a list of the words in the string, using `sep` as the delimiter string.  
`splitlines`([keepends])
For each element in `self`, return a list of the lines in the element, breaking at line boundaries.  
`squeeze`([axis])
Remove axes of length one from `a`.  
`startswith`(prefix[, start, end])
Returns a boolean array which is `True` where the string element in `self` starts with `prefix`, otherwise `False`.  
`strip`([chars])
For each element in `self`, return a copy with the leading and trailing characters removed.  
`swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`swapcase`()
For each element in `self`, return a copy of the string with uppercase characters converted to lowercase and vice versa.  
`take`(indices[, axis, out, mode])
Return an array formed from the elements of `a` at the given indices.  
`title`()
For each element in `self`, return a titlecased version of the string: words start with uppercase characters, all remaining cased characters are lowercase.  
`tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
`tolist`()
Return the array as an `a.ndim`-levels deep nested list of Python scalars.  
`tostring`([order])
A compatibility alias for `tobytes`, with exactly the same behavior.  
`translate`(table[, deletechars])
For each element in `self`, return a copy of the string where all characters occurring in the optional argument `deletechars` are removed, and the remaining characters have been mapped through the given translation table.  
`transpose`(*axes)
Returns a view of the array with axes transposed.  
`upper`()
Return an array with the elements of `self` converted to uppercase.  
`view`([dtype][, type])
New view of array with the same data.  
`zfill`(width)
Return the numeric string left-filled with zeros in a string of length `width`.  
# numpy.char.chararray.imag
attribute
char.chararray.imag
    
The imaginary part of the array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.sqrt([1+0j, 0+1j])
    >>> x.imag
    array([ 0.        ,  0.70710678])
    >>> x.imag.dtype
    dtype('float64')
    
# numpy.char.chararray.index
method
char.chararray.index(sub, start=0, end=None)[source]
    
Like `find`, but raises `ValueError` when the substring is not found.
See also
`char.index`
# numpy.char.chararray.isalnum
method
char.chararray.isalnum()[source]
    
Returns true for each element if all characters in the string are alphanumeric and there is at least one character, false otherwise.
See also
`char.isalnum`
# numpy.char.chararray.isalpha
method
char.chararray.isalpha()[source]
    
Returns true for each element if all characters in the string are alphabetic and there is at least one character, false otherwise.
See also
`char.isalpha`
# numpy.char.chararray.isdecimal
method
char.chararray.isdecimal()[source]
    
For each element in `self`, return True if there are only decimal characters in the element.
See also
`char.isdecimal`
# numpy.char.chararray.isdigit
method
char.chararray.isdigit()[source]
    
Returns true for each element if all characters in the string are digits and there is at least one character, false otherwise.
See also
`char.isdigit`
# numpy.char.chararray.islower
method
char.chararray.islower()[source]
    
Returns true for each element if all cased characters in the string are lowercase and there is at least one cased character, false otherwise.
See also
`char.islower`
# numpy.char.chararray.isnumeric
method
char.chararray.isnumeric()[source]
    
For each element in `self`, return True if there are only numeric characters in the element.
See also
`char.isnumeric`
# numpy.char.chararray.isspace
method
char.chararray.isspace()[source]
    
Returns true for each element if there are only whitespace characters in the string and there is at least one character, false otherwise.
See also
`char.isspace`
# numpy.char.chararray.istitle
method
char.chararray.istitle()[source]
    
Returns true for each element if the element is a titlecased string and there is at least one character, false otherwise.
See also
`char.istitle`
# numpy.char.chararray.isupper
method
char.chararray.isupper()[source]
    
Returns true for each element if all cased characters in the string are uppercase and there is at least one character, false otherwise.
See also
`char.isupper`
# numpy.char.chararray.item
method
char.chararray.item(*args)
    
Copy an element of an array to a standard Python scalar and return it.
Parameters:
    
*argsArguments (variable number and type)
    
  * none: in this case, the method only works for arrays with one element (`a.size == 1`), which element is copied into a standard Python scalar object and returned.
  * int_type: this argument is interpreted as a flat index into the array, specifying which element to copy and return.
  * tuple of int_types: functions as does a single int_type argument, except that the argument is interpreted as an nd-index into the array.


Returns:
    
zStandard Python scalar object
    
A copy of the specified element of the array as a suitable Python scalar
#### Notes
When the data type of `a` is longdouble or clongdouble, item() returns a scalar array object because there is no available Python scalar that would not lose information. Void arrays return a buffer object for item(), unless fields are defined, in which case a tuple is returned.
`item` is very similar to a[args], except, instead of an array scalar, a standard Python scalar is returned. This can be useful for speeding up access to elements of the array and doing arithmetic on elements of the array using Python’s optimized math.
#### Examples
    
    >>> import numpy as np
    >>> np.random.seed(123)
    >>> x = np.random.randint(9, size=(3, 3))
    >>> x
    array([[2, 2, 6],
           [1, 3, 6],
           [1, 0, 1]])
    >>> x.item(3)
    1
    >>> x.item(7)
    0
    >>> x.item((0, 1))
    2
    >>> x.item((2, 2))
    1
    
For an array with object dtype, elements are returned as-is.
    
    >>> a = np.array([np.int64(1)], dtype=object)
    >>> a.item() #return np.int64
    np.int64(1)
    
# numpy.char.chararray.itemsize
attribute
char.chararray.itemsize
    
Length of one array element in bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1,2,3], dtype=np.float64)
    >>> x.itemsize
    8
    >>> x = np.array([1,2,3], dtype=np.complex128)
    >>> x.itemsize
    16
    
# numpy.char.chararray.join
method
char.chararray.join(seq)[source]
    
Return a string which is the concatenation of the strings in the sequence `seq`.
See also
`char.join`
# numpy.char.chararray.ljust
method
char.chararray.ljust(width, fillchar=' ')[source]
    
Return an array with the elements of `self` left-justified in a string of length `width`.
See also
`char.ljust`
# numpy.char.chararray.lower
method
char.chararray.lower()[source]
    
Return an array with the elements of `self` converted to lowercase.
See also
`char.lower`
# numpy.char.chararray.lstrip
method
char.chararray.lstrip(chars=None)[source]
    
For each element in `self`, return a copy with the leading characters removed.
See also
`char.lstrip`
# numpy.char.chararray.mT
attribute
char.chararray.mT
    
View of the matrix transposed array.
The matrix transpose is the transpose of the last two dimensions, even if the array is of higher dimension.
New in version 2.0.
Raises:
    
ValueError
    
If the array is of dimension less than 2.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.mT
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.arange(8).reshape((2, 2, 2))
    >>> a
    array([[[0, 1],
            [2, 3]],
    
           [[4, 5],
            [6, 7]]])
    >>> a.mT
    array([[[0, 2],
            [1, 3]],
    
           [[4, 6],
            [5, 7]]])
    
# numpy.char.chararray.nbytes
attribute
char.chararray.nbytes
    
Total bytes consumed by the elements of the array.
See also
`sys.getsizeof`
    
Memory consumed by the object itself without parents in case view. This does include memory consumed by non-element attributes.
#### Notes
Does not include memory consumed by non-element attributes of the array object.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3,5,2), dtype=np.complex128)
    >>> x.nbytes
    480
    >>> np.prod(x.shape) * x.itemsize
    480
    
# numpy.char.chararray.ndim
attribute
char.chararray.ndim
    
Number of array dimensions.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> x.ndim
    1
    >>> y = np.zeros((2, 3, 4))
    >>> y.ndim
    3
    
# numpy.char.chararray.nonzero
method
char.chararray.nonzero()
    
Return the indices of the elements that are non-zero.
Refer to `numpy.nonzero` for full documentation.
See also
`numpy.nonzero`
    
equivalent function
# numpy.char.chararray.put
method
char.chararray.put(indices, values, mode='raise')
    
Set `a.flat[n] = values[n]` for all `n` in indices.
Refer to `numpy.put` for full documentation.
See also
`numpy.put`
    
equivalent function
# numpy.char.chararray.ravel
method
char.chararray.ravel([order])
    
Return a flattened array.
Refer to `numpy.ravel` for full documentation.
See also
`numpy.ravel`
    
equivalent function
`ndarray.flat`
    
a flat iterator on the array.
# numpy.char.chararray.real
attribute
char.chararray.real
    
The real part of the array.
See also
`numpy.real`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> x = np.sqrt([1+0j, 0+1j])
    >>> x.real
    array([ 1.        ,  0.70710678])
    >>> x.real.dtype
    dtype('float64')
    
# numpy.char.chararray.repeat
method
char.chararray.repeat(repeats, axis=None)
    
Repeat elements of an array.
Refer to `numpy.repeat` for full documentation.
See also
`numpy.repeat`
    
equivalent function
# numpy.char.chararray.replace
method
char.chararray.replace(old, new, count=None)[source]
    
For each element in `self`, return a copy of the string with all occurrences of substring `old` replaced by `new`.
See also
`char.replace`
# numpy.char.chararray.reshape
method
char.chararray.reshape(shape, /, *, order='C', copy=None)
    
Returns an array containing the same data with a new shape.
Refer to `numpy.reshape` for full documentation.
See also
`numpy.reshape`
    
equivalent function
#### Notes
Unlike the free function `numpy.reshape`, this method on `ndarray` allows the elements of the shape parameter to be passed in as separate arguments. For example, `a.reshape(10, 11)` is equivalent to `a.reshape((10, 11))`.
# numpy.char.chararray.resize
method
char.chararray.resize(new_shape, refcheck=True)
    
Change shape and size of array in-place.
Parameters:
    
new_shapetuple of ints, or `n` ints
    
Shape of resized array.
refcheckbool, optional
    
If False, reference count will not be checked. Default is True.
Returns:
    
None
Raises:
    
ValueError
    
If `a` does not own its own data or references or views to it exist, and the data memory must be changed. PyPy only: will always raise if the data memory must be changed, since there is no reliable way to determine if references or views to it exist.
SystemError
    
If the `order` keyword argument is specified. This behaviour is a bug in NumPy.
See also
`resize`
    
Return a new array with the specified shape.
#### Notes
This reallocates space for the data area if necessary.
Only contiguous arrays (data elements consecutive in memory) can be resized.
The purpose of the reference count check is to make sure you do not use this array as a buffer for another Python object and then reallocate the memory. However, reference counts can increase in other ways so if you are sure that you have not shared the memory for this array with another Python object, then you may safely set `refcheck` to False.
#### Examples
Shrinking an array: array is flattened (in the order that the data are stored in memory), resized, and reshaped:
    
    >>> import numpy as np
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='C')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [1]])
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='F')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [2]])
    
Enlarging an array: as above, but missing entries are filled with zeros:
    
    >>> b = np.array([[0, 1], [2, 3]])
    >>> b.resize(2, 3) # new_shape parameter doesn't have to be a tuple
    >>> b
    array([[0, 1, 2],
           [3, 0, 0]])
    
Referencing an array prevents resizing…
    
    >>> c = a
    >>> a.resize((1, 1))
    Traceback (most recent call last):
    ...
    ValueError: cannot resize an array that references or is referenced ...
    
Unless `refcheck` is False:
    
    >>> a.resize((1, 1), refcheck=False)
    >>> a
    array([[0]])
    >>> c
    array([[0]])
    
# numpy.char.chararray.rfind
method
char.chararray.rfind(sub, start=0, end=None)[source]
    
For each element in `self`, return the highest index in the string where substring `sub` is found, such that `sub` is contained within [`start`, `end`].
See also
`char.rfind`
# numpy.char.chararray.rindex
method
char.chararray.rindex(sub, start=0, end=None)[source]
    
Like `rfind`, but raises `ValueError` when the substring `sub` is not found.
See also
`char.rindex`
# numpy.char.chararray.rjust
method
char.chararray.rjust(width, fillchar=' ')[source]
    
Return an array with the elements of `self` right-justified in a string of length `width`.
See also
`char.rjust`
# numpy.char.chararray.rsplit
method
char.chararray.rsplit(sep=None, maxsplit=None)[source]
    
For each element in `self`, return a list of the words in the string, using `sep` as the delimiter string.
See also
`char.rsplit`
# numpy.char.chararray.rstrip
method
char.chararray.rstrip(chars=None)[source]
    
For each element in `self`, return a copy with the trailing characters removed.
See also
`char.rstrip`
# numpy.char.chararray.searchsorted
method
char.chararray.searchsorted(v, side='left', sorter=None)
    
Find indices where elements of v should be inserted in a to maintain order.
For full documentation, see `numpy.searchsorted`
See also
`numpy.searchsorted`
    
equivalent function
# numpy.char.chararray.setfield
method
char.chararray.setfield(val, dtype, offset=0)
    
Put a value into a specified place in a field defined by a data-type.
Place `val` into `a`’s field defined by `dtype` and beginning `offset` bytes into the field.
Parameters:
    
valobject
    
Value to be placed in field.
dtypedtype object
    
Data-type of the field in which to place `val`.
offsetint, optional
    
The number of bytes into the field at which to place `val`.
Returns:
    
None
See also
`getfield`
#### Examples
    
    >>> import numpy as np
    >>> x = np.eye(3)
    >>> x.getfield(np.float64)
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    >>> x.setfield(3, np.int32)
    >>> x.getfield(np.int32)
    array([[3, 3, 3],
           [3, 3, 3],
           [3, 3, 3]], dtype=int32)
    >>> x
    array([[1.0e+000, 1.5e-323, 1.5e-323],
           [1.5e-323, 1.0e+000, 1.5e-323],
           [1.5e-323, 1.5e-323, 1.0e+000]])
    >>> x.setfield(np.eye(3), np.int32)
    >>> x
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    
# numpy.char.chararray.setflags
method
char.chararray.setflags(write=None, align=None, uic=None)
    
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.
These Boolean-valued flags affect how numpy interprets the memory area used by `a` (see Notes below). The ALIGNED flag can only be set to True if the data is actually aligned according to the type. The WRITEBACKIFCOPY flag can never be set to True. The flag WRITEABLE can only be set to True if the array owns its own memory, or the ultimate owner of the memory exposes a writeable buffer interface, or is a string. (The exception for string is made so that unpickling can be done without copying memory.)
Parameters:
    
writebool, optional
    
Describes whether or not `a` can be written to.
alignbool, optional
    
Describes whether or not `a` is aligned properly for its type.
uicbool, optional
    
Describes whether or not `a` is a copy of another “base” array.
#### Notes
Array flags provide information about how the memory area used for the array is to be interpreted. There are 7 Boolean flags in use, only three of which can be changed by the user: WRITEBACKIFCOPY, WRITEABLE, and ALIGNED.
WRITEABLE (W) the data area can be written to;
ALIGNED (A) the data and strides are aligned appropriately for the hardware (as determined by the compiler);
WRITEBACKIFCOPY (X) this array is a copy of some other array (referenced by .base). When the C-API function PyArray_ResolveWritebackIfCopy is called, the base array will be updated with the contents of this array.
All flags can be accessed using the single (upper case) letter as well as the full name.
#### Examples
    
    >>> import numpy as np
    >>> y = np.array([[3, 1, 7],
    ...               [2, 0, 0],
    ...               [8, 5, 9]])
    >>> y
    array([[3, 1, 7],
           [2, 0, 0],
           [8, 5, 9]])
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
    >>> y.setflags(write=0, align=0)
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : False
      ALIGNED : False
      WRITEBACKIFCOPY : False
    >>> y.setflags(uic=1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: cannot set WRITEBACKIFCOPY flag to True
    
# numpy.char.chararray.shape
attribute
char.chararray.shape
    
Tuple of array dimensions.
The shape property is usually used to get the current shape of an array, but may also be used to reshape the array in-place by assigning a tuple of array dimensions to it. As with `numpy.reshape`, one of the new shape dimensions can be -1, in which case its value is inferred from the size of the array and the remaining dimensions. Reshaping an array in-place will fail if a copy is required.
Warning
Setting `arr.shape` is discouraged and may be deprecated in the future. Using `ndarray.reshape` is the preferred approach.
See also
`numpy.shape`
    
Equivalent getter function.
`numpy.reshape`
    
Function similar to setting `shape`.
`ndarray.reshape`
    
Method similar to setting `shape`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3, 4])
    >>> x.shape
    (4,)
    >>> y = np.zeros((2, 3, 4))
    >>> y.shape
    (2, 3, 4)
    >>> y.shape = (3, 8)
    >>> y
    array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
    >>> y.shape = (3, 6)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: total size of new array must be unchanged
    >>> np.zeros((4,2))[::2].shape = (-1,)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: Incompatible shape for in-place modification. Use
    `.reshape()` to make a copy with the desired shape.
    
# numpy.char.chararray.size
attribute
char.chararray.size
    
Number of elements in the array.
Equal to `np.prod(a.shape)`, i.e., the product of the array’s dimensions.
#### Notes
`a.size` returns a standard arbitrary precision Python integer. This may not be the case with other methods of obtaining the same value (like the suggested `np.prod(a.shape)`, which returns an instance of `np.int_`), and may be relevant if the value is used further in calculations that may overflow a fixed size integer type.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3, 5, 2), dtype=np.complex128)
    >>> x.size
    30
    >>> np.prod(x.shape)
    30
    
# numpy.char.chararray.sort
method
char.chararray.sort(axis=-1, kind=None, order=None)
    
Sort an array in-place. Refer to `numpy.sort` for full documentation.
Parameters:
    
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort under the covers and, in general, the actual implementation will vary with datatype. The ‘mergesort’ option is retained for backwards compatibility.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.sort`
    
Return a sorted copy of an array.
`numpy.argsort`
    
Indirect sort.
`numpy.lexsort`
    
Indirect stable sort on multiple keys.
`numpy.searchsorted`
    
Find elements in sorted array.
`numpy.partition`
    
Partial sort.
#### Notes
See `numpy.sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,4], [3,1]])
    >>> a.sort(axis=1)
    >>> a
    array([[1, 4],
           [1, 3]])
    >>> a.sort(axis=0)
    >>> a
    array([[1, 3],
           [1, 4]])
    
Use the `order` keyword to specify a field to use when sorting a structured array:
    
    >>> a = np.array([('a', 2), ('c', 1)], dtype=[('x', 'S1'), ('y', int)])
    >>> a.sort(order='y')
    >>> a
    array([(b'c', 1), (b'a', 2)],
          dtype=[('x', 'S1'), ('y', '<i8')])
    
# numpy.char.chararray.split
method
char.chararray.split(sep=None, maxsplit=None)[source]
    
For each element in `self`, return a list of the words in the string, using `sep` as the delimiter string.
See also
`char.split`
# numpy.char.chararray.splitlines
method
char.chararray.splitlines(keepends=None)[source]
    
For each element in `self`, return a list of the lines in the element, breaking at line boundaries.
See also
`char.splitlines`
# numpy.char.chararray.squeeze
method
char.chararray.squeeze(axis=None)
    
Remove axes of length one from `a`.
Refer to `numpy.squeeze` for full documentation.
See also
`numpy.squeeze`
    
equivalent function
# numpy.char.chararray.startswith
method
char.chararray.startswith(prefix, start=0, end=None)[source]
    
Returns a boolean array which is `True` where the string element in `self` starts with `prefix`, otherwise `False`.
See also
`char.startswith`
# numpy.char.chararray.strides
attribute
char.chararray.strides
    
Tuple of bytes to step in each dimension when traversing an array.
The byte offset of element `(i[0], i[1], ..., i[n])` in an array `a` is:
    
    offset = sum(np.array(i) * a.strides)
    
A more detailed explanation of strides can be found in The N-dimensional array (ndarray).
Warning
Setting `arr.strides` is discouraged and may be deprecated in the future. `numpy.lib.stride_tricks.as_strided` should be preferred to create a new view of the same data in a safer way.
See also
`numpy.lib.stride_tricks.as_strided`
#### Notes
Imagine an array of 32-bit integers (each 4 bytes):
    
    x = np.array([[0, 1, 2, 3, 4],
                  [5, 6, 7, 8, 9]], dtype=np.int32)
    
This array is stored in memory as 40 bytes, one after the other (known as a contiguous block of memory). The strides of an array tell us how many bytes we have to skip in memory to move to the next position along a certain axis. For example, we have to skip 4 bytes (1 value) to move to the next column, but 20 bytes (5 values) to get to the same position in the next row. As such, the strides for the array `x` will be `(20, 4)`.
#### Examples
    
    >>> import numpy as np
    >>> y = np.reshape(np.arange(2*3*4), (2,3,4))
    >>> y
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>> y.strides
    (48, 16, 4)
    >>> y[1,1,1]
    17
    >>> offset=sum(y.strides * np.array((1,1,1)))
    >>> offset/y.itemsize
    17
    
    
    >>> x = np.reshape(np.arange(5*6*7*8), (5,6,7,8)).transpose(2,3,1,0)
    >>> x.strides
    (32, 4, 224, 1344)
    >>> i = np.array([3,5,2,2])
    >>> offset = sum(i * x.strides)
    >>> x[3,5,2,2]
    813
    >>> offset / x.itemsize
    813
    
# numpy.char.chararray.strip
method
char.chararray.strip(chars=None)[source]
    
For each element in `self`, return a copy with the leading and trailing characters removed.
See also
`char.strip`
# numpy.char.chararray.swapaxes
method
char.chararray.swapaxes(axis1, axis2)
    
Return a view of the array with `axis1` and `axis2` interchanged.
Refer to `numpy.swapaxes` for full documentation.
See also
`numpy.swapaxes`
    
equivalent function
# numpy.char.chararray.swapcase
method
char.chararray.swapcase()[source]
    
For each element in `self`, return a copy of the string with uppercase characters converted to lowercase and vice versa.
See also
`char.swapcase`
# numpy.char.chararray.T
attribute
char.chararray.T
    
View of the transposed array.
Same as `self.transpose()`.
See also
`transpose`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.T
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.T
    array([1, 2, 3, 4])
    
# numpy.char.chararray.take
method
char.chararray.take(indices, axis=None, out=None, mode='raise')
    
Return an array formed from the elements of `a` at the given indices.
Refer to `numpy.take` for full documentation.
See also
`numpy.take`
    
equivalent function
# numpy.char.chararray.title
method
char.chararray.title()[source]
    
For each element in `self`, return a titlecased version of the string: words start with uppercase characters, all remaining cased characters are lowercase.
See also
`char.title`
# numpy.char.chararray.tofile
method
char.chararray.tofile(fid, sep='', format='%s')
    
Write array to a file as text or binary (default).
Data is always written in ‘C’ order, independent of the order of `a`. The data produced by this method can be recovered using the function fromfile().
Parameters:
    
fidfile or str or Path
    
An open file object, or a string containing a filename.
sepstr
    
Separator between array items for text output. If “” (empty), a binary file is written, equivalent to `file.write(a.tobytes())`.
formatstr
    
Format string for text file output. Each entry in the array is formatted to text by first converting it to the closest Python type, and then using “format” % item.
#### Notes
This is a convenience function for quick storage of array data. Information on endianness and precision is lost, so this method is not a good choice for files intended to archive data or transport data between machines with different endianness. Some of these problems can be overcome by outputting the data as text files, at the expense of speed and file size.
When fid is a file object, array contents are directly written to the file, bypassing the file object’s `write` method. As a result, tofile cannot be used with files objects supporting compression (e.g., GzipFile) or file-like objects that do not support `fileno()` (e.g., BytesIO).
# numpy.char.chararray.tolist
method
char.chararray.tolist()
    
Return the array as an `a.ndim`-levels deep nested list of Python scalars.
Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible builtin Python type, via the `item` function.
If `a.ndim` is 0, then since the depth of the nested list is 0, it will not be a list at all, but a simple Python scalar.
Parameters:
    
none
Returns:
    
yobject, or list of object, or list of list of object, or …
    
The possibly nested list of array elements.
#### Notes
The array may be recreated via `a = np.array(a.tolist())`, although this may sometimes lose precision.
#### Examples
For a 1D array, `a.tolist()` is almost the same as `list(a)`, except that `tolist` changes numpy scalars to Python scalars:
    
    >>> import numpy as np
    >>> a = np.uint32([1, 2])
    >>> a_list = list(a)
    >>> a_list
    [np.uint32(1), np.uint32(2)]
    >>> type(a_list[0])
    <class 'numpy.uint32'>
    >>> a_tolist = a.tolist()
    >>> a_tolist
    [1, 2]
    >>> type(a_tolist[0])
    <class 'int'>
    
Additionally, for a 2D array, `tolist` applies recursively:
    
    >>> a = np.array([[1, 2], [3, 4]])
    >>> list(a)
    [array([1, 2]), array([3, 4])]
    >>> a.tolist()
    [[1, 2], [3, 4]]
    
The base case for this recursion is a 0D array:
    
    >>> a = np.array(1)
    >>> list(a)
    Traceback (most recent call last):
      ...
    TypeError: iteration over a 0-d array
    >>> a.tolist()
    1
    
# numpy.char.chararray.tostring
method
char.chararray.tostring(order='C')
    
A compatibility alias for `tobytes`, with exactly the same behavior.
Despite its name, it returns `bytes` not `str`s.
Deprecated since version 1.19.0.
# numpy.char.chararray.translate
method
char.chararray.translate(table, deletechars=None)[source]
    
For each element in `self`, return a copy of the string where all characters occurring in the optional argument `deletechars` are removed, and the remaining characters have been mapped through the given translation table.
See also
`char.translate`
# numpy.char.chararray.transpose
method
char.chararray.transpose(*axes)
    
Returns a view of the array with axes transposed.
Refer to `numpy.transpose` for full documentation.
Parameters:
    
axesNone, tuple of ints, or `n` ints
    
  * None or no argument: reverses the order of the axes.
  * tuple of ints: `i` in the `j`-th place in the tuple means that the array’s `i`-th axis becomes the transposed array’s `j`-th axis.
  * `n` ints: same as an n-tuple of the same ints (this form is intended simply as a “convenience” alternative to the tuple form).


Returns:
    
pndarray
    
View of the array with its axes suitably permuted.
See also
`transpose`
    
Equivalent function.
`ndarray.T`
    
Array property returning the array transposed.
`ndarray.reshape`
    
Give a new shape to an array without changing its data.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.transpose()
    array([[1, 3],
           [2, 4]])
    >>> a.transpose((1, 0))
    array([[1, 3],
           [2, 4]])
    >>> a.transpose(1, 0)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.transpose()
    array([1, 2, 3, 4])
    
# numpy.char.chararray.upper
method
char.chararray.upper()[source]
    
Return an array with the elements of `self` converted to uppercase.
See also
`char.upper`
# numpy.char.chararray.view
method
char.chararray.view([dtype][, type])
    
New view of array with the same data.
Note
Passing None for `dtype` is different from omitting the parameter, since the former invokes `dtype(None)` which is an alias for `dtype('float64')`.
Parameters:
    
dtypedata-type or ndarray sub-class, optional
    
Data-type descriptor of the returned view, e.g., float32 or int16. Omitting it results in the view having the same data-type as `a`. This argument can also be specified as an ndarray sub-class, which then specifies the type of the returned object (this is equivalent to setting the `type` parameter).
typePython type, optional
    
Type of the returned view, e.g., ndarray or matrix. Again, omission of the parameter results in type preservation.
#### Notes
`a.view()` is used two different ways:
`a.view(some_dtype)` or `a.view(dtype=some_dtype)` constructs a view of the array’s memory with a different data-type. This can cause a reinterpretation of the bytes of memory.
`a.view(ndarray_subclass)` or `a.view(type=ndarray_subclass)` just returns an instance of `ndarray_subclass` that looks at the same array (same shape, dtype, etc.) This does not cause a reinterpretation of the memory.
For `a.view(some_dtype)`, if `some_dtype` has a different number of bytes per entry than the previous dtype (for example, converting a regular array to a structured array), then the last axis of `a` must be contiguous. This axis will be resized in the result.
Changed in version 1.23.0: Only the last axis needs to be contiguous. Previously, the entire array had to be C-contiguous.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([(-1, 2)], dtype=[('a', np.int8), ('b', np.int8)])
    
Viewing array data using a different type and dtype:
    
    >>> nonneg = np.dtype([("a", np.uint8), ("b", np.uint8)])
    >>> y = x.view(dtype=nonneg, type=np.recarray)
    >>> x["a"]
    array([-1], dtype=int8)
    >>> y.a
    array([255], dtype=uint8)
    
Creating a view on a structured array so it can be used in calculations
    
    >>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)])
    >>> xv = x.view(dtype=np.int8).reshape(-1,2)
    >>> xv
    array([[1, 2],
           [3, 4]], dtype=int8)
    >>> xv.mean(0)
    array([2.,  3.])
    
Making changes to the view changes the underlying array
    
    >>> xv[0,1] = 20
    >>> x
    array([(1, 20), (3,  4)], dtype=[('a', 'i1'), ('b', 'i1')])
    
Using a view to convert an array to a recarray:
    
    >>> z = x.view(np.recarray)
    >>> z.a
    array([1, 3], dtype=int8)
    
Views share data:
    
    >>> x[0] = (9, 10)
    >>> z[0]
    np.record((9, 10), dtype=[('a', 'i1'), ('b', 'i1')])
    
Views that change the dtype size (bytes per entry) should normally be avoided on arrays defined by slices, transposes, fortran-ordering, etc.:
    
    >>> x = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int16)
    >>> y = x[:, ::2]
    >>> y
    array([[1, 3],
           [4, 6]], dtype=int16)
    >>> y.view(dtype=[('width', np.int16), ('length', np.int16)])
    Traceback (most recent call last):
        ...
    ValueError: To change to a dtype of a different size, the last axis must be contiguous
    >>> z = y.copy()
    >>> z.view(dtype=[('width', np.int16), ('length', np.int16)])
    array([[(1, 3)],
           [(4, 6)]], dtype=[('width', '<i2'), ('length', '<i2')])
    
However, views that change dtype are totally fine for arrays with a contiguous last axis, even if the rest of the axes are not C-contiguous:
    
    >>> x = np.arange(2 * 3 * 4, dtype=np.int8).reshape(2, 3, 4)
    >>> x.transpose(1, 0, 2).view(np.int16)
    array([[[ 256,  770],
            [3340, 3854]],
    
           [[1284, 1798],
            [4368, 4882]],
    
           [[2312, 2826],
            [5396, 5910]]], dtype=int16)
    
# numpy.char.chararray.zfill
method
char.chararray.zfill(width)[source]
    
Return the numeric string left-filled with zeros in a string of length `width`.
See also
`char.zfill`
# numpy.char.compare_chararrays
char.compare_chararrays(a1, a2, cmp, rstrip)
    
Performs element-wise comparison of two string arrays using the comparison operator specified by `cmp`.
Parameters:
    
a1, a2array_like
    
Arrays to be compared.
cmp{“<”, “<=”, “==”, “>=”, “>”, “!=”}
    
Type of comparison.
rstripBoolean
    
If True, the spaces at the end of Strings are removed before the comparison.
Returns:
    
outndarray
    
The output array of type Boolean with the same shape as a and b.
Raises:
    
ValueError
    
If `cmp` is not valid.
TypeError
    
If at least one of `a` or `b` is a non-string array
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["a", "b", "cde"])
    >>> b = np.array(["a", "a", "dec"])
    >>> np.char.compare_chararrays(a, b, ">", True)
    array([False,  True, False])
    
# numpy.char.count
char.count(a, sub, start=0, end=None)[source]
    
Returns an array with the number of non-overlapping occurrences of substring `sub` in the range [`start`, `end`).
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
subarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
The substring to search for.
start, endarray_like, with any integer dtype
    
The range to look in, interpreted as in slice notation.
Returns:
    
yndarray
    
Output array of ints
See also
`str.count`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> c
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.count(c, 'A')
    array([3, 1, 1])
    >>> np.strings.count(c, 'aA')
    array([3, 1, 0])
    >>> np.strings.count(c, 'A', start=1, end=4)
    array([2, 1, 1])
    >>> np.strings.count(c, 'A', start=1, end=3)
    array([1, 0, 0])
    
# numpy.char.decode
char.decode(a, encoding=None, errors=None)[source]
    
Calls `bytes.decode` element-wise.
The set of available codecs comes from the Python standard library, and may be extended at runtime. For more information, see the `codecs` module.
Parameters:
    
aarray_like, with `bytes_` dtype
encodingstr, optional
    
The name of an encoding
errorsstr, optional
    
Specifies how to handle encoding errors
Returns:
    
outndarray
See also
`bytes.decode`
#### Notes
The type of the result will depend on the encoding specified.
#### Examples
    
    >>> import numpy as np
    >>> c = np.array([b'\x81\xc1\x81\xc1\x81\xc1', b'@@\x81\xc1@@',
    ...               b'\x81\x82\xc2\xc1\xc2\x82\x81'])
    >>> c
    array([b'\x81\xc1\x81\xc1\x81\xc1', b'@@\x81\xc1@@',
           b'\x81\x82\xc2\xc1\xc2\x82\x81'], dtype='|S7')
    >>> np.strings.decode(c, encoding='cp037')
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    
# numpy.char.encode
char.encode(a, encoding=None, errors=None)[source]
    
Calls `str.encode` element-wise.
The set of available codecs comes from the Python standard library, and may be extended at runtime. For more information, see the `codecs` module.
Parameters:
    
aarray_like, with `StringDType` or `str_` dtype
encodingstr, optional
    
The name of an encoding
errorsstr, optional
    
Specifies how to handle encoding errors
Returns:
    
outndarray
See also
`str.encode`
#### Notes
The type of the result will depend on the encoding specified.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.encode(a, encoding='cp037')
    array([b'ÁÁÁ', b'@@Á@@',
       b'ÂÁÂ'], dtype='|S7')
    
# numpy.char.endswith
char.endswith(a, suffix, start=0, end=None)[source]
    
Returns a boolean array which is `True` where the string element in `a` ends with `suffix`, otherwise `False`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
suffixarray-like, with `StringDType`, `bytes_`, or `str_` dtype
start, endarray_like, with any integer dtype
    
With `start`, test beginning at that position. With `end`, stop comparing at that position.
Returns:
    
outndarray
    
Output array of bools
See also
`str.endswith`
#### Examples
    
    >>> import numpy as np
    >>> s = np.array(['foo', 'bar'])
    >>> s
    array(['foo', 'bar'], dtype='<U3')
    >>> np.strings.endswith(s, 'ar')
    array([False,  True])
    >>> np.strings.endswith(s, 'a', start=1, end=2)
    array([False,  True])
    
# numpy.char.equal
char.equal(x1, x2)[source]
    
Return (x1 == x2) element-wise.
Unlike `numpy.equal`, this comparison is performed by first stripping whitespace characters from the end of the string. This behavior is provided for backward-compatibility with numarray.
Parameters:
    
x1, x2array_like of str or unicode
    
Input arrays of the same shape.
Returns:
    
outndarray
    
Output array of bools.
See also
`not_equal`, `greater_equal`, `less_equal`, `greater`, `less`
#### Examples
    
    >>> import numpy as np
    >>> y = "aa "
    >>> x = "aa"
    >>> np.char.equal(x, y)
    array(True)
    
# numpy.char.expandtabs
char.expandtabs(a, tabsize=8)[source]
    
Return a copy of each string element where all tab characters are replaced by one or more spaces.
Calls `str.expandtabs` element-wise.
Return a copy of each string element where all tab characters are replaced by one or more spaces, depending on the current column and the given `tabsize`. The column number is reset to zero after each newline occurring in the string. This doesn’t understand other non-printing characters or escape sequences.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array
tabsizeint, optional
    
Replace tabs with `tabsize` number of spaces. If not given defaults to 8 spaces.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input type
See also
`str.expandtabs`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['         Hello   world'])
    >>> np.strings.expandtabs(a, tabsize=4)  
    array(['        Hello   world'], dtype='<U21')  
    
# numpy.char.find
char.find(a, sub, start=0, end=None)[source]
    
For each element, return the lowest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).
Parameters:
    
aarray_like, with `StringDType`, `bytes_` or `str_` dtype
subarray_like, with `np.bytes_` or `np.str_` dtype
    
The substring to search for.
start, endarray_like, with any integer dtype
    
The range to look in, interpreted as in slice notation.
Returns:
    
yndarray
    
Output array of ints
See also
`str.find`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["NumPy is a Python library"])
    >>> np.strings.find(a, "Python")
    array([11])
    
# numpy.char.greater
char.greater(x1, x2)[source]
    
Return (x1 > x2) element-wise.
Unlike `numpy.greater`, this comparison is performed by first stripping whitespace characters from the end of the string. This behavior is provided for backward-compatibility with numarray.
Parameters:
    
x1, x2array_like of str or unicode
    
Input arrays of the same shape.
Returns:
    
outndarray
    
Output array of bools.
See also
`equal`, `not_equal`, `greater_equal`, `less_equal`, `less`
#### Examples
    
    >>> import numpy as np
    >>> x1 = np.array(['a', 'b', 'c'])
    >>> np.char.greater(x1, 'b')
    array([False, False,  True])
    
# numpy.char.greater_equal
char.greater_equal(x1, x2)[source]
    
Return (x1 >= x2) element-wise.
Unlike `numpy.greater_equal`, this comparison is performed by first stripping whitespace characters from the end of the string. This behavior is provided for backward-compatibility with numarray.
Parameters:
    
x1, x2array_like of str or unicode
    
Input arrays of the same shape.
Returns:
    
outndarray
    
Output array of bools.
See also
`equal`, `not_equal`, `less_equal`, `greater`, `less`
#### Examples
    
    >>> import numpy as np
    >>> x1 = np.array(['a', 'b', 'c'])
    >>> np.char.greater_equal(x1, 'b')
    array([False,  True,  True])
    
# numpy.char.index
char.index(a, sub, start=0, end=None)[source]
    
Like `find`, but raises `ValueError` when the substring is not found.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
subarray-like, with `StringDType`, `bytes_`, or `str_` dtype
start, endarray_like, with any integer dtype, optional
Returns:
    
outndarray
    
Output array of ints.
See also
`find`, `str.index`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["Computer Science"])
    >>> np.strings.index(a, "Science", start=0, end=None)
    array([9])
    
# numpy.char.isalnum
char.isalnum(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isalnum'>
    
Returns true for each element if all characters in the string are alphanumeric and there is at least one character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bool This is a scalar if `x` is a scalar.
See also
`str.isalnum`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a', '1', 'a1', '(', ''])
    >>> np.strings.isalnum(a)
    array([ True,  True,  True, False, False])
    
# numpy.char.isalpha
char.isalpha(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isalpha'>
    
Returns true for each element if all characters in the data interpreted as a string are alphabetic and there is at least one character, false otherwise.
For byte strings (i.e. `bytes`), alphabetic characters are those byte values in the sequence b’abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’. For Unicode strings, alphabetic characters are those characters defined in the Unicode character database as “Letter”.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isalpha`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a', 'b', '0'])
    >>> np.strings.isalpha(a)
    array([ True,  True, False])
    
    
    >>> a = np.array([['a', 'b', '0'], ['c', '1', '2']])
    >>> np.strings.isalpha(a)
    array([[ True,  True, False], [ True, False, False]])
    
# numpy.char.isdecimal
char.isdecimal(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isdecimal'>
    
For each element, return True if there are only decimal characters in the element.
Decimal characters include digit characters, and all characters that can be used to form decimal-radix numbers, e.g. `U+0660, ARABIC-INDIC DIGIT ZERO`.
Parameters:
    
xarray_like, with `StringDType` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isdecimal`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.isdecimal(['12345', '4.99', '123ABC', ''])
    array([ True, False, False, False])
    
# numpy.char.isdigit
char.isdigit(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isdigit'>
    
Returns true for each element if all characters in the string are digits and there is at least one character, false otherwise.
For byte strings, digits are the byte values in the sequence b’0123456789’. For Unicode strings, digits include decimal characters and digits that need special handling, such as the compatibility superscript digits. This also covers digits which cannot be used to form numbers in base 10, like the Kharosthi numbers.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isdigit`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a', 'b', '0'])
    >>> np.strings.isdigit(a)
    array([False, False,  True])
    >>> a = np.array([['a', 'b', '0'], ['c', '1', '2']])
    >>> np.strings.isdigit(a)
    array([[False, False,  True], [False,  True,  True]])
    
# numpy.char.islower
char.islower(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'islower'>
    
Returns true for each element if all cased characters in the string are lowercase and there is at least one cased character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.islower`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.islower("GHC")
    array(False)
    >>> np.strings.islower("ghc")
    array(True)
    
# numpy.char.isnumeric
char.isnumeric(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isnumeric'>
    
For each element, return True if there are only numeric characters in the element.
Numeric characters include digit characters, and all characters that have the Unicode numeric value property, e.g. `U+2155, VULGAR FRACTION ONE FIFTH`.
Parameters:
    
xarray_like, with `StringDType` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isnumeric`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.isnumeric(['123', '123abc', '9.0', '1/4', 'VIII'])
    array([ True, False, False, False, False])
    
# numpy.char.isspace
char.isspace(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isspace'>
    
Returns true for each element if there are only whitespace characters in the string and there is at least one character, false otherwise.
For byte strings, whitespace characters are the ones in the sequence b’ tnrx0bf’. For Unicode strings, a character is whitespace, if, in the Unicode character database, its general category is Zs (“Separator, space”), or its bidirectional class is one of WS, B, or S.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isspace`
#### Examples
    
    >>> np.char.isspace(list("a b c"))
    array([False,  True, False,  True, False])
    >>> np.char.isspace(b'\x0a \x0b \x0c')
    np.True_
    >>> np.char.isspace(b'\x0a \x0b \x0c N')
    np.False_
    
# numpy.char.istitle
char.istitle(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'istitle'>
    
Returns true for each element if the element is a titlecased string and there is at least one character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.istitle`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.istitle("Numpy Is Great")
    array(True)
    
    
    >>> np.strings.istitle("Numpy is great")
    array(False)
    
# numpy.char.isupper
char.isupper(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isupper'>
    
Return true for each element if all cased characters in the string are uppercase and there is at least one character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isupper`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.isupper("GHC")
    array(True)
    >>> a = np.array(["hello", "HELLO", "Hello"])
    >>> np.strings.isupper(a)
    array([False,  True, False])
    
# numpy.char.join
char.join(sep, seq)[source]
    
Return a string which is the concatenation of the strings in the sequence `seq`.
Calls `str.join` element-wise.
Parameters:
    
separray-like, with `StringDType`, `bytes_`, or `str_` dtype
seqarray-like, with `StringDType`, `bytes_`, or `str_` dtype
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.join`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.join('-', 'osd')  
    array('o-s-d', dtype='<U5')  
    
    
    >>> np.strings.join(['-', '.'], ['ghc', 'osd'])  
    array(['g-h-c', 'o.s.d'], dtype='<U5')  
    
# numpy.char.less
char.less(x1, x2)[source]
    
Return (x1 < x2) element-wise.
Unlike `numpy.greater`, this comparison is performed by first stripping whitespace characters from the end of the string. This behavior is provided for backward-compatibility with numarray.
Parameters:
    
x1, x2array_like of str or unicode
    
Input arrays of the same shape.
Returns:
    
outndarray
    
Output array of bools.
See also
`equal`, `not_equal`, `greater_equal`, `less_equal`, `greater`
#### Examples
    
    >>> import numpy as np
    >>> x1 = np.array(['a', 'b', 'c'])
    >>> np.char.less(x1, 'b')
    array([True, False, False])
    
# numpy.char.less_equal
char.less_equal(x1, x2)[source]
    
Return (x1 <= x2) element-wise.
Unlike `numpy.less_equal`, this comparison is performed by first stripping whitespace characters from the end of the string. This behavior is provided for backward-compatibility with numarray.
Parameters:
    
x1, x2array_like of str or unicode
    
Input arrays of the same shape.
Returns:
    
outndarray
    
Output array of bools.
See also
`equal`, `not_equal`, `greater_equal`, `greater`, `less`
#### Examples
    
    >>> import numpy as np
    >>> x1 = np.array(['a', 'b', 'c'])
    >>> np.char.less_equal(x1, 'b')
    array([ True,  True, False])
    
# numpy.char.ljust
char.ljust(a, width, fillchar=' ')[source]
    
Return an array with the elements of `a` left-justified in a string of length `width`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
The length of the resulting strings, unless `width < str_len(a)`.
fillchararray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Optional character to use for padding (default is space).
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.ljust`
#### Notes
While it is possible for `a` and `fillchar` to have different dtypes, passing a non-ASCII character in `fillchar` when `a` is of dtype “S” is not allowed, and a `ValueError` is raised.
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.ljust(c, width=3)
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.ljust(c, width=9)
    array(['aAaAaA   ', '  aA     ', 'abBABba  '], dtype='<U9')
    
# numpy.char.lower
char.lower(a)[source]
    
Return an array with the elements converted to lowercase.
Call `str.lower` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.lower`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['A1B C', '1BCA', 'BCA1']); c
    array(['A1B C', '1BCA', 'BCA1'], dtype='<U5')
    >>> np.strings.lower(c)
    array(['a1b c', '1bca', 'bca1'], dtype='<U5')
    
# numpy.char.lstrip
char.lstrip(a, chars=None)[source]
    
For each element in `a`, return a copy with the leading characters removed.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
charsscalar with the same dtype as `a`, optional
    
The `chars` argument is a string specifying the set of characters to be removed. If `None`, the `chars` argument defaults to removing whitespace. The `chars` argument is not a prefix or suffix; rather, all combinations of its values are stripped.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.lstrip`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> c
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    # The 'a' variable is unstripped from c[1] because of leading whitespace.
    >>> np.strings.lstrip(c, 'a')
    array(['AaAaA', '  aA  ', 'bBABba'], dtype='<U7')
    >>> np.strings.lstrip(c, 'A') # leaves c unchanged
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> (np.strings.lstrip(c, ' ') == np.strings.lstrip(c, '')).all()
    np.False_
    >>> (np.strings.lstrip(c, ' ') == np.strings.lstrip(c)).all()
    np.True_
    
# numpy.char.mod
char.mod(a, values)[source]
    
Return (a % i), that is pre-Python 2.6 string formatting (interpolation), element-wise for a pair of array_likes of str or unicode.
Parameters:
    
aarray_like, with `np.bytes_` or `np.str_` dtype
valuesarray_like of values
    
These values will be element-wise interpolated into the string.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["NumPy is a %s library"])
    >>> np.strings.mod(a, values=["Python"])
    array(['NumPy is a Python library'], dtype='<U25')
    
    
    >>> a = np.array([b'%d bytes', b'%d bits'])
    >>> values = np.array([8, 64])
    >>> np.strings.mod(a, values)
    array([b'8 bytes', b'64 bits'], dtype='|S7')
    
# numpy.char.multiply
char.multiply(a, i)[source]
    
Return (a * i), that is string multiple concatenation, element-wise.
Values in `i` of less than 0 are treated as 0 (which yields an empty string).
Parameters:
    
aarray_like, with `np.bytes_` or `np.str_` dtype
iarray_like, with any integer dtype
Returns:
    
outndarray
    
Output array of str or unicode, depending on input types
#### Notes
This is a thin wrapper around np.strings.multiply that raises `ValueError` when `i` is not an integer. It only exists for backwards-compatibility.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["a", "b", "c"])
    >>> np.strings.multiply(a, 3)
    array(['aaa', 'bbb', 'ccc'], dtype='<U3')
    >>> i = np.array([1, 2, 3])
    >>> np.strings.multiply(a, i)
    array(['a', 'bb', 'ccc'], dtype='<U3')
    >>> np.strings.multiply(np.array(['a']), i)
    array(['a', 'aa', 'aaa'], dtype='<U3')
    >>> a = np.array(['a', 'b', 'c', 'd', 'e', 'f']).reshape((2, 3))
    >>> np.strings.multiply(a, 3)
    array([['aaa', 'bbb', 'ccc'],
           ['ddd', 'eee', 'fff']], dtype='<U3')
    >>> np.strings.multiply(a, i)
    array([['a', 'bb', 'ccc'],
           ['d', 'ee', 'fff']], dtype='<U3')
    
# numpy.char.not_equal
char.not_equal(x1, x2)[source]
    
Return (x1 != x2) element-wise.
Unlike `numpy.not_equal`, this comparison is performed by first stripping whitespace characters from the end of the string. This behavior is provided for backward-compatibility with numarray.
Parameters:
    
x1, x2array_like of str or unicode
    
Input arrays of the same shape.
Returns:
    
outndarray
    
Output array of bools.
See also
`equal`, `greater_equal`, `less_equal`, `greater`, `less`
#### Examples
    
    >>> import numpy as np
    >>> x1 = np.array(['a', 'b', 'c'])
    >>> np.char.not_equal(x1, 'b')
    array([ True, False,  True])
    
# numpy.char.partition
char.partition(a, sep)[source]
    
Partition each element in `a` around `sep`.
Calls `str.partition` element-wise.
For each element in `a`, split the element as the first occurrence of `sep`, and return 3 strings containing the part before the separator, the separator itself, and the part after the separator. If the separator is not found, return 3 strings containing the string itself, followed by two empty strings.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array
sep{str, unicode}
    
Separator to split each string element in `a`.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types. The output array will have an extra dimension with 3 elements per input element.
See also
`str.partition`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array(["Numpy is nice!"])
    >>> np.char.partition(x, " ")
    array([['Numpy', ' ', 'is nice!']], dtype='<U8')
    
# numpy.char.replace
char.replace(a, old, new, count=-1)[source]
    
For each element in `a`, return a copy of the string with occurrences of substring `old` replaced by `new`.
Parameters:
    
aarray_like, with `bytes_` or `str_` dtype
old, newarray_like, with `bytes_` or `str_` dtype
countarray_like, with `int_` dtype
    
If the optional argument `count` is given, only the first `count` occurrences are replaced.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.replace`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["That is a mango", "Monkeys eat mangos"])
    >>> np.strings.replace(a, 'mango', 'banana')
    array(['That is a banana', 'Monkeys eat bananas'], dtype='<U19')
    
    
    >>> a = np.array(["The dish is fresh", "This is it"])
    >>> np.strings.replace(a, 'is', 'was')
    array(['The dwash was fresh', 'Thwas was it'], dtype='<U19')
    
# numpy.char.rfind
char.rfind(a, sub, start=0, end=None)[source]
    
For each element, return the highest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
subarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
The substring to search for.
start, endarray_like, with any integer dtype
    
The range to look in, interpreted as in slice notation.
Returns:
    
yndarray
    
Output array of ints
See also
`str.rfind`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["Computer Science"])
    >>> np.strings.rfind(a, "Science", start=0, end=None)
    array([9])
    >>> np.strings.rfind(a, "Science", start=0, end=8)
    array([-1])
    >>> b = np.array(["Computer Science", "Science"])
    >>> np.strings.rfind(b, "Science", start=0, end=None)
    array([9, 0])
    
# numpy.char.rindex
char.rindex(a, sub, start=0, end=None)[source]
    
Like `rfind`, but raises `ValueError` when the substring `sub` is not found.
Parameters:
    
aarray-like, with `np.bytes_` or `np.str_` dtype
subarray-like, with `np.bytes_` or `np.str_` dtype
start, endarray-like, with any integer dtype, optional
Returns:
    
outndarray
    
Output array of ints.
See also
`rfind`, `str.rindex`
#### Examples
    
    >>> a = np.array(["Computer Science"])
    >>> np.strings.rindex(a, "Science", start=0, end=None)
    array([9])
    
# numpy.char.rjust
char.rjust(a, width, fillchar=' ')[source]
    
Return an array with the elements of `a` right-justified in a string of length `width`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
The length of the resulting strings, unless `width < str_len(a)`.
fillchararray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Optional padding character to use (default is space).
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.rjust`
#### Notes
While it is possible for `a` and `fillchar` to have different dtypes, passing a non-ASCII character in `fillchar` when `a` is of dtype “S” is not allowed, and a `ValueError` is raised.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.rjust(a, width=3)
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.rjust(a, width=9)
    array(['   aAaAaA', '     aA  ', '  abBABba'], dtype='<U9')
    
# numpy.char.rpartition
char.rpartition(a, sep)[source]
    
Partition (split) each element around the right-most separator.
Calls `str.rpartition` element-wise.
For each element in `a`, split the element as the last occurrence of `sep`, and return 3 strings containing the part before the separator, the separator itself, and the part after the separator. If the separator is not found, return 3 strings containing the string itself, followed by two empty strings.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array
sepstr or unicode
    
Right-most separator to split each element in array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types. The output array will have an extra dimension with 3 elements per input element.
See also
`str.rpartition`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.char.rpartition(a, 'A')
    array([['aAaAa', 'A', ''],
       ['  a', 'A', '  '],
       ['abB', 'A', 'Bba']], dtype='<U5')
    
# numpy.char.rsplit
char.rsplit(a, sep=None, maxsplit=None)[source]
    
For each element in `a`, return a list of the words in the string, using `sep` as the delimiter string.
Calls `str.rsplit` element-wise.
Except for splitting from the right, `rsplit` behaves like `split`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
sepstr or unicode, optional
    
If `sep` is not specified or None, any whitespace string is a separator.
maxsplitint, optional
    
If `maxsplit` is given, at most `maxsplit` splits are done, the rightmost ones.
Returns:
    
outndarray
    
Array of list objects
See also
`str.rsplit`, `split`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', 'abBABba'])
    >>> np.strings.rsplit(a, 'A')  
    array([list(['a', 'a', 'a', '']),  
           list(['abB', 'Bba'])], dtype=object)  
    
# numpy.char.rstrip
char.rstrip(a, chars=None)[source]
    
For each element in `a`, return a copy with the trailing characters removed.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
charsscalar with the same dtype as `a`, optional
    
The `chars` argument is a string specifying the set of characters to be removed. If `None`, the `chars` argument defaults to removing whitespace. The `chars` argument is not a prefix or suffix; rather, all combinations of its values are stripped.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.rstrip`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', 'abBABba'])
    >>> c
    array(['aAaAaA', 'abBABba'], dtype='<U7')
    >>> np.strings.rstrip(c, 'a')
    array(['aAaAaA', 'abBABb'], dtype='<U7')
    >>> np.strings.rstrip(c, 'A')
    array(['aAaAa', 'abBABba'], dtype='<U7')
    
# numpy.char.split
char.split(a, sep=None, maxsplit=None)[source]
    
For each element in `a`, return a list of the words in the string, using `sep` as the delimiter string.
Calls `str.split` element-wise.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
sepstr or unicode, optional
    
If `sep` is not specified or None, any whitespace string is a separator.
maxsplitint, optional
    
If `maxsplit` is given, at most `maxsplit` splits are done.
Returns:
    
outndarray
    
Array of list objects
See also
`str.split`, `rsplit`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array("Numpy is nice!")
    >>> np.strings.split(x, " ")  
    array(list(['Numpy', 'is', 'nice!']), dtype=object)  
    
    
    >>> np.strings.split(x, " ", 1)  
    array(list(['Numpy', 'is nice!']), dtype=object)  
    
# numpy.char.splitlines
char.splitlines(a, keepends=None)[source]
    
For each element in `a`, return a list of the lines in the element, breaking at line boundaries.
Calls `str.splitlines` element-wise.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
keependsbool, optional
    
Line breaks are not included in the resulting list unless keepends is given and true.
Returns:
    
outndarray
    
Array of list objects
See also
`str.splitlines`
#### Examples
    
    >>> np.char.splitlines("first line\nsecond line")
    array(list(['first line', 'second line']), dtype=object)
    >>> a = np.array(["first\nsecond", "third\nfourth"])
    >>> np.char.splitlines(a)
    array([list(['first', 'second']), list(['third', 'fourth'])], dtype=object)
    
# numpy.char.startswith
char.startswith(a, prefix, start=0, end=None)[source]
    
Returns a boolean array which is `True` where the string element in `a` starts with `prefix`, otherwise `False`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
prefixarray-like, with `StringDType`, `bytes_`, or `str_` dtype
start, endarray_like, with any integer dtype
    
With `start`, test beginning at that position. With `end`, stop comparing at that position.
Returns:
    
outndarray
    
Output array of bools
See also
`str.startswith`
#### Examples
    
    >>> import numpy as np
    >>> s = np.array(['foo', 'bar'])
    >>> s
    array(['foo', 'bar'], dtype='<U3')
    >>> np.strings.startswith(s, 'fo')
    array([True,  False])
    >>> np.strings.startswith(s, 'o', start=1, end=2)
    array([True,  False])
    
# numpy.char.str_len
char.str_len(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'str_len'>
    
Returns the length of each element. For byte strings, this is the number of bytes, while, for Unicode strings, it is the number of Unicode code points.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of ints This is a scalar if `x` is a scalar.
See also
`len`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['Grace Hopper Conference', 'Open Source Day'])
    >>> np.strings.str_len(a)
    array([23, 15])
    >>> a = np.array(['Р', 'о'])
    >>> np.strings.str_len(a)
    array([1, 1])
    >>> a = np.array([['hello', 'world'], ['Р', 'о']])
    >>> np.strings.str_len(a)
    array([[5, 5], [1, 1]])
    
# numpy.char.strip
char.strip(a, chars=None)[source]
    
For each element in `a`, return a copy with the leading and trailing characters removed.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
charsscalar with the same dtype as `a`, optional
    
The `chars` argument is a string specifying the set of characters to be removed. If `None`, the `chars` argument defaults to removing whitespace. The `chars` argument is not a prefix or suffix; rather, all combinations of its values are stripped.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.strip`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> c
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.strip(c)
    array(['aAaAaA', 'aA', 'abBABba'], dtype='<U7')
    # 'a' unstripped from c[1] because of leading whitespace.
    >>> np.strings.strip(c, 'a')
    array(['AaAaA', '  aA  ', 'bBABb'], dtype='<U7')
    # 'A' unstripped from c[1] because of trailing whitespace.
    >>> np.strings.strip(c, 'A')
    array(['aAaAa', '  aA  ', 'abBABba'], dtype='<U7')
    
# numpy.char.swapcase
char.swapcase(a)[source]
    
Return element-wise a copy of the string with uppercase characters converted to lowercase and vice versa.
Calls `str.swapcase` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.swapcase`
#### Examples
    
    >>> import numpy as np
    >>> c=np.array(['a1B c','1b Ca','b Ca1','cA1b'],'S5'); c
    array(['a1B c', '1b Ca', 'b Ca1', 'cA1b'],
        dtype='|S5')
    >>> np.strings.swapcase(c)
    array(['A1b C', '1B cA', 'B cA1', 'Ca1B'],
        dtype='|S5')
    
# numpy.char.title
char.title(a)[source]
    
Return element-wise title cased version of string or unicode.
Title case words start with uppercase characters, all remaining cased characters are lowercase.
Calls `str.title` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.title`
#### Examples
    
    >>> import numpy as np
    >>> c=np.array(['a1b c','1b ca','b ca1','ca1b'],'S5'); c
    array(['a1b c', '1b ca', 'b ca1', 'ca1b'],
        dtype='|S5')
    >>> np.strings.title(c)
    array(['A1B C', '1B Ca', 'B Ca1', 'Ca1B'],
        dtype='|S5')
    
# numpy.char.translate
char.translate(a, table, deletechars=None)[source]
    
For each element in `a`, return a copy of the string where all characters occurring in the optional argument `deletechars` are removed, and the remaining characters have been mapped through the given translation table.
Calls `str.translate` element-wise.
Parameters:
    
aarray-like, with `np.bytes_` or `np.str_` dtype
tablestr of length 256
deletecharsstr
Returns:
    
outndarray
    
Output array of str or unicode, depending on input type
See also
`str.translate`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a1b c', '1bca', 'bca1'])
    >>> table = a[0].maketrans('abc', '123')
    >>> deletechars = ' '
    >>> np.char.translate(a, table, deletechars)
    array(['112 3', '1231', '2311'], dtype='<U5')
    
# numpy.char.upper
char.upper(a)[source]
    
Return an array with the elements converted to uppercase.
Calls `str.upper` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.upper`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['a1b c', '1bca', 'bca1']); c
    array(['a1b c', '1bca', 'bca1'], dtype='<U5')
    >>> np.strings.upper(c)
    array(['A1B C', '1BCA', 'BCA1'], dtype='<U5')
    
# numpy.char.zfill
char.zfill(a, width)[source]
    
Return the numeric string left-filled with zeros. A leading sign prefix (`+`/`-`) is handled by inserting the padding after the sign character rather than before.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
Width of string to left-fill elements in `a`.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input type
See also
`str.zfill`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.zfill(['1', '-1', '+1'], 3)
    array(['001', '-01', '+01'], dtype='<U3')
    
# numpy.choose
numpy.choose(a, choices, out=None, mode='raise')[source]
    
Construct an array from an index array and a list of arrays to choose from.
First of all, if confused or uncertain, definitely look at the Examples - in its full generality, this function is less simple than it might seem from the following code description:
    
    np.choose(a,c) == np.array([c[a[I]][I] for I in np.ndindex(a.shape)])
    
But this omits some subtleties. Here is a fully general summary:
Given an “index” array (`a`) of integers and a sequence of `n` arrays (`choices`), `a` and each choice array are first broadcast, as necessary, to arrays of a common shape; calling these Ba and Bchoices[i], i = 0,…,n-1 we have that, necessarily, `Ba.shape == Bchoices[i].shape` for each `i`. Then, a new array with shape `Ba.shape` is created as follows:
  * if `mode='raise'` (the default), then, first of all, each element of `a` (and thus `Ba`) must be in the range `[0, n-1]`; now, suppose that `i` (in that range) is the value at the `(j0, j1, ..., jm)` position in `Ba` \- then the value at the same position in the new array is the value in `Bchoices[i]` at that same position;
  * if `mode='wrap'`, values in `a` (and thus `Ba`) may be any (signed) integer; modular arithmetic is used to map integers outside the range `[0, n-1]` back into that range; and then the new array is constructed as above;
  * if `mode='clip'`, values in `a` (and thus `Ba`) may be any (signed) integer; negative integers are mapped to 0; values greater than `n-1` are mapped to `n-1`; and then the new array is constructed as above.


Parameters:
    
aint array
    
This array must contain integers in `[0, n-1]`, where `n` is the number of choices, unless `mode=wrap` or `mode=clip`, in which cases any integers are permissible.
choicessequence of arrays
    
Choice arrays. `a` and all of the choices must be broadcastable to the same shape. If `choices` is itself an array (not recommended), then its outermost dimension (i.e., the one corresponding to `choices.shape[0]`) is taken as defining the “sequence”.
outarray, optional
    
If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype. Note that `out` is always buffered if `mode='raise'`; use other modes for better performance.
mode{‘raise’ (default), ‘wrap’, ‘clip’}, optional
    
Specifies how indices outside `[0, n-1]` will be treated:
  * ‘raise’ : an exception is raised
  * ‘wrap’ : value becomes value mod `n`
  * ‘clip’ : values < 0 are mapped to 0, values > n-1 are mapped to n-1


Returns:
    
merged_arrayarray
    
The merged result.
Raises:
    
ValueError: shape mismatch
    
If `a` and each choice array are not all broadcastable to the same shape.
See also
`ndarray.choose`
    
equivalent method
`numpy.take_along_axis`
    
Preferable if `choices` is an array
#### Notes
To reduce the chance of misinterpretation, even though the following “abuse” is nominally supported, `choices` should neither be, nor be thought of as, a single array, i.e., the outermost sequence-like container should be either a list or a tuple.
#### Examples
    
    >>> import numpy as np
    >>> choices = [[0, 1, 2, 3], [10, 11, 12, 13],
    ...   [20, 21, 22, 23], [30, 31, 32, 33]]
    >>> np.choose([2, 3, 1, 0], choices
    ... # the first element of the result will be the first element of the
    ... # third (2+1) "array" in choices, namely, 20; the second element
    ... # will be the second element of the fourth (3+1) choice array, i.e.,
    ... # 31, etc.
    ... )
    array([20, 31, 12,  3])
    >>> np.choose([2, 4, 1, 0], choices, mode='clip') # 4 goes to 3 (4-1)
    array([20, 31, 12,  3])
    >>> # because there are 4 choice arrays
    >>> np.choose([2, 4, 1, 0], choices, mode='wrap') # 4 goes to (4 mod 4)
    array([20,  1, 12,  3])
    >>> # i.e., 0
    
A couple examples illustrating how choose broadcasts:
    
    >>> a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
    >>> choices = [-10, 10]
    >>> np.choose(a, choices)
    array([[ 10, -10,  10],
           [-10,  10, -10],
           [ 10, -10,  10]])
    
    
    >>> # With thanks to Anne Archibald
    >>> a = np.array([0, 1]).reshape((2,1,1))
    >>> c1 = np.array([1, 2, 3]).reshape((1,3,1))
    >>> c2 = np.array([-1, -2, -3, -4, -5]).reshape((1,1,5))
    >>> np.choose(a, (c1, c2)) # result is 2x3x5, res[0,:,:]=c1, res[1,:,:]=c2
    array([[[ 1,  1,  1,  1,  1],
            [ 2,  2,  2,  2,  2],
            [ 3,  3,  3,  3,  3]],
           [[-1, -2, -3, -4, -5],
            [-1, -2, -3, -4, -5],
            [-1, -2, -3, -4, -5]]])
    
# numpy.clip
numpy.clip(a, a_min=<no value>, a_max=<no value>, out=None, *, min=<no value>, max=<no value>, **kwargs)[source]
    
Clip (limit) the values in an array.
Given an interval, values outside the interval are clipped to the interval edges. For example, if an interval of `[0, 1]` is specified, values smaller than 0 become 0, and values larger than 1 become 1.
Equivalent to but faster than `np.minimum(a_max, np.maximum(a, a_min))`.
No check is performed to ensure `a_min < a_max`.
Parameters:
    
aarray_like
    
Array containing elements to clip.
a_min, a_maxarray_like or None
    
Minimum and maximum value. If `None`, clipping is not performed on the corresponding edge. If both `a_min` and `a_max` are `None`, the elements of the returned array stay the same. Both are broadcasted against `a`.
outndarray, optional
    
The results will be placed in this array. It may be the input array for in-place clipping. `out` must be of the right shape to hold the output. Its type is preserved.
min, maxarray_like or None
    
Array API compatible alternatives for `a_min` and `a_max` arguments. Either `a_min` and `a_max` or `min` and `max` can be passed at the same time. Default: `None`.
New in version 2.1.0.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
clipped_arrayndarray
    
An array with the elements of `a`, but where values < `a_min` are replaced with `a_min`, and those > `a_max` with `a_max`.
See also
Output type determination
#### Notes
When `a_min` is greater than `a_max`, `clip` returns an array in which all values are equal to `a_max`, as shown in the second example.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(10)
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.clip(a, 1, 8)
    array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8])
    >>> np.clip(a, 8, 1)
    array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    >>> np.clip(a, 3, 6, out=a)
    array([3, 3, 3, 3, 4, 5, 6, 6, 6, 6])
    >>> a
    array([3, 3, 3, 3, 4, 5, 6, 6, 6, 6])
    >>> a = np.arange(10)
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.clip(a, [3, 4, 1, 1, 1, 4, 4, 4, 4, 4], 8)
    array([3, 4, 2, 3, 4, 5, 6, 7, 8, 8])
    
# numpy.column_stack
numpy.column_stack(tup)[source]
    
Stack 1-D arrays as columns into a 2-D array.
Take a sequence of 1-D arrays and stack them as columns to make a single 2-D array. 2-D arrays are stacked as-is, just like with `hstack`. 1-D arrays are turned into 2-D columns first.
Parameters:
    
tupsequence of 1-D or 2-D arrays.
    
Arrays to stack. All of them must have the same first dimension.
Returns:
    
stacked2-D array
    
The array formed by stacking the given arrays.
See also
`stack`, `hstack`, `vstack`, `concatenate`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((1,2,3))
    >>> b = np.array((2,3,4))
    >>> np.column_stack((a,b))
    array([[1, 2],
           [2, 3],
           [3, 4]])
    
# numpy.common_type
numpy.common_type(*arrays)[source]
    
Return a scalar type which is common to the input arrays.
The return type will always be an inexact (i.e. floating point) scalar type, even if all the arrays are integer arrays. If one of the inputs is an integer array, the minimum precision type that is returned is a 64-bit floating point dtype.
All input arrays except int64 and uint64 can be safely cast to the returned dtype without loss of information.
Parameters:
    
array1, array2, …ndarrays
    
Input arrays.
Returns:
    
outdata type code
    
Data type code.
See also
`dtype`, `mintypecode`
#### Examples
    
    >>> np.common_type(np.arange(2, dtype=np.float32))
    <class 'numpy.float32'>
    >>> np.common_type(np.arange(2, dtype=np.float32), np.arange(2))
    <class 'numpy.float64'>
    >>> np.common_type(np.arange(4), np.array([45, 6.j]), np.array([45.0]))
    <class 'numpy.complex128'>
    
# numpy.compress
numpy.compress(condition, a, axis=None, out=None)[source]
    
Return selected slices of an array along given axis.
When working along a given axis, a slice along that axis is returned in `output` for each index where `condition` evaluates to True. When working on a 1-D array, `compress` is equivalent to `extract`.
Parameters:
    
condition1-D array of bools
    
Array that selects which entries to return. If len(condition) is less than the size of `a` along the given axis, then output is truncated to the length of the condition array.
aarray_like
    
Array from which to extract a part.
axisint, optional
    
Axis along which to take slices. If None (default), work on the flattened array.
outndarray, optional
    
Output array. Its type is preserved and it must be of the right shape to hold the output.
Returns:
    
compressed_arrayndarray
    
A copy of `a` without the slices along axis for which `condition` is false.
See also
`take`, `choose`, `diag`, `diagonal`, `select`
`ndarray.compress`
    
Equivalent method in ndarray
`extract`
    
Equivalent method when working on 1-D arrays
Output type determination
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4], [5, 6]])
    >>> a
    array([[1, 2],
           [3, 4],
           [5, 6]])
    >>> np.compress([0, 1], a, axis=0)
    array([[3, 4]])
    >>> np.compress([False, True, True], a, axis=0)
    array([[3, 4],
           [5, 6]])
    >>> np.compress([False, True], a, axis=1)
    array([[2],
           [4],
           [6]])
    
Working on the flattened array does not return slices along an axis but selects elements.
    
    >>> np.compress([False, True], a)
    array([2])
    
# numpy.concat
numpy.concat((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
    
Join a sequence of arrays along an existing axis.
Parameters:
    
a1, a2, …sequence of array_like
    
The arrays must have the same shape, except in the dimension corresponding to `axis` (the first, by default).
axisint, optional
    
The axis along which the arrays will be joined. If axis is None, arrays are flattened before use. Default is 0.
outndarray, optional
    
If provided, the destination to place the result. The shape must be correct, matching that of what concatenate would have returned if no out argument were specified.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.20.0.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’. For a description of the options, please see casting.
New in version 1.20.0.
Returns:
    
resndarray
    
The concatenated array.
See also
`ma.concatenate`
    
Concatenate function that preserves input masks.
`array_split`
    
Split an array into multiple sub-arrays of equal or near-equal size.
`split`
    
Split array into a list of multiple sub-arrays of equal size.
`hsplit`
    
Split array into multiple sub-arrays horizontally (column wise).
`vsplit`
    
Split array into multiple sub-arrays vertically (row wise).
`dsplit`
    
Split array into multiple sub-arrays along the 3rd axis (depth).
`stack`
    
Stack a sequence of arrays along a new axis.
`block`
    
Assemble arrays from blocks.
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`vstack`
    
Stack arrays in sequence vertically (row wise).
`dstack`
    
Stack arrays in sequence depth wise (along third dimension).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
#### Notes
When one or more of the arrays to be concatenated is a MaskedArray, this function will return a MaskedArray object instead of an ndarray, but the input masks are not preserved. In cases where a MaskedArray is expected as input, use the ma.concatenate function from the masked array module instead.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> b = np.array([[5, 6]])
    >>> np.concatenate((a, b), axis=0)
    array([[1, 2],
           [3, 4],
           [5, 6]])
    >>> np.concatenate((a, b.T), axis=1)
    array([[1, 2, 5],
           [3, 4, 6]])
    >>> np.concatenate((a, b), axis=None)
    array([1, 2, 3, 4, 5, 6])
    
This function will not preserve masking of MaskedArray inputs.
    
    >>> a = np.ma.arange(3)
    >>> a[1] = np.ma.masked
    >>> b = np.arange(2, 5)
    >>> a
    masked_array(data=[0, --, 2],
                 mask=[False,  True, False],
           fill_value=999999)
    >>> b
    array([2, 3, 4])
    >>> np.concatenate([a, b])
    masked_array(data=[0, 1, 2, 2, 3, 4],
                 mask=False,
           fill_value=999999)
    >>> np.ma.concatenate([a, b])
    masked_array(data=[0, --, 2, 2, 3, 4],
                 mask=[False,  True, False, False, False, False],
           fill_value=999999)
    
# numpy.concatenate
numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
    
Join a sequence of arrays along an existing axis.
Parameters:
    
a1, a2, …sequence of array_like
    
The arrays must have the same shape, except in the dimension corresponding to `axis` (the first, by default).
axisint, optional
    
The axis along which the arrays will be joined. If axis is None, arrays are flattened before use. Default is 0.
outndarray, optional
    
If provided, the destination to place the result. The shape must be correct, matching that of what concatenate would have returned if no out argument were specified.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.20.0.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’. For a description of the options, please see casting.
New in version 1.20.0.
Returns:
    
resndarray
    
The concatenated array.
See also
`ma.concatenate`
    
Concatenate function that preserves input masks.
`array_split`
    
Split an array into multiple sub-arrays of equal or near-equal size.
`split`
    
Split array into a list of multiple sub-arrays of equal size.
`hsplit`
    
Split array into multiple sub-arrays horizontally (column wise).
`vsplit`
    
Split array into multiple sub-arrays vertically (row wise).
`dsplit`
    
Split array into multiple sub-arrays along the 3rd axis (depth).
`stack`
    
Stack a sequence of arrays along a new axis.
`block`
    
Assemble arrays from blocks.
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`vstack`
    
Stack arrays in sequence vertically (row wise).
`dstack`
    
Stack arrays in sequence depth wise (along third dimension).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
#### Notes
When one or more of the arrays to be concatenated is a MaskedArray, this function will return a MaskedArray object instead of an ndarray, but the input masks are not preserved. In cases where a MaskedArray is expected as input, use the ma.concatenate function from the masked array module instead.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> b = np.array([[5, 6]])
    >>> np.concatenate((a, b), axis=0)
    array([[1, 2],
           [3, 4],
           [5, 6]])
    >>> np.concatenate((a, b.T), axis=1)
    array([[1, 2, 5],
           [3, 4, 6]])
    >>> np.concatenate((a, b), axis=None)
    array([1, 2, 3, 4, 5, 6])
    
This function will not preserve masking of MaskedArray inputs.
    
    >>> a = np.ma.arange(3)
    >>> a[1] = np.ma.masked
    >>> b = np.arange(2, 5)
    >>> a
    masked_array(data=[0, --, 2],
                 mask=[False,  True, False],
           fill_value=999999)
    >>> b
    array([2, 3, 4])
    >>> np.concatenate([a, b])
    masked_array(data=[0, 1, 2, 2, 3, 4],
                 mask=False,
           fill_value=999999)
    >>> np.ma.concatenate([a, b])
    masked_array(data=[0, --, 2, 2, 3, 4],
                 mask=[False,  True, False, False, False, False],
           fill_value=999999)
    
# numpy.conj
numpy.conj(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'conjugate'>
    
Return the complex conjugate, element-wise.
The complex conjugate of a complex number is obtained by changing the sign of its imaginary part.
Parameters:
    
xarray_like
    
Input value.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The complex conjugate of `x`, with same dtype as `y`. This is a scalar if `x` is a scalar.
#### Notes
`conj` is an alias for `conjugate`:
    
    >>> np.conj is np.conjugate
    True
    
#### Examples
    
    >>> import numpy as np
    >>> np.conjugate(1+2j)
    (1-2j)
    
    
    >>> x = np.eye(2) + 1j * np.eye(2)
    >>> np.conjugate(x)
    array([[ 1.-1.j,  0.-0.j],
           [ 0.-0.j,  1.-1.j]])
    
# numpy.conjugate
numpy.conjugate(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'conjugate'>
    
Return the complex conjugate, element-wise.
The complex conjugate of a complex number is obtained by changing the sign of its imaginary part.
Parameters:
    
xarray_like
    
Input value.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The complex conjugate of `x`, with same dtype as `y`. This is a scalar if `x` is a scalar.
#### Notes
`conj` is an alias for `conjugate`:
    
    >>> np.conj is np.conjugate
    True
    
#### Examples
    
    >>> import numpy as np
    >>> np.conjugate(1+2j)
    (1-2j)
    
    
    >>> x = np.eye(2) + 1j * np.eye(2)
    >>> np.conjugate(x)
    array([[ 1.-1.j,  0.-0.j],
           [ 0.-0.j,  1.-1.j]])
    
# numpy.convolve
numpy.convolve(a, v, mode='full')[source]
    
Returns the discrete, linear convolution of two one-dimensional sequences.
The convolution operator is often seen in signal processing, where it models the effect of a linear time-invariant system on a signal [1]. In probability theory, the sum of two independent random variables is distributed according to the convolution of their individual distributions.
If `v` is longer than `a`, the arrays are swapped before computation.
Parameters:
    
a(N,) array_like
    
First one-dimensional input array.
v(M,) array_like
    
Second one-dimensional input array.
mode{‘full’, ‘valid’, ‘same’}, optional
    
‘full’:
    
By default, mode is ‘full’. This returns the convolution at each point of overlap, with an output shape of (N+M-1,). At the end-points of the convolution, the signals do not overlap completely, and boundary effects may be seen.
‘same’:
    
Mode ‘same’ returns output of length `max(M, N)`. Boundary effects are still visible.
‘valid’:
    
Mode ‘valid’ returns output of length `max(M, N) - min(M, N) + 1`. The convolution product is only given for points where the signals overlap completely. Values outside the signal boundary have no effect.
Returns:
    
outndarray
    
Discrete, linear convolution of `a` and `v`.
See also
`scipy.signal.fftconvolve`
    
Convolve two arrays using the Fast Fourier Transform.
`scipy.linalg.toeplitz`
    
Used to construct the convolution operator.
`polymul`
    
Polynomial multiplication. Same output as convolve, but also accepts poly1d objects as input.
#### Notes
The discrete convolution operation is defined as
\\[(a * v)_n = \sum_{m = -\infty}^{\infty} a_m v_{n - m}\\]
It can be shown that a convolution \\(x(t) * y(t)\\) in time/space is equivalent to the multiplication \\(X(f) Y(f)\\) in the Fourier domain, after appropriate padding (padding is necessary to prevent circular convolution). Since multiplication is more efficient (faster) than convolution, the function `scipy.signal.fftconvolve` exploits the FFT to calculate the convolution of large data-sets.
#### References
[1]
Wikipedia, “Convolution”, https://en.wikipedia.org/wiki/Convolution
#### Examples
Note how the convolution operator flips the second array before “sliding” the two across one another:
    
    >>> import numpy as np
    >>> np.convolve([1, 2, 3], [0, 1, 0.5])
    array([0. , 1. , 2.5, 4. , 1.5])
    
Only return the middle values of the convolution. Contains boundary effects, where zeros are taken into account:
    
    >>> np.convolve([1,2,3],[0,1,0.5], 'same')
    array([1. ,  2.5,  4. ])
    
The two arrays are of the same length, so there is only one position where they completely overlap:
    
    >>> np.convolve([1,2,3],[0,1,0.5], 'valid')
    array([2.5])
    
# numpy.copy
numpy.copy(a, order='K', subok=False)[source]
    
Return an array copy of the given object.
Parameters:
    
aarray_like
    
Input data.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `ndarray.copy` are very similar, but have different default values for their order= arguments.)
subokbool, optional
    
If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (defaults to False).
Returns:
    
arrndarray
    
Array interpretation of `a`.
See also
`ndarray.copy`
    
Preferred method for creating an array copy
#### Notes
This is equivalent to:
    
    >>> np.array(a, copy=True)  
    
The copy made of the data is shallow, i.e., for arrays with object dtype, the new array will point to the same objects. See Examples from `ndarray.copy`.
#### Examples
    
    >>> import numpy as np
    
Create an array x, with a reference y and a copy z:
    
    >>> x = np.array([1, 2, 3])
    >>> y = x
    >>> z = np.copy(x)
    
Note that, when we modify x, y changes, but not z:
    
    >>> x[0] = 10
    >>> x[0] == y[0]
    True
    >>> x[0] == z[0]
    False
    
Note that, np.copy clears previously set WRITEABLE=False flag.
    
    >>> a = np.array([1, 2, 3])
    >>> a.flags["WRITEABLE"] = False
    >>> b = np.copy(a)
    >>> b.flags["WRITEABLE"]
    True
    >>> b[0] = 3
    >>> b
    array([3, 2, 3])
    
# numpy.copysign
numpy.copysign(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'copysign'>
    
Change the sign of x1 to that of x2, element-wise.
If `x2` is a scalar, its sign will be copied to all elements of `x1`.
Parameters:
    
x1array_like
    
Values to change the sign of.
x2array_like
    
The sign of `x2` is copied to `x1`. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
The values of `x1` with the sign of `x2`. This is a scalar if both `x1` and `x2` are scalars.
#### Examples
    
    >>> import numpy as np
    >>> np.copysign(1.3, -1)
    -1.3
    >>> 1/np.copysign(0, 1)
    inf
    >>> 1/np.copysign(0, -1)
    -inf
    
    
    >>> np.copysign([-1, 0, 1], -1.1)
    array([-1., -0., -1.])
    >>> np.copysign([-1, 0, 1], np.arange(3)-1)
    array([-1.,  0.,  1.])
    
# numpy.copyto
numpy.copyto(dst, src, casting='same_kind', where=True)
    
Copies values from one array to another, broadcasting as necessary.
Raises a TypeError if the `casting` rule is violated, and if `where` is provided, it selects which elements to copy.
Parameters:
    
dstndarray
    
The array into which values are copied.
srcarray_like
    
The array from which values are copied.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur when copying.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


wherearray_like of bool, optional
    
A boolean array which is broadcasted to match the dimensions of `dst`, and selects elements to copy from `src` to `dst` wherever it contains the value True.
#### Examples
    
    >>> import numpy as np
    >>> A = np.array([4, 5, 6])
    >>> B = [1, 2, 3]
    >>> np.copyto(A, B)
    >>> A
    array([1, 2, 3])
    
    
    >>> A = np.array([[1, 2, 3], [4, 5, 6]])
    >>> B = [[4, 5, 6], [7, 8, 9]]
    >>> np.copyto(A, B)
    >>> A
    array([[4, 5, 6],
           [7, 8, 9]])
    
# numpy.corrcoef
numpy.corrcoef(x, y=None, rowvar=True, bias=<no value>, ddof=<no value>, *, dtype=None)[source]
    
Return Pearson product-moment correlation coefficients.
Please refer to the documentation for `cov` for more detail. The relationship between the correlation coefficient matrix, `R`, and the covariance matrix, `C`, is
\\[R_{ij} = \frac{ C_{ij} } { \sqrt{ C_{ii} C_{jj} } }\\]
The values of `R` are between -1 and 1, inclusive.
Parameters:
    
xarray_like
    
A 1-D or 2-D array containing multiple variables and observations. Each row of `x` represents a variable, and each column a single observation of all those variables. Also see `rowvar` below.
yarray_like, optional
    
An additional set of variables and observations. `y` has the same shape as `x`.
rowvarbool, optional
    
If `rowvar` is True (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations.
bias_NoValue, optional
    
Has no effect, do not use.
Deprecated since version 1.10.0.
ddof_NoValue, optional
    
Has no effect, do not use.
Deprecated since version 1.10.0.
dtypedata-type, optional
    
Data-type of the result. By default, the return data-type will have at least `numpy.float64` precision.
New in version 1.20.
Returns:
    
Rndarray
    
The correlation coefficient matrix of the variables.
See also
`cov`
    
Covariance matrix
#### Notes
Due to floating point rounding the resulting array may not be Hermitian, the diagonal elements may not be 1, and the elements may not satisfy the inequality abs(a) <= 1. The real and imaginary parts are clipped to the interval [-1, 1] in an attempt to improve on that situation but is not much help in the complex case.
This function accepts but discards arguments `bias` and `ddof`. This is for backwards compatibility with previous versions of this function. These arguments had no effect on the return values of the function and can be safely ignored in this and previous versions of numpy.
#### Examples
    
    >>> import numpy as np
    
In this example we generate two random arrays, `xarr` and `yarr`, and compute the row-wise and column-wise Pearson correlation coefficients, `R`. Since `rowvar` is true by default, we first find the row-wise Pearson correlation coefficients between the variables of `xarr`.
    
    >>> import numpy as np
    >>> rng = np.random.default_rng(seed=42)
    >>> xarr = rng.random((3, 3))
    >>> xarr
    array([[0.77395605, 0.43887844, 0.85859792],
           [0.69736803, 0.09417735, 0.97562235],
           [0.7611397 , 0.78606431, 0.12811363]])
    >>> R1 = np.corrcoef(xarr)
    >>> R1
    array([[ 1.        ,  0.99256089, -0.68080986],
           [ 0.99256089,  1.        , -0.76492172],
           [-0.68080986, -0.76492172,  1.        ]])
    
If we add another set of variables and observations `yarr`, we can compute the row-wise Pearson correlation coefficients between the variables in `xarr` and `yarr`.
    
    >>> yarr = rng.random((3, 3))
    >>> yarr
    array([[0.45038594, 0.37079802, 0.92676499],
           [0.64386512, 0.82276161, 0.4434142 ],
           [0.22723872, 0.55458479, 0.06381726]])
    >>> R2 = np.corrcoef(xarr, yarr)
    >>> R2
    array([[ 1.        ,  0.99256089, -0.68080986,  0.75008178, -0.934284  ,
            -0.99004057],
           [ 0.99256089,  1.        , -0.76492172,  0.82502011, -0.97074098,
            -0.99981569],
           [-0.68080986, -0.76492172,  1.        , -0.99507202,  0.89721355,
             0.77714685],
           [ 0.75008178,  0.82502011, -0.99507202,  1.        , -0.93657855,
            -0.83571711],
           [-0.934284  , -0.97074098,  0.89721355, -0.93657855,  1.        ,
             0.97517215],
           [-0.99004057, -0.99981569,  0.77714685, -0.83571711,  0.97517215,
             1.        ]])
    
Finally if we use the option `rowvar=False`, the columns are now being treated as the variables and we will find the column-wise Pearson correlation coefficients between variables in `xarr` and `yarr`.
    
    >>> R3 = np.corrcoef(xarr, yarr, rowvar=False)
    >>> R3
    array([[ 1.        ,  0.77598074, -0.47458546, -0.75078643, -0.9665554 ,
             0.22423734],
           [ 0.77598074,  1.        , -0.92346708, -0.99923895, -0.58826587,
            -0.44069024],
           [-0.47458546, -0.92346708,  1.        ,  0.93773029,  0.23297648,
             0.75137473],
           [-0.75078643, -0.99923895,  0.93773029,  1.        ,  0.55627469,
             0.47536961],
           [-0.9665554 , -0.58826587,  0.23297648,  0.55627469,  1.        ,
            -0.46666491],
           [ 0.22423734, -0.44069024,  0.75137473,  0.47536961, -0.46666491,
             1.        ]])
    
# numpy.correlate
numpy.correlate(a, v, mode='valid')[source]
    
Cross-correlation of two 1-dimensional sequences.
This function computes the correlation as generally defined in signal processing texts [1]:
\\[c_k = \sum_n a_{n+k} \cdot \overline{v}_n\\]
with a and v sequences being zero-padded where necessary and \\(\overline v\\) denoting complex conjugation.
Parameters:
    
a, varray_like
    
Input sequences.
mode{‘valid’, ‘same’, ‘full’}, optional
    
Refer to the `convolve` docstring. Note that the default is ‘valid’, unlike `convolve`, which uses ‘full’.
Returns:
    
outndarray
    
Discrete cross-correlation of `a` and `v`.
See also
`convolve`
    
Discrete, linear convolution of two one-dimensional sequences.
`scipy.signal.correlate`
    
uses FFT which has superior performance on large arrays.
#### Notes
The definition of correlation above is not unique and sometimes correlation may be defined differently. Another common definition is [1]:
\\[c'_k = \sum_n a_{n} \cdot \overline{v_{n+k}}\\]
which is related to \\(c_k\\) by \\(c'_k = c_{-k}\\).
`numpy.correlate` may perform slowly in large arrays (i.e. n = 1e5) because it does not use the FFT to compute the convolution; in that case, `scipy.signal.correlate` might be preferable.
#### References
[1] (1,2)
Wikipedia, “Cross-correlation”, https://en.wikipedia.org/wiki/Cross-correlation
#### Examples
    
    >>> import numpy as np
    >>> np.correlate([1, 2, 3], [0, 1, 0.5])
    array([3.5])
    >>> np.correlate([1, 2, 3], [0, 1, 0.5], "same")
    array([2. ,  3.5,  3. ])
    >>> np.correlate([1, 2, 3], [0, 1, 0.5], "full")
    array([0.5,  2. ,  3.5,  3. ,  0. ])
    
Using complex sequences:
    
    >>> np.correlate([1+1j, 2, 3-1j], [0, 1, 0.5j], 'full')
    array([ 0.5-0.5j,  1.0+0.j ,  1.5-1.5j,  3.0-1.j ,  0.0+0.j ])
    
Note that you get the time reversed, complex conjugated result (\\(\overline{c_{-k}}\\)) when the two input sequences a and v change places:
    
    >>> np.correlate([0, 1, 0.5j], [1+1j, 2, 3-1j], 'full')
    array([ 0.0+0.j ,  3.0+1.j ,  1.5+1.5j,  1.0+0.j ,  0.5+0.5j])
    
# numpy.cos
numpy.cos(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'cos'>
    
Cosine element-wise.
Parameters:
    
xarray_like
    
Input array in radians.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding cosine values. This is a scalar if `x` is a scalar.
#### Notes
If `out` is provided, the function writes the result into it, and returns a reference to `out`. (See Examples)
#### References
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions. New York, NY: Dover, 1972.
#### Examples
    
    >>> import numpy as np
    >>> np.cos(np.array([0, np.pi/2, np.pi]))
    array([  1.00000000e+00,   6.12303177e-17,  -1.00000000e+00])
    >>>
    >>> # Example of providing the optional output parameter
    >>> out1 = np.array([0], dtype='d')
    >>> out2 = np.cos([0.1], out1)
    >>> out2 is out1
    True
    >>>
    >>> # Example of ValueError due to provision of shape mis-matched `out`
    >>> np.cos(np.zeros((3,3)),np.zeros((2,2)))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (3,3) (2,2)
    
# numpy.cosh
numpy.cosh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'cosh'>
    
Hyperbolic cosine, element-wise.
Equivalent to `1/2 * (np.exp(x) + np.exp(-x))` and `np.cos(1j*x)`.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array of same shape as `x`. This is a scalar if `x` is a scalar.
#### Examples
    
    >>> import numpy as np
    >>> np.cosh(0)
    1.0
    
The hyperbolic cosine describes the shape of a hanging cable:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(-4, 4, 1000)
    >>> plt.plot(x, np.cosh(x))
    >>> plt.show()
    
# numpy.count_nonzero
numpy.count_nonzero(a, axis=None, *, keepdims=False)[source]
    
Counts the number of non-zero values in the array `a`.
The word “non-zero” is in reference to the Python 2.x built-in method `__nonzero__()` (renamed `__bool__()` in Python 3.x) of Python objects that tests an object’s “truthfulness”. For example, any number is considered truthful if it is nonzero, whereas any string is considered truthful if it is not the empty string. Thus, this function (recursively) counts how many elements in `a` (and in sub-arrays thereof) have their `__nonzero__()` or `__bool__()` method evaluated to `True`.
Parameters:
    
aarray_like
    
The array for which to count non-zeros.
axisint or tuple, optional
    
Axis or tuple of axes along which to count non-zeros. Default is None, meaning that non-zeros will be counted along a flattened version of `a`.
keepdimsbool, optional
    
If this is set to True, the axes that are counted are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
Returns:
    
countint or array of int
    
Number of non-zero values in the array along a given axis. Otherwise, the total number of non-zero values in the array is returned.
See also
`nonzero`
    
Return the coordinates of all the non-zero values.
#### Examples
    
    >>> import numpy as np
    >>> np.count_nonzero(np.eye(4))
    4
    >>> a = np.array([[0, 1, 7, 0],
    ...               [3, 0, 2, 19]])
    >>> np.count_nonzero(a)
    5
    >>> np.count_nonzero(a, axis=0)
    array([1, 1, 2, 1])
    >>> np.count_nonzero(a, axis=1)
    array([2, 3])
    >>> np.count_nonzero(a, axis=1, keepdims=True)
    array([[2],
           [3]])
    
# numpy.cov
numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None, *, dtype=None)[source]
    
Estimate a covariance matrix, given data and weights.
Covariance indicates the level to which two variables vary together. If we examine N-dimensional samples, \\(X = [x_1, x_2, ... x_N]^T\\), then the covariance matrix element \\(C_{ij}\\) is the covariance of \\(x_i\\) and \\(x_j\\). The element \\(C_{ii}\\) is the variance of \\(x_i\\).
See the notes for an outline of the algorithm.
Parameters:
    
marray_like
    
A 1-D or 2-D array containing multiple variables and observations. Each row of `m` represents a variable, and each column a single observation of all those variables. Also see `rowvar` below.
yarray_like, optional
    
An additional set of variables and observations. `y` has the same form as that of `m`.
rowvarbool, optional
    
If `rowvar` is True (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations.
biasbool, optional
    
Default normalization (False) is by `(N - 1)`, where `N` is the number of observations given (unbiased estimate). If `bias` is True, then normalization is by `N`. These values can be overridden by using the keyword `ddof` in numpy versions >= 1.5.
ddofint, optional
    
If not `None` the default value implied by `bias` is overridden. Note that `ddof=1` will return the unbiased estimate, even if both `fweights` and `aweights` are specified, and `ddof=0` will return the simple average. See the notes for the details. The default value is `None`.
fweightsarray_like, int, optional
    
1-D array of integer frequency weights; the number of times each observation vector should be repeated.
aweightsarray_like, optional
    
1-D array of observation vector weights. These relative weights are typically large for observations considered “important” and smaller for observations considered less “important”. If `ddof=0` the array of weights can be used to assign probabilities to observation vectors.
dtypedata-type, optional
    
Data-type of the result. By default, the return data-type will have at least `numpy.float64` precision.
New in version 1.20.
Returns:
    
outndarray
    
The covariance matrix of the variables.
See also
`corrcoef`
    
Normalized covariance matrix
#### Notes
Assume that the observations are in the columns of the observation array `m` and let `f = fweights` and `a = aweights` for brevity. The steps to compute the weighted covariance are as follows:
    
    >>> m = np.arange(10, dtype=np.float64)
    >>> f = np.arange(10) * 2
    >>> a = np.arange(10) ** 2.
    >>> ddof = 1
    >>> w = f * a
    >>> v1 = np.sum(w)
    >>> v2 = np.sum(w * a)
    >>> m -= np.sum(m * w, axis=None, keepdims=True) / v1
    >>> cov = np.dot(m * w, m.T) * v1 / (v1**2 - ddof * v2)
    
Note that when `a == 1`, the normalization factor `v1 / (v1**2 - ddof * v2)` goes over to `1 / (np.sum(f) - ddof)` as it should.
#### Examples
    
    >>> import numpy as np
    
Consider two variables, \\(x_0\\) and \\(x_1\\), which correlate perfectly, but in opposite directions:
    
    >>> x = np.array([[0, 2], [1, 1], [2, 0]]).T
    >>> x
    array([[0, 1, 2],
           [2, 1, 0]])
    
Note how \\(x_0\\) increases while \\(x_1\\) decreases. The covariance matrix shows this clearly:
    
    >>> np.cov(x)
    array([[ 1., -1.],
           [-1.,  1.]])
    
Note that element \\(C_{0,1}\\), which shows the correlation between \\(x_0\\) and \\(x_1\\), is negative.
Further, note how `x` and `y` are combined:
    
    >>> x = [-2.1, -1,  4.3]
    >>> y = [3,  1.1,  0.12]
    >>> X = np.stack((x, y), axis=0)
    >>> np.cov(X)
    array([[11.71      , -4.286     ], # may vary
           [-4.286     ,  2.144133]])
    >>> np.cov(x, y)
    array([[11.71      , -4.286     ], # may vary
           [-4.286     ,  2.144133]])
    >>> np.cov(x)
    array(11.71)
    
# numpy.cross
numpy.cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None)[source]
    
Return the cross product of two (arrays of) vectors.
The cross product of `a` and `b` in \\(R^3\\) is a vector perpendicular to both `a` and `b`. If `a` and `b` are arrays of vectors, the vectors are defined by the last axis of `a` and `b` by default, and these axes can have dimensions 2 or 3. Where the dimension of either `a` or `b` is 2, the third component of the input vector is assumed to be zero and the cross product calculated accordingly. In cases where both input vectors have dimension 2, the z-component of the cross product is returned.
Parameters:
    
aarray_like
    
Components of the first vector(s).
barray_like
    
Components of the second vector(s).
axisaint, optional
    
Axis of `a` that defines the vector(s). By default, the last axis.
axisbint, optional
    
Axis of `b` that defines the vector(s). By default, the last axis.
axiscint, optional
    
Axis of `c` containing the cross product vector(s). Ignored if both input vectors have dimension 2, as the return is scalar. By default, the last axis.
axisint, optional
    
If defined, the axis of `a`, `b` and `c` that defines the vector(s) and cross product(s). Overrides `axisa`, `axisb` and `axisc`.
Returns:
    
cndarray
    
Vector cross product(s).
Raises:
    
ValueError
    
When the dimension of the vector(s) in `a` and/or `b` does not equal 2 or 3.
See also
`inner`
    
Inner product
`outer`
    
Outer product.
`linalg.cross`
    
An Array API compatible variation of `np.cross`, which accepts (arrays of) 3-element vectors only.
`ix_`
    
Construct index arrays.
#### Notes
Supports full broadcasting of the inputs.
Dimension-2 input arrays were deprecated in 2.0.0. If you do need this functionality, you can use:
    
    def cross2d(x, y):
        return x[..., 0] * y[..., 1] - x[..., 1] * y[..., 0]
    
#### Examples
Vector cross-product.
    
    >>> import numpy as np
    >>> x = [1, 2, 3]
    >>> y = [4, 5, 6]
    >>> np.cross(x, y)
    array([-3,  6, -3])
    
One vector with dimension 2.
    
    >>> x = [1, 2]
    >>> y = [4, 5, 6]
    >>> np.cross(x, y)
    array([12, -6, -3])
    
Equivalently:
    
    >>> x = [1, 2, 0]
    >>> y = [4, 5, 6]
    >>> np.cross(x, y)
    array([12, -6, -3])
    
Both vectors with dimension 2.
    
    >>> x = [1,2]
    >>> y = [4,5]
    >>> np.cross(x, y)
    array(-3)
    
Multiple vector cross-products. Note that the direction of the cross product vector is defined by the right-hand rule.
    
    >>> x = np.array([[1,2,3], [4,5,6]])
    >>> y = np.array([[4,5,6], [1,2,3]])
    >>> np.cross(x, y)
    array([[-3,  6, -3],
           [ 3, -6,  3]])
    
The orientation of `c` can be changed using the `axisc` keyword.
    
    >>> np.cross(x, y, axisc=0)
    array([[-3,  3],
           [ 6, -6],
           [-3,  3]])
    
Change the vector definition of `x` and `y` using `axisa` and `axisb`.
    
    >>> x = np.array([[1,2,3], [4,5,6], [7, 8, 9]])
    >>> y = np.array([[7, 8, 9], [4,5,6], [1,2,3]])
    >>> np.cross(x, y)
    array([[ -6,  12,  -6],
           [  0,   0,   0],
           [  6, -12,   6]])
    >>> np.cross(x, y, axisa=0, axisb=0)
    array([[-24,  48, -24],
           [-30,  60, -30],
           [-36,  72, -36]])
    
# numpy.cumprod
numpy.cumprod(a, axis=None, dtype=None, out=None)[source]
    
Return the cumulative product of elements along a given axis.
Parameters:
    
aarray_like
    
Input array.
axisint, optional
    
Axis along which the cumulative product is computed. By default the input is flattened.
dtypedtype, optional
    
Type of the returned array, as well as of the accumulator in which the elements are multiplied. If dtype is not specified, it defaults to the dtype of `a`, unless `a` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used instead.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type of the resulting values will be cast if necessary.
Returns:
    
cumprodndarray
    
A new array holding the result is returned unless `out` is specified, in which case a reference to out is returned.
See also
`cumulative_prod`
    
Array API compatible alternative for `cumprod`.
Output type determination
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1,2,3])
    >>> np.cumprod(a) # intermediate results 1, 1*2
    ...               # total product 1*2*3 = 6
    array([1, 2, 6])
    >>> a = np.array([[1, 2, 3], [4, 5, 6]])
    >>> np.cumprod(a, dtype=float) # specify type of output
    array([   1.,    2.,    6.,   24.,  120.,  720.])
    
The cumulative product for each column (i.e., over the rows) of `a`:
    
    >>> np.cumprod(a, axis=0)
    array([[ 1,  2,  3],
           [ 4, 10, 18]])
    
The cumulative product for each row (i.e. over the columns) of `a`:
    
    >>> np.cumprod(a,axis=1)
    array([[  1,   2,   6],
           [  4,  20, 120]])
    
# numpy.cumsum
numpy.cumsum(a, axis=None, dtype=None, out=None)[source]
    
Return the cumulative sum of the elements along a given axis.
Parameters:
    
aarray_like
    
Input array.
axisint, optional
    
Axis along which the cumulative sum is computed. The default (None) is to compute the cumsum over the flattened array.
dtypedtype, optional
    
Type of the returned array and of the accumulator in which the elements are summed. If `dtype` is not specified, it defaults to the dtype of `a`, unless `a` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary. See Output type determination for more details.
Returns:
    
cumsum_along_axisndarray.
    
A new array holding the result is returned unless `out` is specified, in which case a reference to `out` is returned. The result has the same size as `a`, and the same shape as `a` if `axis` is not None or `a` is a 1-d array.
See also
`cumulative_sum`
    
Array API compatible alternative for `cumsum`.
`sum`
    
Sum array elements.
`trapezoid`
    
Integration of array values using composite trapezoidal rule.
`diff`
    
Calculate the n-th discrete difference along given axis.
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
`cumsum(a)[-1]` may not be equal to `sum(a)` for floating-point values since `sum` may use a pairwise summation routine, reducing the roundoff-error. See `sum` for more information.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2,3], [4,5,6]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> np.cumsum(a)
    array([ 1,  3,  6, 10, 15, 21])
    >>> np.cumsum(a, dtype=float)     # specifies type of output value(s)
    array([  1.,   3.,   6.,  10.,  15.,  21.])
    
    
    >>> np.cumsum(a,axis=0)      # sum over rows for each of the 3 columns
    array([[1, 2, 3],
           [5, 7, 9]])
    >>> np.cumsum(a,axis=1)      # sum over columns for each of the 2 rows
    array([[ 1,  3,  6],
           [ 4,  9, 15]])
    
`cumsum(b)[-1]` may not be equal to `sum(b)`
    
    >>> b = np.array([1, 2e-9, 3e-9] * 1000000)
    >>> b.cumsum()[-1]
    1000000.0050045159
    >>> b.sum()
    1000000.0050000029
    
# numpy.cumulative_prod
numpy.cumulative_prod(x, /, *, axis=None, dtype=None, out=None, include_initial=False)[source]
    
Return the cumulative product of elements along a given axis.
This function is an Array API compatible alternative to `numpy.cumprod`.
Parameters:
    
xarray_like
    
Input array.
axisint, optional
    
Axis along which the cumulative product is computed. The default (None) is only allowed for one-dimensional arrays. For arrays with more than one dimension `axis` is required.
dtypedtype, optional
    
Type of the returned array, as well as of the accumulator in which the elements are multiplied. If `dtype` is not specified, it defaults to the dtype of `x`, unless `x` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used instead.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type of the resulting values will be cast if necessary. See Output type determination for more details.
include_initialbool, optional
    
Boolean indicating whether to include the initial value (ones) as the first value in the output. With `include_initial=True` the shape of the output is different than the shape of the input. Default: `False`.
Returns:
    
cumulative_prod_along_axisndarray
    
A new array holding the result is returned unless `out` is specified, in which case a reference to `out` is returned. The result has the same shape as `x` if `include_initial=False`.
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
#### Examples
    
    >>> a = np.array([1, 2, 3])
    >>> np.cumulative_prod(a)  # intermediate results 1, 1*2
    ...                        # total product 1*2*3 = 6
    array([1, 2, 6])
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    >>> np.cumulative_prod(a, dtype=float) # specify type of output
    array([   1.,    2.,    6.,   24.,  120.,  720.])
    
The cumulative product for each column (i.e., over the rows) of `b`:
    
    >>> b = np.array([[1, 2, 3], [4, 5, 6]])
    >>> np.cumulative_prod(b, axis=0)
    array([[ 1,  2,  3],
           [ 4, 10, 18]])
    
The cumulative product for each row (i.e. over the columns) of `b`:
    
    >>> np.cumulative_prod(b, axis=1)
    array([[  1,   2,   6],
           [  4,  20, 120]])
    
# numpy.cumulative_sum
numpy.cumulative_sum(x, /, *, axis=None, dtype=None, out=None, include_initial=False)[source]
    
Return the cumulative sum of the elements along a given axis.
This function is an Array API compatible alternative to `numpy.cumsum`.
Parameters:
    
xarray_like
    
Input array.
axisint, optional
    
Axis along which the cumulative sum is computed. The default (None) is only allowed for one-dimensional arrays. For arrays with more than one dimension `axis` is required.
dtypedtype, optional
    
Type of the returned array and of the accumulator in which the elements are summed. If `dtype` is not specified, it defaults to the dtype of `x`, unless `x` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary. See Output type determination for more details.
include_initialbool, optional
    
Boolean indicating whether to include the initial value (zeros) as the first value in the output. With `include_initial=True` the shape of the output is different than the shape of the input. Default: `False`.
Returns:
    
cumulative_sum_along_axisndarray
    
A new array holding the result is returned unless `out` is specified, in which case a reference to `out` is returned. The result has the same shape as `x` if `include_initial=False`.
See also
`sum`
    
Sum array elements.
`trapezoid`
    
Integration of array values using composite trapezoidal rule.
`diff`
    
Calculate the n-th discrete difference along given axis.
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
`cumulative_sum(a)[-1]` may not be equal to `sum(a)` for floating-point values since `sum` may use a pairwise summation routine, reducing the roundoff-error. See `sum` for more information.
#### Examples
    
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    >>> a
    array([1, 2, 3, 4, 5, 6])
    >>> np.cumulative_sum(a)
    array([ 1,  3,  6, 10, 15, 21])
    >>> np.cumulative_sum(a, dtype=float)  # specifies type of output value(s)
    array([  1.,   3.,   6.,  10.,  15.,  21.])
    
    
    >>> b = np.array([[1, 2, 3], [4, 5, 6]])
    >>> np.cumulative_sum(b,axis=0)  # sum over rows for each of the 3 columns
    array([[1, 2, 3],
           [5, 7, 9]])
    >>> np.cumulative_sum(b,axis=1)  # sum over columns for each of the 2 rows
    array([[ 1,  3,  6],
           [ 4,  9, 15]])
    
`cumulative_sum(c)[-1]` may not be equal to `sum(c)`
    
    >>> c = np.array([1, 2e-9, 3e-9] * 1000000)
    >>> np.cumulative_sum(c)[-1]
    1000000.0050045159
    >>> c.sum()
    1000000.0050000029
    
# numpy.datetime_as_string
numpy.datetime_as_string(arr, unit=None, timezone='naive', casting='same_kind')
    
Convert an array of datetimes into an array of strings.
Parameters:
    
arrarray_like of datetime64
    
The array of UTC timestamps to format.
unitstr
    
One of None, ‘auto’, or a datetime unit.
timezone{‘naive’, ‘UTC’, ‘local’} or tzinfo
    
Timezone information to use when displaying the datetime. If ‘UTC’, end with a Z to indicate UTC time. If ‘local’, convert to the local timezone first, and suffix with a +-#### timezone offset. If a tzinfo object, then do as with ‘local’, but use the specified timezone.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}
    
Casting to allow when changing between datetime units.
Returns:
    
str_arrndarray
    
An array of strings the same shape as `arr`.
#### Examples
    
    >>> import numpy as np
    >>> import pytz
    >>> d = np.arange('2002-10-27T04:30', 4*60, 60, dtype='M8[m]')
    >>> d
    array(['2002-10-27T04:30', '2002-10-27T05:30', '2002-10-27T06:30',
           '2002-10-27T07:30'], dtype='datetime64[m]')
    
Setting the timezone to UTC shows the same information, but with a Z suffix
    
    >>> np.datetime_as_string(d, timezone='UTC')
    array(['2002-10-27T04:30Z', '2002-10-27T05:30Z', '2002-10-27T06:30Z',
           '2002-10-27T07:30Z'], dtype='<U35')
    
Note that we picked datetimes that cross a DST boundary. Passing in a `pytz` timezone object will print the appropriate offset
    
    >>> np.datetime_as_string(d, timezone=pytz.timezone('US/Eastern'))
    array(['2002-10-27T00:30-0400', '2002-10-27T01:30-0400',
           '2002-10-27T01:30-0500', '2002-10-27T02:30-0500'], dtype='<U39')
    
Passing in a unit will change the precision
    
    >>> np.datetime_as_string(d, unit='h')
    array(['2002-10-27T04', '2002-10-27T05', '2002-10-27T06', '2002-10-27T07'],
          dtype='<U32')
    >>> np.datetime_as_string(d, unit='s')
    array(['2002-10-27T04:30:00', '2002-10-27T05:30:00', '2002-10-27T06:30:00',
           '2002-10-27T07:30:00'], dtype='<U38')
    
‘casting’ can be used to specify whether precision can be changed
    
    >>> np.datetime_as_string(d, unit='h', casting='safe')
    Traceback (most recent call last):
        ...
    TypeError: Cannot create a datetime string as units 'h' from a NumPy
    datetime with units 'm' according to the rule 'safe'
    
# numpy.datetime_data
numpy.datetime_data(dtype, /)
    
Get information about the step size of a date or time type.
The returned tuple can be passed as the second argument of `numpy.datetime64` and `numpy.timedelta64`.
Parameters:
    
dtypedtype
    
The dtype object, which must be a `datetime64` or `timedelta64` type.
Returns:
    
unitstr
    
The datetime unit on which this dtype is based.
countint
    
The number of base units in a step.
#### Examples
    
    >>> import numpy as np
    >>> dt_25s = np.dtype('timedelta64[25s]')
    >>> np.datetime_data(dt_25s)
    ('s', 25)
    >>> np.array(10, dt_25s).astype('timedelta64[s]')
    array(250, dtype='timedelta64[s]')
    
The result can be used to construct a datetime that uses the same units as a timedelta
    
    >>> np.datetime64('2010', np.datetime_data(dt_25s))
    np.datetime64('2010-01-01T00:00:00','25s')
    
# numpy.deg2rad
numpy.deg2rad(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'deg2rad'>
    
Convert angles from degrees to radians.
Parameters:
    
xarray_like
    
Angles in degrees.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding angle in radians. This is a scalar if `x` is a scalar.
See also
`rad2deg`
    
Convert angles from radians to degrees.
`unwrap`
    
Remove large jumps in angle by wrapping.
#### Notes
`deg2rad(x)` is `x * pi / 180`.
#### Examples
    
    >>> import numpy as np
    >>> np.deg2rad(180)
    3.1415926535897931
    
# numpy.degrees
numpy.degrees(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'degrees'>
    
Convert angles from radians to degrees.
Parameters:
    
xarray_like
    
Input array in radians.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray of floats
    
The corresponding degree values; if `out` was supplied this is a reference to it. This is a scalar if `x` is a scalar.
See also
`rad2deg`
    
equivalent function
#### Examples
Convert a radian array to degrees
    
    >>> import numpy as np
    
    
    >>> rad = np.arange(12.)*np.pi/6
    >>> np.degrees(rad)
    array([   0.,   30.,   60.,   90.,  120.,  150.,  180.,  210.,  240.,
            270.,  300.,  330.])
    
    
    >>> out = np.zeros((rad.shape))
    >>> r = np.degrees(rad, out)
    >>> np.all(r == out)
    True
    
# numpy.delete
numpy.delete(arr, obj, axis=None)[source]
    
Return a new array with sub-arrays along an axis deleted. For a one dimensional array, this returns those entries not returned by `arr[obj]`.
Parameters:
    
arrarray_like
    
Input array.
objslice, int, array-like of ints or bools
    
Indicate indices of sub-arrays to remove along the specified axis.
Changed in version 1.19.0: Boolean indices are now treated as a mask of elements to remove, rather than being cast to the integers 0 and 1.
axisint, optional
    
The axis along which to delete the subarray defined by `obj`. If `axis` is None, `obj` is applied to the flattened array.
Returns:
    
outndarray
    
A copy of `arr` with the elements specified by `obj` removed. Note that `delete` does not occur in-place. If `axis` is None, `out` is a flattened array.
See also
`insert`
    
Insert elements into an array.
`append`
    
Append elements at the end of an array.
#### Notes
Often it is preferable to use a boolean mask. For example:
    
    >>> arr = np.arange(12) + 1
    >>> mask = np.ones(len(arr), dtype=bool)
    >>> mask[[0,2,4]] = False
    >>> result = arr[mask,...]
    
Is equivalent to `np.delete(arr, [0,2,4], axis=0)`, but allows further use of `mask`.
#### Examples
    
    >>> import numpy as np
    >>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
    >>> arr
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    >>> np.delete(arr, 1, 0)
    array([[ 1,  2,  3,  4],
           [ 9, 10, 11, 12]])
    
    
    >>> np.delete(arr, np.s_[::2], 1)
    array([[ 2,  4],
           [ 6,  8],
           [10, 12]])
    >>> np.delete(arr, [1,3,5], None)
    array([ 1,  3,  5,  7,  8,  9, 10, 11, 12])
    
# numpy.diag
numpy.diag(v, k=0)[source]
    
Extract a diagonal or construct a diagonal array.
See the more detailed documentation for `numpy.diagonal` if you use this function to extract a diagonal and wish to write to the resulting array; whether it returns a copy or a view depends on what version of numpy you are using.
Parameters:
    
varray_like
    
If `v` is a 2-D array, return a copy of its `k`-th diagonal. If `v` is a 1-D array, return a 2-D array with `v` on the `k`-th diagonal.
kint, optional
    
Diagonal in question. The default is 0. Use `k>0` for diagonals above the main diagonal, and `k<0` for diagonals below the main diagonal.
Returns:
    
outndarray
    
The extracted diagonal or constructed diagonal array.
See also
`diagonal`
    
Return specified diagonals.
`diagflat`
    
Create a 2-D array with the flattened input as a diagonal.
`trace`
    
Sum along diagonals.
`triu`
    
Upper triangle of an array.
`tril`
    
Lower triangle of an array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(9).reshape((3,3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    
    >>> np.diag(x)
    array([0, 4, 8])
    >>> np.diag(x, k=1)
    array([1, 5])
    >>> np.diag(x, k=-1)
    array([3, 7])
    
    
    >>> np.diag(np.diag(x))
    array([[0, 0, 0],
           [0, 4, 0],
           [0, 0, 8]])
    
# numpy.diag_indices
numpy.diag_indices(n, ndim=2)[source]
    
Return the indices to access the main diagonal of an array.
This returns a tuple of indices that can be used to access the main diagonal of an array `a` with `a.ndim >= 2` dimensions and shape (n, n, …, n). For `a.ndim = 2` this is the usual diagonal, for `a.ndim > 2` this is the set of indices to access `a[i, i, ..., i]` for `i = [0..n-1]`.
Parameters:
    
nint
    
The size, along each dimension, of the arrays for which the returned indices can be used.
ndimint, optional
    
The number of dimensions.
See also
`diag_indices_from`
#### Examples
    
    >>> import numpy as np
    
Create a set of indices to access the diagonal of a (4, 4) array:
    
    >>> di = np.diag_indices(4)
    >>> di
    (array([0, 1, 2, 3]), array([0, 1, 2, 3]))
    >>> a = np.arange(16).reshape(4, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    >>> a[di] = 100
    >>> a
    array([[100,   1,   2,   3],
           [  4, 100,   6,   7],
           [  8,   9, 100,  11],
           [ 12,  13,  14, 100]])
    
Now, we create indices to manipulate a 3-D array:
    
    >>> d3 = np.diag_indices(2, 3)
    >>> d3
    (array([0, 1]), array([0, 1]), array([0, 1]))
    
And use it to set the diagonal of an array of zeros to 1:
    
    >>> a = np.zeros((2, 2, 2), dtype=int)
    >>> a[d3] = 1
    >>> a
    array([[[1, 0],
            [0, 0]],
           [[0, 0],
            [0, 1]]])
    
# numpy.diag_indices_from
numpy.diag_indices_from(arr)[source]
    
Return the indices to access the main diagonal of an n-dimensional array.
See `diag_indices` for full details.
Parameters:
    
arrarray, at least 2-D
See also
`diag_indices`
#### Examples
    
    >>> import numpy as np
    
Create a 4 by 4 array.
    
    >>> a = np.arange(16).reshape(4, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
Get the indices of the diagonal elements.
    
    >>> di = np.diag_indices_from(a)
    >>> di
    (array([0, 1, 2, 3]), array([0, 1, 2, 3]))
    
    
    >>> a[di]
    array([ 0,  5, 10, 15])
    
This is simply syntactic sugar for diag_indices.
    
    >>> np.diag_indices(a.shape[0])
    (array([0, 1, 2, 3]), array([0, 1, 2, 3]))
    
# numpy.diagflat
numpy.diagflat(v, k=0)[source]
    
Create a two-dimensional array with the flattened input as a diagonal.
Parameters:
    
varray_like
    
Input data, which is flattened and set as the `k`-th diagonal of the output.
kint, optional
    
Diagonal to set; 0, the default, corresponds to the “main” diagonal, a positive (negative) `k` giving the number of the diagonal above (below) the main.
Returns:
    
outndarray
    
The 2-D output array.
See also
`diag`
    
MATLAB work-alike for 1-D and 2-D arrays.
`diagonal`
    
Return specified diagonals.
`trace`
    
Sum along diagonals.
#### Examples
    
    >>> import numpy as np
    >>> np.diagflat([[1,2], [3,4]])
    array([[1, 0, 0, 0],
           [0, 2, 0, 0],
           [0, 0, 3, 0],
           [0, 0, 0, 4]])
    
    
    >>> np.diagflat([1,2], 1)
    array([[0, 1, 0],
           [0, 0, 2],
           [0, 0, 0]])
    
# numpy.diagonal
numpy.diagonal(a, offset=0, axis1=0, axis2=1)[source]
    
Return specified diagonals.
If `a` is 2-D, returns the diagonal of `a` with the given offset, i.e., the collection of elements of the form `a[i, i+offset]`. If `a` has more than two dimensions, then the axes specified by `axis1` and `axis2` are used to determine the 2-D sub-array whose diagonal is returned. The shape of the resulting array can be determined by removing `axis1` and `axis2` and appending an index to the right equal to the size of the resulting diagonals.
In versions of NumPy prior to 1.7, this function always returned a new, independent array containing a copy of the values in the diagonal.
In NumPy 1.7 and 1.8, it continues to return a copy of the diagonal, but depending on this fact is deprecated. Writing to the resulting array continues to work as it used to, but a FutureWarning is issued.
Starting in NumPy 1.9 it returns a read-only view on the original array. Attempting to write to the resulting array will produce an error.
In some future release, it will return a read/write view and writing to the returned array will alter your original array. The returned array will have the same type as the input array.
If you don’t write to the array returned by this function, then you can just ignore all of the above.
If you depend on the current behavior, then we suggest copying the returned array explicitly, i.e., use `np.diagonal(a).copy()` instead of just `np.diagonal(a)`. This will work with both past and future versions of NumPy.
Parameters:
    
aarray_like
    
Array from which the diagonals are taken.
offsetint, optional
    
Offset of the diagonal from the main diagonal. Can be positive or negative. Defaults to main diagonal (0).
axis1int, optional
    
Axis to be used as the first axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults to first axis (0).
axis2int, optional
    
Axis to be used as the second axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults to second axis (1).
Returns:
    
array_of_diagonalsndarray
    
If `a` is 2-D, then a 1-D array containing the diagonal and of the same type as `a` is returned unless `a` is a `matrix`, in which case a 1-D array rather than a (2-D) `matrix` is returned in order to maintain backward compatibility.
If `a.ndim > 2`, then the dimensions specified by `axis1` and `axis2` are removed, and a new axis inserted at the end corresponding to the diagonal.
Raises:
    
ValueError
    
If the dimension of `a` is less than 2.
See also
`diag`
    
MATLAB work-a-like for 1-D and 2-D arrays.
`diagflat`
    
Create diagonal arrays.
`trace`
    
Sum along diagonals.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(4).reshape(2,2)
    >>> a
    array([[0, 1],
           [2, 3]])
    >>> a.diagonal()
    array([0, 3])
    >>> a.diagonal(1)
    array([1])
    
A 3-D example:
    
    >>> a = np.arange(8).reshape(2,2,2); a
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    >>> a.diagonal(0,  # Main diagonals of two arrays created by skipping
    ...            0,  # across the outer(left)-most axis last and
    ...            1)  # the "middle" (row) axis first.
    array([[0, 6],
           [1, 7]])
    
The sub-arrays whose main diagonals we just obtained; note that each corresponds to fixing the right-most (column) axis, and that the diagonals are “packed” in rows.
    
    >>> a[:,:,0]  # main diagonal is [0 6]
    array([[0, 2],
           [4, 6]])
    >>> a[:,:,1]  # main diagonal is [1 7]
    array([[1, 3],
           [5, 7]])
    
The anti-diagonal can be obtained by reversing the order of elements using either `numpy.flipud` or `numpy.fliplr`.
    
    >>> a = np.arange(9).reshape(3, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> np.fliplr(a).diagonal()  # Horizontal flip
    array([2, 4, 6])
    >>> np.flipud(a).diagonal()  # Vertical flip
    array([6, 4, 2])
    
Note that the order in which the diagonal is retrieved varies depending on the flip function.
# numpy.diff
numpy.diff(a, n=1, axis=-1, prepend=<no value>, append=<no value>)[source]
    
Calculate the n-th discrete difference along the given axis.
The first difference is given by `out[i] = a[i+1] - a[i]` along the given axis, higher differences are calculated by using `diff` recursively.
Parameters:
    
aarray_like
    
Input array
nint, optional
    
The number of times values are differenced. If zero, the input is returned as-is.
axisint, optional
    
The axis along which the difference is taken, default is the last axis.
prepend, appendarray_like, optional
    
Values to prepend or append to `a` along axis prior to performing the difference. Scalar values are expanded to arrays with length 1 in the direction of axis and the shape of the input array in along all other axes. Otherwise the dimension and shape must match `a` except along axis.
Returns:
    
diffndarray
    
The n-th differences. The shape of the output is the same as `a` except along `axis` where the dimension is smaller by `n`. The type of the output is the same as the type of the difference between any two elements of `a`. This is the same as the type of `a` in most cases. A notable exception is `datetime64`, which results in a `timedelta64` output array.
See also
`gradient`, `ediff1d`, `cumsum`
#### Notes
Type is preserved for boolean arrays, so the result will contain `False` when consecutive elements are the same and `True` when they differ.
For unsigned integer arrays, the results will also be unsigned. This should not be surprising, as the result is consistent with calculating the difference directly:
    
    >>> u8_arr = np.array([1, 0], dtype=np.uint8)
    >>> np.diff(u8_arr)
    array([255], dtype=uint8)
    >>> u8_arr[1,...] - u8_arr[0,...]
    np.uint8(255)
    
If this is not desirable, then the array should be cast to a larger integer type first:
    
    >>> i16_arr = u8_arr.astype(np.int16)
    >>> np.diff(i16_arr)
    array([-1], dtype=int16)
    
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 4, 7, 0])
    >>> np.diff(x)
    array([ 1,  2,  3, -7])
    >>> np.diff(x, n=2)
    array([  1,   1, -10])
    
    
    >>> x = np.array([[1, 3, 6, 10], [0, 5, 6, 8]])
    >>> np.diff(x)
    array([[2, 3, 4],
           [5, 1, 2]])
    >>> np.diff(x, axis=0)
    array([[-1,  2,  0, -2]])
    
    
    >>> x = np.arange('1066-10-13', '1066-10-16', dtype=np.datetime64)
    >>> np.diff(x)
    array([1, 1], dtype='timedelta64[D]')
    
# numpy.digitize
numpy.digitize(x, bins, right=False)[source]
    
Return the indices of the bins to which each value in input array belongs.
`right`
order of bins
returned index `i` satisfies  
`False`
increasing
`bins[i-1] <= x < bins[i]`  
`True`
increasing
`bins[i-1] < x <= bins[i]`  
`False`
decreasing
`bins[i-1] > x >= bins[i]`  
`True`
decreasing
`bins[i-1] >= x > bins[i]`  
If values in `x` are beyond the bounds of `bins`, 0 or `len(bins)` is returned as appropriate.
Parameters:
    
xarray_like
    
Input array to be binned. Prior to NumPy 1.10.0, this array had to be 1-dimensional, but can now have any shape.
binsarray_like
    
Array of bins. It has to be 1-dimensional and monotonic.
rightbool, optional
    
Indicating whether the intervals include the right or the left bin edge. Default behavior is (right==False) indicating that the interval does not include the right edge. The left bin end is open in this case, i.e., bins[i-1] <= x < bins[i] is the default behavior for monotonically increasing bins.
Returns:
    
indicesndarray of ints
    
Output array of indices, of same shape as `x`.
Raises:
    
ValueError
    
If `bins` is not monotonic.
TypeError
    
If the type of the input is complex.
See also
`bincount`, `histogram`, `unique`, `searchsorted`
#### Notes
If values in `x` are such that they fall outside the bin range, attempting to index `bins` with the indices that `digitize` returns will result in an IndexError.
New in version 1.10.0.
`numpy.digitize` is implemented in terms of `numpy.searchsorted`. This means that a binary search is used to bin the values, which scales much better for larger number of bins than the previous linear search. It also removes the requirement for the input array to be 1-dimensional.
For monotonically increasing `bins`, the following are equivalent:
    
    np.digitize(x, bins, right=True)
    np.searchsorted(bins, x, side='left')
    
Note that as the order of the arguments are reversed, the side must be too. The `searchsorted` call is marginally faster, as it does not do any monotonicity checks. Perhaps more importantly, it supports all dtypes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([0.2, 6.4, 3.0, 1.6])
    >>> bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
    >>> inds = np.digitize(x, bins)
    >>> inds
    array([1, 4, 3, 2])
    >>> for n in range(x.size):
    ...   print(bins[inds[n]-1], "<=", x[n], "<", bins[inds[n]])
    ...
    0.0 <= 0.2 < 1.0
    4.0 <= 6.4 < 10.0
    2.5 <= 3.0 < 4.0
    1.0 <= 1.6 < 2.5
    
    
    >>> x = np.array([1.2, 10.0, 12.4, 15.5, 20.])
    >>> bins = np.array([0, 5, 10, 15, 20])
    >>> np.digitize(x,bins,right=True)
    array([1, 2, 3, 4, 4])
    >>> np.digitize(x,bins,right=False)
    array([1, 3, 3, 4, 5])
    
# numpy.distutils.ccompiler.CCompiler_compile
distutils.ccompiler.CCompiler_compile(self, sources, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None)[source]
    
Compile one or more source files.
Please refer to the Python distutils API reference for more details.
Parameters:
    
sourceslist of str
    
A list of filenames
output_dirstr, optional
    
Path to the output directory.
macroslist of tuples
    
A list of macro definitions.
include_dirslist of str, optional
    
The directories to add to the default include file search path for this compilation only.
debugbool, optional
    
Whether or not to output debug symbols in or alongside the object file(s).
extra_preargs, extra_postargs?
    
Extra pre- and post-arguments.
dependslist of str, optional
    
A list of file names that all targets depend on.
Returns:
    
objectslist of str
    
A list of object file names, one per source file `sources`.
Raises:
    
CompileError
    
If compilation fails.
# numpy.distutils.ccompiler.CCompiler_customize
distutils.ccompiler.CCompiler_customize(self, dist, need_cxx=0)[source]
    
Do any platform-specific customization of a compiler instance.
This method calls `distutils.sysconfig.customize_compiler` for platform-specific customization, as well as optionally remove a flag to suppress spurious warnings in case C++ code is being compiled.
Parameters:
    
distobject
    
This parameter is not used for anything.
need_cxxbool, optional
    
Whether or not C++ has to be compiled. If so (True), the `"-Wstrict-prototypes"` option is removed to prevent spurious warnings. Default is False.
Returns:
    
None
#### Notes
All the default options used by distutils can be extracted with:
    
    from distutils import sysconfig
    sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'BASECFLAGS',
                              'CCSHARED', 'LDSHARED', 'SO')
    
# numpy.distutils.ccompiler.CCompiler_customize_cmd
distutils.ccompiler.CCompiler_customize_cmd(self, cmd, ignore=())[source]
    
Customize compiler using distutils command.
Parameters:
    
cmdclass instance
    
An instance inheriting from `distutils.cmd.Command`.
ignoresequence of str, optional
    
List of `distutils.ccompiler.CCompiler` commands (without `'set_'`) that should not be altered. Strings that are checked for are: `('include_dirs', 'define', 'undef', 'libraries', 'library_dirs', 'rpath', 'link_objects')`.
Returns:
    
None
# numpy.distutils.ccompiler.CCompiler_cxx_compiler
distutils.ccompiler.CCompiler_cxx_compiler(self)[source]
    
Return the C++ compiler.
Parameters:
    
None
Returns:
    
cxxclass instance
    
The C++ compiler, as a `distutils.ccompiler.CCompiler` instance.
# numpy.distutils.ccompiler.CCompiler_find_executables
distutils.ccompiler.CCompiler_find_executables(self)[source]
    
Does nothing here, but is called by the get_version method and can be overridden by subclasses. In particular it is redefined in the `FCompiler` class where more documentation can be found.
# numpy.distutils.ccompiler.CCompiler_get_version
distutils.ccompiler.CCompiler_get_version(self, force=False, ok_status=[0])[source]
    
Return compiler version, or None if compiler is not available.
Parameters:
    
forcebool, optional
    
If True, force a new determination of the version, even if the compiler already has a version attribute. Default is False.
ok_statuslist of int, optional
    
The list of status values returned by the version look-up process for which a version string is returned. If the status value is not in `ok_status`, None is returned. Default is `[0]`.
Returns:
    
versionstr or None
    
Version string, in the format of `distutils.version.LooseVersion`.
# numpy.distutils.ccompiler.CCompiler_object_filenames
distutils.ccompiler.CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir='')[source]
    
Return the name of the object files for the given source files.
Parameters:
    
source_filenameslist of str
    
The list of paths to source files. Paths can be either relative or absolute, this is handled transparently.
strip_dirbool, optional
    
Whether to strip the directory from the returned paths. If True, the file name prepended by `output_dir` is returned. Default is False.
output_dirstr, optional
    
If given, this path is prepended to the returned paths to the object files.
Returns:
    
obj_nameslist of str
    
The list of paths to the object files corresponding to the source files in `source_filenames`.
# numpy.distutils.ccompiler.CCompiler_show_customization
distutils.ccompiler.CCompiler_show_customization(self)[source]
    
Print the compiler customizations to stdout.
Parameters:
    
None
Returns:
    
None
#### Notes
Printing is only done if the distutils log threshold is < 2.
# numpy.distutils.ccompiler.CCompiler_spawn
distutils.ccompiler.CCompiler_spawn(self, cmd, display=None, env=None)[source]
    
Execute a command in a sub-process.
Parameters:
    
cmdstr
    
The command to execute.
displaystr or sequence of str, optional
    
The text to add to the log file kept by `numpy.distutils`. If not given, `display` is equal to `cmd`.
enva dictionary for environment variables, optional
Returns:
    
None
Raises:
    
DistutilsExecError
    
If the command failed, i.e. the exit status was not 0.
# numpy.distutils.ccompiler.gen_lib_options
distutils.ccompiler.gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries)[source]
# numpy.distutils.ccompiler
#### Functions
`CCompiler_compile`(self, sources[, ...])
Compile one or more source files.  
`CCompiler_customize`(self, dist[, need_cxx])
Do any platform-specific customization of a compiler instance.  
`CCompiler_customize_cmd`(self, cmd[, ignore])
Customize compiler using distutils command.  
`CCompiler_cxx_compiler`(self)
Return the C++ compiler.  
`CCompiler_find_executables`(self)
Does nothing here, but is called by the get_version method and can be overridden by subclasses.  
`CCompiler_get_version`(self[, force, ok_status])
Return compiler version, or None if compiler is not available.  
`CCompiler_object_filenames`(self, ...[, ...])
Return the name of the object files for the given source files.  
`CCompiler_show_customization`(self)
Print the compiler customizations to stdout.  
`CCompiler_spawn`(self, cmd[, display, env])
Execute a command in a sub-process.  
`gen_lib_options`(compiler, library_dirs, ...)  
`new_compiler`([plat, compiler, verbose, ...])  
`replace_method`(klass, method_name, func)  
`simple_version_match`([pat, ignore, start])
Simple matching of version numbers, for use in CCompiler and FCompiler.  
# numpy.distutils.ccompiler.new_compiler
distutils.ccompiler.new_compiler(plat=None, compiler=None, verbose=None, dry_run=0, force=0)[source]
# numpy.distutils.ccompiler.replace_method
distutils.ccompiler.replace_method(klass, method_name, func)[source]
# numpy.distutils.ccompiler.simple_version_match
distutils.ccompiler.simple_version_match(pat='[-.\\\d]+', ignore='', start='')[source]
    
Simple matching of version numbers, for use in CCompiler and FCompiler.
Parameters:
    
patstr, optional
    
A regular expression matching version numbers. Default is `r'[-.\d]+'`.
ignorestr, optional
    
A regular expression matching patterns to skip. Default is `''`, in which case nothing is skipped.
startstr, optional
    
A regular expression matching the start of where to start looking for version numbers. Default is `''`, in which case searching is started at the beginning of the version string given to `matcher`.
Returns:
    
matchercallable
    
A function that is appropriate to use as the `.version_match` attribute of a `distutils.ccompiler.CCompiler` class. `matcher` takes a single parameter, a version string.
# numpy.distutils.ccompiler_opt.CCompilerOpt.cache_flush
method
distutils.ccompiler_opt.CCompilerOpt.cache_flush()[source]
    
Force update the cache.
# numpy.distutils.ccompiler_opt.CCompilerOpt.cc_normalize_flags
method
distutils.ccompiler_opt.CCompilerOpt.cc_normalize_flags(flags)[source]
    
Remove the conflicts that caused due gathering implied features flags.
Parameters:
    
‘flags’ list, compiler flags
    
flags should be sorted from the lowest to the highest interest.
Returns:
    
list, filtered from any conflicts.
#### Examples
    
    >>> self.cc_normalize_flags(['-march=armv8.2-a+fp16', '-march=armv8.2-a+dotprod'])
    ['armv8.2-a+fp16+dotprod']
    
    
    >>> self.cc_normalize_flags(
        ['-msse', '-msse2', '-msse3', '-mssse3', '-msse4.1', '-msse4.2', '-mavx', '-march=core-avx2']
    )
    ['-march=core-avx2']
    
# numpy.distutils.ccompiler_opt.CCompilerOpt.conf_features
attribute
distutils.ccompiler_opt.CCompilerOpt.conf_features={'ASIMD': {'implies': 'NEON_FP16 NEON_VFPV4', 'implies_detect': False, 'interest': 4}, 'ASIMDDP': {'implies': 'ASIMD', 'interest': 6}, 'ASIMDFHM': {'implies': 'ASIMDHP', 'interest': 7}, 'ASIMDHP': {'implies': 'ASIMD', 'interest': 5}, 'AVX': {'headers': 'immintrin.h', 'implies': 'SSE42', 'implies_detect': False, 'interest': 8}, 'AVX2': {'implies': 'F16C', 'interest': 13}, 'AVX512CD': {'implies': 'AVX512F', 'interest': 21}, 'AVX512F': {'extra_checks': 'AVX512F_REDUCE', 'implies': 'FMA3 AVX2', 'implies_detect': False, 'interest': 20}, 'AVX512_CLX': {'detect': 'AVX512_CLX', 'group': 'AVX512VNNI', 'implies': 'AVX512_SKX', 'interest': 43}, 'AVX512_CNL': {'detect': 'AVX512_CNL', 'group': 'AVX512IFMA AVX512VBMI', 'implies': 'AVX512_SKX', 'implies_detect': False, 'interest': 44}, 'AVX512_ICL': {'detect': 'AVX512_ICL', 'group': 'AVX512VBMI2 AVX512BITALG AVX512VPOPCNTDQ', 'implies': 'AVX512_CLX AVX512_CNL', 'implies_detect': False, 'interest': 45}, 'AVX512_KNL': {'detect': 'AVX512_KNL', 'group': 'AVX512ER AVX512PF', 'implies': 'AVX512CD', 'implies_detect': False, 'interest': 40}, 'AVX512_KNM': {'detect': 'AVX512_KNM', 'group': 'AVX5124FMAPS AVX5124VNNIW AVX512VPOPCNTDQ', 'implies': 'AVX512_KNL', 'implies_detect': False, 'interest': 41}, 'AVX512_SKX': {'detect': 'AVX512_SKX', 'extra_checks': 'AVX512BW_MASK AVX512DQ_MASK', 'group': 'AVX512VL AVX512BW AVX512DQ', 'implies': 'AVX512CD', 'implies_detect': False, 'interest': 42}, 'AVX512_SPR': {'detect': 'AVX512_SPR', 'group': 'AVX512FP16', 'implies': 'AVX512_ICL', 'implies_detect': False, 'interest': 46}, 'F16C': {'implies': 'AVX', 'interest': 11}, 'FMA3': {'implies': 'F16C', 'interest': 12}, 'FMA4': {'headers': 'x86intrin.h', 'implies': 'AVX', 'interest': 10}, 'NEON': {'headers': 'arm_neon.h', 'interest': 1}, 'NEON_FP16': {'implies': 'NEON', 'interest': 2}, 'NEON_VFPV4': {'implies': 'NEON_FP16', 'interest': 3}, 'POPCNT': {'headers': 'popcntintrin.h', 'implies': 'SSE41', 'interest': 6}, 'SSE': {'headers': 'xmmintrin.h', 'implies': 'SSE2', 'interest': 1}, 'SSE2': {'headers': 'emmintrin.h', 'implies': 'SSE', 'interest': 2}, 'SSE3': {'headers': 'pmmintrin.h', 'implies': 'SSE2', 'interest': 3}, 'SSE41': {'headers': 'smmintrin.h', 'implies': 'SSSE3', 'interest': 5}, 'SSE42': {'implies': 'POPCNT', 'interest': 7}, 'SSSE3': {'headers': 'tmmintrin.h', 'implies': 'SSE3', 'interest': 4}, 'VSX': {'extra_checks': 'VSX_ASM', 'headers': 'altivec.h', 'interest': 1}, 'VSX2': {'implies': 'VSX', 'implies_detect': False, 'interest': 2}, 'VSX3': {'extra_checks': 'VSX3_HALF_DOUBLE', 'implies': 'VSX2', 'implies_detect': False, 'interest': 3}, 'VSX4': {'extra_checks': 'VSX4_MMA', 'implies': 'VSX3', 'implies_detect': False, 'interest': 4}, 'VX': {'headers': 'vecintrin.h', 'interest': 1}, 'VXE': {'implies': 'VX', 'implies_detect': False, 'interest': 2}, 'VXE2': {'implies': 'VXE', 'implies_detect': False, 'interest': 3}, 'XOP': {'headers': 'x86intrin.h', 'implies': 'AVX', 'interest': 9}} 
# numpy.distutils.ccompiler_opt.CCompilerOpt.conf_features_partial
method
distutils.ccompiler_opt.CCompilerOpt.conf_features_partial()[source]
    
Return a dictionary of supported CPU features by the platform, and accumulate the rest of undefined options in `conf_features`, the returned dict has same rules and notes in class attribute `conf_features`, also its override any options that been set in ‘conf_features’.
# numpy.distutils.ccompiler_opt.CCompilerOpt.cpu_baseline_flags
method
distutils.ccompiler_opt.CCompilerOpt.cpu_baseline_flags()[source]
    
Returns a list of final CPU baseline compiler flags
# numpy.distutils.ccompiler_opt.CCompilerOpt.cpu_baseline_names
method
distutils.ccompiler_opt.CCompilerOpt.cpu_baseline_names()[source]
    
return a list of final CPU baseline feature names
# numpy.distutils.ccompiler_opt.CCompilerOpt.cpu_dispatch_names
method
distutils.ccompiler_opt.CCompilerOpt.cpu_dispatch_names()[source]
    
return a list of final CPU dispatch feature names
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_compile
method
distutils.ccompiler_opt.CCompilerOpt.dist_compile(sources, flags, ccompiler=None, **kwargs)[source]
    
Wrap CCompiler.compile()
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_error
method
staticdistutils.ccompiler_opt.CCompilerOpt.dist_error(*args)[source]
    
Raise a compiler error
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_fatal
method
staticdistutils.ccompiler_opt.CCompilerOpt.dist_fatal(*args)[source]
    
Raise a distutils error
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_info
method
distutils.ccompiler_opt.CCompilerOpt.dist_info()[source]
    
Return a tuple containing info about (platform, compiler, extra_args), required by the abstract class ‘_CCompiler’ for discovering the platform environment. This is also used as a cache factor in order to detect any changes happening from outside.
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_load_module
method
staticdistutils.ccompiler_opt.CCompilerOpt.dist_load_module(name, path)[source]
    
Load a module from file, required by the abstract class ‘_Cache’.
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_log
method
staticdistutils.ccompiler_opt.CCompilerOpt.dist_log(*args, stderr=False)[source]
    
Print a console message
# numpy.distutils.ccompiler_opt.CCompilerOpt.dist_test
method
distutils.ccompiler_opt.CCompilerOpt.dist_test(source, flags, macros=[])[source]
    
Return True if ‘CCompiler.compile()’ able to compile a source file with certain flags.
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_ahead
method
distutils.ccompiler_opt.CCompilerOpt.feature_ahead(names)[source]
    
Return list of features in ‘names’ after remove any implied features and keep the origins.
Parameters:
    
‘names’: sequence
    
sequence of CPU feature names in uppercase.
Returns:
    
list of CPU features sorted as-is ‘names’
#### Examples
    
    >>> self.feature_ahead(["SSE2", "SSE3", "SSE41"])
    ["SSE41"]
    # assume AVX2 and FMA3 implies each other and AVX2
    # is the highest interest
    >>> self.feature_ahead(["SSE2", "SSE3", "SSE41", "AVX2", "FMA3"])
    ["AVX2"]
    # assume AVX2 and FMA3 don't implies each other
    >>> self.feature_ahead(["SSE2", "SSE3", "SSE41", "AVX2", "FMA3"])
    ["AVX2", "FMA3"]
    
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_c_preprocessor
method
distutils.ccompiler_opt.CCompilerOpt.feature_c_preprocessor(feature_name, tabs=0)[source]
    
Generate C preprocessor definitions and include headers of a CPU feature.
Parameters:
    
‘feature_name’: str
    
CPU feature name in uppercase.
‘tabs’: int
    
if > 0, align the generated strings to the right depend on number of tabs.
Returns:
    
str, generated C preprocessor
#### Examples
    
    >>> self.feature_c_preprocessor("SSE3")
    /** SSE3 **/
    #define NPY_HAVE_SSE3 1
    #include <pmmintrin.h>
    
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_detect
method
distutils.ccompiler_opt.CCompilerOpt.feature_detect(names)[source]
    
Return a list of CPU features that required to be detected sorted from the lowest to highest interest.
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_get_til
method
distutils.ccompiler_opt.CCompilerOpt.feature_get_til(names, keyisfalse)[source]
    
same as `feature_implies_c()` but stop collecting implied features when feature’s option that provided through parameter ‘keyisfalse’ is False, also sorting the returned features.
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_implies
method
distutils.ccompiler_opt.CCompilerOpt.feature_implies(names, keep_origins=False)[source]
    
Return a set of CPU features that implied by ‘names’
Parameters:
    
namesstr or sequence of str
    
CPU feature name(s) in uppercase.
keep_originsbool
    
if False(default) then the returned set will not contain any features from ‘names’. This case happens only when two features imply each other.
#### Examples
    
    >>> self.feature_implies("SSE3")
    {'SSE', 'SSE2'}
    >>> self.feature_implies("SSE2")
    {'SSE'}
    >>> self.feature_implies("SSE2", keep_origins=True)
    # 'SSE2' found here since 'SSE' and 'SSE2' imply each other
    {'SSE', 'SSE2'}
    
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_implies_c
method
distutils.ccompiler_opt.CCompilerOpt.feature_implies_c(names)[source]
    
same as feature_implies() but combining ‘names’
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_is_exist
method
distutils.ccompiler_opt.CCompilerOpt.feature_is_exist(name)[source]
    
Returns True if a certain feature is exist and covered within `_Config.conf_features`.
Parameters:
    
‘name’: str
    
feature name in uppercase.
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_names
method
distutils.ccompiler_opt.CCompilerOpt.feature_names(names=None, force_flags=None, macros=[])[source]
    
Returns a set of CPU feature names that supported by platform and the C compiler.
Parameters:
    
namessequence or None, optional
    
Specify certain CPU features to test it against the C compiler. if None(default), it will test all current supported features. Note: feature names must be in upper-case.
force_flagslist or None, optional
    
If None(default), default compiler flags for every CPU feature will be used during the test.
macroslist of tuples, optional
    
A list of C macro definitions.
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_sorted
method
distutils.ccompiler_opt.CCompilerOpt.feature_sorted(names, reverse=False)[source]
    
Sort a list of CPU features ordered by the lowest interest.
Parameters:
    
‘names’: sequence
    
sequence of supported feature names in uppercase.
‘reverse’: bool, optional
    
If true, the sorted features is reversed. (highest interest)
Returns:
    
list, sorted CPU features
# numpy.distutils.ccompiler_opt.CCompilerOpt.feature_untied
method
distutils.ccompiler_opt.CCompilerOpt.feature_untied(names)[source]
    
same as ‘feature_ahead()’ but if both features implied each other and keep the highest interest.
Parameters:
    
‘names’: sequence
    
sequence of CPU feature names in uppercase.
Returns:
    
list of CPU features sorted as-is ‘names’
#### Examples
    
    >>> self.feature_untied(["SSE2", "SSE3", "SSE41"])
    ["SSE2", "SSE3", "SSE41"]
    # assume AVX2 and FMA3 implies each other
    >>> self.feature_untied(["SSE2", "SSE3", "SSE41", "FMA3", "AVX2"])
    ["SSE2", "SSE3", "SSE41", "AVX2"]
    
# numpy.distutils.ccompiler_opt.CCompilerOpt.generate_dispatch_header
method
distutils.ccompiler_opt.CCompilerOpt.generate_dispatch_header(header_path)[source]
    
Generate the dispatch header which contains the #definitions and headers for platform-specific instruction-sets for the enabled CPU baseline and dispatch-able features.
Its highly recommended to take a look at the generated header also the generated source files via `try_dispatch()` in order to get the full picture.
# numpy.distutils.ccompiler_opt.CCompilerOpt
classnumpy.distutils.ccompiler_opt.CCompilerOpt(ccompiler, cpu_baseline='min', cpu_dispatch='max', cache_path=None)[source]
    
A helper class for `CCompiler` aims to provide extra build options to effectively control of compiler optimizations that are directly related to CPU features.
Attributes:
    
conf_cache_factors
conf_tmp_path
#### Methods
`cache_flush`()
Force update the cache.  
`cc_normalize_flags`(flags)
Remove the conflicts that caused due gathering implied features flags.  
`conf_features_partial`()
Return a dictionary of supported CPU features by the platform, and accumulate the rest of undefined options in `conf_features`, the returned dict has same rules and notes in class attribute `conf_features`, also its override any options that been set in 'conf_features'.  
`cpu_baseline_flags`()
Returns a list of final CPU baseline compiler flags  
`cpu_baseline_names`()
return a list of final CPU baseline feature names  
`cpu_dispatch_names`()
return a list of final CPU dispatch feature names  
`dist_compile`(sources, flags[, ccompiler])
Wrap CCompiler.compile()  
`dist_error`(*args)
Raise a compiler error  
`dist_fatal`(*args)
Raise a distutils error  
`dist_info`()
Return a tuple containing info about (platform, compiler, extra_args), required by the abstract class '_CCompiler' for discovering the platform environment.  
`dist_load_module`(name, path)
Load a module from file, required by the abstract class '_Cache'.  
`dist_log`(*args[, stderr])
Print a console message  
`dist_test`(source, flags[, macros])
Return True if 'CCompiler.compile()' able to compile a source file with certain flags.  
`feature_ahead`(names)
Return list of features in 'names' after remove any implied features and keep the origins.  
`feature_c_preprocessor`(feature_name[, tabs])
Generate C preprocessor definitions and include headers of a CPU feature.  
`feature_detect`(names)
Return a list of CPU features that required to be detected sorted from the lowest to highest interest.  
`feature_get_til`(names, keyisfalse)
same as `feature_implies_c()` but stop collecting implied features when feature's option that provided through parameter 'keyisfalse' is False, also sorting the returned features.  
`feature_implies`(names[, keep_origins])
Return a set of CPU features that implied by 'names'  
`feature_implies_c`(names)
same as feature_implies() but combining 'names'  
`feature_is_exist`(name)
Returns True if a certain feature is exist and covered within `_Config.conf_features`.  
`feature_names`([names, force_flags, macros])
Returns a set of CPU feature names that supported by platform and the C compiler.  
`feature_sorted`(names[, reverse])
Sort a list of CPU features ordered by the lowest interest.  
`feature_untied`(names)
same as 'feature_ahead()' but if both features implied each other and keep the highest interest.  
`generate_dispatch_header`(header_path)
Generate the dispatch header which contains the #definitions and headers for platform-specific instruction-sets for the enabled CPU baseline and dispatch-able features.  
`is_cached`()
Returns True if the class loaded from the cache file  
`me`(cb)
A static method that can be treated as a decorator to dynamically cache certain methods.  
`parse_targets`(source)
Fetch and parse configuration statements that required for defining the targeted CPU features, statements should be declared in the top of source in between C comment and start with a special mark @targets.  
`try_dispatch`(sources[, src_dir, ccompiler])
Compile one or more dispatch-able sources and generates object files, also generates abstract C config headers and macros that used later for the final runtime dispatching process.  
cache_hash  
cc_test_cexpr  
cc_test_flags  
feature_can_autovec  
feature_extra_checks  
feature_flags  
feature_is_supported  
feature_test  
report  
# numpy.distutils.ccompiler_opt.CCompilerOpt.is_cached
method
distutils.ccompiler_opt.CCompilerOpt.is_cached()[source]
    
Returns True if the class loaded from the cache file
# numpy.distutils.ccompiler_opt.CCompilerOpt.me
method
staticdistutils.ccompiler_opt.CCompilerOpt.me(cb)[source]
    
A static method that can be treated as a decorator to dynamically cache certain methods.
# numpy.distutils.ccompiler_opt.CCompilerOpt.parse_targets
method
distutils.ccompiler_opt.CCompilerOpt.parse_targets(source)[source]
    
Fetch and parse configuration statements that required for defining the targeted CPU features, statements should be declared in the top of source in between C comment and start with a special mark @targets.
Configuration statements are sort of keywords representing CPU features names, group of statements and policies, combined together to determine the required optimization.
Parameters:
    
sourcestr
    
the path of C source file.
Returns:
    
  * bool, True if group has the ‘baseline’ option
  * list, list of CPU features
  * list, list of extra compiler flags


# numpy.distutils.ccompiler_opt.CCompilerOpt.try_dispatch
method
distutils.ccompiler_opt.CCompilerOpt.try_dispatch(sources, src_dir=None, ccompiler=None, **kwargs)[source]
    
Compile one or more dispatch-able sources and generates object files, also generates abstract C config headers and macros that used later for the final runtime dispatching process.
The mechanism behind it is to takes each source file that specified in ‘sources’ and branching it into several files depend on special configuration statements that must be declared in the top of each source which contains targeted CPU features, then it compiles every branched source with the proper compiler flags.
Parameters:
    
sourceslist
    
Must be a list of dispatch-able sources file paths, and configuration statements must be declared inside each file.
src_dirstr
    
Path of parent directory for the generated headers and wrapped sources. If None(default) the files will generated in-place.
ccompilerCCompiler
    
Distutils `CCompiler` instance to be used for compilation. If None (default), the provided instance during the initialization will be used instead.
**kwargsany
    
Arguments to pass on to the `CCompiler.compile()`
Returns:
    
listgenerated object files
Raises:
    
CompileError
    
Raises by `CCompiler.compile()` on compiling failure.
DistutilsError
    
Some errors during checking the sanity of configuration statements.
See also
`parse_targets`
    
Parsing the configuration statements of dispatch-able sources.
# numpy.distutils.ccompiler_opt
Provides the `CCompilerOpt` class, used for handling the CPU/hardware optimization, starting from parsing the command arguments, to managing the relation between the CPU baseline and dispatch-able features, also generating the required C headers and ending with compiling the sources with proper compiler’s flags.
`CCompilerOpt` doesn’t provide runtime detection for the CPU features, instead only focuses on the compiler side, but it creates abstract C headers that can be used later for the final runtime dispatching process.
#### Functions
`new_ccompiler_opt`(compiler, dispatch_hpath, ...)
Create a new instance of 'CCompilerOpt' and generate the dispatch header which contains the #definitions and headers of platform-specific instruction-sets for the enabled CPU baseline and dispatch-able features.  
#### Classes
`CCompilerOpt`(ccompiler[, cpu_baseline, ...])
A helper class for `CCompiler` aims to provide extra build options to effectively control of compiler optimizations that are directly related to CPU features.  
# numpy.distutils.ccompiler_opt.new_ccompiler_opt
distutils.ccompiler_opt.new_ccompiler_opt(compiler, dispatch_hpath, **kwargs)[source]
    
Create a new instance of ‘CCompilerOpt’ and generate the dispatch header which contains the #definitions and headers of platform-specific instruction-sets for the enabled CPU baseline and dispatch-able features.
Parameters:
    
compilerCCompiler instance
dispatch_hpathstr
    
path of the dispatch header
**kwargs: passed as-is to `CCompilerOpt(…)`
Returns
——-
new instance of CCompilerOpt
# numpy.distutils.core.Extension
classnumpy.distutils.core.Extension(name, sources, include_dirs=None, define_macros=None, undef_macros=None, library_dirs=None, libraries=None, runtime_library_dirs=None, extra_objects=None, extra_compile_args=None, extra_link_args=None, export_symbols=None, swig_opts=None, depends=None, language=None, f2py_options=None, module_dirs=None, extra_c_compile_args=None, extra_cxx_compile_args=None, extra_f77_compile_args=None, extra_f90_compile_args=None)[source]
    
Parameters:
    
namestr
    
Extension name.
sourceslist of str
    
List of source file locations relative to the top directory of the package.
extra_compile_argslist of str
    
Extra command line arguments to pass to the compiler.
extra_f77_compile_argslist of str
    
Extra command line arguments to pass to the fortran77 compiler.
extra_f90_compile_argslist of str
    
Extra command line arguments to pass to the fortran90 compiler.
#### Methods
has_cxx_sources  
has_f2py_sources  
# numpy.distutils.cpuinfo.cpu
distutils.cpuinfo.cpu=<numpy.distutils.cpuinfo.LinuxCPUInfo object>
# numpy.distutils.exec_command.exec_command
distutils.exec_command.exec_command(command, execute_in='', use_shell=None, use_tee=None, _with_python=1, **env)[source]
    
Return (status,output) of executed command.
Deprecated since version 1.17: Use subprocess.Popen instead
Parameters:
    
commandstr
    
A concatenated string of executable and arguments.
execute_instr
    
Before running command `cd execute_in` and after `cd -`.
use_shell{bool, None}, optional
    
If True, execute `sh -c command`. Default None (True)
use_tee{bool, None}, optional
    
If True use tee. Default None (True)
Returns:
    
resstr
    
Both stdout and stderr messages.
#### Notes
On NT, DOS systems the returned status is correct for external commands. Wild cards will not work for non-posix systems or when use_shell=0.
# numpy.distutils.exec_command.filepath_from_subprocess_output
distutils.exec_command.filepath_from_subprocess_output(output)[source]
    
Convert `bytes` in the encoding used by a subprocess into a filesystem-appropriate `str`.
Inherited from `exec_command`, and possibly incorrect.
# numpy.distutils.exec_command.find_executable
distutils.exec_command.find_executable(exe, path=None, _cache={})[source]
    
Return full path of a executable or None.
Symbolic links are not followed.
# numpy.distutils.exec_command.forward_bytes_to_stdout
distutils.exec_command.forward_bytes_to_stdout(val)[source]
    
Forward bytes from a subprocess call to the console, without attempting to decode them.
The assumption is that the subprocess call already returned bytes in a suitable encoding.
# numpy.distutils.exec_command.get_pythonexe
distutils.exec_command.get_pythonexe()[source]
# numpy.distutils.exec_command
exec_command
Implements exec_command function that is (almost) equivalent to commands.getstatusoutput function but on NT, DOS systems the returned status is actually correct (though, the returned status values may be different by a factor). In addition, exec_command takes keyword arguments for (re-)defining environment variables.
Provides functions:
exec_command — execute command in a specified directory and
    
in the modified environment.
find_executable — locate a command using info from environment
    
variable PATH. Equivalent to posix `which` command.
Author: Pearu Peterson <pearu@cens.ioc.ee> Created: 11 January 2003
Requires: Python 2.x
Successfully tested on:
os.name
sys.platform
comments  
posix
linux2
Debian (sid) Linux, Python 2.1.3+, 2.2.3+, 2.3.3 PyCrust 0.9.3, Idle 1.0.2  
posix
linux2
Red Hat 9 Linux, Python 2.1.3, 2.2.2, 2.3.2  
posix
sunos5
SunOS 5.9, Python 2.2, 2.3.2  
posix
darwin
Darwin 7.2.0, Python 2.3  
nt
win32
Windows Me Python 2.3(EE), Idle 1.0, PyCrust 0.7.2 Python 2.1.1 Idle 0.8  
nt
win32
Windows 98, Python 2.1.1. Idle 0.8  
nt
win32
Cygwin 98-4.10, Python 2.1.1(MSC) - echo tests fail i.e. redefining environment variables may not work. FIXED: don’t use cygwin echo! Comment: also `cmd /c echo` will not work but redefining environment variables do work.  
posix
cygwin
Cygwin 98-4.10, Python 2.3.3(cygming special)  
nt
win32
Windows XP, Python 2.3.3  
Known bugs:
  * Tests, that send messages to stderr, fail when executed from MSYS prompt because the messages are lost at some point.


#### Functions
`exec_command`(command[, execute_in, ...])
Return (status,output) of executed command.  
`filepath_from_subprocess_output`(output)
Convert `bytes` in the encoding used by a subprocess into a filesystem-appropriate `str`.  
`find_executable`(exe[, path, _cache])
Return full path of a executable or None.  
`forward_bytes_to_stdout`(val)
Forward bytes from a subprocess call to the console, without attempting to decode them.  
`get_pythonexe`()  
`temp_file_name`()  
# numpy.distutils.exec_command.temp_file_name
distutils.exec_command.temp_file_name()[source]
# numpy.distutils.log.set_verbosity
distutils.log.set_verbosity(v, force=False)[source]
# numpy.distutils.system_info.get_info
distutils.system_info.get_info(name, notfound_action=0)[source]
    
notfound_action:
    
0 - do nothing 1 - display warning message 2 - raise error
# numpy.distutils.system_info.get_standard_file
distutils.system_info.get_standard_file(fname)[source]
    
Returns a list of files named ‘fname’ from 1) System-wide directory (directory-location of this module) 2) Users HOME directory (os.environ[‘HOME’]) 3) Local directory
# numpy.divide
numpy.divide(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'divide'>
    
Divide arguments element-wise.
Parameters:
    
x1array_like
    
Dividend array.
x2array_like
    
Divisor array. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The quotient `x1/x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
See also
`seterr`
    
Set whether to raise or warn on overflow, underflow and division by zero.
#### Notes
Equivalent to `x1` / `x2` in terms of array-broadcasting.
The `true_divide(x1, x2)` function is an alias for `divide(x1, x2)`.
#### Examples
    
    >>> import numpy as np
    >>> np.divide(2.0, 4.0)
    0.5
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.divide(x1, x2)
    array([[nan, 1. , 1. ],
           [inf, 4. , 2.5],
           [inf, 7. , 4. ]])
    
The `/` operator can be used as a shorthand for `np.divide` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = 2 * np.ones(3)
    >>> x1 / x2
    array([[0. , 0.5, 1. ],
           [1.5, 2. , 2.5],
           [3. , 3.5, 4. ]])
    
# numpy.divmod
numpy.divmod(x1, x2, [out1, out2, ]/, [out=(None, None), ]*, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'divmod'>
    
Return element-wise quotient and remainder simultaneously.
`np.divmod(x, y)` is equivalent to `(x // y, x % y)`, but faster because it avoids redundant work. It is used to implement the Python built-in function `divmod` on NumPy arrays.
Parameters:
    
x1array_like
    
Dividend array.
x2array_like
    
Divisor array. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
out1ndarray
    
Element-wise quotient resulting from floor division. This is a scalar if both `x1` and `x2` are scalars.
out2ndarray
    
Element-wise remainder from floor division. This is a scalar if both `x1` and `x2` are scalars.
See also
`floor_divide`
    
Equivalent to Python’s `//` operator.
`remainder`
    
Equivalent to Python’s `%` operator.
`modf`
    
Equivalent to `divmod(x, 1)` for positive `x` with the return values switched.
#### Examples
    
    >>> import numpy as np
    >>> np.divmod(np.arange(5), 3)
    (array([0, 0, 0, 1, 1]), array([0, 1, 2, 0, 1]))
    
The `divmod` function can be used as a shorthand for `np.divmod` on ndarrays.
    
    >>> x = np.arange(5)
    >>> divmod(x, 3)
    (array([0, 0, 0, 1, 1]), array([0, 1, 2, 0, 1]))
    
# numpy.dot
numpy.dot(a, b, out=None)
    
Dot product of two arrays. Specifically,
  * If both `a` and `b` are 1-D arrays, it is inner product of vectors (without complex conjugation).
  * If both `a` and `b` are 2-D arrays, it is matrix multiplication, but using `matmul` or `a @ b` is preferred.
  * If either `a` or `b` is 0-D (scalar), it is equivalent to `multiply` and using `numpy.multiply(a, b)` or `a * b` is preferred.
  * If `a` is an N-D array and `b` is a 1-D array, it is a sum product over the last axis of `a` and `b`.
  * If `a` is an N-D array and `b` is an M-D array (where `M>=2`), it is a sum product over the last axis of `a` and the second-to-last axis of `b`:
        dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
        


It uses an optimized BLAS library when possible (see `numpy.linalg`).
Parameters:
    
aarray_like
    
First argument.
barray_like
    
Second argument.
outndarray, optional
    
Output argument. This must have the exact kind that would be returned if it was not used. In particular, it must have the right type, must be C-contiguous, and its dtype must be the dtype that would be returned for `dot(a,b)`. This is a performance feature. Therefore, if these conditions are not met, an exception is raised, instead of attempting to be flexible.
Returns:
    
outputndarray
    
Returns the dot product of `a` and `b`. If `a` and `b` are both scalars or both 1-D arrays then a scalar is returned; otherwise an array is returned. If `out` is given, then it is returned.
Raises:
    
ValueError
    
If the last dimension of `a` is not the same size as the second-to-last dimension of `b`.
See also
`vdot`
    
Complex-conjugating dot product.
`vecdot`
    
Vector dot product of two arrays.
`tensordot`
    
Sum products over arbitrary axes.
`einsum`
    
Einstein summation convention.
`matmul`
    
‘@’ operator as method with out parameter.
`linalg.multi_dot`
    
Chained dot product.
#### Examples
    
    >>> import numpy as np
    >>> np.dot(3, 4)
    12
    
Neither argument is complex-conjugated:
    
    >>> np.dot([2j, 3j], [2j, 3j])
    (-13+0j)
    
For 2-D arrays it is the matrix product:
    
    >>> a = [[1, 0], [0, 1]]
    >>> b = [[4, 1], [2, 2]]
    >>> np.dot(a, b)
    array([[4, 1],
           [2, 2]])
    
    
    >>> a = np.arange(3*4*5*6).reshape((3,4,5,6))
    >>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3))
    >>> np.dot(a, b)[2,3,2,1,2,2]
    499128
    >>> sum(a[2,3,2,:] * b[1,2,:,2])
    499128
    
# numpy.dsplit
numpy.dsplit(ary, indices_or_sections)[source]
    
Split array into multiple sub-arrays along the 3rd axis (depth).
Please refer to the `split` documentation. `dsplit` is equivalent to `split` with `axis=2`, the array is always split along the third axis provided the array dimension is greater than or equal to 3.
See also
`split`
    
Split an array into multiple sub-arrays of equal size.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(16.0).reshape(2, 2, 4)
    >>> x
    array([[[ 0.,   1.,   2.,   3.],
            [ 4.,   5.,   6.,   7.]],
           [[ 8.,   9.,  10.,  11.],
            [12.,  13.,  14.,  15.]]])
    >>> np.dsplit(x, 2)
    [array([[[ 0.,  1.],
            [ 4.,  5.]],
           [[ 8.,  9.],
            [12., 13.]]]), array([[[ 2.,  3.],
            [ 6.,  7.]],
           [[10., 11.],
            [14., 15.]]])]
    >>> np.dsplit(x, np.array([3, 6]))
    [array([[[ 0.,   1.,   2.],
            [ 4.,   5.,   6.]],
           [[ 8.,   9.,  10.],
            [12.,  13.,  14.]]]),
     array([[[ 3.],
            [ 7.]],
           [[11.],
            [15.]]]),
    array([], shape=(2, 2, 0), dtype=float64)]
    
# numpy.dstack
numpy.dstack(tup)[source]
    
Stack arrays in sequence depth wise (along third axis).
This is equivalent to concatenation along the third axis after 2-D arrays of shape `(M,N)` have been reshaped to `(M,N,1)` and 1-D arrays of shape `(N,)` have been reshaped to `(1,N,1)`. Rebuilds arrays divided by `dsplit`.
This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations.
Parameters:
    
tupsequence of arrays
    
The arrays must have the same shape along all but the third axis. 1-D or 2-D arrays must have the same shape.
Returns:
    
stackedndarray
    
The array formed by stacking the given arrays, will be at least 3-D.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`vstack`
    
Stack arrays in sequence vertically (row wise).
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`dsplit`
    
Split array along third axis.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((1,2,3))
    >>> b = np.array((2,3,4))
    >>> np.dstack((a,b))
    array([[[1, 2],
            [2, 3],
            [3, 4]]])
    
    
    >>> a = np.array([[1],[2],[3]])
    >>> b = np.array([[2],[3],[4]])
    >>> np.dstack((a,b))
    array([[[1, 2]],
           [[2, 3]],
           [[3, 4]]])
    
# numpy.dtype.__class_getitem__
method
dtype.__class_getitem__(item, /)
    
Return a parametrized wrapper around the `dtype` type.
New in version 1.22.
Returns:
    
aliastypes.GenericAlias
    
A parametrized `dtype` type.
See also
PEP 585
    
Type hinting generics in standard collections.
#### Examples
    
    >>> import numpy as np
    
    
    >>> np.dtype[np.int64]
    numpy.dtype[numpy.int64]
    
# numpy.dtype.__ge__
method
dtype.__ge__(value, /)
    
Return self>=value.
# numpy.dtype.__gt__
method
dtype.__gt__(value, /)
    
Return self>value.
# numpy.dtype.__le__
method
dtype.__le__(value, /)
    
Return self<=value.
# numpy.dtype.__lt__
method
dtype.__lt__(value, /)
    
Return self<value.
# numpy.dtype.__reduce__
method
dtype.__reduce__()
    
Helper for pickle.
# numpy.dtype.__setstate__
method
dtype.__setstate__()
# numpy.dtype.alignment
attribute
dtype.alignment
    
The required alignment (bytes) of this data-type according to the compiler.
More information is available in the C-API section of the manual.
#### Examples
    
    >>> import numpy as np
    >>> x = np.dtype('i4')
    >>> x.alignment
    4
    
    
    >>> x = np.dtype(float)
    >>> x.alignment
    8
    
# numpy.dtype.base
attribute
dtype.base
    
Returns dtype for the base element of the subarrays, regardless of their dimension or shape.
See also
`dtype.subdtype`
#### Examples
    
    >>> import numpy as np
    >>> x = numpy.dtype('8f')
    >>> x.base
    dtype('float32')
    
    
    >>> x =  numpy.dtype('i2')
    >>> x.base
    dtype('int16')
    
# numpy.dtype.byteorder
attribute
dtype.byteorder
    
A character indicating the byte-order of this data-type object.
One of:
‘=’
native  
‘<’
little-endian  
‘>’
big-endian  
‘|’
not applicable  
All built-in data-type objects have byteorder either ‘=’ or ‘|’.
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype('i2')
    >>> dt.byteorder
    '='
    >>> # endian is not relevant for 8 bit numbers
    >>> np.dtype('i1').byteorder
    '|'
    >>> # or ASCII strings
    >>> np.dtype('S2').byteorder
    '|'
    >>> # Even if specific code is given, and it is native
    >>> # '=' is the byteorder
    >>> import sys
    >>> sys_is_le = sys.byteorder == 'little'
    >>> native_code = '<' if sys_is_le else '>'
    >>> swapped_code = '>' if sys_is_le else '<'
    >>> dt = np.dtype(native_code + 'i2')
    >>> dt.byteorder
    '='
    >>> # Swapped code shows up as itself
    >>> dt = np.dtype(swapped_code + 'i2')
    >>> dt.byteorder == swapped_code
    True
    
# numpy.dtype.char
attribute
dtype.char
    
A unique character code for each of the 21 different built-in types.
#### Examples
    
    >>> import numpy as np
    >>> x = np.dtype(float)
    >>> x.char
    'd'
    
# numpy.dtype.descr
attribute
dtype.descr
    
`__array_interface__` description of the data-type.
The format is that required by the ‘descr’ key in the `__array_interface__` attribute.
Warning: This attribute exists specifically for `__array_interface__`, and passing it directly to `numpy.dtype` will not accurately reconstruct some dtypes (e.g., scalar and subarray dtypes).
#### Examples
    
    >>> import numpy as np
    >>> x = np.dtype(float)
    >>> x.descr
    [('', '<f8')]
    
    
    >>> dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
    >>> dt.descr
    [('name', '<U16'), ('grades', '<f8', (2,))]
    
# numpy.dtype.fields
attribute
dtype.fields
    
Dictionary of named fields defined for this data type, or `None`.
The dictionary is indexed by keys that are the names of the fields. Each entry in the dictionary is a tuple fully describing the field:
    
    (dtype, offset[, title])
    
Offset is limited to C int, which is signed and usually 32 bits. If present, the optional title can be any object (if it is a string or unicode then it will also be a key in the fields dictionary, otherwise it’s meta-data). Notice also that the first two elements of the tuple can be passed directly as arguments to the `ndarray.getfield` and `ndarray.setfield` methods.
See also
`ndarray.getfield`, `ndarray.setfield`
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
    >>> print(dt.fields)
    {'grades': (dtype(('float64',(2,))), 16), 'name': (dtype('|S16'), 0)}
    
# numpy.dtype.flags
attribute
dtype.flags
    
Bit-flags describing how this data type is to be interpreted.
Bit-masks are in `numpy._core.multiarray` as the constants `ITEM_HASOBJECT`, `LIST_PICKLE`, `ITEM_IS_POINTER`, `NEEDS_INIT`, `NEEDS_PYAPI`, `USE_GETITEM`, `USE_SETITEM`. A full explanation of these flags is in C-API documentation; they are largely useful for user-defined data-types.
The following example demonstrates that operations on this particular dtype requires Python C-API.
#### Examples
    
    >>> import numpy as np
    >>> x = np.dtype([('a', np.int32, 8), ('b', np.float64, 6)])
    >>> x.flags
    16
    >>> np._core.multiarray.NEEDS_PYAPI
    16
    
# numpy.dtype.hasobject
attribute
dtype.hasobject
    
Boolean indicating whether this dtype contains any reference-counted objects in any fields or sub-dtypes.
Recall that what is actually in the ndarray memory representing the Python object is the memory address of that object (a pointer). Special handling may be required, and this attribute is useful for distinguishing data types that may contain arbitrary Python objects and data-types that won’t.
# numpy.dtype
classnumpy.dtype(dtype, align=False, copy=False[, metadata])[source]
    
Create a data type object.
A numpy array is homogeneous, and contains elements described by a dtype object. A dtype object can be constructed from different combinations of fundamental numeric types.
Parameters:
    
dtype
    
Object to be converted to a data type object.
alignbool, optional
    
Add padding to the fields to match what a C compiler would output for a similar C-struct. Can be `True` only if `obj` is a dictionary or a comma-separated string. If a struct dtype is being created, this also sets a sticky alignment flag `isalignedstruct`.
copybool, optional
    
Make a new copy of the data-type object. If `False`, the result may just be a reference to a built-in data-type object.
metadatadict, optional
    
An optional dictionary with dtype metadata.
See also
`result_type`
#### Examples
Using array-scalar type:
    
    >>> import numpy as np
    >>> np.dtype(np.int16)
    dtype('int16')
    
Structured type, one field name ‘f1’, containing int16:
    
    >>> np.dtype([('f1', np.int16)])
    dtype([('f1', '<i2')])
    
Structured type, one field named ‘f1’, in itself containing a structured type with one field:
    
    >>> np.dtype([('f1', [('f1', np.int16)])])
    dtype([('f1', [('f1', '<i2')])])
    
Structured type, two fields: the first field contains an unsigned int, the second an int32:
    
    >>> np.dtype([('f1', np.uint64), ('f2', np.int32)])
    dtype([('f1', '<u8'), ('f2', '<i4')])
    
Using array-protocol type strings:
    
    >>> np.dtype([('a','f8'),('b','S10')])
    dtype([('a', '<f8'), ('b', 'S10')])
    
Using comma-separated field formats. The shape is (2,3):
    
    >>> np.dtype("i4, (2,3)f8")
    dtype([('f0', '<i4'), ('f1', '<f8', (2, 3))])
    
Using tuples. `int` is a fixed type, 3 the field’s shape. `void` is a flexible type, here of size 10:
    
    >>> np.dtype([('hello',(np.int64,3)),('world',np.void,10)])
    dtype([('hello', '<i8', (3,)), ('world', 'V10')])
    
Subdivide `int16` into 2 `int8`’s, called x and y. 0 and 1 are the offsets in bytes:
    
    >>> np.dtype((np.int16, {'x':(np.int8,0), 'y':(np.int8,1)}))
    dtype((numpy.int16, [('x', 'i1'), ('y', 'i1')]))
    
Using dictionaries. Two fields named ‘gender’ and ‘age’:
    
    >>> np.dtype({'names':['gender','age'], 'formats':['S1',np.uint8]})
    dtype([('gender', 'S1'), ('age', 'u1')])
    
Offsets in bytes, here 0 and 25:
    
    >>> np.dtype({'surname':('S25',0),'age':(np.uint8,25)})
    dtype([('surname', 'S25'), ('age', 'u1')])
    
Attributes:
    
`alignment`
    
The required alignment (bytes) of this data-type according to the compiler.
`base`
    
Returns dtype for the base element of the subarrays, regardless of their dimension or shape.
`byteorder`
    
A character indicating the byte-order of this data-type object.
`char`
    
A unique character code for each of the 21 different built-in types.
`descr`
    
`__array_interface__` description of the data-type.
`fields`
    
Dictionary of named fields defined for this data type, or `None`.
`flags`
    
Bit-flags describing how this data type is to be interpreted.
`hasobject`
    
Boolean indicating whether this dtype contains any reference-counted objects in any fields or sub-dtypes.
`isalignedstruct`
    
Boolean indicating whether the dtype is a struct which maintains field alignment.
`isbuiltin`
    
Integer indicating how this dtype relates to the built-in dtypes.
`isnative`
    
Boolean indicating whether the byte order of this dtype is native to the platform.
`itemsize`
    
The element size of this data-type object.
`kind`
    
A character code (one of ‘biufcmMOSUV’) identifying the general kind of data.
`metadata`
    
Either `None` or a readonly dictionary of metadata (mappingproxy).
`name`
    
A bit-width name for this data-type.
`names`
    
Ordered list of field names, or `None` if there are no fields.
`ndim`
    
Number of dimensions of the sub-array if this data type describes a sub-array, and `0` otherwise.
`num`
    
A unique number for each of the 21 different built-in types.
`shape`
    
Shape tuple of the sub-array if this data type describes a sub-array, and `()` otherwise.
`str`
    
The array-protocol typestring of this data-type object.
`subdtype`
    
Tuple `(item_dtype, shape)` if this `dtype` describes a sub-array, and None otherwise.
type
#### Methods
`newbyteorder`([new_order])
Return a new dtype with a different byte order.  
# numpy.dtype.isalignedstruct
attribute
dtype.isalignedstruct
    
Boolean indicating whether the dtype is a struct which maintains field alignment. This flag is sticky, so when combining multiple structs together, it is preserved and produces new dtypes which are also aligned.
# numpy.dtype.isbuiltin
attribute
dtype.isbuiltin
    
Integer indicating how this dtype relates to the built-in dtypes.
Read-only.
0
if this is a structured array type, with fields  
1
if this is a dtype compiled into numpy (such as ints, floats etc)  
2
if the dtype is for a user-defined numpy type A user-defined type uses the numpy C-API machinery to extend numpy to handle a new array type. See User-defined data-types in the NumPy manual.  
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype('i2')
    >>> dt.isbuiltin
    1
    >>> dt = np.dtype('f8')
    >>> dt.isbuiltin
    1
    >>> dt = np.dtype([('field1', 'f8')])
    >>> dt.isbuiltin
    0
    
# numpy.dtype.isnative
attribute
dtype.isnative
    
Boolean indicating whether the byte order of this dtype is native to the platform.
# numpy.dtype.itemsize
attribute
dtype.itemsize
    
The element size of this data-type object.
For 18 of the 21 types this number is fixed by the data-type. For the flexible data-types, this number can be anything.
#### Examples
    
    >>> import numpy as np
    >>> arr = np.array([[1, 2], [3, 4]])
    >>> arr.dtype
    dtype('int64')
    >>> arr.itemsize
    8
    
    
    >>> dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
    >>> dt.itemsize
    80
    
# numpy.dtype.kind
attribute
dtype.kind
    
A character code (one of ‘biufcmMOSUV’) identifying the general kind of data.
b
boolean  
i
signed integer  
u
unsigned integer  
f
floating-point  
c
complex floating-point  
m
timedelta  
M
datetime  
O
object  
S
(byte-)string  
U
Unicode  
V
void  
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype('i4')
    >>> dt.kind
    'i'
    >>> dt = np.dtype('f8')
    >>> dt.kind
    'f'
    >>> dt = np.dtype([('field1', 'f8')])
    >>> dt.kind
    'V'
    
# numpy.dtype.metadata
attribute
dtype.metadata
    
Either `None` or a readonly dictionary of metadata (mappingproxy).
The metadata field can be set using any dictionary at data-type creation. NumPy currently has no uniform approach to propagating metadata; although some array operations preserve it, there is no guarantee that others will.
Warning
Although used in certain projects, this feature was long undocumented and is not well supported. Some aspects of metadata propagation are expected to change in the future.
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype(float, metadata={"key": "value"})
    >>> dt.metadata["key"]
    'value'
    >>> arr = np.array([1, 2, 3], dtype=dt)
    >>> arr.dtype.metadata
    mappingproxy({'key': 'value'})
    
Adding arrays with identical datatypes currently preserves the metadata:
    
    >>> (arr + arr).dtype.metadata
    mappingproxy({'key': 'value'})
    
But if the arrays have different dtype metadata, the metadata may be dropped:
    
    >>> dt2 = np.dtype(float, metadata={"key2": "value2"})
    >>> arr2 = np.array([3, 2, 1], dtype=dt2)
    >>> (arr + arr2).dtype.metadata is None
    True  # The metadata field is cleared so None is returned
    
# numpy.dtype.name
attribute
dtype.name
    
A bit-width name for this data-type.
Un-sized flexible data-type objects do not have this attribute.
#### Examples
    
    >>> import numpy as np
    >>> x = np.dtype(float)
    >>> x.name
    'float64'
    >>> x = np.dtype([('a', np.int32, 8), ('b', np.float64, 6)])
    >>> x.name
    'void640'
    
# numpy.dtype.names
attribute
dtype.names
    
Ordered list of field names, or `None` if there are no fields.
The names are ordered according to increasing byte offset. This can be used, for example, to walk through all of the named fields in offset order.
#### Examples
    
    >>> dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
    >>> dt.names
    ('name', 'grades')
    
# numpy.dtype.newbyteorder
method
dtype.newbyteorder(new_order='S', /)
    
Return a new dtype with a different byte order.
Changes are also made in all fields and sub-arrays of the data type.
Parameters:
    
new_orderstring, optional
    
Byte order to force; a value from the byte order specifications below. The default value (‘S’) results in swapping the current byte order. `new_order` codes can be any of:
  * ‘S’ - swap dtype from current to opposite endian
  * {‘<’, ‘little’} - little endian
  * {‘>’, ‘big’} - big endian
  * {‘=’, ‘native’} - native order
  * {‘|’, ‘I’} - ignore (no change to byte order)


Returns:
    
new_dtypedtype
    
New dtype object with the given change to the byte order.
#### Notes
Changes are also made in all fields and sub-arrays of the data type.
#### Examples
    
    >>> import sys
    >>> sys_is_le = sys.byteorder == 'little'
    >>> native_code = '<' if sys_is_le else '>'
    >>> swapped_code = '>' if sys_is_le else '<'
    >>> import numpy as np
    >>> native_dt = np.dtype(native_code+'i2')
    >>> swapped_dt = np.dtype(swapped_code+'i2')
    >>> native_dt.newbyteorder('S') == swapped_dt
    True
    >>> native_dt.newbyteorder() == swapped_dt
    True
    >>> native_dt == swapped_dt.newbyteorder('S')
    True
    >>> native_dt == swapped_dt.newbyteorder('=')
    True
    >>> native_dt == swapped_dt.newbyteorder('N')
    True
    >>> native_dt == native_dt.newbyteorder('|')
    True
    >>> np.dtype('<i2') == native_dt.newbyteorder('<')
    True
    >>> np.dtype('<i2') == native_dt.newbyteorder('L')
    True
    >>> np.dtype('>i2') == native_dt.newbyteorder('>')
    True
    >>> np.dtype('>i2') == native_dt.newbyteorder('B')
    True
    
# numpy.dtype.num
attribute
dtype.num
    
A unique number for each of the 21 different built-in types.
These are roughly ordered from least-to-most precision.
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype(str)
    >>> dt.num
    19
    
    
    >>> dt = np.dtype(float)
    >>> dt.num
    12
    
# numpy.dtype.shape
attribute
dtype.shape
    
Shape tuple of the sub-array if this data type describes a sub-array, and `()` otherwise.
#### Examples
    
    >>> import numpy as np
    >>> dt = np.dtype(('i4', 4))
    >>> dt.shape
    (4,)
    
    
    >>> dt = np.dtype(('i4', (2, 3)))
    >>> dt.shape
    (2, 3)
    
# numpy.dtype.str
attribute
dtype.str
    
The array-protocol typestring of this data-type object.
# numpy.dtype.subdtype
attribute
dtype.subdtype
    
Tuple `(item_dtype, shape)` if this `dtype` describes a sub-array, and None otherwise.
The shape is the fixed shape of the sub-array described by this data type, and item_dtype the data type of the array.
If a field whose dtype object has this attribute is retrieved, then the extra dimensions implied by shape are tacked on to the end of the retrieved array.
See also
`dtype.base`
#### Examples
    
    >>> import numpy as np
    >>> x = numpy.dtype('8f')
    >>> x.subdtype
    (dtype('float32'), (8,))
    
    
    >>> x =  numpy.dtype('i2')
    >>> x.subdtype
    >>>
    
# numpy.dtype.type
attribute
dtype.type=None 
# numpy.ediff1d
numpy.ediff1d(ary, to_end=None, to_begin=None)[source]
    
The differences between consecutive elements of an array.
Parameters:
    
aryarray_like
    
If necessary, will be flattened before the differences are taken.
to_endarray_like, optional
    
Number(s) to append at the end of the returned differences.
to_beginarray_like, optional
    
Number(s) to prepend at the beginning of the returned differences.
Returns:
    
ediff1dndarray
    
The differences. Loosely, this is `ary.flat[1:] - ary.flat[:-1]`.
See also
`diff`, `gradient`
#### Notes
When applied to masked arrays, this function drops the mask information if the `to_begin` and/or `to_end` parameters are used.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 4, 7, 0])
    >>> np.ediff1d(x)
    array([ 1,  2,  3, -7])
    
    
    >>> np.ediff1d(x, to_begin=-99, to_end=np.array([88, 99]))
    array([-99,   1,   2, ...,  -7,  88,  99])
    
The returned array is always 1D.
    
    >>> y = [[1, 2, 4], [1, 6, 24]]
    >>> np.ediff1d(y)
    array([ 1,  2, -3,  5, 18])
    
# numpy.einsum
numpy.einsum(subscripts, *operands, out=None, dtype=None, order='K', casting='safe', optimize=False)[source]
    
Evaluates the Einstein summation convention on the operands.
Using the Einstein summation convention, many common multi-dimensional, linear algebraic array operations can be represented in a simple fashion. In implicit mode `einsum` computes these values.
In explicit mode, `einsum` provides further flexibility to compute other array operations that might not be considered classical Einstein summation operations, by disabling, or forcing summation over specified subscript labels.
See the notes and examples for clarification.
Parameters:
    
subscriptsstr
    
Specifies the subscripts for summation as comma separated list of subscript labels. An implicit (classical Einstein summation) calculation is performed unless the explicit indicator ‘->’ is included as well as subscript labels of the precise output form.
operandslist of array_like
    
These are the arrays for the operation.
outndarray, optional
    
If provided, the calculation is done into this array.
dtype{data-type, None}, optional
    
If provided, forces the calculation to use the data type specified. Note that you may have to also give a more liberal `casting` parameter to allow the conversions. Default is None.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the output. ‘C’ means it should be C contiguous. ‘F’ means it should be Fortran contiguous, ‘A’ means it should be ‘F’ if the inputs are all ‘F’, ‘C’ otherwise. ‘K’ means it should be as close to the layout as the inputs as is possible, including arbitrarily permuted axes. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Setting this to ‘unsafe’ is not recommended, as it can adversely affect accumulations.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


Default is ‘safe’.
optimize{False, True, ‘greedy’, ‘optimal’}, optional
    
Controls if intermediate optimization should occur. No optimization will occur if False and True will default to the ‘greedy’ algorithm. Also accepts an explicit contraction list from the `np.einsum_path` function. See `np.einsum_path` for more details. Defaults to False.
Returns:
    
outputndarray
    
The calculation based on the Einstein summation convention.
See also
`einsum_path`, `dot`, `inner`, `outer`, `tensordot`, `linalg.multi_dot`
`einsum`
    
Similar verbose interface is provided by the einops package to cover additional operations: transpose, reshape/flatten, repeat/tile, squeeze/unsqueeze and reductions. The opt_einsum optimizes contraction order for einsum-like expressions in backend-agnostic manner.
#### Notes
The Einstein summation convention can be used to compute many multi-dimensional, linear algebraic array operations. `einsum` provides a succinct way of representing these.
A non-exhaustive list of these operations, which can be computed by `einsum`, is shown below along with examples:
  * Trace of an array, `numpy.trace`.
  * Return a diagonal, `numpy.diag`.
  * Array axis summations, `numpy.sum`.
  * Transpositions and permutations, `numpy.transpose`.
  * Matrix multiplication and dot product, `numpy.matmul`
    
`numpy.dot`.
  * Vector inner and outer products, `numpy.inner`
    
`numpy.outer`.
  * Broadcasting, element-wise and scalar multiplication,
    
`numpy.multiply`.
  * Tensor contractions, `numpy.tensordot`.
  * Chained array operations, in efficient calculation order,
    
`numpy.einsum_path`.


The subscripts string is a comma-separated list of subscript labels, where each label refers to a dimension of the corresponding operand. Whenever a label is repeated it is summed, so `np.einsum('i,i', a, b)` is equivalent to `np.inner(a,b)`. If a label appears only once, it is not summed, so `np.einsum('i', a)` produces a view of `a` with no changes. A further example `np.einsum('ij,jk', a, b)` describes traditional matrix multiplication and is equivalent to `np.matmul(a,b)`. Repeated subscript labels in one operand take the diagonal. For example, `np.einsum('ii', a)` is equivalent to `np.trace(a)`.
In implicit mode, the chosen subscripts are important since the axes of the output are reordered alphabetically. This means that `np.einsum('ij', a)` doesn’t affect a 2D array, while `np.einsum('ji', a)` takes its transpose. Additionally, `np.einsum('ij,jk', a, b)` returns a matrix multiplication, while, `np.einsum('ij,jh', a, b)` returns the transpose of the multiplication since subscript ‘h’ precedes subscript ‘i’.
In explicit mode the output can be directly controlled by specifying output subscript labels. This requires the identifier ‘->’ as well as the list of output subscript labels. This feature increases the flexibility of the function since summing can be disabled or forced when required. The call `np.einsum('i->', a)` is like `np.sum(a)` if `a` is a 1-D array, and `np.einsum('ii->i', a)` is like `np.diag(a)` if `a` is a square 2-D array. The difference is that `einsum` does not allow broadcasting by default. Additionally `np.einsum('ij,jh->ih', a, b)` directly specifies the order of the output subscript labels and therefore returns matrix multiplication, unlike the example above in implicit mode.
To enable and control broadcasting, use an ellipsis. Default NumPy-style broadcasting is done by adding an ellipsis to the left of each term, like `np.einsum('...ii->...i', a)`. `np.einsum('...i->...', a)` is like `np.sum(a, axis=-1)` for array `a` of any shape. To take the trace along the first and last axes, you can do `np.einsum('i...i', a)`, or to do a matrix-matrix product with the left-most indices instead of rightmost, one can do `np.einsum('ij...,jk...->ik...', a, b)`.
When there is only one operand, no axes are summed, and no output parameter is provided, a view into the operand is returned instead of a new array. Thus, taking the diagonal as `np.einsum('ii->i', a)` produces a view (changed in version 1.10.0).
`einsum` also provides an alternative way to provide the subscripts and operands as `einsum(op0, sublist0, op1, sublist1, ..., [sublistout])`. If the output shape is not provided in this format `einsum` will be calculated in implicit mode, otherwise it will be performed explicitly. The examples below have corresponding `einsum` calls with the two parameter methods.
Views returned from einsum are now writeable whenever the input array is writeable. For example, `np.einsum('ijk...->kji...', a)` will now have the same effect as `np.swapaxes(a, 0, 2)` and `np.einsum('ii->i', a)` will return a writeable view of the diagonal of a 2D array.
Added the `optimize` argument which will optimize the contraction order of an einsum expression. For a contraction with three or more operands this can greatly increase the computational efficiency at the cost of a larger memory footprint during computation.
Typically a ‘greedy’ algorithm is applied which empirical tests have shown returns the optimal path in the majority of cases. In some cases ‘optimal’ will return the superlative path through a more expensive, exhaustive search. For iterative calculations it may be advisable to calculate the optimal path once and reuse that path by supplying it as an argument. An example is given below.
See `numpy.einsum_path` for more details.
#### Examples
    
    >>> a = np.arange(25).reshape(5,5)
    >>> b = np.arange(5)
    >>> c = np.arange(6).reshape(2,3)
    
Trace of a matrix:
    
    >>> np.einsum('ii', a)
    60
    >>> np.einsum(a, [0,0])
    60
    >>> np.trace(a)
    60
    
Extract the diagonal (requires explicit form):
    
    >>> np.einsum('ii->i', a)
    array([ 0,  6, 12, 18, 24])
    >>> np.einsum(a, [0,0], [0])
    array([ 0,  6, 12, 18, 24])
    >>> np.diag(a)
    array([ 0,  6, 12, 18, 24])
    
Sum over an axis (requires explicit form):
    
    >>> np.einsum('ij->i', a)
    array([ 10,  35,  60,  85, 110])
    >>> np.einsum(a, [0,1], [0])
    array([ 10,  35,  60,  85, 110])
    >>> np.sum(a, axis=1)
    array([ 10,  35,  60,  85, 110])
    
For higher dimensional arrays summing a single axis can be done with ellipsis:
    
    >>> np.einsum('...j->...', a)
    array([ 10,  35,  60,  85, 110])
    >>> np.einsum(a, [Ellipsis,1], [Ellipsis])
    array([ 10,  35,  60,  85, 110])
    
Compute a matrix transpose, or reorder any number of axes:
    
    >>> np.einsum('ji', c)
    array([[0, 3],
           [1, 4],
           [2, 5]])
    >>> np.einsum('ij->ji', c)
    array([[0, 3],
           [1, 4],
           [2, 5]])
    >>> np.einsum(c, [1,0])
    array([[0, 3],
           [1, 4],
           [2, 5]])
    >>> np.transpose(c)
    array([[0, 3],
           [1, 4],
           [2, 5]])
    
Vector inner products:
    
    >>> np.einsum('i,i', b, b)
    30
    >>> np.einsum(b, [0], b, [0])
    30
    >>> np.inner(b,b)
    30
    
Matrix vector multiplication:
    
    >>> np.einsum('ij,j', a, b)
    array([ 30,  80, 130, 180, 230])
    >>> np.einsum(a, [0,1], b, [1])
    array([ 30,  80, 130, 180, 230])
    >>> np.dot(a, b)
    array([ 30,  80, 130, 180, 230])
    >>> np.einsum('...j,j', a, b)
    array([ 30,  80, 130, 180, 230])
    
Broadcasting and scalar multiplication:
    
    >>> np.einsum('..., ...', 3, c)
    array([[ 0,  3,  6],
           [ 9, 12, 15]])
    >>> np.einsum(',ij', 3, c)
    array([[ 0,  3,  6],
           [ 9, 12, 15]])
    >>> np.einsum(3, [Ellipsis], c, [Ellipsis])
    array([[ 0,  3,  6],
           [ 9, 12, 15]])
    >>> np.multiply(3, c)
    array([[ 0,  3,  6],
           [ 9, 12, 15]])
    
Vector outer product:
    
    >>> np.einsum('i,j', np.arange(2)+1, b)
    array([[0, 1, 2, 3, 4],
           [0, 2, 4, 6, 8]])
    >>> np.einsum(np.arange(2)+1, [0], b, [1])
    array([[0, 1, 2, 3, 4],
           [0, 2, 4, 6, 8]])
    >>> np.outer(np.arange(2)+1, b)
    array([[0, 1, 2, 3, 4],
           [0, 2, 4, 6, 8]])
    
Tensor contraction:
    
    >>> a = np.arange(60.).reshape(3,4,5)
    >>> b = np.arange(24.).reshape(4,3,2)
    >>> np.einsum('ijk,jil->kl', a, b)
    array([[4400., 4730.],
           [4532., 4874.],
           [4664., 5018.],
           [4796., 5162.],
           [4928., 5306.]])
    >>> np.einsum(a, [0,1,2], b, [1,0,3], [2,3])
    array([[4400., 4730.],
           [4532., 4874.],
           [4664., 5018.],
           [4796., 5162.],
           [4928., 5306.]])
    >>> np.tensordot(a,b, axes=([1,0],[0,1]))
    array([[4400., 4730.],
           [4532., 4874.],
           [4664., 5018.],
           [4796., 5162.],
           [4928., 5306.]])
    
Writeable returned arrays (since version 1.10.0):
    
    >>> a = np.zeros((3, 3))
    >>> np.einsum('ii->i', a)[:] = 1
    >>> a
    array([[1., 0., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])
    
Example of ellipsis use:
    
    >>> a = np.arange(6).reshape((3,2))
    >>> b = np.arange(12).reshape((4,3))
    >>> np.einsum('ki,jk->ij', a, b)
    array([[10, 28, 46, 64],
           [13, 40, 67, 94]])
    >>> np.einsum('ki,...k->i...', a, b)
    array([[10, 28, 46, 64],
           [13, 40, 67, 94]])
    >>> np.einsum('k...,jk', a, b)
    array([[10, 28, 46, 64],
           [13, 40, 67, 94]])
    
Chained array operations. For more complicated contractions, speed ups might be achieved by repeatedly computing a ‘greedy’ path or pre-computing the ‘optimal’ path and repeatedly applying it, using an `einsum_path` insertion (since version 1.12.0). Performance improvements can be particularly significant with larger arrays:
    
    >>> a = np.ones(64).reshape(2,4,8)
    
Basic `einsum`: ~1520ms (benchmarked on 3.1GHz Intel i5.)
    
    >>> for iteration in range(500):
    ...     _ = np.einsum('ijk,ilm,njm,nlk,abc->',a,a,a,a,a)
    
Sub-optimal `einsum` (due to repeated path calculation time): ~330ms
    
    >>> for iteration in range(500):
    ...     _ = np.einsum('ijk,ilm,njm,nlk,abc->',a,a,a,a,a,
    ...         optimize='optimal')
    
Greedy `einsum` (faster optimal path approximation): ~160ms
    
    >>> for iteration in range(500):
    ...     _ = np.einsum('ijk,ilm,njm,nlk,abc->',a,a,a,a,a, optimize='greedy')
    
Optimal `einsum` (best usage pattern in some use cases): ~110ms
    
    >>> path = np.einsum_path('ijk,ilm,njm,nlk,abc->',a,a,a,a,a,
    ...     optimize='optimal')[0]
    >>> for iteration in range(500):
    ...     _ = np.einsum('ijk,ilm,njm,nlk,abc->',a,a,a,a,a, optimize=path)
    
# numpy.einsum_path
numpy.einsum_path(subscripts, *operands, optimize='greedy')[source]
    
Evaluates the lowest cost contraction order for an einsum expression by considering the creation of intermediate arrays.
Parameters:
    
subscriptsstr
    
Specifies the subscripts for summation.
*operandslist of array_like
    
These are the arrays for the operation.
optimize{bool, list, tuple, ‘greedy’, ‘optimal’}
    
Choose the type of path. If a tuple is provided, the second argument is assumed to be the maximum intermediate size created. If only a single argument is provided the largest input or output array size is used as a maximum intermediate size.
  * if a list is given that starts with `einsum_path`, uses this as the contraction path
  * if False no optimization is taken
  * if True defaults to the ‘greedy’ algorithm
  * ‘optimal’ An algorithm that combinatorially explores all possible ways of contracting the listed tensors and chooses the least costly path. Scales exponentially with the number of terms in the contraction.
  * ‘greedy’ An algorithm that chooses the best pair contraction at each step. Effectively, this algorithm searches the largest inner, Hadamard, and then outer products at each step. Scales cubically with the number of terms in the contraction. Equivalent to the ‘optimal’ path for most contractions.


Default is ‘greedy’.
Returns:
    
pathlist of tuples
    
A list representation of the einsum path.
string_reprstr
    
A printable representation of the einsum path.
See also
`einsum`, `linalg.multi_dot`
#### Notes
The resulting path indicates which terms of the input contraction should be contracted first, the result of this contraction is then appended to the end of the contraction list. This list can then be iterated over until all intermediate contractions are complete.
#### Examples
We can begin with a chain dot example. In this case, it is optimal to contract the `b` and `c` tensors first as represented by the first element of the path `(1, 2)`. The resulting tensor is added to the end of the contraction and the remaining contraction `(0, 1)` is then completed.
    
    >>> np.random.seed(123)
    >>> a = np.random.rand(2, 2)
    >>> b = np.random.rand(2, 5)
    >>> c = np.random.rand(5, 2)
    >>> path_info = np.einsum_path('ij,jk,kl->il', a, b, c, optimize='greedy')
    >>> print(path_info[0])
    ['einsum_path', (1, 2), (0, 1)]
    >>> print(path_info[1])
      Complete contraction:  ij,jk,kl->il # may vary
             Naive scaling:  4
         Optimized scaling:  3
          Naive FLOP count:  1.600e+02
      Optimized FLOP count:  5.600e+01
       Theoretical speedup:  2.857
      Largest intermediate:  4.000e+00 elements
    -------------------------------------------------------------------------
    scaling                  current                                remaining
    -------------------------------------------------------------------------
       3                   kl,jk->jl                                ij,jl->il
       3                   jl,ij->il                                   il->il
    
A more complex index transformation example.
    
    >>> I = np.random.rand(10, 10, 10, 10)
    >>> C = np.random.rand(10, 10)
    >>> path_info = np.einsum_path('ea,fb,abcd,gc,hd->efgh', C, C, I, C, C,
    ...                            optimize='greedy')
    
    
    >>> print(path_info[0])
    ['einsum_path', (0, 2), (0, 3), (0, 2), (0, 1)]
    >>> print(path_info[1])
      Complete contraction:  ea,fb,abcd,gc,hd->efgh # may vary
             Naive scaling:  8
         Optimized scaling:  5
          Naive FLOP count:  8.000e+08
      Optimized FLOP count:  8.000e+05
       Theoretical speedup:  1000.000
      Largest intermediate:  1.000e+04 elements
    --------------------------------------------------------------------------
    scaling                  current                                remaining
    --------------------------------------------------------------------------
       5               abcd,ea->bcde                      fb,gc,hd,bcde->efgh
       5               bcde,fb->cdef                         gc,hd,cdef->efgh
       5               cdef,gc->defg                            hd,defg->efgh
       5               defg,hd->efgh                               efgh->efgh
    
# numpy.emath.arccos
emath.arccos(x)[source]
    
Compute the inverse cosine of x.
Return the “principal value” (for a description of this, see `numpy.arccos`) of the inverse cosine of `x`. For real `x` such that `abs(x) <= 1`, this is a real number in the closed interval \\([0, \pi]\\). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like or scalar
    
The value(s) whose arccos is (are) required.
Returns:
    
outndarray or scalar
    
The inverse cosine(s) of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array object is returned.
See also
`numpy.arccos`
#### Notes
For an arccos() that returns `NAN` when real `x` is not in the interval `[-1,1]`, use `numpy.arccos`.
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.arccos(1) # a scalar is returned
    0.0
    
    
    >>> np.emath.arccos([1,2])
    array([0.-0.j   , 0.-1.317j])
    
# numpy.emath.arcsin
emath.arcsin(x)[source]
    
Compute the inverse sine of x.
Return the “principal value” (for a description of this, see `numpy.arcsin`) of the inverse sine of `x`. For real `x` such that `abs(x) <= 1`, this is a real number in the closed interval \\([-\pi/2, \pi/2]\\). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like or scalar
    
The value(s) whose arcsin is (are) required.
Returns:
    
outndarray or scalar
    
The inverse sine(s) of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array object is returned.
See also
`numpy.arcsin`
#### Notes
For an arcsin() that returns `NAN` when real `x` is not in the interval `[-1,1]`, use `numpy.arcsin`.
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.arcsin(0)
    0.0
    
    
    >>> np.emath.arcsin([0,1])
    array([0.    , 1.5708])
    
# numpy.emath.arctanh
emath.arctanh(x)[source]
    
Compute the inverse hyperbolic tangent of `x`.
Return the “principal value” (for a description of this, see `numpy.arctanh`) of `arctanh(x)`. For real `x` such that `abs(x) < 1`, this is a real number. If `abs(x) > 1`, or if `x` is complex, the result is complex. Finally, `x = 1` returns``inf`` and `x=-1` returns `-inf`.
Parameters:
    
xarray_like
    
The value(s) whose arctanh is (are) required.
Returns:
    
outndarray or scalar
    
The inverse hyperbolic tangent(s) of the `x` value(s). If `x` was a scalar so is `out`, otherwise an array is returned.
See also
`numpy.arctanh`
#### Notes
For an arctanh() that returns `NAN` when real `x` is not in the interval `(-1,1)`, use `numpy.arctanh` (this latter, however, does return +/-inf for `x = +/-1`).
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.arctanh(0.5)
    0.5493061443340549
    
    
    >>> from numpy.testing import suppress_warnings
    >>> with suppress_warnings() as sup:
    ...     sup.filter(RuntimeWarning)
    ...     np.emath.arctanh(np.eye(2))
    array([[inf,  0.],
           [ 0., inf]])
    >>> np.emath.arctanh([1j])
    array([0.+0.7854j])
    
# numpy.emath.log
emath.log(x)[source]
    
Compute the natural logarithm of `x`.
Return the “principal value” (for a description of this, see `numpy.log`) of \\(log_e(x)\\). For real `x > 0`, this is a real number (`log(0)` returns `-inf` and `log(np.inf)` returns `inf`). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like
    
The value(s) whose log is (are) required.
Returns:
    
outndarray or scalar
    
The log of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array is returned.
See also
`numpy.log`
#### Notes
For a log() that returns `NAN` when real `x < 0`, use `numpy.log` (note, however, that otherwise `numpy.log` and this `log` are identical, i.e., both return `-inf` for `x = 0`, `inf` for `x = inf`, and, notably, the complex principle value if `x.imag != 0`).
#### Examples
    
    >>> import numpy as np
    >>> np.emath.log(np.exp(1))
    1.0
    
Negative arguments are handled “correctly” (recall that `exp(log(x)) == x` does not hold for real `x < 0`):
    
    >>> np.emath.log(-np.exp(1)) == (1 + np.pi * 1j)
    True
    
# numpy.emath.log10
emath.log10(x)[source]
    
Compute the logarithm base 10 of `x`.
Return the “principal value” (for a description of this, see `numpy.log10`) of \\(log_{10}(x)\\). For real `x > 0`, this is a real number (`log10(0)` returns `-inf` and `log10(np.inf)` returns `inf`). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like or scalar
    
The value(s) whose log base 10 is (are) required.
Returns:
    
outndarray or scalar
    
The log base 10 of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array object is returned.
See also
`numpy.log10`
#### Notes
For a log10() that returns `NAN` when real `x < 0`, use `numpy.log10` (note, however, that otherwise `numpy.log10` and this `log10` are identical, i.e., both return `-inf` for `x = 0`, `inf` for `x = inf`, and, notably, the complex principle value if `x.imag != 0`).
#### Examples
    
    >>> import numpy as np
    
(We set the printing precision so the example can be auto-tested)
    
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.log10(10**1)
    1.0
    
    
    >>> np.emath.log10([-10**1, -10**2, 10**2])
    array([1.+1.3644j, 2.+1.3644j, 2.+0.j    ])
    
# numpy.emath.log2
emath.log2(x)[source]
    
Compute the logarithm base 2 of `x`.
Return the “principal value” (for a description of this, see `numpy.log2`) of \\(log_2(x)\\). For real `x > 0`, this is a real number (`log2(0)` returns `-inf` and `log2(np.inf)` returns `inf`). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like
    
The value(s) whose log base 2 is (are) required.
Returns:
    
outndarray or scalar
    
The log base 2 of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array is returned.
See also
`numpy.log2`
#### Notes
For a log2() that returns `NAN` when real `x < 0`, use `numpy.log2` (note, however, that otherwise `numpy.log2` and this `log2` are identical, i.e., both return `-inf` for `x = 0`, `inf` for `x = inf`, and, notably, the complex principle value if `x.imag != 0`).
#### Examples
We set the printing precision so the example can be auto-tested:
    
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.log2(8)
    3.0
    >>> np.emath.log2([-4, -8, 8])
    array([2.+4.5324j, 3.+4.5324j, 3.+0.j    ])
    
# numpy.emath.logn
emath.logn(n, x)[source]
    
Take log base n of x.
If `x` contains negative inputs, the answer is computed and returned in the complex domain.
Parameters:
    
narray_like
    
The integer base(s) in which the log is taken.
xarray_like
    
The value(s) whose log base `n` is (are) required.
Returns:
    
outndarray or scalar
    
The log base `n` of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array is returned.
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.logn(2, [4, 8])
    array([2., 3.])
    >>> np.emath.logn(2, [-4, -8, 8])
    array([2.+4.5324j, 3.+4.5324j, 3.+0.j    ])
    
# numpy.emath.power
emath.power(x, p)[source]
    
Return x to the power p, (x**p).
If `x` contains negative values, the output is converted to the complex domain.
Parameters:
    
xarray_like
    
The input value(s).
parray_like of ints
    
The power(s) to which `x` is raised. If `x` contains multiple values, `p` has to either be a scalar, or contain the same number of values as `x`. In the latter case, the result is `x[0]**p[0], x[1]**p[1], ...`.
Returns:
    
outndarray or scalar
    
The result of `x**p`. If `x` and `p` are scalars, so is `out`, otherwise an array is returned.
See also
`numpy.power`
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.power(2, 2)
    4
    
    
    >>> np.emath.power([2, 4], 2)
    array([ 4, 16])
    
    
    >>> np.emath.power([2, 4], -2)
    array([0.25  ,  0.0625])
    
    
    >>> np.emath.power([-2, 4], 2)
    array([ 4.-0.j, 16.+0.j])
    
    
    >>> np.emath.power([2, 4], [2, 4])
    array([ 4, 256])
    
# numpy.emath.sqrt
emath.sqrt(x)[source]
    
Compute the square root of x.
For negative input elements, a complex value is returned (unlike `numpy.sqrt` which returns NaN).
Parameters:
    
xarray_like
    
The input value(s).
Returns:
    
outndarray or scalar
    
The square root of `x`. If `x` was a scalar, so is `out`, otherwise an array is returned.
See also
`numpy.sqrt`
#### Examples
For real, non-negative inputs this works just like `numpy.sqrt`:
    
    >>> import numpy as np
    
    
    >>> np.emath.sqrt(1)
    1.0
    >>> np.emath.sqrt([1, 4])
    array([1.,  2.])
    
But it automatically handles negative inputs:
    
    >>> np.emath.sqrt(-1)
    1j
    >>> np.emath.sqrt([-1,4])
    array([0.+1.j, 2.+0.j])
    
Different results are expected because: floating point 0.0 and -0.0 are distinct.
For more control, explicitly use complex() as follows:
    
    >>> np.emath.sqrt(complex(-4.0, 0.0))
    2j
    >>> np.emath.sqrt(complex(-4.0, -0.0))
    -2j
    
# numpy.empty
numpy.empty(shape, dtype=float, order='C', *, device=None, like=None)
    
Return a new array of given shape and type, without initializing entries.
Parameters:
    
shapeint or tuple of int
    
Shape of the empty array, e.g., `(2, 3)` or `2`.
dtypedata-type, optional
    
Desired output data-type for the array, e.g, `numpy.int8`. Default is `numpy.float64`.
order{‘C’, ‘F’}, optional, default: ‘C’
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Array of uninitialized (arbitrary) data of the given shape, dtype, and order. Object arrays will be initialized to None.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`ones`
    
Return a new array setting values to one.
`zeros`
    
Return a new array setting values to zero.
`full`
    
Return a new array of given shape filled with value.
#### Notes
Unlike other array creation functions (e.g. `zeros`, `ones`, `full`), `empty` does not initialize the values of the array, and may therefore be marginally faster. However, the values stored in the newly allocated array are arbitrary. For reproducible behavior, be sure to set each element of the array before reading.
#### Examples
    
    >>> import numpy as np
    >>> np.empty([2, 2])
    array([[ -9.74499359e+001,   6.69583040e-309],
           [  2.13182611e-314,   3.06959433e-309]])         #uninitialized
    
    
    >>> np.empty([2, 2], dtype=int)
    array([[-1073741821, -1067949133],
           [  496041986,    19249760]])                     #uninitialized
    
# numpy.empty_like
numpy.empty_like(prototype, dtype=None, order='K', subok=True, shape=None, *, device=None)
    
Return a new array with the same shape and type as a given array.
Parameters:
    
prototypearray_like
    
The shape and data-type of `prototype` define these same attributes of the returned array.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `prototype` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `prototype` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `prototype`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outndarray
    
Array of uninitialized (arbitrary) data with the same shape and type as `prototype`.
See also
`ones_like`
    
Return an array of ones with shape and type of input.
`zeros_like`
    
Return an array of zeros with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`empty`
    
Return a new uninitialized array.
#### Notes
Unlike other array creation functions (e.g. `zeros_like`, `ones_like`, `full_like`), `empty_like` does not initialize the values of the array, and may therefore be marginally faster. However, the values stored in the newly allocated array are arbitrary. For reproducible behavior, be sure to set each element of the array before reading.
#### Examples
    
    >>> import numpy as np
    >>> a = ([1,2,3], [4,5,6])                         # a is array-like
    >>> np.empty_like(a)
    array([[-1073741821, -1073741821,           3],    # uninitialized
           [          0,           0, -1073741821]])
    >>> a = np.array([[1., 2., 3.],[4.,5.,6.]])
    >>> np.empty_like(a)
    array([[ -2.00000715e+000,   1.48219694e-323,  -2.00000572e+000], # uninitialized
           [  4.38791518e-305,  -2.00000715e+000,   4.17269252e-309]])
    
# numpy.equal
numpy.equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'equal'>
    
Return (x1 == x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`not_equal`, `greater_equal`, `less_equal`, `greater`, `less`
#### Examples
    
    >>> import numpy as np
    >>> np.equal([0, 1, 3], np.arange(3))
    array([ True,  True, False])
    
What is compared are values, not types. So an int (1) and an array of length one can evaluate as True:
    
    >>> np.equal(1, np.ones(1))
    array([ True])
    
The `==` operator can be used as a shorthand for `np.equal` on ndarrays.
    
    >>> a = np.array([2, 4, 6])
    >>> b = np.array([2, 4, 2])
    >>> a == b
    array([ True,  True, False])
    
# numpy.errstate.__call__
method
errstate.__call__(func)[source]
    
Call self as a function.
# numpy.errstate
classnumpy.errstate(**kwargs)[source]
    
Context manager for floating-point error handling.
Using an instance of `errstate` as a context manager allows statements in that context to execute with a known error handling behavior. Upon entering the context the error handling is set with `seterr` and `seterrcall`, and upon exiting it is reset to what it was before.
Changed in version 1.17.0: `errstate` is also usable as a function decorator, saving a level of indentation if an entire function is wrapped.
Changed in version 2.0: `errstate` is now fully thread and asyncio safe, but may not be entered more than once. It is not safe to decorate async functions using `errstate`.
Parameters:
    
kwargs{divide, over, under, invalid}
    
Keyword arguments. The valid keywords are the possible floating-point exceptions. Each keyword should have a string value that defines the treatment for the particular error. Possible values are {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}.
See also
`seterr`, `geterr`, `seterrcall`, `geterrcall`
#### Notes
For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`.
#### Examples
    
    >>> import numpy as np
    >>> olderr = np.seterr(all='ignore')  # Set error handling to known state.
    
    
    >>> np.arange(3) / 0.
    array([nan, inf, inf])
    >>> with np.errstate(divide='ignore'):
    ...     np.arange(3) / 0.
    array([nan, inf, inf])
    
    
    >>> np.sqrt(-1)
    np.float64(nan)
    >>> with np.errstate(invalid='raise'):
    ...     np.sqrt(-1)
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    FloatingPointError: invalid value encountered in sqrt
    
Outside the context the error handling behavior has not changed:
    
    >>> np.geterr()
    {'divide': 'ignore', 'over': 'ignore', 'under': 'ignore', 'invalid': 'ignore'}
    >>> olderr = np.seterr(**olderr)  # restore original state
    
#### Methods
`__call__`(func)
Call self as a function.  
# numpy.exceptions.AxisError
exceptionexceptions.AxisError(axis, ndim=None, msg_prefix=None)[source]
    
Axis supplied was invalid.
This is raised whenever an `axis` parameter is specified that is larger than the number of array dimensions. For compatibility with code written against older numpy versions, which raised a mixture of `ValueError` and `IndexError` for this situation, this exception subclasses both to ensure that `except ValueError` and `except IndexError` statements continue to catch `AxisError`.
Parameters:
    
axisint or str
    
The out of bounds axis or a custom exception message. If an axis is provided, then `ndim` should be specified as well.
ndimint, optional
    
The number of array dimensions.
msg_prefixstr, optional
    
A prefix for the exception message.
#### Examples
    
    >>> import numpy as np
    >>> array_1d = np.arange(10)
    >>> np.cumsum(array_1d, axis=1)
    Traceback (most recent call last):
      ...
    numpy.exceptions.AxisError: axis 1 is out of bounds for array of dimension 1
    
Negative axes are preserved:
    
    >>> np.cumsum(array_1d, axis=-2)
    Traceback (most recent call last):
      ...
    numpy.exceptions.AxisError: axis -2 is out of bounds for array of dimension 1
    
The class constructor generally takes the axis and arrays’ dimensionality as arguments:
    
    >>> print(np.exceptions.AxisError(2, 1, msg_prefix='error'))
    error: axis 2 is out of bounds for array of dimension 1
    
Alternatively, a custom exception message can be passed:
    
    >>> print(np.exceptions.AxisError('Custom error message'))
    Custom error message
    
Attributes:
    
axisint, optional
    
The out of bounds axis or `None` if a custom exception message was provided. This should be the axis as passed by the user, before any normalization to resolve negative indices.
New in version 1.22.
ndimint, optional
    
The number of array dimensions or `None` if a custom exception message was provided.
New in version 1.22.
# numpy.exceptions.ComplexWarning
exceptionexceptions.ComplexWarning[source]
    
The warning raised when casting a complex dtype to a real dtype.
As implemented, casting a complex number to a real discards its imaginary part, but this behavior may not be what the user actually wants.
# numpy.exceptions.DTypePromotionError
exceptionexceptions.DTypePromotionError[source]
    
Multiple DTypes could not be converted to a common one.
This exception derives from `TypeError` and is raised whenever dtypes cannot be converted to a single common one. This can be because they are of a different category/class or incompatible instances of the same one (see Examples).
#### Notes
Many functions will use promotion to find the correct result and implementation. For these functions the error will typically be chained with a more specific error indicating that no implementation was found for the input dtypes.
Typically promotion should be considered “invalid” between the dtypes of two arrays when `arr1 == arr2` can safely return all `False` because the dtypes are fundamentally different.
#### Examples
Datetimes and complex numbers are incompatible classes and cannot be promoted:
    
    >>> import numpy as np
    >>> np.result_type(np.dtype("M8[s]"), np.complex128)  
    Traceback (most recent call last):
     ...
    DTypePromotionError: The DType <class 'numpy.dtype[datetime64]'> could not
    be promoted by <class 'numpy.dtype[complex128]'>. This means that no common
    DType exists for the given inputs. For example they cannot be stored in a
    single array unless the dtype is `object`. The full list of DTypes is:
    (<class 'numpy.dtype[datetime64]'>, <class 'numpy.dtype[complex128]'>)
    
For example for structured dtypes, the structure can mismatch and the same `DTypePromotionError` is given when two structured dtypes with a mismatch in their number of fields is given:
    
    >>> dtype1 = np.dtype([("field1", np.float64), ("field2", np.int64)])
    >>> dtype2 = np.dtype([("field1", np.float64)])
    >>> np.promote_types(dtype1, dtype2)  
    Traceback (most recent call last):
     ...
    DTypePromotionError: field names `('field1', 'field2')` and `('field1',)`
    mismatch.
    
# numpy.exceptions.RankWarning
exceptionexceptions.RankWarning[source]
    
Matrix rank warning.
Issued by polynomial functions when the design matrix is rank deficient.
# numpy.exceptions.TooHardError
exceptionexceptions.TooHardError[source]
    
max_work was exceeded.
This is raised whenever the maximum number of candidate solutions to consider specified by the `max_work` parameter is exceeded. Assigning a finite number to max_work may have caused the operation to fail.
# numpy.exceptions.VisibleDeprecationWarning
exceptionexceptions.VisibleDeprecationWarning[source]
    
Visible deprecation warning.
By default, python will not show deprecation warnings, so this class can be used when a very visible warning is helpful, for example because the usage is most likely a user bug.
# numpy.exp
numpy.exp(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'exp'>
    
Calculate the exponential of all elements in the input array.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise exponential of `x`. This is a scalar if `x` is a scalar.
See also
`expm1`
    
Calculate `exp(x) - 1` for all elements in the array.
`exp2`
    
Calculate `2**x` for all elements in the array.
#### Notes
The irrational number `e` is also known as Euler’s number. It is approximately 2.718281, and is the base of the natural logarithm, `ln` (this means that, if \\(x = \ln y = \log_e y\\), then \\(e^x = y\\). For real input, `exp(x)` is always positive.
For complex arguments, `x = a + ib`, we can write \\(e^x = e^a e^{ib}\\). The first term, \\(e^a\\), is already known (it is the real argument, described above). The second term, \\(e^{ib}\\), is \\(\cos b + i \sin b\\), a function with magnitude 1 and a periodic phase.
#### References
[1]
Wikipedia, “Exponential function”, https://en.wikipedia.org/wiki/Exponential_function
[2]
M. Abramovitz and I. A. Stegun, “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables,” Dover, 1964, p. 69, https://personal.math.ubc.ca/~cbm/aands/page_69.htm
#### Examples
Plot the magnitude and phase of `exp(x)` in the complex plane:
    
    >>> import numpy as np
    
    
    >>> import matplotlib.pyplot as plt
    
    
    >>> x = np.linspace(-2*np.pi, 2*np.pi, 100)
    >>> xx = x + 1j * x[:, np.newaxis] # a + ib over complex plane
    >>> out = np.exp(xx)
    
    
    >>> plt.subplot(121)
    >>> plt.imshow(np.abs(out),
    ...            extent=[-2*np.pi, 2*np.pi, -2*np.pi, 2*np.pi], cmap='gray')
    >>> plt.title('Magnitude of exp(x)')
    
    
    >>> plt.subplot(122)
    >>> plt.imshow(np.angle(out),
    ...            extent=[-2*np.pi, 2*np.pi, -2*np.pi, 2*np.pi], cmap='hsv')
    >>> plt.title('Phase (angle) of exp(x)')
    >>> plt.show()
    
# numpy.exp2
numpy.exp2(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'exp2'>
    
Calculate `2**p` for all `p` in the input array.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Element-wise 2 to the power `x`. This is a scalar if `x` is a scalar.
See also
`power`
#### Examples
    
    >>> import numpy as np
    >>> np.exp2([2, 3])
    array([ 4.,  8.])
    
# numpy.expand_dims
numpy.expand_dims(a, axis)[source]
    
Expand the shape of an array.
Insert a new axis that will appear at the `axis` position in the expanded array shape.
Parameters:
    
aarray_like
    
Input array.
axisint or tuple of ints
    
Position in the expanded axes where the new axis (or axes) is placed.
Deprecated since version 1.13.0: Passing an axis where `axis > a.ndim` will be treated as `axis == a.ndim`, and passing `axis < -a.ndim - 1` will be treated as `axis == 0`. This behavior is deprecated.
Returns:
    
resultndarray
    
View of `a` with the number of dimensions increased.
See also
`squeeze`
    
The inverse operation, removing singleton dimensions
`reshape`
    
Insert, remove, and combine dimensions, and resize existing ones
`atleast_1d`, `atleast_2d`, `atleast_3d`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2])
    >>> x.shape
    (2,)
    
The following is equivalent to `x[np.newaxis, :]` or `x[np.newaxis]`:
    
    >>> y = np.expand_dims(x, axis=0)
    >>> y
    array([[1, 2]])
    >>> y.shape
    (1, 2)
    
The following is equivalent to `x[:, np.newaxis]`:
    
    >>> y = np.expand_dims(x, axis=1)
    >>> y
    array([[1],
           [2]])
    >>> y.shape
    (2, 1)
    
`axis` may also be a tuple:
    
    >>> y = np.expand_dims(x, axis=(0, 1))
    >>> y
    array([[[1, 2]]])
    
    
    >>> y = np.expand_dims(x, axis=(2, 0))
    >>> y
    array([[[1],
            [2]]])
    
Note that some examples may use `None` instead of `np.newaxis`. These are the same objects:
    
    >>> np.newaxis is None
    True
    
# numpy.expm1
numpy.expm1(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'expm1'>
    
Calculate `exp(x) - 1` for all elements in the array.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Element-wise exponential minus one: `out = exp(x) - 1`. This is a scalar if `x` is a scalar.
See also
`log1p`
    
`log(1 + x)`, the inverse of expm1.
#### Notes
This function provides greater precision than `exp(x) - 1` for small values of `x`.
#### Examples
The true value of `exp(1e-10) - 1` is `1.00000000005e-10` to about 32 significant digits. This example shows the superiority of expm1 in this case.
    
    >>> import numpy as np
    
    
    >>> np.expm1(1e-10)
    1.00000000005e-10
    >>> np.exp(1e-10) - 1
    1.000000082740371e-10
    
# numpy.extract
numpy.extract(condition, arr)[source]
    
Return the elements of an array that satisfy some condition.
This is equivalent to `np.compress(ravel(condition), ravel(arr))`. If `condition` is boolean `np.extract` is equivalent to `arr[condition]`.
Note that `place` does the exact opposite of `extract`.
Parameters:
    
conditionarray_like
    
An array whose nonzero or True entries indicate the elements of `arr` to extract.
arrarray_like
    
Input array of the same size as `condition`.
Returns:
    
extractndarray
    
Rank 1 array of values from `arr` where `condition` is True.
See also
`take`, `put`, `copyto`, `compress`, `place`
#### Examples
    
    >>> import numpy as np
    >>> arr = np.arange(12).reshape((3, 4))
    >>> arr
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> condition = np.mod(arr, 3)==0
    >>> condition
    array([[ True, False, False,  True],
           [False, False,  True, False],
           [False,  True, False, False]])
    >>> np.extract(condition, arr)
    array([0, 3, 6, 9])
    
If `condition` is boolean:
    
    >>> arr[condition]
    array([0, 3, 6, 9])
    
# numpy.eye
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, device=None, like=None)[source]
    
Return a 2-D array with ones on the diagonal and zeros elsewhere.
Parameters:
    
Nint
    
Number of rows in the output.
Mint, optional
    
Number of columns in the output. If None, defaults to `N`.
kint, optional
    
Index of the diagonal: 0 (the default) refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal.
dtypedata-type, optional
    
Data-type of the returned array.
order{‘C’, ‘F’}, optional
    
Whether the output should be stored in row-major (C-style) or column-major (Fortran-style) order in memory.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
Indarray of shape (N,M)
    
An array where all elements are equal to zero, except for the `k`-th diagonal, whose values are equal to one.
See also
`identity`
    
(almost) equivalent function
`diag`
    
diagonal 2-D array from a 1-D array specified by the user.
#### Examples
    
    >>> import numpy as np
    >>> np.eye(2, dtype=int)
    array([[1, 0],
           [0, 1]])
    >>> np.eye(3, k=1)
    array([[0.,  1.,  0.],
           [0.,  0.,  1.],
           [0.,  0.,  0.]])
    
# numpy.fabs
numpy.fabs(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'fabs'>
    
Compute the absolute values element-wise.
This function returns the absolute values (positive magnitude) of the data in `x`. Complex values are not handled, use `absolute` to find the absolute values of complex data.
Parameters:
    
xarray_like
    
The array of numbers for which the absolute values are required. If `x` is a scalar, the result `y` will also be a scalar.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The absolute values of `x`, the returned values are always floats. This is a scalar if `x` is a scalar.
See also
`absolute`
    
Absolute values including `complex` types.
#### Examples
    
    >>> import numpy as np
    >>> np.fabs(-1)
    1.0
    >>> np.fabs([-1.2, 1.2])
    array([ 1.2,  1.2])
    
# numpy.fft.fft
fft.fft(a, n=None, axis=-1, norm=None, out=None)[source]
    
Compute the one-dimensional discrete Fourier Transform.
This function computes the one-dimensional n-point discrete Fourier Transform (DFT) with the efficient Fast Fourier Transform (FFT) algorithm [CT].
Parameters:
    
aarray_like
    
Input array, can be complex.
nint, optional
    
Length of the transformed axis of the output. If `n` is smaller than the length of the input, the input is cropped. If it is larger, the input is padded with zeros. If `n` is not given, the length of the input along the axis specified by `axis` is used.
axisint, optional
    
Axis over which to compute the FFT. If not given, the last axis is used.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype.
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axis indicated by `axis`, or the last one if `axis` is not specified.
Raises:
    
IndexError
    
If `axis` is not a valid axis of `a`.
See also
`numpy.fft`
    
for definition of the DFT and conventions used.
`ifft`
    
The inverse of `fft`.
`fft2`
    
The two-dimensional FFT.
`fftn`
    
The n-dimensional FFT.
`rfftn`
    
The n-dimensional FFT of real input.
`fftfreq`
    
Frequency bins for given FFT parameters.
#### Notes
FFT (Fast Fourier Transform) refers to a way the discrete Fourier Transform (DFT) can be calculated efficiently, by using symmetries in the calculated terms. The symmetry is highest when `n` is a power of 2, and the transform is therefore most efficient for these sizes.
The DFT is defined, with the conventions used in this implementation, in the documentation for the `numpy.fft` module.
#### References
[CT]
Cooley, James W., and John W. Tukey, 1965, “An algorithm for the machine calculation of complex Fourier series,” Math. Comput. 19: 297-301.
#### Examples
    
    >>> import numpy as np
    >>> np.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8))
    array([-2.33486982e-16+1.14423775e-17j,  8.00000000e+00-1.25557246e-15j,
            2.33486982e-16+2.33486982e-16j,  0.00000000e+00+1.22464680e-16j,
           -1.14423775e-17+2.33486982e-16j,  0.00000000e+00+5.20784380e-16j,
            1.14423775e-17+1.14423775e-17j,  0.00000000e+00+1.22464680e-16j])
    
In this example, real input has an FFT which is Hermitian, i.e., symmetric in the real part and anti-symmetric in the imaginary part, as described in the `numpy.fft` documentation:
    
    >>> import matplotlib.pyplot as plt
    >>> t = np.arange(256)
    >>> sp = np.fft.fft(np.sin(t))
    >>> freq = np.fft.fftfreq(t.shape[-1])
    >>> plt.plot(freq, sp.real, freq, sp.imag)
    [<matplotlib.lines.Line2D object at 0x...>, <matplotlib.lines.Line2D object at 0x...>]
    >>> plt.show()
    
# numpy.fft.fft2
fft.fft2(a, s=None, axes=(-2, -1), norm=None, out=None)[source]
    
Compute the 2-dimensional discrete Fourier Transform.
This function computes the n-dimensional discrete Fourier Transform over any axes in an M-dimensional array by means of the Fast Fourier Transform (FFT). By default, the transform is computed over the last two axes of the input array, i.e., a 2-dimensional FFT.
Parameters:
    
aarray_like
    
Input array, can be complex
ssequence of ints, optional
    
Shape (length of each transformed axis) of the output (`s[0]` refers to axis 0, `s[1]` to axis 1, etc.). This corresponds to `n` for `fft(x, n)`. Along each axis, if the given shape is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
If `s` is not given, the shape of the input along the axes specified by `axes` is used.
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the FFT. If not given, the last two axes are used. A repeated index in `axes` means the transform over that axis is performed multiple times. A one-element sequence means that a one-dimensional FFT is performed. Default: `(-2, -1)`.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must not be `None`.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for all axes (and hence only the last axis can have `s` not equal to the shape at that axis).
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axes indicated by `axes`, or the last two axes if `axes` is not given.
Raises:
    
ValueError
    
If `s` and `axes` have different length, or `axes` not given and `len(s) != 2`.
IndexError
    
If an element of `axes` is larger than than the number of axes of `a`.
See also
`numpy.fft`
    
Overall view of discrete Fourier transforms, with definitions and conventions used.
`ifft2`
    
The inverse two-dimensional FFT.
`fft`
    
The one-dimensional FFT.
`fftn`
    
The n-dimensional FFT.
`fftshift`
    
Shifts zero-frequency terms to the center of the array. For two-dimensional input, swaps first and third quadrants, and second and fourth quadrants.
#### Notes
`fft2` is just `fftn` with a different default for `axes`.
The output, analogously to `fft`, contains the term for zero frequency in the low-order corner of the transformed axes, the positive frequency terms in the first half of these axes, the term for the Nyquist frequency in the middle of the axes and the negative frequency terms in the second half of the axes, in order of decreasingly negative frequency.
See `fftn` for details and a plotting example, and `numpy.fft` for definitions and conventions used.
#### Examples
    
    >>> import numpy as np
    >>> a = np.mgrid[:5, :5][0]
    >>> np.fft.fft2(a)
    array([[ 50.  +0.j        ,   0.  +0.j        ,   0.  +0.j        , # may vary
              0.  +0.j        ,   0.  +0.j        ],
           [-12.5+17.20477401j,   0.  +0.j        ,   0.  +0.j        ,
              0.  +0.j        ,   0.  +0.j        ],
           [-12.5 +4.0614962j ,   0.  +0.j        ,   0.  +0.j        ,
              0.  +0.j        ,   0.  +0.j        ],
           [-12.5 -4.0614962j ,   0.  +0.j        ,   0.  +0.j        ,
              0.  +0.j        ,   0.  +0.j        ],
           [-12.5-17.20477401j,   0.  +0.j        ,   0.  +0.j        ,
              0.  +0.j        ,   0.  +0.j        ]])
    
# numpy.fft.fftfreq
fft.fftfreq(n, d=1.0, device=None)[source]
    
Return the Discrete Fourier Transform sample frequencies.
The returned float array `f` contains the frequency bin centers in cycles per unit of the sample spacing (with zero at the start). For instance, if the sample spacing is in seconds, then the frequency unit is cycles/second.
Given a window length `n` and a sample spacing `d`:
    
    f = [0, 1, ...,   n/2-1,     -n/2, ..., -1] / (d*n)   if n is even
    f = [0, 1, ..., (n-1)/2, -(n-1)/2, ..., -1] / (d*n)   if n is odd
    
Parameters:
    
nint
    
Window length.
dscalar, optional
    
Sample spacing (inverse of the sampling rate). Defaults to 1.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
fndarray
    
Array of length `n` containing the sample frequencies.
#### Examples
    
    >>> import numpy as np
    >>> signal = np.array([-2, 8, 6, 4, 1, 0, 3, 5], dtype=float)
    >>> fourier = np.fft.fft(signal)
    >>> n = signal.size
    >>> timestep = 0.1
    >>> freq = np.fft.fftfreq(n, d=timestep)
    >>> freq
    array([ 0.  ,  1.25,  2.5 , ..., -3.75, -2.5 , -1.25])
    
# numpy.fft.fftn
fft.fftn(a, s=None, axes=None, norm=None, out=None)[source]
    
Compute the N-dimensional discrete Fourier Transform.
This function computes the N-dimensional discrete Fourier Transform over any number of axes in an M-dimensional array by means of the Fast Fourier Transform (FFT).
Parameters:
    
aarray_like
    
Input array, can be complex.
ssequence of ints, optional
    
Shape (length of each transformed axis) of the output (`s[0]` refers to axis 0, `s[1]` to axis 1, etc.). This corresponds to `n` for `fft(x, n)`. Along any axis, if the given shape is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
If `s` is not given, the shape of the input along the axes specified by `axes` is used.
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the FFT. If not given, the last `len(s)` axes are used, or all axes if `s` is also not specified. Repeated indices in `axes` means that the transform over that axis is performed multiple times.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must be explicitly specified too.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for all axes (and hence is incompatible with passing in all but the trivial `s`).
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axes indicated by `axes`, or by a combination of `s` and `a`, as explained in the parameters section above.
Raises:
    
ValueError
    
If `s` and `axes` have different length.
IndexError
    
If an element of `axes` is larger than than the number of axes of `a`.
See also
`numpy.fft`
    
Overall view of discrete Fourier transforms, with definitions and conventions used.
`ifftn`
    
The inverse of `fftn`, the inverse n-dimensional FFT.
`fft`
    
The one-dimensional FFT, with definitions and conventions used.
`rfftn`
    
The n-dimensional FFT of real input.
`fft2`
    
The two-dimensional FFT.
`fftshift`
    
Shifts zero-frequency terms to centre of array
#### Notes
The output, analogously to `fft`, contains the term for zero frequency in the low-order corner of all axes, the positive frequency terms in the first half of all axes, the term for the Nyquist frequency in the middle of all axes and the negative frequency terms in the second half of all axes, in order of decreasingly negative frequency.
See `numpy.fft` for details, definitions and conventions used.
#### Examples
    
    >>> import numpy as np
    >>> a = np.mgrid[:3, :3, :3][0]
    >>> np.fft.fftn(a, axes=(1, 2))
    array([[[ 0.+0.j,   0.+0.j,   0.+0.j], # may vary
            [ 0.+0.j,   0.+0.j,   0.+0.j],
            [ 0.+0.j,   0.+0.j,   0.+0.j]],
           [[ 9.+0.j,   0.+0.j,   0.+0.j],
            [ 0.+0.j,   0.+0.j,   0.+0.j],
            [ 0.+0.j,   0.+0.j,   0.+0.j]],
           [[18.+0.j,   0.+0.j,   0.+0.j],
            [ 0.+0.j,   0.+0.j,   0.+0.j],
            [ 0.+0.j,   0.+0.j,   0.+0.j]]])
    >>> np.fft.fftn(a, (2, 2), axes=(0, 1))
    array([[[ 2.+0.j,  2.+0.j,  2.+0.j], # may vary
            [ 0.+0.j,  0.+0.j,  0.+0.j]],
           [[-2.+0.j, -2.+0.j, -2.+0.j],
            [ 0.+0.j,  0.+0.j,  0.+0.j]]])
    
    
    >>> import matplotlib.pyplot as plt
    >>> [X, Y] = np.meshgrid(2 * np.pi * np.arange(200) / 12,
    ...                      2 * np.pi * np.arange(200) / 34)
    >>> S = np.sin(X) + np.cos(Y) + np.random.uniform(0, 1, X.shape)
    >>> FS = np.fft.fftn(S)
    >>> plt.imshow(np.log(np.abs(np.fft.fftshift(FS))**2))
    <matplotlib.image.AxesImage object at 0x...>
    >>> plt.show()
    
# numpy.fft.fftshift
fft.fftshift(x, axes=None)[source]
    
Shift the zero-frequency component to the center of the spectrum.
This function swaps half-spaces for all axes listed (defaults to all). Note that `y[0]` is the Nyquist component only if `len(x)` is even.
Parameters:
    
xarray_like
    
Input array.
axesint or shape tuple, optional
    
Axes over which to shift. Default is None, which shifts all axes.
Returns:
    
yndarray
    
The shifted array.
See also
`ifftshift`
    
The inverse of `fftshift`.
#### Examples
    
    >>> import numpy as np
    >>> freqs = np.fft.fftfreq(10, 0.1)
    >>> freqs
    array([ 0.,  1.,  2., ..., -3., -2., -1.])
    >>> np.fft.fftshift(freqs)
    array([-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.])
    
Shift the zero-frequency component only along the second axis:
    
    >>> freqs = np.fft.fftfreq(9, d=1./9).reshape(3, 3)
    >>> freqs
    array([[ 0.,  1.,  2.],
           [ 3.,  4., -4.],
           [-3., -2., -1.]])
    >>> np.fft.fftshift(freqs, axes=(1,))
    array([[ 2.,  0.,  1.],
           [-4.,  3.,  4.],
           [-1., -3., -2.]])
    
# numpy.fft.hfft
fft.hfft(a, n=None, axis=-1, norm=None, out=None)[source]
    
Compute the FFT of a signal that has Hermitian symmetry, i.e., a real spectrum.
Parameters:
    
aarray_like
    
The input array.
nint, optional
    
Length of the transformed axis of the output. For `n` output points, `n//2 + 1` input points are necessary. If the input is longer than this, it is cropped. If it is shorter than this, it is padded with zeros. If `n` is not given, it is taken to be `2*(m-1)` where `m` is the length of the input along the axis specified by `axis`.
axisint, optional
    
Axis over which to compute the FFT. If not given, the last axis is used.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype.
New in version 2.0.0.
Returns:
    
outndarray
    
The truncated or zero-padded input, transformed along the axis indicated by `axis`, or the last one if `axis` is not specified. The length of the transformed axis is `n`, or, if `n` is not given, `2*m - 2` where `m` is the length of the transformed axis of the input. To get an odd number of output points, `n` must be specified, for instance as `2*m - 1` in the typical case,
Raises:
    
IndexError
    
If `axis` is not a valid axis of `a`.
See also
`rfft`
    
Compute the one-dimensional FFT for real input.
`ihfft`
    
The inverse of `hfft`.
#### Notes
`hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the opposite case: here the signal has Hermitian symmetry in the time domain and is real in the frequency domain. So here it’s `hfft` for which you must supply the length of the result if it is to be odd.
  * even: `ihfft(hfft(a, 2*len(a) - 2)) == a`, within roundoff error,
  * odd: `ihfft(hfft(a, 2*len(a) - 1)) == a`, within roundoff error.


The correct interpretation of the hermitian input depends on the length of the original data, as given by `n`. This is because each input shape could correspond to either an odd or even length signal. By default, `hfft` assumes an even output length which puts the last entry at the Nyquist frequency; aliasing with its symmetric counterpart. By Hermitian symmetry, the value is thus treated as purely real. To avoid losing information, the shape of the full signal must be given.
#### Examples
    
    >>> import numpy as np
    >>> signal = np.array([1, 2, 3, 4, 3, 2])
    >>> np.fft.fft(signal)
    array([15.+0.j,  -4.+0.j,   0.+0.j,  -1.-0.j,   0.+0.j,  -4.+0.j]) # may vary
    >>> np.fft.hfft(signal[:4]) # Input first half of signal
    array([15.,  -4.,   0.,  -1.,   0.,  -4.])
    >>> np.fft.hfft(signal, 6)  # Input entire signal and truncate
    array([15.,  -4.,   0.,  -1.,   0.,  -4.])
    
    
    >>> signal = np.array([[1, 1.j], [-1.j, 2]])
    >>> np.conj(signal.T) - signal   # check Hermitian symmetry
    array([[ 0.-0.j,  -0.+0.j], # may vary
           [ 0.+0.j,  0.-0.j]])
    >>> freq_spectrum = np.fft.hfft(signal)
    >>> freq_spectrum
    array([[ 1.,  1.],
           [ 2., -2.]])
    
# numpy.fft.ifft
fft.ifft(a, n=None, axis=-1, norm=None, out=None)[source]
    
Compute the one-dimensional inverse discrete Fourier Transform.
This function computes the inverse of the one-dimensional n-point discrete Fourier transform computed by `fft`. In other words, `ifft(fft(a)) == a` to within numerical accuracy. For a general description of the algorithm and definitions, see `numpy.fft`.
The input should be ordered in the same way as is returned by `fft`, i.e.,
  * `a[0]` should contain the zero frequency term,
  * `a[1:n//2]` should contain the positive-frequency terms,
  * `a[n//2 + 1:]` should contain the negative-frequency terms, in increasing order starting from the most negative frequency.


For an even number of input points, `A[n//2]` represents the sum of the values at the positive and negative Nyquist frequencies, as the two are aliased together. See `numpy.fft` for details.
Parameters:
    
aarray_like
    
Input array, can be complex.
nint, optional
    
Length of the transformed axis of the output. If `n` is smaller than the length of the input, the input is cropped. If it is larger, the input is padded with zeros. If `n` is not given, the length of the input along the axis specified by `axis` is used. See notes about padding issues.
axisint, optional
    
Axis over which to compute the inverse DFT. If not given, the last axis is used.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype.
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axis indicated by `axis`, or the last one if `axis` is not specified.
Raises:
    
IndexError
    
If `axis` is not a valid axis of `a`.
See also
`numpy.fft`
    
An introduction, with definitions and general explanations.
`fft`
    
The one-dimensional (forward) FFT, of which `ifft` is the inverse
`ifft2`
    
The two-dimensional inverse FFT.
`ifftn`
    
The n-dimensional inverse FFT.
#### Notes
If the input parameter `n` is larger than the size of the input, the input is padded by appending zeros at the end. Even though this is the common approach, it might lead to surprising results. If a different padding is desired, it must be performed before calling `ifft`.
#### Examples
    
    >>> import numpy as np
    >>> np.fft.ifft([0, 4, 0, 0])
    array([ 1.+0.j,  0.+1.j, -1.+0.j,  0.-1.j]) # may vary
    
Create and plot a band-limited signal with random phases:
    
    >>> import matplotlib.pyplot as plt
    >>> t = np.arange(400)
    >>> n = np.zeros((400,), dtype=complex)
    >>> n[40:60] = np.exp(1j*np.random.uniform(0, 2*np.pi, (20,)))
    >>> s = np.fft.ifft(n)
    >>> plt.plot(t, s.real, label='real')
    [<matplotlib.lines.Line2D object at ...>]
    >>> plt.plot(t, s.imag, '--', label='imaginary')
    [<matplotlib.lines.Line2D object at ...>]
    >>> plt.legend()
    <matplotlib.legend.Legend object at ...>
    >>> plt.show()
    
# numpy.fft.ifft2
fft.ifft2(a, s=None, axes=(-2, -1), norm=None, out=None)[source]
    
Compute the 2-dimensional inverse discrete Fourier Transform.
This function computes the inverse of the 2-dimensional discrete Fourier Transform over any number of axes in an M-dimensional array by means of the Fast Fourier Transform (FFT). In other words, `ifft2(fft2(a)) == a` to within numerical accuracy. By default, the inverse transform is computed over the last two axes of the input array.
The input, analogously to `ifft`, should be ordered in the same way as is returned by `fft2`, i.e. it should have the term for zero frequency in the low-order corner of the two axes, the positive frequency terms in the first half of these axes, the term for the Nyquist frequency in the middle of the axes and the negative frequency terms in the second half of both axes, in order of decreasingly negative frequency.
Parameters:
    
aarray_like
    
Input array, can be complex.
ssequence of ints, optional
    
Shape (length of each axis) of the output (`s[0]` refers to axis 0, `s[1]` to axis 1, etc.). This corresponds to `n` for `ifft(x, n)`. Along each axis, if the given shape is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
If `s` is not given, the shape of the input along the axes specified by `axes` is used. See notes for issue on `ifft` zero padding.
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the FFT. If not given, the last two axes are used. A repeated index in `axes` means the transform over that axis is performed multiple times. A one-element sequence means that a one-dimensional FFT is performed. Default: `(-2, -1)`.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must not be `None`.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for all axes (and hence is incompatible with passing in all but the trivial `s`).
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axes indicated by `axes`, or the last two axes if `axes` is not given.
Raises:
    
ValueError
    
If `s` and `axes` have different length, or `axes` not given and `len(s) != 2`.
IndexError
    
If an element of `axes` is larger than than the number of axes of `a`.
See also
`numpy.fft`
    
Overall view of discrete Fourier transforms, with definitions and conventions used.
`fft2`
    
The forward 2-dimensional FFT, of which `ifft2` is the inverse.
`ifftn`
    
The inverse of the n-dimensional FFT.
`fft`
    
The one-dimensional FFT.
`ifft`
    
The one-dimensional inverse FFT.
#### Notes
`ifft2` is just `ifftn` with a different default for `axes`.
See `ifftn` for details and a plotting example, and `numpy.fft` for definition and conventions used.
Zero-padding, analogously with `ifft`, is performed by appending zeros to the input along the specified dimension. Although this is the common approach, it might lead to surprising results. If another form of zero padding is desired, it must be performed before `ifft2` is called.
#### Examples
    
    >>> import numpy as np
    >>> a = 4 * np.eye(4)
    >>> np.fft.ifft2(a)
    array([[1.+0.j,  0.+0.j,  0.+0.j,  0.+0.j], # may vary
           [0.+0.j,  0.+0.j,  0.+0.j,  1.+0.j],
           [0.+0.j,  0.+0.j,  1.+0.j,  0.+0.j],
           [0.+0.j,  1.+0.j,  0.+0.j,  0.+0.j]])
    
# numpy.fft.ifftn
fft.ifftn(a, s=None, axes=None, norm=None, out=None)[source]
    
Compute the N-dimensional inverse discrete Fourier Transform.
This function computes the inverse of the N-dimensional discrete Fourier Transform over any number of axes in an M-dimensional array by means of the Fast Fourier Transform (FFT). In other words, `ifftn(fftn(a)) == a` to within numerical accuracy. For a description of the definitions and conventions used, see `numpy.fft`.
The input, analogously to `ifft`, should be ordered in the same way as is returned by `fftn`, i.e. it should have the term for zero frequency in all axes in the low-order corner, the positive frequency terms in the first half of all axes, the term for the Nyquist frequency in the middle of all axes and the negative frequency terms in the second half of all axes, in order of decreasingly negative frequency.
Parameters:
    
aarray_like
    
Input array, can be complex.
ssequence of ints, optional
    
Shape (length of each transformed axis) of the output (`s[0]` refers to axis 0, `s[1]` to axis 1, etc.). This corresponds to `n` for `ifft(x, n)`. Along any axis, if the given shape is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
If `s` is not given, the shape of the input along the axes specified by `axes` is used. See notes for issue on `ifft` zero padding.
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the IFFT. If not given, the last `len(s)` axes are used, or all axes if `s` is also not specified. Repeated indices in `axes` means that the inverse transform over that axis is performed multiple times.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must be explicitly specified too.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for all axes (and hence is incompatible with passing in all but the trivial `s`).
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axes indicated by `axes`, or by a combination of `s` or `a`, as explained in the parameters section above.
Raises:
    
ValueError
    
If `s` and `axes` have different length.
IndexError
    
If an element of `axes` is larger than than the number of axes of `a`.
See also
`numpy.fft`
    
Overall view of discrete Fourier transforms, with definitions and conventions used.
`fftn`
    
The forward n-dimensional FFT, of which `ifftn` is the inverse.
`ifft`
    
The one-dimensional inverse FFT.
`ifft2`
    
The two-dimensional inverse FFT.
`ifftshift`
    
Undoes `fftshift`, shifts zero-frequency terms to beginning of array.
#### Notes
See `numpy.fft` for definitions and conventions used.
Zero-padding, analogously with `ifft`, is performed by appending zeros to the input along the specified dimension. Although this is the common approach, it might lead to surprising results. If another form of zero padding is desired, it must be performed before `ifftn` is called.
#### Examples
    
    >>> import numpy as np
    >>> a = np.eye(4)
    >>> np.fft.ifftn(np.fft.fftn(a, axes=(0,)), axes=(1,))
    array([[1.+0.j,  0.+0.j,  0.+0.j,  0.+0.j], # may vary
           [0.+0.j,  1.+0.j,  0.+0.j,  0.+0.j],
           [0.+0.j,  0.+0.j,  1.+0.j,  0.+0.j],
           [0.+0.j,  0.+0.j,  0.+0.j,  1.+0.j]])
    
Create and plot an image with band-limited frequency content:
    
    >>> import matplotlib.pyplot as plt
    >>> n = np.zeros((200,200), dtype=complex)
    >>> n[60:80, 20:40] = np.exp(1j*np.random.uniform(0, 2*np.pi, (20, 20)))
    >>> im = np.fft.ifftn(n).real
    >>> plt.imshow(im)
    <matplotlib.image.AxesImage object at 0x...>
    >>> plt.show()
    
# numpy.fft.ifftshift
fft.ifftshift(x, axes=None)[source]
    
The inverse of `fftshift`. Although identical for even-length `x`, the functions differ by one sample for odd-length `x`.
Parameters:
    
xarray_like
    
Input array.
axesint or shape tuple, optional
    
Axes over which to calculate. Defaults to None, which shifts all axes.
Returns:
    
yndarray
    
The shifted array.
See also
`fftshift`
    
Shift zero-frequency component to the center of the spectrum.
#### Examples
    
    >>> import numpy as np
    >>> freqs = np.fft.fftfreq(9, d=1./9).reshape(3, 3)
    >>> freqs
    array([[ 0.,  1.,  2.],
           [ 3.,  4., -4.],
           [-3., -2., -1.]])
    >>> np.fft.ifftshift(np.fft.fftshift(freqs))
    array([[ 0.,  1.,  2.],
           [ 3.,  4., -4.],
           [-3., -2., -1.]])
    
# numpy.fft.ihfft
fft.ihfft(a, n=None, axis=-1, norm=None, out=None)[source]
    
Compute the inverse FFT of a signal that has Hermitian symmetry.
Parameters:
    
aarray_like
    
Input array.
nint, optional
    
Length of the inverse FFT, the number of points along transformation axis in the input to use. If `n` is smaller than the length of the input, the input is cropped. If it is larger, the input is padded with zeros. If `n` is not given, the length of the input along the axis specified by `axis` is used.
axisint, optional
    
Axis over which to compute the inverse FFT. If not given, the last axis is used.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype.
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axis indicated by `axis`, or the last one if `axis` is not specified. The length of the transformed axis is `n//2 + 1`.
See also
`hfft`, `irfft`
#### Notes
`hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the opposite case: here the signal has Hermitian symmetry in the time domain and is real in the frequency domain. So here it’s `hfft` for which you must supply the length of the result if it is to be odd:
  * even: `ihfft(hfft(a, 2*len(a) - 2)) == a`, within roundoff error,
  * odd: `ihfft(hfft(a, 2*len(a) - 1)) == a`, within roundoff error.


#### Examples
    
    >>> import numpy as np
    >>> spectrum = np.array([ 15, -4, 0, -1, 0, -4])
    >>> np.fft.ifft(spectrum)
    array([1.+0.j,  2.+0.j,  3.+0.j,  4.+0.j,  3.+0.j,  2.+0.j]) # may vary
    >>> np.fft.ihfft(spectrum)
    array([ 1.-0.j,  2.-0.j,  3.-0.j,  4.-0.j]) # may vary
    
# numpy.fft.irfft
fft.irfft(a, n=None, axis=-1, norm=None, out=None)[source]
    
Computes the inverse of `rfft`.
This function computes the inverse of the one-dimensional n-point discrete Fourier Transform of real input computed by `rfft`. In other words, `irfft(rfft(a), len(a)) == a` to within numerical accuracy. (See Notes below for why `len(a)` is necessary here.)
The input is expected to be in the form returned by `rfft`, i.e. the real zero-frequency term followed by the complex positive frequency terms in order of increasing frequency. Since the discrete Fourier Transform of real input is Hermitian-symmetric, the negative frequency terms are taken to be the complex conjugates of the corresponding positive frequency terms.
Parameters:
    
aarray_like
    
The input array.
nint, optional
    
Length of the transformed axis of the output. For `n` output points, `n//2+1` input points are necessary. If the input is longer than this, it is cropped. If it is shorter than this, it is padded with zeros. If `n` is not given, it is taken to be `2*(m-1)` where `m` is the length of the input along the axis specified by `axis`.
axisint, optional
    
Axis over which to compute the inverse FFT. If not given, the last axis is used.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype.
New in version 2.0.0.
Returns:
    
outndarray
    
The truncated or zero-padded input, transformed along the axis indicated by `axis`, or the last one if `axis` is not specified. The length of the transformed axis is `n`, or, if `n` is not given, `2*(m-1)` where `m` is the length of the transformed axis of the input. To get an odd number of output points, `n` must be specified.
Raises:
    
IndexError
    
If `axis` is not a valid axis of `a`.
See also
`numpy.fft`
    
For definition of the DFT and conventions used.
`rfft`
    
The one-dimensional FFT of real input, of which `irfft` is inverse.
`fft`
    
The one-dimensional FFT.
`irfft2`
    
The inverse of the two-dimensional FFT of real input.
`irfftn`
    
The inverse of the n-dimensional FFT of real input.
#### Notes
Returns the real valued `n`-point inverse discrete Fourier transform of `a`, where `a` contains the non-negative frequency terms of a Hermitian-symmetric sequence. `n` is the length of the result, not the input.
If you specify an `n` such that `a` must be zero-padded or truncated, the extra/removed values will be added/removed at high frequencies. One can thus resample a series to `m` points via Fourier interpolation by: `a_resamp = irfft(rfft(a), m)`.
The correct interpretation of the hermitian input depends on the length of the original data, as given by `n`. This is because each input shape could correspond to either an odd or even length signal. By default, `irfft` assumes an even output length which puts the last entry at the Nyquist frequency; aliasing with its symmetric counterpart. By Hermitian symmetry, the value is thus treated as purely real. To avoid losing information, the correct length of the real input must be given.
#### Examples
    
    >>> import numpy as np
    >>> np.fft.ifft([1, -1j, -1, 1j])
    array([0.+0.j,  1.+0.j,  0.+0.j,  0.+0.j]) # may vary
    >>> np.fft.irfft([1, -1j, -1])
    array([0.,  1.,  0.,  0.])
    
Notice how the last term in the input to the ordinary `ifft` is the complex conjugate of the second term, and the output has zero imaginary part everywhere. When calling `irfft`, the negative frequencies are not specified, and the output array is purely real.
# numpy.fft.irfft2
fft.irfft2(a, s=None, axes=(-2, -1), norm=None, out=None)[source]
    
Computes the inverse of `rfft2`.
Parameters:
    
aarray_like
    
The input array
ssequence of ints, optional
    
Shape of the real output to the inverse FFT.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
The axes over which to compute the inverse fft. Default: `(-2, -1)`, the last two axes.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must not be `None`.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for the last transformation.
New in version 2.0.0.
Returns:
    
outndarray
    
The result of the inverse real 2-D FFT.
See also
`rfft2`
    
The forward two-dimensional FFT of real input, of which `irfft2` is the inverse.
`rfft`
    
The one-dimensional FFT for real input.
`irfft`
    
The inverse of the one-dimensional FFT of real input.
`irfftn`
    
Compute the inverse of the N-dimensional FFT of real input.
#### Notes
This is really `irfftn` with different defaults. For more details see `irfftn`.
#### Examples
    
    >>> import numpy as np
    >>> a = np.mgrid[:5, :5][0]
    >>> A = np.fft.rfft2(a)
    >>> np.fft.irfft2(A, s=a.shape)
    array([[0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1.],
           [2., 2., 2., 2., 2.],
           [3., 3., 3., 3., 3.],
           [4., 4., 4., 4., 4.]])
    
# numpy.fft.irfftn
fft.irfftn(a, s=None, axes=None, norm=None, out=None)[source]
    
Computes the inverse of `rfftn`.
This function computes the inverse of the N-dimensional discrete Fourier Transform for real input over any number of axes in an M-dimensional array by means of the Fast Fourier Transform (FFT). In other words, `irfftn(rfftn(a), a.shape) == a` to within numerical accuracy. (The `a.shape` is necessary like `len(a)` is for `irfft`, and for the same reason.)
The input should be ordered in the same way as is returned by `rfftn`, i.e. as for `irfft` for the final transformation axis, and as for `ifftn` along all the other axes.
Parameters:
    
aarray_like
    
Input array.
ssequence of ints, optional
    
Shape (length of each transformed axis) of the output (`s[0]` refers to axis 0, `s[1]` to axis 1, etc.). `s` is also the number of input points used along this axis, except for the last axis, where `s[-1]//2+1` points of the input are used. Along any axis, if the shape indicated by `s` is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
If `s` is not given, the shape of the input along the axes specified by axes is used. Except for the last axis which is taken to be `2*(m-1)` where `m` is the length of the input along that axis.
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the inverse FFT. If not given, the last `len(s)` axes are used, or all axes if `s` is also not specified. Repeated indices in `axes` means that the inverse transform over that axis is performed multiple times.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must be explicitly specified too.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for the last transformation.
New in version 2.0.0.
Returns:
    
outndarray
    
The truncated or zero-padded input, transformed along the axes indicated by `axes`, or by a combination of `s` or `a`, as explained in the parameters section above. The length of each transformed axis is as given by the corresponding element of `s`, or the length of the input in every axis except for the last one if `s` is not given. In the final transformed axis the length of the output when `s` is not given is `2*(m-1)` where `m` is the length of the final transformed axis of the input. To get an odd number of output points in the final axis, `s` must be specified.
Raises:
    
ValueError
    
If `s` and `axes` have different length.
IndexError
    
If an element of `axes` is larger than than the number of axes of `a`.
See also
`rfftn`
    
The forward n-dimensional FFT of real input, of which `ifftn` is the inverse.
`fft`
    
The one-dimensional FFT, with definitions and conventions used.
`irfft`
    
The inverse of the one-dimensional FFT of real input.
`irfft2`
    
The inverse of the two-dimensional FFT of real input.
#### Notes
See `fft` for definitions and conventions used.
See `rfft` for definitions and conventions used for real input.
The correct interpretation of the hermitian input depends on the shape of the original data, as given by `s`. This is because each input shape could correspond to either an odd or even length signal. By default, `irfftn` assumes an even output length which puts the last entry at the Nyquist frequency; aliasing with its symmetric counterpart. When performing the final complex to real transform, the last value is thus treated as purely real. To avoid losing information, the correct shape of the real input must be given.
#### Examples
    
    >>> import numpy as np
    >>> a = np.zeros((3, 2, 2))
    >>> a[0, 0, 0] = 3 * 2 * 2
    >>> np.fft.irfftn(a)
    array([[[1.,  1.],
            [1.,  1.]],
           [[1.,  1.],
            [1.,  1.]],
           [[1.,  1.],
            [1.,  1.]]])
    
# numpy.fft.rfft
fft.rfft(a, n=None, axis=-1, norm=None, out=None)[source]
    
Compute the one-dimensional discrete Fourier Transform for real input.
This function computes the one-dimensional n-point discrete Fourier Transform (DFT) of a real-valued array by means of an efficient algorithm called the Fast Fourier Transform (FFT).
Parameters:
    
aarray_like
    
Input array
nint, optional
    
Number of points along transformation axis in the input to use. If `n` is smaller than the length of the input, the input is cropped. If it is larger, the input is padded with zeros. If `n` is not given, the length of the input along the axis specified by `axis` is used.
axisint, optional
    
Axis over which to compute the FFT. If not given, the last axis is used.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype.
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axis indicated by `axis`, or the last one if `axis` is not specified. If `n` is even, the length of the transformed axis is `(n/2)+1`. If `n` is odd, the length is `(n+1)/2`.
Raises:
    
IndexError
    
If `axis` is not a valid axis of `a`.
See also
`numpy.fft`
    
For definition of the DFT and conventions used.
`irfft`
    
The inverse of `rfft`.
`fft`
    
The one-dimensional FFT of general (complex) input.
`fftn`
    
The n-dimensional FFT.
`rfftn`
    
The n-dimensional FFT of real input.
#### Notes
When the DFT is computed for purely real input, the output is Hermitian-symmetric, i.e. the negative frequency terms are just the complex conjugates of the corresponding positive-frequency terms, and the negative-frequency terms are therefore redundant. This function does not compute the negative frequency terms, and the length of the transformed axis of the output is therefore `n//2 + 1`.
When `A = rfft(a)` and fs is the sampling frequency, `A[0]` contains the zero-frequency term 0*fs, which is real due to Hermitian symmetry.
If `n` is even, `A[-1]` contains the term representing both positive and negative Nyquist frequency (+fs/2 and -fs/2), and must also be purely real. If `n` is odd, there is no term at fs/2; `A[-1]` contains the largest positive frequency (fs/2*(n-1)/n), and is complex in the general case.
If the input `a` contains an imaginary part, it is silently discarded.
#### Examples
    
    >>> import numpy as np
    >>> np.fft.fft([0, 1, 0, 0])
    array([ 1.+0.j,  0.-1.j, -1.+0.j,  0.+1.j]) # may vary
    >>> np.fft.rfft([0, 1, 0, 0])
    array([ 1.+0.j,  0.-1.j, -1.+0.j]) # may vary
    
Notice how the final element of the `fft` output is the complex conjugate of the second element, for real input. For `rfft`, this symmetry is exploited to compute only the non-negative frequency terms.
# numpy.fft.rfft2
fft.rfft2(a, s=None, axes=(-2, -1), norm=None, out=None)[source]
    
Compute the 2-dimensional FFT of a real array.
Parameters:
    
aarray
    
Input array, taken to be real.
ssequence of ints, optional
    
Shape of the FFT.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the FFT. Default: `(-2, -1)`.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must not be `None`.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for the last inverse transform. incompatible with passing in all but the trivial `s`).
New in version 2.0.0.
Returns:
    
outndarray
    
The result of the real 2-D FFT.
See also
`rfftn`
    
Compute the N-dimensional discrete Fourier Transform for real input.
#### Notes
This is really just `rfftn` with different default behavior. For more details see `rfftn`.
#### Examples
    
    >>> import numpy as np
    >>> a = np.mgrid[:5, :5][0]
    >>> np.fft.rfft2(a)
    array([[ 50.  +0.j        ,   0.  +0.j        ,   0.  +0.j        ],
           [-12.5+17.20477401j,   0.  +0.j        ,   0.  +0.j        ],
           [-12.5 +4.0614962j ,   0.  +0.j        ,   0.  +0.j        ],
           [-12.5 -4.0614962j ,   0.  +0.j        ,   0.  +0.j        ],
           [-12.5-17.20477401j,   0.  +0.j        ,   0.  +0.j        ]])
    
# numpy.fft.rfftfreq
fft.rfftfreq(n, d=1.0, device=None)[source]
    
Return the Discrete Fourier Transform sample frequencies (for usage with rfft, irfft).
The returned float array `f` contains the frequency bin centers in cycles per unit of the sample spacing (with zero at the start). For instance, if the sample spacing is in seconds, then the frequency unit is cycles/second.
Given a window length `n` and a sample spacing `d`:
    
    f = [0, 1, ...,     n/2-1,     n/2] / (d*n)   if n is even
    f = [0, 1, ..., (n-1)/2-1, (n-1)/2] / (d*n)   if n is odd
    
Unlike `fftfreq` (but like `scipy.fftpack.rfftfreq`) the Nyquist frequency component is considered to be positive.
Parameters:
    
nint
    
Window length.
dscalar, optional
    
Sample spacing (inverse of the sampling rate). Defaults to 1.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
fndarray
    
Array of length `n//2 + 1` containing the sample frequencies.
#### Examples
    
    >>> import numpy as np
    >>> signal = np.array([-2, 8, 6, 4, 1, 0, 3, 5, -3, 4], dtype=float)
    >>> fourier = np.fft.rfft(signal)
    >>> n = signal.size
    >>> sample_rate = 100
    >>> freq = np.fft.fftfreq(n, d=1./sample_rate)
    >>> freq
    array([  0.,  10.,  20., ..., -30., -20., -10.])
    >>> freq = np.fft.rfftfreq(n, d=1./sample_rate)
    >>> freq
    array([  0.,  10.,  20.,  30.,  40.,  50.])
    
# numpy.fft.rfftn
fft.rfftn(a, s=None, axes=None, norm=None, out=None)[source]
    
Compute the N-dimensional discrete Fourier Transform for real input.
This function computes the N-dimensional discrete Fourier Transform over any number of axes in an M-dimensional real array by means of the Fast Fourier Transform (FFT). By default, all axes are transformed, with the real transform performed over the last axis, while the remaining transforms are complex.
Parameters:
    
aarray_like
    
Input array, taken to be real.
ssequence of ints, optional
    
Shape (length along each transformed axis) to use from the input. (`s[0]` refers to axis 0, `s[1]` to axis 1, etc.). The final element of `s` corresponds to `n` for `rfft(x, n)`, while for the remaining axes, it corresponds to `n` for `fft(x, n)`. Along any axis, if the given shape is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros.
Changed in version 2.0: If it is `-1`, the whole input is used (no padding/trimming).
If `s` is not given, the shape of the input along the axes specified by `axes` is used.
Deprecated since version 2.0: If `s` is not `None`, `axes` must not be `None` either.
Deprecated since version 2.0: `s` must contain only `int` s, not `None` values. `None` values currently mean that the default value for `n` is used in the corresponding 1-D transform, but this behaviour is deprecated.
axessequence of ints, optional
    
Axes over which to compute the FFT. If not given, the last `len(s)` axes are used, or all axes if `s` is also not specified.
Deprecated since version 2.0: If `s` is specified, the corresponding `axes` to be transformed must be explicitly specified too.
norm{“backward”, “ortho”, “forward”}, optional
    
Normalization mode (see `numpy.fft`). Default is “backward”. Indicates which direction of the forward/backward pair of transforms is scaled and with what normalization factor.
New in version 1.20.0: The “backward”, “forward” values were added.
outcomplex ndarray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype for all axes (and hence is incompatible with passing in all but the trivial `s`).
New in version 2.0.0.
Returns:
    
outcomplex ndarray
    
The truncated or zero-padded input, transformed along the axes indicated by `axes`, or by a combination of `s` and `a`, as explained in the parameters section above. The length of the last axis transformed will be `s[-1]//2+1`, while the remaining transformed axes will have lengths according to `s`, or unchanged from the input.
Raises:
    
ValueError
    
If `s` and `axes` have different length.
IndexError
    
If an element of `axes` is larger than than the number of axes of `a`.
See also
`irfftn`
    
The inverse of `rfftn`, i.e. the inverse of the n-dimensional FFT of real input.
`fft`
    
The one-dimensional FFT, with definitions and conventions used.
`rfft`
    
The one-dimensional FFT of real input.
`fftn`
    
The n-dimensional FFT.
`rfft2`
    
The two-dimensional FFT of real input.
#### Notes
The transform for real input is performed over the last transformation axis, as by `rfft`, then the transform over the remaining axes is performed as by `fftn`. The order of the output is as for `rfft` for the final transformation axis, and as for `fftn` for the remaining transformation axes.
See `fft` for details, definitions and conventions used.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ones((2, 2, 2))
    >>> np.fft.rfftn(a)
    array([[[8.+0.j,  0.+0.j], # may vary
            [0.+0.j,  0.+0.j]],
           [[0.+0.j,  0.+0.j],
            [0.+0.j,  0.+0.j]]])
    
    
    >>> np.fft.rfftn(a, axes=(2, 0))
    array([[[4.+0.j,  0.+0.j], # may vary
            [4.+0.j,  0.+0.j]],
           [[0.+0.j,  0.+0.j],
            [0.+0.j,  0.+0.j]]])
    
# numpy.fill_diagonal
numpy.fill_diagonal(a, val, wrap=False)[source]
    
Fill the main diagonal of the given array of any dimensionality.
For an array `a` with `a.ndim >= 2`, the diagonal is the list of values `a[i, ..., i]` with indices `i` all identical. This function modifies the input array in-place without returning a value.
Parameters:
    
aarray, at least 2-D.
    
Array whose diagonal is to be filled in-place.
valscalar or array_like
    
Value(s) to write on the diagonal. If `val` is scalar, the value is written along the diagonal. If array-like, the flattened `val` is written along the diagonal, repeating if necessary to fill all diagonal entries.
wrapbool
    
For tall matrices in NumPy version up to 1.6.2, the diagonal “wrapped” after N columns. You can have this behavior with this option. This affects only tall matrices.
See also
`diag_indices`, `diag_indices_from`
#### Notes
This functionality can be obtained via `diag_indices`, but internally this version uses a much faster implementation that never constructs the indices and uses simple slicing.
#### Examples
    
    >>> import numpy as np
    >>> a = np.zeros((3, 3), int)
    >>> np.fill_diagonal(a, 5)
    >>> a
    array([[5, 0, 0],
           [0, 5, 0],
           [0, 0, 5]])
    
The same function can operate on a 4-D array:
    
    >>> a = np.zeros((3, 3, 3, 3), int)
    >>> np.fill_diagonal(a, 4)
    
We only show a few blocks for clarity:
    
    >>> a[0, 0]
    array([[4, 0, 0],
           [0, 0, 0],
           [0, 0, 0]])
    >>> a[1, 1]
    array([[0, 0, 0],
           [0, 4, 0],
           [0, 0, 0]])
    >>> a[2, 2]
    array([[0, 0, 0],
           [0, 0, 0],
           [0, 0, 4]])
    
The wrap option affects only tall matrices:
    
    >>> # tall matrices no wrap
    >>> a = np.zeros((5, 3), int)
    >>> np.fill_diagonal(a, 4)
    >>> a
    array([[4, 0, 0],
           [0, 4, 0],
           [0, 0, 4],
           [0, 0, 0],
           [0, 0, 0]])
    
    
    >>> # tall matrices wrap
    >>> a = np.zeros((5, 3), int)
    >>> np.fill_diagonal(a, 4, wrap=True)
    >>> a
    array([[4, 0, 0],
           [0, 4, 0],
           [0, 0, 4],
           [0, 0, 0],
           [4, 0, 0]])
    
    
    >>> # wide matrices
    >>> a = np.zeros((3, 5), int)
    >>> np.fill_diagonal(a, 4, wrap=True)
    >>> a
    array([[4, 0, 0, 0, 0],
           [0, 4, 0, 0, 0],
           [0, 0, 4, 0, 0]])
    
The anti-diagonal can be filled by reversing the order of elements using either `numpy.flipud` or `numpy.fliplr`.
    
    >>> a = np.zeros((3, 3), int);
    >>> np.fill_diagonal(np.fliplr(a), [1,2,3])  # Horizontal flip
    >>> a
    array([[0, 0, 1],
           [0, 2, 0],
           [3, 0, 0]])
    >>> np.fill_diagonal(np.flipud(a), [1,2,3])  # Vertical flip
    >>> a
    array([[0, 0, 3],
           [0, 2, 0],
           [1, 0, 0]])
    
Note that the order in which the diagonal is filled varies depending on the flip function.
# numpy.finfo
classnumpy.finfo(dtype)[source]
    
Machine limits for floating point types.
Parameters:
    
dtypefloat, dtype, or instance
    
Kind of floating point or complex floating point data-type about which to get information.
See also
`iinfo`
    
The equivalent for integer data types.
`spacing`
    
The distance between a value and the nearest adjacent number
`nextafter`
    
The next floating point value after x1 towards x2
#### Notes
For developers of NumPy: do not instantiate this at the module level. The initial calculation of these parameters is expensive and negatively impacts import times. These objects are cached, so calling `finfo()` repeatedly inside your functions is not a problem.
Note that `smallest_normal` is not actually the smallest positive representable value in a NumPy floating point type. As in the IEEE-754 standard [1], NumPy floating point types make use of subnormal numbers to fill the gap between 0 and `smallest_normal`. However, subnormal numbers may have significantly reduced precision [2].
This function can also be used for complex data types as well. If used, the output will be the same as the corresponding real float type (e.g. numpy.finfo(numpy.csingle) is the same as numpy.finfo(numpy.single)). However, the output is true for the real and imaginary components.
#### References
[1]
IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2008, pp.1-70, 2008, https://doi.org/10.1109/IEEESTD.2008.4610935
[2]
Wikipedia, “Denormal Numbers”, https://en.wikipedia.org/wiki/Denormal_number
#### Examples
    
    >>> import numpy as np
    >>> np.finfo(np.float64).dtype
    dtype('float64')
    >>> np.finfo(np.complex64).dtype
    dtype('float32')
    
Attributes:
    
bitsint
    
The number of bits occupied by the type.
dtypedtype
    
Returns the dtype for which `finfo` returns information. For complex input, the returned dtype is the associated `float*` dtype for its real and complex components.
epsfloat
    
The difference between 1.0 and the next smallest representable float larger than 1.0. For example, for 64-bit binary floats in the IEEE-754 standard, `eps = 2**-52`, approximately 2.22e-16.
epsnegfloat
    
The difference between 1.0 and the next smallest representable float less than 1.0. For example, for 64-bit binary floats in the IEEE-754 standard, `epsneg = 2**-53`, approximately 1.11e-16.
iexpint
    
The number of bits in the exponent portion of the floating point representation.
machepint
    
The exponent that yields `eps`.
maxfloating point number of the appropriate type
    
The largest representable number.
maxexpint
    
The smallest positive power of the base (2) that causes overflow.
minfloating point number of the appropriate type
    
The smallest representable number, typically `-max`.
minexpint
    
The most negative power of the base (2) consistent with there being no leading 0’s in the mantissa.
negepint
    
The exponent that yields `epsneg`.
nexpint
    
The number of bits in the exponent including its sign and bias.
nmantint
    
The number of bits in the mantissa.
precisionint
    
The approximate number of decimal digits to which this kind of float is precise.
resolutionfloating point number of the appropriate type
    
The approximate decimal resolution of this type, i.e., `10**-precision`.
`tiny`float
    
Return the value for tiny, alias of smallest_normal.
`smallest_normal`float
    
Return the value for the smallest normal.
smallest_subnormalfloat
    
The smallest positive floating point number with 0 as leading bit in the mantissa following IEEE-754.
# numpy.finfo.smallest_normal
property
propertyfinfo.smallest_normal
    
Return the value for the smallest normal.
Returns:
    
smallest_normalfloat
    
Value for the smallest normal.
Warns:
    
UserWarning
    
If the calculated value for the smallest normal is requested for double-double.
# numpy.finfo.tiny
property
propertyfinfo.tiny
    
Return the value for tiny, alias of smallest_normal.
Returns:
    
tinyfloat
    
Value for the smallest normal, alias of smallest_normal.
Warns:
    
UserWarning
    
If the calculated value for the smallest normal is requested for double-double.
# numpy.fix
numpy.fix(x, out=None)[source]
    
Round to nearest integer towards zero.
Round an array of floats element-wise to nearest integer towards zero. The rounded values have the same data-type as the input.
Parameters:
    
xarray_like
    
An array to be rounded
outndarray, optional
    
A location into which the result is stored. If provided, it must have a shape that the input broadcasts to. If not provided or None, a freshly-allocated array is returned.
Returns:
    
outndarray of floats
    
An array with the same dimensions and data-type as the input. If second argument is not supplied then a new array is returned with the rounded values.
If a second argument is supplied the result is stored there. The return value `out` is then a reference to that array.
See also
`rint`, `trunc`, `floor`, `ceil`
`around`
    
Round to given number of decimals
#### Examples
    
    >>> import numpy as np
    >>> np.fix(3.14)
    3.0
    >>> np.fix(3)
    3
    >>> np.fix([2.1, 2.9, -2.1, -2.9])
    array([ 2.,  2., -2., -2.])
    
# numpy.flatiter.base
attribute
flatiter.base
    
A reference to the array that is iterated over.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(5)
    >>> fl = x.flat
    >>> fl.base is x
    True
    
# numpy.flatiter.coords
attribute
flatiter.coords
    
An N-dimensional tuple of current coordinates.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6).reshape(2, 3)
    >>> fl = x.flat
    >>> fl.coords
    (0, 0)
    >>> next(fl)
    0
    >>> fl.coords
    (0, 1)
    
# numpy.flatiter.copy
method
flatiter.copy()
    
Get a copy of the iterator as a 1-D array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6).reshape(2, 3)
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> fl = x.flat
    >>> fl.copy()
    array([0, 1, 2, 3, 4, 5])
    
# numpy.flatiter
classnumpy.flatiter[source]
    
Flat iterator object to iterate over arrays.
A `flatiter` iterator is returned by `x.flat` for any array `x`. It allows iterating over the array as if it were a 1-D array, either in a for-loop or by calling its `next` method.
Iteration is done in row-major, C-style order (the last index varying the fastest). The iterator can also be indexed using basic slicing or advanced indexing.
See also
`ndarray.flat`
    
Return a flat iterator over an array.
`ndarray.flatten`
    
Returns a flattened copy of an array.
#### Notes
A `flatiter` iterator can not be constructed directly from Python code by calling the `flatiter` constructor.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6).reshape(2, 3)
    >>> fl = x.flat
    >>> type(fl)
    <class 'numpy.flatiter'>
    >>> for item in fl:
    ...     print(item)
    ...
    0
    1
    2
    3
    4
    5
    
    
    >>> fl[2:4]
    array([2, 3])
    
Attributes:
    
`base`
    
A reference to the array that is iterated over.
`coords`
    
An N-dimensional tuple of current coordinates.
`index`
    
Current flat index into the array.
#### Methods
`copy`()
Get a copy of the iterator as a 1-D array.  
# numpy.flatiter.index
attribute
flatiter.index
    
Current flat index into the array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6).reshape(2, 3)
    >>> fl = x.flat
    >>> fl.index
    0
    >>> next(fl)
    0
    >>> fl.index
    1
    
# numpy.flatnonzero
numpy.flatnonzero(a)[source]
    
Return indices that are non-zero in the flattened version of a.
This is equivalent to `np.nonzero(np.ravel(a))[0]`.
Parameters:
    
aarray_like
    
Input data.
Returns:
    
resndarray
    
Output array, containing the indices of the elements of `a.ravel()` that are non-zero.
See also
`nonzero`
    
Return the indices of the non-zero elements of the input array.
`ravel`
    
Return a 1-D array containing the elements of the input array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(-2, 3)
    >>> x
    array([-2, -1,  0,  1,  2])
    >>> np.flatnonzero(x)
    array([0, 1, 3, 4])
    
Use the indices of the non-zero elements as an index array to extract these elements:
    
    >>> x.ravel()[np.flatnonzero(x)]
    array([-2, -1,  1,  2])
    
# numpy.flip
numpy.flip(m, axis=None)[source]
    
Reverse the order of elements in an array along the given axis.
The shape of the array is preserved, but the elements are reordered.
Parameters:
    
marray_like
    
Input array.
axisNone or int or tuple of ints, optional
    
Axis or axes along which to flip over. The default, axis=None, will flip over all of the axes of the input array. If axis is negative it counts from the last to the first axis.
If axis is a tuple of ints, flipping is performed on all of the axes specified in the tuple.
Returns:
    
outarray_like
    
A view of `m` with the entries of axis reversed. Since a view is returned, this operation is done in constant time.
See also
`flipud`
    
Flip an array vertically (axis=0).
`fliplr`
    
Flip an array horizontally (axis=1).
#### Notes
flip(m, 0) is equivalent to flipud(m).
flip(m, 1) is equivalent to fliplr(m).
flip(m, n) corresponds to `m[...,::-1,...]` with `::-1` at position n.
flip(m) corresponds to `m[::-1,::-1,...,::-1]` with `::-1` at all positions.
flip(m, (0, 1)) corresponds to `m[::-1,::-1,...]` with `::-1` at position 0 and position 1.
#### Examples
    
    >>> import numpy as np
    >>> A = np.arange(8).reshape((2,2,2))
    >>> A
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    >>> np.flip(A, 0)
    array([[[4, 5],
            [6, 7]],
           [[0, 1],
            [2, 3]]])
    >>> np.flip(A, 1)
    array([[[2, 3],
            [0, 1]],
           [[6, 7],
            [4, 5]]])
    >>> np.flip(A)
    array([[[7, 6],
            [5, 4]],
           [[3, 2],
            [1, 0]]])
    >>> np.flip(A, (0, 2))
    array([[[5, 4],
            [7, 6]],
           [[1, 0],
            [3, 2]]])
    >>> rng = np.random.default_rng()
    >>> A = rng.normal(size=(3,4,5))
    >>> np.all(np.flip(A,2) == A[:,:,::-1,...])
    True
    
# numpy.fliplr
numpy.fliplr(m)[source]
    
Reverse the order of elements along axis 1 (left/right).
For a 2-D array, this flips the entries in each row in the left/right direction. Columns are preserved, but appear in a different order than before.
Parameters:
    
marray_like
    
Input array, must be at least 2-D.
Returns:
    
fndarray
    
A view of `m` with the columns reversed. Since a view is returned, this operation is \\(\mathcal O(1)\\).
See also
`flipud`
    
Flip array in the up/down direction.
`flip`
    
Flip array in one or more dimensions.
`rot90`
    
Rotate array counterclockwise.
#### Notes
Equivalent to `m[:,::-1]` or `np.flip(m, axis=1)`. Requires the array to be at least 2-D.
#### Examples
    
    >>> import numpy as np
    >>> A = np.diag([1.,2.,3.])
    >>> A
    array([[1.,  0.,  0.],
           [0.,  2.,  0.],
           [0.,  0.,  3.]])
    >>> np.fliplr(A)
    array([[0.,  0.,  1.],
           [0.,  2.,  0.],
           [3.,  0.,  0.]])
    
    
    >>> rng = np.random.default_rng()
    >>> A = rng.normal(size=(2,3,5))
    >>> np.all(np.fliplr(A) == A[:,::-1,...])
    True
    
# numpy.flipud
numpy.flipud(m)[source]
    
Reverse the order of elements along axis 0 (up/down).
For a 2-D array, this flips the entries in each column in the up/down direction. Rows are preserved, but appear in a different order than before.
Parameters:
    
marray_like
    
Input array.
Returns:
    
outarray_like
    
A view of `m` with the rows reversed. Since a view is returned, this operation is \\(\mathcal O(1)\\).
See also
`fliplr`
    
Flip array in the left/right direction.
`flip`
    
Flip array in one or more dimensions.
`rot90`
    
Rotate array counterclockwise.
#### Notes
Equivalent to `m[::-1, ...]` or `np.flip(m, axis=0)`. Requires the array to be at least 1-D.
#### Examples
    
    >>> import numpy as np
    >>> A = np.diag([1.0, 2, 3])
    >>> A
    array([[1.,  0.,  0.],
           [0.,  2.,  0.],
           [0.,  0.,  3.]])
    >>> np.flipud(A)
    array([[0.,  0.,  3.],
           [0.,  2.,  0.],
           [1.,  0.,  0.]])
    
    
    >>> rng = np.random.default_rng()
    >>> A = rng.normal(size=(2,3,5))
    >>> np.all(np.flipud(A) == A[::-1,...])
    True
    
    
    >>> np.flipud([1,2])
    array([2, 1])
    
# numpy.float_power
numpy.float_power(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'float_power'>
    
First array elements raised to powers from second array, element-wise.
Raise each base in `x1` to the positionally-corresponding power in `x2`. `x1` and `x2` must be broadcastable to the same shape. This differs from the power function in that integers, float16, and float32 are promoted to floats with a minimum precision of float64 so that the result is always inexact. The intent is that the function will return a usable result for negative powers and seldom overflow for positive powers.
Negative values raised to a non-integral value will return `nan`. To get complex results, cast the input to complex, or specify the `dtype` to be `complex` (see the example below).
Parameters:
    
x1array_like
    
The bases.
x2array_like
    
The exponents. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The bases in `x1` raised to the exponents in `x2`. This is a scalar if both `x1` and `x2` are scalars.
See also
`power`
    
power function that preserves type
#### Examples
    
    >>> import numpy as np
    
Cube each element in a list.
    
    >>> x1 = range(6)
    >>> x1
    [0, 1, 2, 3, 4, 5]
    >>> np.float_power(x1, 3)
    array([   0.,    1.,    8.,   27.,   64.,  125.])
    
Raise the bases to different exponents.
    
    >>> x2 = [1.0, 2.0, 3.0, 3.0, 2.0, 1.0]
    >>> np.float_power(x1, x2)
    array([  0.,   1.,   8.,  27.,  16.,   5.])
    
The effect of broadcasting.
    
    >>> x2 = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]])
    >>> x2
    array([[1, 2, 3, 3, 2, 1],
           [1, 2, 3, 3, 2, 1]])
    >>> np.float_power(x1, x2)
    array([[  0.,   1.,   8.,  27.,  16.,   5.],
           [  0.,   1.,   8.,  27.,  16.,   5.]])
    
Negative values raised to a non-integral value will result in `nan` (and a warning will be generated).
    
    >>> x3 = np.array([-1, -4])
    >>> with np.errstate(invalid='ignore'):
    ...     p = np.float_power(x3, 1.5)
    ...
    >>> p
    array([nan, nan])
    
To get complex results, give the argument `dtype=complex`.
    
    >>> np.float_power(x3, 1.5, dtype=complex)
    array([-1.83697020e-16-1.j, -1.46957616e-15-8.j])
    
# numpy.floor
numpy.floor(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'floor'>
    
Return the floor of the input, element-wise.
The floor of the scalar `x` is the largest integer `i`, such that `i <= x`. It is often denoted as \\(\lfloor x \rfloor\\).
Parameters:
    
xarray_like
    
Input data.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The floor of each element in `x`. This is a scalar if `x` is a scalar.
See also
`ceil`, `trunc`, `rint`, `fix`
#### Notes
Some spreadsheet programs calculate the “floor-towards-zero”, where `floor(-2.5) == -2`. NumPy instead uses the definition of `floor` where `floor(-2.5) == -3`. The “floor-towards-zero” function is called `fix` in NumPy.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0])
    >>> np.floor(a)
    array([-2., -2., -1.,  0.,  1.,  1.,  2.])
    
# numpy.floor_divide
numpy.floor_divide(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'floor_divide'>
    
Return the largest integer smaller or equal to the division of the inputs. It is equivalent to the Python `//` operator and pairs with the Python `%` (`remainder`), function so that `a = a % b + b * (a // b)` up to roundoff.
Parameters:
    
x1array_like
    
Numerator.
x2array_like
    
Denominator. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
y = floor(`x1`/`x2`) This is a scalar if both `x1` and `x2` are scalars.
See also
`remainder`
    
Remainder complementary to floor_divide.
`divmod`
    
Simultaneous floor division and remainder.
`divide`
    
Standard division.
`floor`
    
Round a number to the nearest integer toward minus infinity.
`ceil`
    
Round a number to the nearest integer toward infinity.
#### Examples
    
    >>> import numpy as np
    >>> np.floor_divide(7,3)
    2
    >>> np.floor_divide([1., 2., 3., 4.], 2.5)
    array([ 0.,  0.,  1.,  1.])
    
The `//` operator can be used as a shorthand for `np.floor_divide` on ndarrays.
    
    >>> x1 = np.array([1., 2., 3., 4.])
    >>> x1 // 2.5
    array([0., 0., 1., 1.])
    
# numpy.fmax
numpy.fmax(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'fmax'>
    
Element-wise maximum of array elements.
Compare two arrays and return a new array containing the element-wise maxima. If one of the elements being compared is a NaN, then the non-nan element is returned. If both elements are NaNs then the first is returned. The latter distinction is important for complex NaNs, which are defined as at least one of the real or imaginary parts being a NaN. The net effect is that NaNs are ignored when possible.
Parameters:
    
x1, x2array_like
    
The arrays holding the elements to be compared. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The maximum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
See also
`fmin`
    
Element-wise minimum of two arrays, ignores NaNs.
`maximum`
    
Element-wise maximum of two arrays, propagates NaNs.
`amax`
    
The maximum value of an array along a given axis, propagates NaNs.
`nanmax`
    
The maximum value of an array along a given axis, ignores NaNs.
`minimum`, `amin`, `nanmin`
#### Notes
The fmax is equivalent to `np.where(x1 >= x2, x1, x2)` when neither x1 nor x2 are NaNs, but it is faster and does proper broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.fmax([2, 3, 4], [1, 5, 2])
    array([ 2,  5,  4])
    
    
    >>> np.fmax(np.eye(2), [0.5, 2])
    array([[ 1. ,  2. ],
           [ 0.5,  2. ]])
    
    
    >>> np.fmax([np.nan, 0, np.nan],[0, np.nan, np.nan])
    array([ 0.,  0., nan])
    
# numpy.fmin
numpy.fmin(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'fmin'>
    
Element-wise minimum of array elements.
Compare two arrays and return a new array containing the element-wise minima. If one of the elements being compared is a NaN, then the non-nan element is returned. If both elements are NaNs then the first is returned. The latter distinction is important for complex NaNs, which are defined as at least one of the real or imaginary parts being a NaN. The net effect is that NaNs are ignored when possible.
Parameters:
    
x1, x2array_like
    
The arrays holding the elements to be compared. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The minimum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
See also
`fmax`
    
Element-wise maximum of two arrays, ignores NaNs.
`minimum`
    
Element-wise minimum of two arrays, propagates NaNs.
`amin`
    
The minimum value of an array along a given axis, propagates NaNs.
`nanmin`
    
The minimum value of an array along a given axis, ignores NaNs.
`maximum`, `amax`, `nanmax`
#### Notes
The fmin is equivalent to `np.where(x1 <= x2, x1, x2)` when neither x1 nor x2 are NaNs, but it is faster and does proper broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.fmin([2, 3, 4], [1, 5, 2])
    array([1, 3, 2])
    
    
    >>> np.fmin(np.eye(2), [0.5, 2])
    array([[ 0.5,  0. ],
           [ 0. ,  1. ]])
    
    
    >>> np.fmin([np.nan, 0, np.nan],[0, np.nan, np.nan])
    array([ 0.,  0., nan])
    
# numpy.fmod
numpy.fmod(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'fmod'>
    
Returns the element-wise remainder of division.
This is the NumPy implementation of the C library function fmod, the remainder has the same sign as the dividend `x1`. It is equivalent to the Matlab(TM) `rem` function and should not be confused with the Python modulus operator `x1 % x2`.
Parameters:
    
x1array_like
    
Dividend.
x2array_like
    
Divisor. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yarray_like
    
The remainder of the division of `x1` by `x2`. This is a scalar if both `x1` and `x2` are scalars.
See also
`remainder`
    
Equivalent to the Python `%` operator.
`divide`
#### Notes
The result of the modulo operation for negative dividend and divisors is bound by conventions. For `fmod`, the sign of result is the sign of the dividend, while for `remainder` the sign of the result is the sign of the divisor. The `fmod` function is equivalent to the Matlab(TM) `rem` function.
#### Examples
    
    >>> import numpy as np
    >>> np.fmod([-3, -2, -1, 1, 2, 3], 2)
    array([-1,  0, -1,  1,  0,  1])
    >>> np.remainder([-3, -2, -1, 1, 2, 3], 2)
    array([1, 0, 1, 1, 0, 1])
    
    
    >>> np.fmod([5, 3], [2, 2.])
    array([ 1.,  1.])
    >>> a = np.arange(-3, 3).reshape(3, 2)
    >>> a
    array([[-3, -2],
           [-1,  0],
           [ 1,  2]])
    >>> np.fmod(a, [2,2])
    array([[-1,  0],
           [-1,  0],
           [ 1,  0]])
    
# numpy.format_float_positional
numpy.format_float_positional(x, precision=None, unique=True, fractional=True, trim='k', sign=False, pad_left=None, pad_right=None, min_digits=None)[source]
    
Format a floating-point scalar as a decimal string in positional notation.
Provides control over rounding, trimming and padding. Uses and assumes IEEE unbiased rounding. Uses the “Dragon4” algorithm.
Parameters:
    
xpython float or numpy floating scalar
    
Value to format.
precisionnon-negative integer or None, optional
    
Maximum number of digits to print. May be None if `unique` is `True`, but must be an integer if unique is `False`.
uniqueboolean, optional
    
If `True`, use a digit-generation strategy which gives the shortest representation which uniquely identifies the floating-point number from other values of the same type, by judicious rounding. If `precision` is given fewer digits than necessary can be printed, or if `min_digits` is given more can be printed, in which cases the last digit is rounded with unbiased rounding. If `False`, digits are generated as if printing an infinite-precision value and stopping after `precision` digits, rounding the remaining value with unbiased rounding
fractionalboolean, optional
    
If `True`, the cutoffs of `precision` and `min_digits` refer to the total number of digits after the decimal point, including leading zeros. If `False`, `precision` and `min_digits` refer to the total number of significant digits, before or after the decimal point, ignoring leading zeros.
trimone of ‘k’, ‘.’, ‘0’, ‘-’, optional
    
Controls post-processing trimming of trailing digits, as follows:
  * ‘k’ : keep trailing zeros, keep decimal point (no trimming)
  * ‘.’ : trim all trailing zeros, leave decimal point
  * ‘0’ : trim all but the zero before the decimal point. Insert the zero if it is missing.
  * ‘-’ : trim trailing zeros and any trailing decimal point


signboolean, optional
    
Whether to show the sign for positive values.
pad_leftnon-negative integer, optional
    
Pad the left side of the string with whitespace until at least that many characters are to the left of the decimal point.
pad_rightnon-negative integer, optional
    
Pad the right side of the string with whitespace until at least that many characters are to the right of the decimal point.
min_digitsnon-negative integer or None, optional
    
Minimum number of digits to print. Only has an effect if `unique=True` in which case additional digits past those necessary to uniquely identify the value may be printed, rounding the last additional digit.
New in version 1.21.0.
Returns:
    
repstring
    
The string representation of the floating point value
See also
`format_float_scientific`
#### Examples
    
    >>> import numpy as np
    >>> np.format_float_positional(np.float32(np.pi))
    '3.1415927'
    >>> np.format_float_positional(np.float16(np.pi))
    '3.14'
    >>> np.format_float_positional(np.float16(0.3))
    '0.3'
    >>> np.format_float_positional(np.float16(0.3), unique=False, precision=10)
    '0.3000488281'
    
# numpy.format_float_scientific
numpy.format_float_scientific(x, precision=None, unique=True, trim='k', sign=False, pad_left=None, exp_digits=None, min_digits=None)[source]
    
Format a floating-point scalar as a decimal string in scientific notation.
Provides control over rounding, trimming and padding. Uses and assumes IEEE unbiased rounding. Uses the “Dragon4” algorithm.
Parameters:
    
xpython float or numpy floating scalar
    
Value to format.
precisionnon-negative integer or None, optional
    
Maximum number of digits to print. May be None if `unique` is `True`, but must be an integer if unique is `False`.
uniqueboolean, optional
    
If `True`, use a digit-generation strategy which gives the shortest representation which uniquely identifies the floating-point number from other values of the same type, by judicious rounding. If `precision` is given fewer digits than necessary can be printed. If `min_digits` is given more can be printed, in which cases the last digit is rounded with unbiased rounding. If `False`, digits are generated as if printing an infinite-precision value and stopping after `precision` digits, rounding the remaining value with unbiased rounding
trimone of ‘k’, ‘.’, ‘0’, ‘-’, optional
    
Controls post-processing trimming of trailing digits, as follows:
  * ‘k’ : keep trailing zeros, keep decimal point (no trimming)
  * ‘.’ : trim all trailing zeros, leave decimal point
  * ‘0’ : trim all but the zero before the decimal point. Insert the zero if it is missing.
  * ‘-’ : trim trailing zeros and any trailing decimal point


signboolean, optional
    
Whether to show the sign for positive values.
pad_leftnon-negative integer, optional
    
Pad the left side of the string with whitespace until at least that many characters are to the left of the decimal point.
exp_digitsnon-negative integer, optional
    
Pad the exponent with zeros until it contains at least this many digits. If omitted, the exponent will be at least 2 digits.
min_digitsnon-negative integer or None, optional
    
Minimum number of digits to print. This only has an effect for `unique=True`. In that case more digits than necessary to uniquely identify the value may be printed and rounded unbiased.
New in version 1.21.0.
Returns:
    
repstring
    
The string representation of the floating point value
See also
`format_float_positional`
#### Examples
    
    >>> import numpy as np
    >>> np.format_float_scientific(np.float32(np.pi))
    '3.1415927e+00'
    >>> s = np.float32(1.23e24)
    >>> np.format_float_scientific(s, unique=False, precision=15)
    '1.230000071797338e+24'
    >>> np.format_float_scientific(s, exp_digits=4)
    '1.23e+0024'
    
# numpy.frexp
numpy.frexp(x, [out1, out2, ]/, [out=(None, None), ]*, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'frexp'>
    
Decompose the elements of x into mantissa and twos exponent.
Returns (`mantissa`, `exponent`), where `x = mantissa * 2**exponent`. The mantissa lies in the open interval(-1, 1), while the twos exponent is a signed integer.
Parameters:
    
xarray_like
    
Array of numbers to be decomposed.
out1ndarray, optional
    
Output array for the mantissa. Must have the same shape as `x`.
out2ndarray, optional
    
Output array for the exponent. Must have the same shape as `x`.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
mantissandarray
    
Floating values between -1 and 1. This is a scalar if `x` is a scalar.
exponentndarray
    
Integer exponents of 2. This is a scalar if `x` is a scalar.
See also
`ldexp`
    
Compute `y = x1 * 2**x2`, the inverse of `frexp`.
#### Notes
Complex dtypes are not supported, they will raise a TypeError.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(9)
    >>> y1, y2 = np.frexp(x)
    >>> y1
    array([ 0.   ,  0.5  ,  0.5  ,  0.75 ,  0.5  ,  0.625,  0.75 ,  0.875,
            0.5  ])
    >>> y2
    array([0, 1, 2, 2, 3, 3, 3, 3, 4], dtype=int32)
    >>> y1 * 2**y2
    array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.])
    
# numpy.from_dlpack
numpy.from_dlpack(x, /, *, device=None, copy=None)
    
Create a NumPy array from an object implementing the `__dlpack__` protocol. Generally, the returned NumPy array is a read-only view of the input object. See [1] and [2] for more details.
Parameters:
    
xobject
    
A Python object that implements the `__dlpack__` and `__dlpack_device__` methods.
devicedevice, optional
    
Device on which to place the created array. Default: `None`. Must be `"cpu"` if passed which may allow importing an array that is not already CPU available.
copybool, optional
    
Boolean indicating whether or not to copy the input. If `True`, the copy will be made. If `False`, the function will never copy, and will raise `BufferError` in case a copy is deemed necessary. Passing it requests a copy from the exporter who may or may not implement the capability. If `None`, the function will reuse the existing memory buffer if possible and copy otherwise. Default: `None`.
Returns:
    
outndarray
#### References
[1]
Array API documentation, https://data-apis.org/array-api/latest/design_topics/data_interchange.html#syntax-for-data-interchange-with-dlpack
[2]
Python specification for DLPack, https://dmlc.github.io/dlpack/latest/python_spec.html
#### Examples
    
    >>> import torch  
    >>> x = torch.arange(10)  
    >>> # create a view of the torch tensor "x" in NumPy
    >>> y = np.from_dlpack(x)  
    
# numpy.frombuffer
numpy.frombuffer(buffer, dtype=float, count=-1, offset=0, *, like=None)
    
Interpret a buffer as a 1-dimensional array.
Parameters:
    
bufferbuffer_like
    
An object that exposes the buffer interface.
dtypedata-type, optional
    
Data-type of the returned array; default: float.
countint, optional
    
Number of items to read. `-1` means all data in the buffer.
offsetint, optional
    
Start reading the buffer from this offset (in bytes); default: 0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
See also
`ndarray.tobytes`
    
Inverse of this operation, construct Python bytes from the raw data bytes in the array.
#### Notes
If the buffer has data that is not in machine byte-order, this should be specified as part of the data-type, e.g.:
    
    >>> dt = np.dtype(int)
    >>> dt = dt.newbyteorder('>')
    >>> np.frombuffer(buf, dtype=dt) 
    
The data of the resulting array will not be byteswapped, but will be interpreted correctly.
This function creates a view into the original object. This should be safe in general, but it may make sense to copy the result when the original object is mutable or untrusted.
#### Examples
    
    >>> import numpy as np
    >>> s = b'hello world'
    >>> np.frombuffer(s, dtype='S1', count=5, offset=6)
    array([b'w', b'o', b'r', b'l', b'd'], dtype='|S1')
    
    
    >>> np.frombuffer(b'\x01\x02', dtype=np.uint8)
    array([1, 2], dtype=uint8)
    >>> np.frombuffer(b'\x01\x02\x03\x04\x05', dtype=np.uint8, count=3)
    array([1, 2, 3], dtype=uint8)
    
# numpy.fromfile
numpy.fromfile(file, dtype=float, count=-1, sep='', offset=0, *, like=None)
    
Construct an array from data in a text or binary file.
A highly efficient way of reading binary data with a known data-type, as well as parsing simply formatted text files. Data written using the `tofile` method can be read using this function.
Parameters:
    
filefile or str or Path
    
Open file object or filename.
dtypedata-type
    
Data type of the returned array. For binary files, it is used to determine the size and byte-order of the items in the file. Most builtin numeric types are supported and extension types may be supported.
countint
    
Number of items to read. `-1` means all items (i.e., the complete file).
sepstr
    
Separator between items if file is a text file. Empty (“”) separator means the file should be treated as binary. Spaces (” “) in the separator match zero or more whitespace characters. A separator consisting only of spaces must match at least one whitespace.
offsetint
    
The offset (in bytes) from the file’s current position. Defaults to 0. Only permitted for binary files.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
See also
`load`, `save`
`ndarray.tofile`
`loadtxt`
    
More flexible way of loading data from a text file.
#### Notes
Do not rely on the combination of `tofile` and `fromfile` for data storage, as the binary files generated are not platform independent. In particular, no byte-order or data-type information is saved. Data can be stored in the platform independent `.npy` format using `save` and `load` instead.
#### Examples
Construct an ndarray:
    
    >>> import numpy as np
    >>> dt = np.dtype([('time', [('min', np.int64), ('sec', np.int64)]),
    ...                ('temp', float)])
    >>> x = np.zeros((1,), dtype=dt)
    >>> x['time']['min'] = 10; x['temp'] = 98.25
    >>> x
    array([((10, 0), 98.25)],
          dtype=[('time', [('min', '<i8'), ('sec', '<i8')]), ('temp', '<f8')])
    
Save the raw data to disk:
    
    >>> import tempfile
    >>> fname = tempfile.mkstemp()[1]
    >>> x.tofile(fname)
    
Read the raw data from disk:
    
    >>> np.fromfile(fname, dtype=dt)
    array([((10, 0), 98.25)],
          dtype=[('time', [('min', '<i8'), ('sec', '<i8')]), ('temp', '<f8')])
    
The recommended way to store and load data:
    
    >>> np.save(fname, x)
    >>> np.load(fname + '.npy')
    array([((10, 0), 98.25)],
          dtype=[('time', [('min', '<i8'), ('sec', '<i8')]), ('temp', '<f8')])
    
# numpy.fromfunction
numpy.fromfunction(function, shape, *, dtype=<class 'float'>, like=None, **kwargs)[source]
    
Construct an array by executing a function over each coordinate.
The resulting array therefore has a value `fn(x, y, z)` at coordinate `(x, y, z)`.
Parameters:
    
functioncallable
    
The function is called with N parameters, where N is the rank of `shape`. Each parameter represents the coordinates of the array varying along a specific axis. For example, if `shape` were `(2, 2)`, then the parameters would be `array([[0, 0], [1, 1]])` and `array([[0, 1], [0, 1]])`
shape(N,) tuple of ints
    
Shape of the output array, which also determines the shape of the coordinate arrays passed to `function`.
dtypedata-type, optional
    
Data-type of the coordinate arrays passed to `function`. By default, `dtype` is float.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
fromfunctionany
    
The result of the call to `function` is passed back directly. Therefore the shape of `fromfunction` is completely determined by `function`. If `function` returns a scalar value, the shape of `fromfunction` would not match the `shape` parameter.
See also
`indices`, `meshgrid`
#### Notes
Keywords other than `dtype` and `like` are passed to `function`.
#### Examples
    
    >>> import numpy as np
    >>> np.fromfunction(lambda i, j: i, (2, 2), dtype=float)
    array([[0., 0.],
           [1., 1.]])
    
    
    >>> np.fromfunction(lambda i, j: j, (2, 2), dtype=float)
    array([[0., 1.],
           [0., 1.]])
    
    
    >>> np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
    array([[ True, False, False],
           [False,  True, False],
           [False, False,  True]])
    
    
    >>> np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4]])
    
# numpy.fromiter
numpy.fromiter(iter, dtype, count=-1, *, like=None)
    
Create a new 1-dimensional array from an iterable object.
Parameters:
    
iteriterable object
    
An iterable object providing data for the array.
dtypedata-type
    
The data-type of the returned array.
Changed in version 1.23: Object and subarray dtypes are now supported (note that the final result is not 1-D for a subarray dtype).
countint, optional
    
The number of items to read from iterable. The default is -1, which means all data is read.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
The output array.
#### Notes
Specify `count` to improve performance. It allows `fromiter` to pre-allocate the output array, instead of resizing it on demand.
#### Examples
    
    >>> import numpy as np
    >>> iterable = (x*x for x in range(5))
    >>> np.fromiter(iterable, float)
    array([  0.,   1.,   4.,   9.,  16.])
    
A carefully constructed subarray dtype will lead to higher dimensional results:
    
    >>> iterable = ((x+1, x+2) for x in range(5))
    >>> np.fromiter(iterable, dtype=np.dtype((int, 2)))
    array([[1, 2],
           [2, 3],
           [3, 4],
           [4, 5],
           [5, 6]])
    
# numpy.frompyfunc
numpy.frompyfunc(func, /, nin, nout, *[, identity])
    
Takes an arbitrary Python function and returns a NumPy ufunc.
Can be used, for example, to add broadcasting to a built-in Python function (see Examples section).
Parameters:
    
funcPython function object
    
An arbitrary Python function.
ninint
    
The number of input arguments.
noutint
    
The number of objects returned by `func`.
identityobject, optional
    
The value to use for the `identity` attribute of the resulting object. If specified, this is equivalent to setting the underlying C `identity` field to `PyUFunc_IdentityValue`. If omitted, the identity is set to `PyUFunc_None`. Note that this is _not_ equivalent to setting the identity to `None`, which implies the operation is reorderable.
Returns:
    
outufunc
    
Returns a NumPy universal function (`ufunc`) object.
See also
`vectorize`
    
Evaluates pyfunc over input arrays using broadcasting rules of numpy.
#### Notes
The returned ufunc always returns PyObject arrays.
#### Examples
Use frompyfunc to add broadcasting to the Python function `oct`:
    
    >>> import numpy as np
    >>> oct_array = np.frompyfunc(oct, 1, 1)
    >>> oct_array(np.array((10, 30, 100)))
    array(['0o12', '0o36', '0o144'], dtype=object)
    >>> np.array((oct(10), oct(30), oct(100))) # for comparison
    array(['0o12', '0o36', '0o144'], dtype='<U5')
    
# numpy.fromregex
numpy.fromregex(file, regexp, dtype, encoding=None)[source]
    
Construct an array from a text file, using regular expression parsing.
The returned array is always a structured array, and is constructed from all matches of the regular expression in the file. Groups in the regular expression are converted to fields of the structured array.
Parameters:
    
filefile, str, or pathlib.Path
    
Filename or file object to read.
Changed in version 1.22.0: Now accepts `os.PathLike` implementations.
regexpstr or regexp
    
Regular expression used to parse the file. Groups in the regular expression correspond to fields in the dtype.
dtypedtype or list of dtypes
    
Dtype for the structured array; must be a structured datatype.
encodingstr, optional
    
Encoding used to decode the inputfile. Does not apply to input streams.
Returns:
    
outputndarray
    
The output array, containing the part of the content of `file` that was matched by `regexp`. `output` is always a structured array.
Raises:
    
TypeError
    
When `dtype` is not a valid dtype for a structured array.
See also
`fromstring`, `loadtxt`
#### Notes
Dtypes for structured arrays can be specified in several forms, but all forms specify at least the data type and field name. For details see `basics.rec`.
#### Examples
    
    >>> import numpy as np
    >>> from io import StringIO
    >>> text = StringIO("1312 foo\n1534  bar\n444   qux")
    
    
    >>> regexp = r"(\d+)\s+(...)"  # match [digits, whitespace, anything]
    >>> output = np.fromregex(text, regexp,
    ...                       [('num', np.int64), ('key', 'S3')])
    >>> output
    array([(1312, b'foo'), (1534, b'bar'), ( 444, b'qux')],
          dtype=[('num', '<i8'), ('key', 'S3')])
    >>> output['num']
    array([1312, 1534,  444])
    
# numpy.fromstring
numpy.fromstring(string, dtype=float, count=-1, *, sep, like=None)
    
A new 1-D array initialized from text data in a string.
Parameters:
    
stringstr
    
A string containing the data.
dtypedata-type, optional
    
The data type of the array; default: float. For binary input data, the data must be in exactly this format. Most builtin numeric types are supported and extension types may be supported.
countint, optional
    
Read this number of `dtype` elements from the data. If this is negative (the default), the count will be determined from the length of the data.
sepstr, optional
    
The string separating numbers in the data; extra whitespace between elements is also ignored.
Deprecated since version 1.14: Passing `sep=''`, the default, is deprecated since it will trigger the deprecated binary mode of this function. This mode interprets `string` as binary bytes, rather than ASCII text with decimal numbers, an operation which is better spelt `frombuffer(string, dtype, count)`. If `string` contains unicode text, the binary mode of `fromstring` will first encode it into bytes using utf-8, which will not produce sane results.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
arrndarray
    
The constructed array.
Raises:
    
ValueError
    
If the string is not the correct size to satisfy the requested `dtype` and `count`.
See also
`frombuffer`, `fromfile`, `fromiter`
#### Examples
    
    >>> import numpy as np
    >>> np.fromstring('1 2', dtype=int, sep=' ')
    array([1, 2])
    >>> np.fromstring('1, 2', dtype=int, sep=',')
    array([1, 2])
    
# numpy.full
numpy.full(shape, fill_value, dtype=None, order='C', *, device=None, like=None)[source]
    
Return a new array of given shape and type, filled with `fill_value`.
Parameters:
    
shapeint or sequence of ints
    
Shape of the new array, e.g., `(2, 3)` or `2`.
fill_valuescalar or array_like
    
Fill value.
dtypedata-type, optional
    
The desired data-type for the array The default, None, means
    
`np.array(fill_value).dtype`.
order{‘C’, ‘F’}, optional
    
Whether to store multidimensional data in C- or Fortran-contiguous (row- or column-wise) order in memory.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Array of `fill_value` with the given shape, dtype, and order.
See also
`full_like`
    
Return a new array with shape of input filled with value.
`empty`
    
Return a new uninitialized array.
`ones`
    
Return a new array setting values to one.
`zeros`
    
Return a new array setting values to zero.
#### Examples
    
    >>> import numpy as np
    >>> np.full((2, 2), np.inf)
    array([[inf, inf],
           [inf, inf]])
    >>> np.full((2, 2), 10)
    array([[10, 10],
           [10, 10]])
    
    
    >>> np.full((2, 2), [1, 2])
    array([[1, 2],
           [1, 2]])
    
# numpy.full_like
numpy.full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None, *, device=None)[source]
    
Return a full array with the same shape and type as a given array.
Parameters:
    
aarray_like
    
The shape and data-type of `a` define these same attributes of the returned array.
fill_valuearray_like
    
Fill value.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `a`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outndarray
    
Array of `fill_value` with the same shape and type as `a`.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`ones_like`
    
Return an array of ones with shape and type of input.
`zeros_like`
    
Return an array of zeros with shape and type of input.
`full`
    
Return a new array of given shape filled with value.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6, dtype=int)
    >>> np.full_like(x, 1)
    array([1, 1, 1, 1, 1, 1])
    >>> np.full_like(x, 0.1)
    array([0, 0, 0, 0, 0, 0])
    >>> np.full_like(x, 0.1, dtype=np.double)
    array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
    >>> np.full_like(x, np.nan, dtype=np.double)
    array([nan, nan, nan, nan, nan, nan])
    
    
    >>> y = np.arange(6, dtype=np.double)
    >>> np.full_like(y, 0.1)
    array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
    
    
    >>> y = np.zeros([2, 2, 3], dtype=int)
    >>> np.full_like(y, [0, 0, 255])
    array([[[  0,   0, 255],
            [  0,   0, 255]],
           [[  0,   0, 255],
            [  0,   0, 255]]])
    
# numpy.gcd
numpy.gcd(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'gcd'>
    
Returns the greatest common divisor of `|x1|` and `|x2|`
Parameters:
    
x1, x2array_like, int
    
Arrays of values. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
Returns:
    
yndarray or scalar
    
The greatest common divisor of the absolute value of the inputs This is a scalar if both `x1` and `x2` are scalars.
See also
`lcm`
    
The lowest common multiple
#### Examples
    
    >>> import numpy as np
    >>> np.gcd(12, 20)
    4
    >>> np.gcd.reduce([15, 25, 35])
    5
    >>> np.gcd(np.arange(6), 20)
    array([20,  1,  2,  1,  4,  5])
    
# numpy.generic.__array__
method
generic.__array__()
    
sc.__array__(dtype) return 0-dim array from scalar with specified dtype
# numpy.generic.__array_interface__
attribute
generic.__array_interface__
    
Array protocol: Python side
# numpy.generic.__array_priority__
attribute
generic.__array_priority__
    
Array priority.
# numpy.generic.__array_struct__
attribute
generic.__array_struct__
    
Array protocol: struct
# numpy.generic.__array_wrap__
method
generic.__array_wrap__()
    
__array_wrap__ implementation for scalar types
# numpy.generic.__reduce__
method
generic.__reduce__()
    
Helper for pickle.
# numpy.generic.__setstate__
method
generic.__setstate__()
# numpy.generic.base
attribute
generic.base
    
Scalar attribute identical to the corresponding array attribute.
Please see `ndarray.base`.
# numpy.generic.byteswap
method
generic.byteswap()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.byteswap`.
# numpy.generic.data
attribute
generic.data
    
Pointer to start of data.
# numpy.generic.dtype
attribute
generic.dtype
    
Get array data-descriptor.
# numpy.generic.flags
attribute
generic.flags
    
The integer value of flags.
# numpy.generic.flat
attribute
generic.flat
    
A 1-D view of the scalar.
# numpy.generic.imag
attribute
generic.imag
    
The imaginary part of the scalar.
# numpy.generic.itemsize
attribute
generic.itemsize
    
The length of one element in bytes.
# numpy.generic.ndim
attribute
generic.ndim
    
The number of array dimensions.
# numpy.generic.real
attribute
generic.real
    
The real part of the scalar.
# numpy.generic.setflags
method
generic.setflags()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.setflags`.
# numpy.generic.shape
attribute
generic.shape
    
Tuple of array dimensions.
# numpy.generic.size
attribute
generic.size
    
The number of elements in the gentype.
# numpy.generic.squeeze
method
generic.squeeze()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.squeeze`.
# numpy.generic.strides
attribute
generic.strides
    
Tuple of bytes steps in each dimension.
# numpy.generic.T
attribute
generic.T
    
Scalar attribute identical to the corresponding array attribute.
Please see `ndarray.T`.
# numpy.genfromtxt
numpy.genfromtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=" !#$%&'()*+, -./:;<=>?@[\\\\]^{|}~", replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding=None, *, ndmin=0, like=None)[source]
    
Load data from a text file, with missing values handled as specified.
Each line past the first `skip_header` lines is split at the `delimiter` character, and characters following the `comments` character are discarded.
Parameters:
    
fnamefile, str, pathlib.Path, list of str, generator
    
File, filename, list, or generator to read. If the filename extension is `.gz` or `.bz2`, the file is first decompressed. Note that generators must return bytes or strings. The strings in a list or produced by a generator are treated as lines.
dtypedtype, optional
    
Data type of the resulting array. If None, the dtypes will be determined by the contents of each column, individually.
commentsstr, optional
    
The character used to indicate the start of a comment. All the characters occurring on a line after a comment are discarded.
delimiterstr, int, or sequence, optional
    
The string used to separate values. By default, any consecutive whitespaces act as delimiter. An integer or sequence of integers can also be provided as width(s) of each field.
skiprowsint, optional
    
`skiprows` was removed in numpy 1.10. Please use `skip_header` instead.
skip_headerint, optional
    
The number of lines to skip at the beginning of the file.
skip_footerint, optional
    
The number of lines to skip at the end of the file.
convertersvariable, optional
    
The set of functions that convert the data of a column to a value. The converters can also be used to provide a default value for missing data: `converters = {3: lambda s: float(s or 0)}`.
missingvariable, optional
    
`missing` was removed in numpy 1.10. Please use `missing_values` instead.
missing_valuesvariable, optional
    
The set of strings corresponding to missing data.
filling_valuesvariable, optional
    
The set of values to be used as default when the data are missing.
usecolssequence, optional
    
Which columns to read, with 0 being the first. For example, `usecols = (1, 4, 5)` will extract the 2nd, 5th and 6th columns.
names{None, True, str, sequence}, optional
    
If `names` is True, the field names are read from the first line after the first `skip_header` lines. This line can optionally be preceded by a comment delimiter. Any content before the comment delimiter is discarded. If `names` is a sequence or a single-string of comma-separated names, the names will be used to define the field names in a structured dtype. If `names` is None, the names of the dtype fields will be used, if any.
excludelistsequence, optional
    
A list of names to exclude. This list is appended to the default list [‘return’,’file’,’print’]. Excluded names are appended with an underscore: for example, `file` would become `file_`.
deletecharsstr, optional
    
A string combining invalid characters that must be deleted from the names.
defaultfmtstr, optional
    
A format used to define default field names, such as “f%i” or “f_%02i”.
autostripbool, optional
    
Whether to automatically strip white spaces from the variables.
replace_spacechar, optional
    
Character(s) used in replacement of white spaces in the variable names. By default, use a ‘_’.
case_sensitive{True, False, ‘upper’, ‘lower’}, optional
    
If True, field names are case sensitive. If False or ‘upper’, field names are converted to upper case. If ‘lower’, field names are converted to lower case.
unpackbool, optional
    
If True, the returned array is transposed, so that arguments may be unpacked using `x, y, z = genfromtxt(...)`. When used with a structured data-type, arrays are returned for each field. Default is False.
usemaskbool, optional
    
If True, return a masked array. If False, return a regular array.
loosebool, optional
    
If True, do not raise errors for invalid values.
invalid_raisebool, optional
    
If True, an exception is raised if an inconsistency is detected in the number of columns. If False, a warning is emitted and the offending lines are skipped.
max_rowsint, optional
    
The maximum number of rows to read. Must not be used with skip_footer at the same time. If given, the value must be at least 1. Default is to read the entire file.
encodingstr, optional
    
Encoding used to decode the inputfile. Does not apply when `fname` is a file object. The special value ‘bytes’ enables backward compatibility workarounds that ensure that you receive byte arrays when possible and passes latin1 encoded strings to converters. Override this value to receive unicode arrays and pass strings as input to converters. If set to None the system default is used. The default value is ‘bytes’.
Changed in version 2.0: Before NumPy 2, the default was `'bytes'` for Python 2 compatibility. The default is now `None`.
ndminint, optional
    
Same parameter as `loadtxt`
New in version 1.23.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Data read from the text file. If `usemask` is True, this is a masked array.
See also
`numpy.loadtxt`
    
equivalent function when no data is missing.
#### Notes
  * When spaces are used as delimiters, or when no delimiter has been given as input, there should not be any missing data between two fields.
  * When variables are named (either by a flexible dtype or with a `names` sequence), there must not be any header in the file (else a ValueError exception is raised).
  * Individual values are not stripped of spaces by default. When using a custom converter, make sure the function does remove spaces.
  * Custom converters may receive unexpected values due to dtype discovery.


#### References
[1]
NumPy User Guide, section I/O with NumPy.
#### Examples
    
    >>> from io import StringIO
    >>> import numpy as np
    
Comma delimited file with mixed dtype
    
    >>> s = StringIO("1,1.3,abcde")
    >>> data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
    ... ('mystring','S5')], delimiter=",")
    >>> data
    array((1, 1.3, b'abcde'),
          dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])
    
Using dtype = None
    
    >>> _ = s.seek(0) # needed for StringIO example only
    >>> data = np.genfromtxt(s, dtype=None,
    ... names = ['myint','myfloat','mystring'], delimiter=",")
    >>> data
    array((1, 1.3, 'abcde'),
          dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', '<U5')])
    
Specifying dtype and names
    
    >>> _ = s.seek(0)
    >>> data = np.genfromtxt(s, dtype="i8,f8,S5",
    ... names=['myint','myfloat','mystring'], delimiter=",")
    >>> data
    array((1, 1.3, b'abcde'),
          dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])
    
An example with fixed-width columns
    
    >>> s = StringIO("11.3abcde")
    >>> data = np.genfromtxt(s, dtype=None, names=['intvar','fltvar','strvar'],
    ...     delimiter=[1,3,5])
    >>> data
    array((1, 1.3, 'abcde'),
          dtype=[('intvar', '<i8'), ('fltvar', '<f8'), ('strvar', '<U5')])
    
An example to show comments
    
    >>> f = StringIO('''
    ... text,# of chars
    ... hello world,11
    ... numpy,5''')
    >>> np.genfromtxt(f, dtype='S12,S12', delimiter=',')
    array([(b'text', b''), (b'hello world', b'11'), (b'numpy', b'5')],
      dtype=[('f0', 'S12'), ('f1', 'S12')])
    
# numpy.geomspace
numpy.geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0)[source]
    
Return numbers spaced evenly on a log scale (a geometric progression).
This is similar to `logspace`, but with endpoints specified directly. Each output sample is a constant multiple of the previous.
Parameters:
    
startarray_like
    
The starting value of the sequence.
stoparray_like
    
The final value of the sequence, unless `endpoint` is False. In that case, `num + 1` values are spaced over the interval in log-space, of which all but the last (a sequence of length `num`) are returned.
numinteger, optional
    
Number of samples to generate. Default is 50.
endpointboolean, optional
    
If true, `stop` is the last sample. Otherwise, it is not included. Default is True.
dtypedtype
    
The type of the output array. If `dtype` is not given, the data type is inferred from `start` and `stop`. The inferred dtype will never be an integer; `float` is chosen even if the arguments would produce an array of integers.
axisint, optional
    
The axis in the result to store the samples. Relevant only if start or stop are array-like. By default (0), the samples will be along a new axis inserted at the beginning. Use -1 to get an axis at the end.
Returns:
    
samplesndarray
    
`num` samples, equally spaced on a log scale.
See also
`logspace`
    
Similar to geomspace, but with endpoints specified using log and base.
`linspace`
    
Similar to geomspace, but with arithmetic instead of geometric progression.
`arange`
    
Similar to linspace, with the step size specified instead of the number of samples.
How to create arrays with regularly-spaced values
#### Notes
If the inputs or dtype are complex, the output will follow a logarithmic spiral in the complex plane. (There are an infinite number of spirals passing through two points; the output will follow the shortest such path.)
#### Examples
    
    >>> import numpy as np
    >>> np.geomspace(1, 1000, num=4)
    array([    1.,    10.,   100.,  1000.])
    >>> np.geomspace(1, 1000, num=3, endpoint=False)
    array([   1.,   10.,  100.])
    >>> np.geomspace(1, 1000, num=4, endpoint=False)
    array([   1.        ,    5.62341325,   31.6227766 ,  177.827941  ])
    >>> np.geomspace(1, 256, num=9)
    array([   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.])
    
Note that the above may not produce exact integers:
    
    >>> np.geomspace(1, 256, num=9, dtype=int)
    array([  1,   2,   4,   7,  16,  32,  63, 127, 256])
    >>> np.around(np.geomspace(1, 256, num=9)).astype(int)
    array([  1,   2,   4,   8,  16,  32,  64, 128, 256])
    
Negative, decreasing, and complex inputs are allowed:
    
    >>> np.geomspace(1000, 1, num=4)
    array([1000.,  100.,   10.,    1.])
    >>> np.geomspace(-1000, -1, num=4)
    array([-1000.,  -100.,   -10.,    -1.])
    >>> np.geomspace(1j, 1000j, num=4)  # Straight line
    array([0.   +1.j, 0.  +10.j, 0. +100.j, 0.+1000.j])
    >>> np.geomspace(-1+0j, 1+0j, num=5)  # Circle
    array([-1.00000000e+00+1.22464680e-16j, -7.07106781e-01+7.07106781e-01j,
            6.12323400e-17+1.00000000e+00j,  7.07106781e-01+7.07106781e-01j,
            1.00000000e+00+0.00000000e+00j])
    
Graphical illustration of `endpoint` parameter:
    
    >>> import matplotlib.pyplot as plt
    >>> N = 10
    >>> y = np.zeros(N)
    >>> plt.semilogx(np.geomspace(1, 1000, N, endpoint=True), y + 1, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.semilogx(np.geomspace(1, 1000, N, endpoint=False), y + 2, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.axis([0.5, 2000, 0, 3])
    [0.5, 2000, 0, 3]
    >>> plt.grid(True, color='0.7', linestyle='-', which='both', axis='both')
    >>> plt.show()
    
# numpy.get_include
numpy.get_include()[source]
    
Return the directory that contains the NumPy *.h header files.
Extension modules that need to compile against NumPy may need to use this function to locate the appropriate include directory.
#### Notes
When using `setuptools`, for example in `setup.py`:
    
    import numpy as np
    ...
    Extension('extension_name', ...
              include_dirs=[np.get_include()])
    ...
    
Note that a CLI tool `numpy-config` was introduced in NumPy 2.0, using that is likely preferred for build systems other than `setuptools`:
    
    $ numpy-config --cflags
    -I/path/to/site-packages/numpy/_core/include
    
    # Or rely on pkg-config:
    $ export PKG_CONFIG_PATH=$(numpy-config --pkgconfigdir)
    $ pkg-config --cflags
    -I/path/to/site-packages/numpy/_core/include
    
#### Examples
    
    >>> np.get_include()
    '.../site-packages/numpy/core/include'  # may vary
    
# numpy.get_printoptions
numpy.get_printoptions()[source]
    
Return the current print options.
Returns:
    
print_optsdict
    
Dictionary of current print options with keys
  * precision : int
  * threshold : int
  * edgeitems : int
  * linewidth : int
  * suppress : bool
  * nanstr : str
  * infstr : str
  * sign : str
  * formatter : dict of callables
  * floatmode : str
  * legacy : str or False


For a full description of these options, see `set_printoptions`.
See also
`set_printoptions`, `printoptions`
#### Examples
    
    >>> import numpy as np
    
    
    >>> np.get_printoptions()
    {'edgeitems': 3, 'threshold': 1000, ..., 'override_repr': None}
    
    
    >>> np.get_printoptions()['linewidth']
    75
    >>> np.set_printoptions(linewidth=100)
    >>> np.get_printoptions()['linewidth']
    100
    
# numpy.getbufsize
numpy.getbufsize()[source]
    
Return the size of the buffer used in ufuncs.
Returns:
    
getbufsizeint
    
Size of ufunc buffer in bytes.
#### Examples
    
    >>> import numpy as np
    >>> np.getbufsize()
    8192
    
# numpy.geterr
numpy.geterr()[source]
    
Get the current way of handling floating-point errors.
Returns:
    
resdict
    
A dictionary with keys “divide”, “over”, “under”, and “invalid”, whose values are from the strings “ignore”, “print”, “log”, “warn”, “raise”, and “call”. The keys represent possible floating-point exceptions, and the values define how these exceptions are handled.
See also
`geterrcall`, `seterr`, `seterrcall`
#### Notes
For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`.
#### Examples
    
    >>> import numpy as np
    >>> np.geterr()
    {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
    >>> np.arange(3.) / np.arange(3.)  
    array([nan,  1.,  1.])
    RuntimeWarning: invalid value encountered in divide
    
    
    >>> oldsettings = np.seterr(all='warn', invalid='raise')
    >>> np.geterr()
    {'divide': 'warn', 'over': 'warn', 'under': 'warn', 'invalid': 'raise'}
    >>> np.arange(3.) / np.arange(3.)
    Traceback (most recent call last):
      ...
    FloatingPointError: invalid value encountered in divide
    >>> oldsettings = np.seterr(**oldsettings)  # restore original
    
# numpy.geterrcall
numpy.geterrcall()[source]
    
Return the current callback function used on floating-point errors.
When the error handling for a floating-point error (one of “divide”, “over”, “under”, or “invalid”) is set to ‘call’ or ‘log’, the function that is called or the log instance that is written to is returned by `geterrcall`. This function or log instance has been set with `seterrcall`.
Returns:
    
errobjcallable, log instance or None
    
The current error handler. If no handler was set through `seterrcall`, `None` is returned.
See also
`seterrcall`, `seterr`, `geterr`
#### Notes
For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`.
#### Examples
    
    >>> import numpy as np
    >>> np.geterrcall()  # we did not yet set a handler, returns None
    
    
    >>> orig_settings = np.seterr(all='call')
    >>> def err_handler(type, flag):
    ...     print("Floating point error (%s), with flag %s" % (type, flag))
    >>> old_handler = np.seterrcall(err_handler)
    >>> np.array([1, 2, 3]) / 0.0
    Floating point error (divide by zero), with flag 1
    array([inf, inf, inf])
    
    
    >>> cur_handler = np.geterrcall()
    >>> cur_handler is err_handler
    True
    >>> old_settings = np.seterr(**orig_settings)  # restore original
    >>> old_handler = np.seterrcall(None)  # restore original
    
# numpy.gradient
numpy.gradient(f, *varargs, axis=None, edge_order=1)[source]
    
Return the gradient of an N-dimensional array.
The gradient is computed using second order accurate central differences in the interior points and either first or second order accurate one-sides (forward or backwards) differences at the boundaries. The returned gradient hence has the same shape as the input array.
Parameters:
    
farray_like
    
An N-dimensional array containing samples of a scalar function.
varargslist of scalar or array, optional
    
Spacing between f values. Default unitary spacing for all dimensions. Spacing can be specified using:
  1. single scalar to specify a sample distance for all dimensions.
  2. N scalars to specify a constant sample distance for each dimension. i.e. `dx`, `dy`, `dz`, …
  3. N arrays to specify the coordinates of the values along each dimension of F. The length of the array must match the size of the corresponding dimension
  4. Any combination of N scalars/arrays with the meaning of 2. and 3.


If `axis` is given, the number of varargs must equal the number of axes. Default: 1. (see Examples below).
edge_order{1, 2}, optional
    
Gradient is calculated using N-th order accurate differences at the boundaries. Default: 1.
axisNone or int or tuple of ints, optional
    
Gradient is calculated only along the given axis or axes The default (axis = None) is to calculate the gradient for all the axes of the input array. axis may be negative, in which case it counts from the last to the first axis.
Returns:
    
gradientndarray or tuple of ndarray
    
A tuple of ndarrays (or a single ndarray if there is only one dimension) corresponding to the derivatives of f with respect to each dimension. Each derivative has the same shape as f.
#### Notes
Assuming that \\(f\in C^{3}\\) (i.e., \\(f\\) has at least 3 continuous derivatives) and let \\(h_{*}\\) be a non-homogeneous stepsize, we minimize the “consistency error” \\(\eta_{i}\\) between the true gradient and its estimate from a linear combination of the neighboring grid-points:
\\[\eta_{i} = f_{i}^{\left(1\right)} - \left[ \alpha f\left(x_{i}\right) + \beta f\left(x_{i} + h_{d}\right) + \gamma f\left(x_{i}-h_{s}\right) \right]\\]
By substituting \\(f(x_{i} + h_{d})\\) and \\(f(x_{i} - h_{s})\\) with their Taylor series expansion, this translates into solving the following the linear system:
\\[\begin{split}\left\\{ \begin{array}{r} \alpha+\beta+\gamma=0 \\\ \beta h_{d}-\gamma h_{s}=1 \\\ \beta h_{d}^{2}+\gamma h_{s}^{2}=0 \end{array} \right.\end{split}\\]
The resulting approximation of \\(f_{i}^{(1)}\\) is the following:
\\[\hat f_{i}^{(1)} = \frac{ h_{s}^{2}f\left(x_{i} + h_{d}\right) + \left(h_{d}^{2} - h_{s}^{2}\right)f\left(x_{i}\right) - h_{d}^{2}f\left(x_{i}-h_{s}\right)} { h_{s}h_{d}\left(h_{d} + h_{s}\right)} + \mathcal{O}\left(\frac{h_{d}h_{s}^{2} + h_{s}h_{d}^{2}}{h_{d} + h_{s}}\right)\\]
It is worth noting that if \\(h_{s}=h_{d}\\) (i.e., data are evenly spaced) we find the standard second order approximation:
\\[\hat f_{i}^{(1)}= \frac{f\left(x_{i+1}\right) - f\left(x_{i-1}\right)}{2h} + \mathcal{O}\left(h^{2}\right)\\]
With a similar procedure the forward/backward approximations used for boundaries can be derived.
#### References
[1]
Quarteroni A., Sacco R., Saleri F. (2007) Numerical Mathematics (Texts in Applied Mathematics). New York: Springer.
[2]
Durran D. R. (1999) Numerical Methods for Wave Equations in Geophysical Fluid Dynamics. New York: Springer.
[3]
Fornberg B. (1988) Generation of Finite Difference Formulas on Arbitrarily Spaced Grids, Mathematics of Computation 51, no. 184 : 699-706. PDF.
#### Examples
    
    >>> import numpy as np
    >>> f = np.array([1, 2, 4, 7, 11, 16])
    >>> np.gradient(f)
    array([1. , 1.5, 2.5, 3.5, 4.5, 5. ])
    >>> np.gradient(f, 2)
    array([0.5 ,  0.75,  1.25,  1.75,  2.25,  2.5 ])
    
Spacing can be also specified with an array that represents the coordinates of the values F along the dimensions. For instance a uniform spacing:
    
    >>> x = np.arange(f.size)
    >>> np.gradient(f, x)
    array([1. ,  1.5,  2.5,  3.5,  4.5,  5. ])
    
Or a non uniform one:
    
    >>> x = np.array([0., 1., 1.5, 3.5, 4., 6.])
    >>> np.gradient(f, x)
    array([1. ,  3. ,  3.5,  6.7,  6.9,  2.5])
    
For two dimensional arrays, the return will be two arrays ordered by axis. In this example the first array stands for the gradient in rows and the second one in columns direction:
    
    >>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]]))
    (array([[ 2.,  2., -1.],
            [ 2.,  2., -1.]]),
     array([[1. , 2.5, 4. ],
            [1. , 1. , 1. ]]))
    
In this example the spacing is also specified: uniform for axis=0 and non uniform for axis=1
    
    >>> dx = 2.
    >>> y = [1., 1.5, 3.5]
    >>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]]), dx, y)
    (array([[ 1. ,  1. , -0.5],
            [ 1. ,  1. , -0.5]]),
     array([[2. , 2. , 2. ],
            [2. , 1.7, 0.5]]))
    
It is possible to specify how boundaries are treated using `edge_order`
    
    >>> x = np.array([0, 1, 2, 3, 4])
    >>> f = x**2
    >>> np.gradient(f, edge_order=1)
    array([1.,  2.,  4.,  6.,  7.])
    >>> np.gradient(f, edge_order=2)
    array([0., 2., 4., 6., 8.])
    
The `axis` keyword can be used to specify a subset of axes of which the gradient is calculated
    
    >>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]]), axis=0)
    array([[ 2.,  2., -1.],
           [ 2.,  2., -1.]])
    
The `varargs` argument defines the spacing between sample points in the input array. It can take two forms:
  1. An array, specifying coordinates, which may be unevenly spaced:


    
    >>> x = np.array([0., 2., 3., 6., 8.])
    >>> y = x ** 2
    >>> np.gradient(y, x, edge_order=2)
    array([ 0.,  4.,  6., 12., 16.])
    
  2. A scalar, representing the fixed sample distance:


    
    >>> dx = 2
    >>> x = np.array([0., 2., 4., 6., 8.])
    >>> y = x ** 2
    >>> np.gradient(y, dx, edge_order=2)
    array([ 0.,  4.,  8., 12., 16.])
    
It’s possible to provide different data for spacing along each dimension. The number of arguments must match the number of dimensions in the input data.
    
    >>> dx = 2
    >>> dy = 3
    >>> x = np.arange(0, 6, dx)
    >>> y = np.arange(0, 9, dy)
    >>> xs, ys = np.meshgrid(x, y)
    >>> zs = xs + 2 * ys
    >>> np.gradient(zs, dy, dx)  # Passing two scalars
    (array([[2., 2., 2.],
            [2., 2., 2.],
            [2., 2., 2.]]),
     array([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]]))
    
Mixing scalars and arrays is also allowed:
    
    >>> np.gradient(zs, y, dx)  # Passing one array and one scalar
    (array([[2., 2., 2.],
            [2., 2., 2.],
            [2., 2., 2.]]),
     array([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]]))
    
# numpy.greater
numpy.greater(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'greater'>
    
Return the truth value of (x1 > x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater_equal`, `less`, `less_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.greater([4,2],[2,2])
    array([ True, False])
    
The `>` operator can be used as a shorthand for `np.greater` on ndarrays.
    
    >>> a = np.array([4, 2])
    >>> b = np.array([2, 2])
    >>> a > b
    array([ True, False])
    
# numpy.greater_equal
numpy.greater_equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'greater_equal'>
    
Return the truth value of (x1 >= x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outbool or ndarray of bool
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater`, `less`, `less_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.greater_equal([4, 2, 1], [2, 2, 2])
    array([ True, True, False])
    
The `>=` operator can be used as a shorthand for `np.greater_equal` on ndarrays.
    
    >>> a = np.array([4, 2, 1])
    >>> b = np.array([2, 2, 2])
    >>> a >= b
    array([ True,  True, False])
    
# numpy.hamming
numpy.hamming(M)[source]
    
Return the Hamming window.
The Hamming window is a taper formed by using a weighted cosine.
Parameters:
    
Mint
    
Number of points in the output window. If zero or less, an empty array is returned.
Returns:
    
outndarray
    
The window, with the maximum value normalized to one (the value one appears only if the number of samples is odd).
See also
`bartlett`, `blackman`, `hanning`, `kaiser`
#### Notes
The Hamming window is defined as
\\[w(n) = 0.54 - 0.46\cos\left(\frac{2\pi{n}}{M-1}\right) \qquad 0 \leq n \leq M-1\\]
The Hamming was named for R. W. Hamming, an associate of J. W. Tukey and is described in Blackman and Tukey. It was recommended for smoothing the truncated autocovariance function in the time domain. Most references to the Hamming window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means “removing the foot”, i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function.
#### References
[1]
Blackman, R.B. and Tukey, J.W., (1958) The measurement of power spectra, Dover Publications, New York.
[2]
E.R. Kanasewich, “Time Sequence Analysis in Geophysics”, The University of Alberta Press, 1975, pp. 109-110.
[3]
Wikipedia, “Window function”, https://en.wikipedia.org/wiki/Window_function
[4]
W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling, “Numerical Recipes”, Cambridge University Press, 1986, page 425.
#### Examples
    
    >>> import numpy as np
    >>> np.hamming(12)
    array([ 0.08      ,  0.15302337,  0.34890909,  0.60546483,  0.84123594, # may vary
            0.98136677,  0.98136677,  0.84123594,  0.60546483,  0.34890909,
            0.15302337,  0.08      ])
    
Plot the window and the frequency response.
    
    import matplotlib.pyplot as plt
    from numpy.fft import fft, fftshift
    window = np.hamming(51)
    plt.plot(window)
    plt.title("Hamming window")
    plt.ylabel("Amplitude")
    plt.xlabel("Sample")
    plt.show()
    
    
    plt.figure()
    A = fft(window, 2048) / 25.5
    mag = np.abs(fftshift(A))
    freq = np.linspace(-0.5, 0.5, len(A))
    response = 20 * np.log10(mag)
    response = np.clip(response, -100, 100)
    plt.plot(freq, response)
    plt.title("Frequency response of Hamming window")
    plt.ylabel("Magnitude [dB]")
    plt.xlabel("Normalized frequency [cycles per sample]")
    plt.axis('tight')
    plt.show()
    
# numpy.hanning
numpy.hanning(M)[source]
    
Return the Hanning window.
The Hanning window is a taper formed by using a weighted cosine.
Parameters:
    
Mint
    
Number of points in the output window. If zero or less, an empty array is returned.
Returns:
    
outndarray, shape(M,)
    
The window, with the maximum value normalized to one (the value one appears only if `M` is odd).
See also
`bartlett`, `blackman`, `hamming`, `kaiser`
#### Notes
The Hanning window is defined as
\\[w(n) = 0.5 - 0.5\cos\left(\frac{2\pi{n}}{M-1}\right) \qquad 0 \leq n \leq M-1\\]
The Hanning was named for Julius von Hann, an Austrian meteorologist. It is also known as the Cosine Bell. Some authors prefer that it be called a Hann window, to help avoid confusion with the very similar Hamming window.
Most references to the Hanning window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means “removing the foot”, i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function.
#### References
[1]
Blackman, R.B. and Tukey, J.W., (1958) The measurement of power spectra, Dover Publications, New York.
[2]
E.R. Kanasewich, “Time Sequence Analysis in Geophysics”, The University of Alberta Press, 1975, pp. 106-108.
[3]
Wikipedia, “Window function”, https://en.wikipedia.org/wiki/Window_function
[4]
W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling, “Numerical Recipes”, Cambridge University Press, 1986, page 425.
#### Examples
    
    >>> import numpy as np
    >>> np.hanning(12)
    array([0.        , 0.07937323, 0.29229249, 0.57115742, 0.82743037,
           0.97974649, 0.97974649, 0.82743037, 0.57115742, 0.29229249,
           0.07937323, 0.        ])
    
Plot the window and its frequency response.
    
    import matplotlib.pyplot as plt
    from numpy.fft import fft, fftshift
    window = np.hanning(51)
    plt.plot(window)
    plt.title("Hann window")
    plt.ylabel("Amplitude")
    plt.xlabel("Sample")
    plt.show()
    
    
    plt.figure()
    A = fft(window, 2048) / 25.5
    mag = np.abs(fftshift(A))
    freq = np.linspace(-0.5, 0.5, len(A))
    with np.errstate(divide='ignore', invalid='ignore'):
        response = 20 * np.log10(mag)
    response = np.clip(response, -100, 100)
    plt.plot(freq, response)
    plt.title("Frequency response of the Hann window")
    plt.ylabel("Magnitude [dB]")
    plt.xlabel("Normalized frequency [cycles per sample]")
    plt.axis('tight')
    plt.show()
    
# numpy.heaviside
numpy.heaviside(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'heaviside'>
    
Compute the Heaviside step function.
The Heaviside step function [1] is defined as:
    
                          0   if x1 < 0
    heaviside(x1, x2) =  x2   if x1 == 0
                          1   if x1 > 0
    
where `x2` is often taken to be 0.5, but 0 and 1 are also sometimes used.
Parameters:
    
x1array_like
    
Input values.
x2array_like
    
The value of the function when x1 is 0. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
The output array, element-wise Heaviside step function of `x1`. This is a scalar if both `x1` and `x2` are scalars.
#### References
[1]
Wikipedia, “Heaviside step function”, https://en.wikipedia.org/wiki/Heaviside_step_function
#### Examples
    
    >>> import numpy as np
    >>> np.heaviside([-1.5, 0, 2.0], 0.5)
    array([ 0. ,  0.5,  1. ])
    >>> np.heaviside([-1.5, 0, 2.0], 1)
    array([ 0.,  1.,  1.])
    
# numpy.histogram
numpy.histogram(a, bins=10, range=None, density=None, weights=None)[source]
    
Compute the histogram of a dataset.
Parameters:
    
aarray_like
    
Input data. The histogram is computed over the flattened array.
binsint or sequence of scalars or str, optional
    
If `bins` is an int, it defines the number of equal-width bins in the given range (10, by default). If `bins` is a sequence, it defines a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform bin widths.
If `bins` is a string, it defines the method used to calculate the optimal bin width, as defined by `histogram_bin_edges`.
range(float, float), optional
    
The lower and upper range of the bins. If not provided, range is simply `(a.min(), a.max())`. Values outside the range are ignored. The first element of the range must be less than or equal to the second. `range` affects the automatic bin computation as well. While bin width is computed to be optimal based on the actual data within `range`, the bin count will fill the entire range including portions containing no data.
weightsarray_like, optional
    
An array of weights, of the same shape as `a`. Each value in `a` only contributes its associated weight towards the bin count (instead of 1). If `density` is True, the weights are normalized, so that the integral of the density over the range remains 1. Please note that the `dtype` of `weights` will also become the `dtype` of the returned accumulator (`hist`), so it must be large enough to hold accumulated values as well.
densitybool, optional
    
If `False`, the result will contain the number of samples in each bin. If `True`, the result is the value of the probability density function at the bin, normalized such that the integral over the range is 1. Note that the sum of the histogram values will not be equal to 1 unless bins of unity width are chosen; it is not a probability mass function.
Returns:
    
histarray
    
The values of the histogram. See `density` and `weights` for a description of the possible semantics. If `weights` are given, `hist.dtype` will be taken from `weights`.
bin_edgesarray of dtype float
    
Return the bin edges `(length(hist)+1)`.
See also
`histogramdd`, `bincount`, `searchsorted`, `digitize`, `histogram_bin_edges`
#### Notes
All but the last (righthand-most) bin is half-open. In other words, if `bins` is:
    
    [1, 2, 3, 4]
    
then the first bin is `[1, 2)` (including 1, but excluding 2) and the second `[2, 3)`. The last bin, however, is `[3, 4]`, which includes 4.
#### Examples
    
    >>> import numpy as np
    >>> np.histogram([1, 2, 1], bins=[0, 1, 2, 3])
    (array([0, 2, 1]), array([0, 1, 2, 3]))
    >>> np.histogram(np.arange(4), bins=np.arange(5), density=True)
    (array([0.25, 0.25, 0.25, 0.25]), array([0, 1, 2, 3, 4]))
    >>> np.histogram([[1, 2, 1], [1, 0, 1]], bins=[0,1,2,3])
    (array([1, 4, 1]), array([0, 1, 2, 3]))
    
    
    >>> a = np.arange(5)
    >>> hist, bin_edges = np.histogram(a, density=True)
    >>> hist
    array([0.5, 0. , 0.5, 0. , 0. , 0.5, 0. , 0.5, 0. , 0.5])
    >>> hist.sum()
    2.4999999999999996
    >>> np.sum(hist * np.diff(bin_edges))
    1.0
    
Automated Bin Selection Methods example, using 2 peak random data with 2000 points.
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    rng = np.random.RandomState(10)  # deterministic random data
    a = np.hstack((rng.normal(size=1000),
                   rng.normal(loc=5, scale=2, size=1000)))
    plt.hist(a, bins='auto')  # arguments are passed to np.histogram
    plt.title("Histogram with 'auto' bins")
    plt.show()
    
# numpy.histogram2d
numpy.histogram2d(x, y, bins=10, range=None, density=None, weights=None)[source]
    
Compute the bi-dimensional histogram of two data samples.
Parameters:
    
xarray_like, shape (N,)
    
An array containing the x coordinates of the points to be histogrammed.
yarray_like, shape (N,)
    
An array containing the y coordinates of the points to be histogrammed.
binsint or array_like or [int, int] or [array, array], optional
    
The bin specification:
  * If int, the number of bins for the two dimensions (nx=ny=bins).
  * If array_like, the bin edges for the two dimensions (x_edges=y_edges=bins).
  * If [int, int], the number of bins in each dimension (nx, ny = bins).
  * If [array, array], the bin edges in each dimension (x_edges, y_edges = bins).
  * A combination [int, array] or [array, int], where int is the number of bins and array is the bin edges.


rangearray_like, shape(2,2), optional
    
The leftmost and rightmost edges of the bins along each dimension (if not specified explicitly in the `bins` parameters): `[[xmin, xmax], [ymin, ymax]]`. All values outside of this range will be considered outliers and not tallied in the histogram.
densitybool, optional
    
If False, the default, returns the number of samples in each bin. If True, returns the probability density function at the bin, `bin_count / sample_count / bin_area`.
weightsarray_like, shape(N,), optional
    
An array of values `w_i` weighing each sample `(x_i, y_i)`. Weights are normalized to 1 if `density` is True. If `density` is False, the values of the returned histogram are equal to the sum of the weights belonging to the samples falling into each bin.
Returns:
    
Hndarray, shape(nx, ny)
    
The bi-dimensional histogram of samples `x` and `y`. Values in `x` are histogrammed along the first dimension and values in `y` are histogrammed along the second dimension.
xedgesndarray, shape(nx+1,)
    
The bin edges along the first dimension.
yedgesndarray, shape(ny+1,)
    
The bin edges along the second dimension.
See also
`histogram`
    
1D histogram
`histogramdd`
    
Multidimensional histogram
#### Notes
When `density` is True, then the returned histogram is the sample density, defined such that the sum over bins of the product `bin_value * bin_area` is 1.
Please note that the histogram does not follow the Cartesian convention where `x` values are on the abscissa and `y` values on the ordinate axis. Rather, `x` is histogrammed along the first dimension of the array (vertical), and `y` along the second dimension of the array (horizontal). This ensures compatibility with `histogramdd`.
#### Examples
    
    >>> import numpy as np
    >>> from matplotlib.image import NonUniformImage
    >>> import matplotlib.pyplot as plt
    
Construct a 2-D histogram with variable bin width. First define the bin edges:
    
    >>> xedges = [0, 1, 3, 5]
    >>> yedges = [0, 2, 3, 4, 6]
    
Next we create a histogram H with random bin content:
    
    >>> x = np.random.normal(2, 1, 100)
    >>> y = np.random.normal(1, 1, 100)
    >>> H, xedges, yedges = np.histogram2d(x, y, bins=(xedges, yedges))
    >>> # Histogram does not follow Cartesian convention (see Notes),
    >>> # therefore transpose H for visualization purposes.
    >>> H = H.T
    
`imshow` can only display square bins:
    
    >>> fig = plt.figure(figsize=(7, 3))
    >>> ax = fig.add_subplot(131, title='imshow: square bins')
    >>> plt.imshow(H, interpolation='nearest', origin='lower',
    ...         extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])
    <matplotlib.image.AxesImage object at 0x...>
    
`pcolormesh` can display actual edges:
    
    >>> ax = fig.add_subplot(132, title='pcolormesh: actual edges',
    ...         aspect='equal')
    >>> X, Y = np.meshgrid(xedges, yedges)
    >>> ax.pcolormesh(X, Y, H)
    <matplotlib.collections.QuadMesh object at 0x...>
    
`NonUniformImage` can be used to display actual bin edges with interpolation:
    
    >>> ax = fig.add_subplot(133, title='NonUniformImage: interpolated',
    ...         aspect='equal', xlim=xedges[[0, -1]], ylim=yedges[[0, -1]])
    >>> im = NonUniformImage(ax, interpolation='bilinear')
    >>> xcenters = (xedges[:-1] + xedges[1:]) / 2
    >>> ycenters = (yedges[:-1] + yedges[1:]) / 2
    >>> im.set_data(xcenters, ycenters, H)
    >>> ax.add_image(im)
    >>> plt.show()
    
It is also possible to construct a 2-D histogram without specifying bin edges:
    
    >>> # Generate non-symmetric test data
    >>> n = 10000
    >>> x = np.linspace(1, 100, n)
    >>> y = 2*np.log(x) + np.random.rand(n) - 0.5
    >>> # Compute 2d histogram. Note the order of x/y and xedges/yedges
    >>> H, yedges, xedges = np.histogram2d(y, x, bins=20)
    
Now we can plot the histogram using `pcolormesh`, and a `hexbin` for comparison.
    
    >>> # Plot histogram using pcolormesh
    >>> fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
    >>> ax1.pcolormesh(xedges, yedges, H, cmap='rainbow')
    >>> ax1.plot(x, 2*np.log(x), 'k-')
    >>> ax1.set_xlim(x.min(), x.max())
    >>> ax1.set_ylim(y.min(), y.max())
    >>> ax1.set_xlabel('x')
    >>> ax1.set_ylabel('y')
    >>> ax1.set_title('histogram2d')
    >>> ax1.grid()
    
    
    >>> # Create hexbin plot for comparison
    >>> ax2.hexbin(x, y, gridsize=20, cmap='rainbow')
    >>> ax2.plot(x, 2*np.log(x), 'k-')
    >>> ax2.set_title('hexbin')
    >>> ax2.set_xlim(x.min(), x.max())
    >>> ax2.set_xlabel('x')
    >>> ax2.grid()
    
    
    >>> plt.show()
    
# numpy.histogram_bin_edges
numpy.histogram_bin_edges(a, bins=10, range=None, weights=None)[source]
    
Function to calculate only the edges of the bins used by the `histogram` function.
Parameters:
    
aarray_like
    
Input data. The histogram is computed over the flattened array.
binsint or sequence of scalars or str, optional
    
If `bins` is an int, it defines the number of equal-width bins in the given range (10, by default). If `bins` is a sequence, it defines the bin edges, including the rightmost edge, allowing for non-uniform bin widths.
If `bins` is a string from the list below, `histogram_bin_edges` will use the method chosen to calculate the optimal bin width and consequently the number of bins (see the Notes section for more detail on the estimators) from the data that falls within the requested range. While the bin width will be optimal for the actual data in the range, the number of bins will be computed to fill the entire range, including the empty portions. For visualisation, using the ‘auto’ option is suggested. Weighted data is not supported for automated bin size selection.
‘auto’
    
Minimum bin width between the ‘sturges’ and ‘fd’ estimators. Provides good all-around performance.
‘fd’ (Freedman Diaconis Estimator)
    
Robust (resilient to outliers) estimator that takes into account data variability and data size.
‘doane’
    
An improved version of Sturges’ estimator that works better with non-normal datasets.
‘scott’
    
Less robust estimator that takes into account data variability and data size.
‘stone’
    
Estimator based on leave-one-out cross-validation estimate of the integrated squared error. Can be regarded as a generalization of Scott’s rule.
‘rice’
    
Estimator does not take variability into account, only data size. Commonly overestimates number of bins required.
‘sturges’
    
R’s default method, only accounts for data size. Only optimal for gaussian data and underestimates number of bins for large non-gaussian datasets.
‘sqrt’
    
Square root (of data size) estimator, used by Excel and other programs for its speed and simplicity.
range(float, float), optional
    
The lower and upper range of the bins. If not provided, range is simply `(a.min(), a.max())`. Values outside the range are ignored. The first element of the range must be less than or equal to the second. `range` affects the automatic bin computation as well. While bin width is computed to be optimal based on the actual data within `range`, the bin count will fill the entire range including portions containing no data.
weightsarray_like, optional
    
An array of weights, of the same shape as `a`. Each value in `a` only contributes its associated weight towards the bin count (instead of 1). This is currently not used by any of the bin estimators, but may be in the future.
Returns:
    
bin_edgesarray of dtype float
    
The edges to pass into `histogram`
See also
`histogram`
#### Notes
The methods to estimate the optimal number of bins are well founded in literature, and are inspired by the choices R provides for histogram visualisation. Note that having the number of bins proportional to \\(n^{1/3}\\) is asymptotically optimal, which is why it appears in most estimators. These are simply plug-in methods that give good starting points for number of bins. In the equations below, \\(h\\) is the binwidth and \\(n_h\\) is the number of bins. All estimators that compute bin counts are recast to bin width using the `ptp` of the data. The final bin count is obtained from `np.round(np.ceil(range / h))`. The final bin width is often less than what is returned by the estimators below.
‘auto’ (minimum bin width of the ‘sturges’ and ‘fd’ estimators)
    
A compromise to get a good value. For small datasets the Sturges value will usually be chosen, while larger datasets will usually default to FD. Avoids the overly conservative behaviour of FD and Sturges for small and large datasets respectively. Switchover point is usually \\(a.size \approx 1000\\).
‘fd’ (Freedman Diaconis Estimator)
    
\\[h = 2 \frac{IQR}{n^{1/3}}\\]
The binwidth is proportional to the interquartile range (IQR) and inversely proportional to cube root of a.size. Can be too conservative for small datasets, but is quite good for large datasets. The IQR is very robust to outliers.
‘scott’
    
\\[h = \sigma \sqrt[3]{\frac{24 \sqrt{\pi}}{n}}\\]
The binwidth is proportional to the standard deviation of the data and inversely proportional to cube root of `x.size`. Can be too conservative for small datasets, but is quite good for large datasets. The standard deviation is not very robust to outliers. Values are very similar to the Freedman-Diaconis estimator in the absence of outliers.
‘rice’
    
\\[n_h = 2n^{1/3}\\]
The number of bins is only proportional to cube root of `a.size`. It tends to overestimate the number of bins and it does not take into account data variability.
‘sturges’
    
\\[n_h = \log _{2}(n) + 1\\]
The number of bins is the base 2 log of `a.size`. This estimator assumes normality of data and is too conservative for larger, non-normal datasets. This is the default method in R’s `hist` method.
‘doane’
    
\\[ \begin{align}\begin{aligned}n_h = 1 + \log_{2}(n) + \log_{2}\left(1 + \frac{|g_1|}{\sigma_{g_1}}\right)\\\g_1 = mean\left[\left(\frac{x - \mu}{\sigma}\right)^3\right]\\\\\sigma_{g_1} = \sqrt{\frac{6(n - 2)}{(n + 1)(n + 3)}}\end{aligned}\end{align} \\]
An improved version of Sturges’ formula that produces better estimates for non-normal datasets. This estimator attempts to account for the skew of the data.
‘sqrt’
    
\\[n_h = \sqrt n\\]
The simplest and fastest estimator. Only takes into account the data size.
Additionally, if the data is of integer dtype, then the binwidth will never be less than 1.
#### Examples
    
    >>> import numpy as np
    >>> arr = np.array([0, 0, 0, 1, 2, 3, 3, 4, 5])
    >>> np.histogram_bin_edges(arr, bins='auto', range=(0, 1))
    array([0.  , 0.25, 0.5 , 0.75, 1.  ])
    >>> np.histogram_bin_edges(arr, bins=2)
    array([0. , 2.5, 5. ])
    
For consistency with histogram, an array of pre-computed bins is passed through unmodified:
    
    >>> np.histogram_bin_edges(arr, [1, 2])
    array([1, 2])
    
This function allows one set of bins to be computed, and reused across multiple histograms:
    
    >>> shared_bins = np.histogram_bin_edges(arr, bins='auto')
    >>> shared_bins
    array([0., 1., 2., 3., 4., 5.])
    
    
    >>> group_id = np.array([0, 1, 1, 0, 1, 1, 0, 1, 1])
    >>> hist_0, _ = np.histogram(arr[group_id == 0], bins=shared_bins)
    >>> hist_1, _ = np.histogram(arr[group_id == 1], bins=shared_bins)
    
    
    >>> hist_0; hist_1
    array([1, 1, 0, 1, 0])
    array([2, 0, 1, 1, 2])
    
Which gives more easily comparable results than using separate bins for each histogram:
    
    >>> hist_0, bins_0 = np.histogram(arr[group_id == 0], bins='auto')
    >>> hist_1, bins_1 = np.histogram(arr[group_id == 1], bins='auto')
    >>> hist_0; hist_1
    array([1, 1, 1])
    array([2, 1, 1, 2])
    >>> bins_0; bins_1
    array([0., 1., 2., 3.])
    array([0.  , 1.25, 2.5 , 3.75, 5.  ])
    
# numpy.histogramdd
numpy.histogramdd(sample, bins=10, range=None, density=None, weights=None)[source]
    
Compute the multidimensional histogram of some data.
Parameters:
    
sample(N, D) array, or (N, D) array_like
    
The data to be histogrammed.
Note the unusual interpretation of sample when an array_like:
  * When an array, each row is a coordinate in a D-dimensional space - such as `histogramdd(np.array([p1, p2, p3]))`.
  * When an array_like, each element is the list of values for single coordinate - such as `histogramdd((X, Y, Z))`.


The first form should be preferred.
binssequence or int, optional
    
The bin specification:
  * A sequence of arrays describing the monotonically increasing bin edges along each dimension.
  * The number of bins for each dimension (nx, ny, … =bins)
  * The number of bins for all dimensions (nx=ny=…=bins).


rangesequence, optional
    
A sequence of length D, each an optional (lower, upper) tuple giving the outer bin edges to be used if the edges are not given explicitly in `bins`. An entry of None in the sequence results in the minimum and maximum values being used for the corresponding dimension. The default, None, is equivalent to passing a tuple of D None values.
densitybool, optional
    
If False, the default, returns the number of samples in each bin. If True, returns the probability density function at the bin, `bin_count / sample_count / bin_volume`.
weights(N,) array_like, optional
    
An array of values `w_i` weighing each sample `(x_i, y_i, z_i, …)`. Weights are normalized to 1 if density is True. If density is False, the values of the returned histogram are equal to the sum of the weights belonging to the samples falling into each bin.
Returns:
    
Hndarray
    
The multidimensional histogram of sample x. See density and weights for the different possible semantics.
edgestuple of ndarrays
    
A tuple of D arrays describing the bin edges for each dimension.
See also
`histogram`
    
1-D histogram
`histogram2d`
    
2-D histogram
#### Examples
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> r = rng.normal(size=(100,3))
    >>> H, edges = np.histogramdd(r, bins = (5, 8, 4))
    >>> H.shape, edges[0].size, edges[1].size, edges[2].size
    ((5, 8, 4), 6, 9, 5)
    
# numpy.hsplit
numpy.hsplit(ary, indices_or_sections)[source]
    
Split an array into multiple sub-arrays horizontally (column-wise).
Please refer to the `split` documentation. `hsplit` is equivalent to `split` with `axis=1`, the array is always split along the second axis except for 1-D arrays, where it is split at `axis=0`.
See also
`split`
    
Split an array into multiple sub-arrays of equal size.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(16.0).reshape(4, 4)
    >>> x
    array([[ 0.,   1.,   2.,   3.],
           [ 4.,   5.,   6.,   7.],
           [ 8.,   9.,  10.,  11.],
           [12.,  13.,  14.,  15.]])
    >>> np.hsplit(x, 2)
    [array([[  0.,   1.],
           [  4.,   5.],
           [  8.,   9.],
           [12.,  13.]]),
     array([[  2.,   3.],
           [  6.,   7.],
           [10.,  11.],
           [14.,  15.]])]
    >>> np.hsplit(x, np.array([3, 6]))
    [array([[ 0.,   1.,   2.],
           [ 4.,   5.,   6.],
           [ 8.,   9.,  10.],
           [12.,  13.,  14.]]),
     array([[ 3.],
           [ 7.],
           [11.],
           [15.]]),
     array([], shape=(4, 0), dtype=float64)]
    
With a higher dimensional array the split is still along the second axis.
    
    >>> x = np.arange(8.0).reshape(2, 2, 2)
    >>> x
    array([[[0.,  1.],
            [2.,  3.]],
           [[4.,  5.],
            [6.,  7.]]])
    >>> np.hsplit(x, 2)
    [array([[[0.,  1.]],
           [[4.,  5.]]]),
     array([[[2.,  3.]],
           [[6.,  7.]]])]
    
With a 1-D array, the split is along axis 0.
    
    >>> x = np.array([0, 1, 2, 3, 4, 5])
    >>> np.hsplit(x, 2)
    [array([0, 1, 2]), array([3, 4, 5])]
    
# numpy.hstack
numpy.hstack(tup, *, dtype=None, casting='same_kind')[source]
    
Stack arrays in sequence horizontally (column wise).
This is equivalent to concatenation along the second axis, except for 1-D arrays where it concatenates along the first axis. Rebuilds arrays divided by `hsplit`.
This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations.
Parameters:
    
tupsequence of ndarrays
    
The arrays must have the same shape along all but the second axis, except 1-D arrays which can be any length. In the case of a single array_like input, it will be treated as a sequence of arrays; i.e., each element along the zeroth axis is treated as a separate array.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.24.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’.
New in version 1.24.
Returns:
    
stackedndarray
    
The array formed by stacking the given arrays.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`vstack`
    
Stack arrays in sequence vertically (row wise).
`dstack`
    
Stack arrays in sequence depth wise (along third axis).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`hsplit`
    
Split an array into multiple sub-arrays horizontally (column-wise).
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((1,2,3))
    >>> b = np.array((4,5,6))
    >>> np.hstack((a,b))
    array([1, 2, 3, 4, 5, 6])
    >>> a = np.array([[1],[2],[3]])
    >>> b = np.array([[4],[5],[6]])
    >>> np.hstack((a,b))
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
# numpy.hypot
numpy.hypot(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'hypot'>
    
Given the “legs” of a right triangle, return its hypotenuse.
Equivalent to `sqrt(x1**2 + x2**2)`, element-wise. If `x1` or `x2` is scalar_like (i.e., unambiguously cast-able to a scalar type), it is broadcast for use with each element of the other argument. (See Examples)
Parameters:
    
x1, x2array_like
    
Leg of the triangle(s). If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
zndarray
    
The hypotenuse of the triangle(s). This is a scalar if both `x1` and `x2` are scalars.
#### Examples
    
    >>> import numpy as np
    >>> np.hypot(3*np.ones((3, 3)), 4*np.ones((3, 3)))
    array([[ 5.,  5.,  5.],
           [ 5.,  5.,  5.],
           [ 5.,  5.,  5.]])
    
Example showing broadcast of scalar_like argument:
    
    >>> np.hypot(3*np.ones((3, 3)), [4])
    array([[ 5.,  5.,  5.],
           [ 5.,  5.,  5.],
           [ 5.,  5.,  5.]])
    
# numpy.i0
numpy.i0(x)[source]
    
Modified Bessel function of the first kind, order 0.
Usually denoted \\(I_0\\).
Parameters:
    
xarray_like of float
    
Argument of the Bessel function.
Returns:
    
outndarray, shape = x.shape, dtype = float
    
The modified Bessel function evaluated at each of the elements of `x`.
See also
`scipy.special.i0`, `scipy.special.iv`, `scipy.special.ive`
#### Notes
The scipy implementation is recommended over this function: it is a proper ufunc written in C, and more than an order of magnitude faster.
We use the algorithm published by Clenshaw [1] and referenced by Abramowitz and Stegun [2], for which the function domain is partitioned into the two intervals [0,8] and (8,inf), and Chebyshev polynomial expansions are employed in each interval. Relative error on the domain [0,30] using IEEE arithmetic is documented [3] as having a peak of 5.8e-16 with an rms of 1.4e-16 (n = 30000).
#### References
[1]
C. W. Clenshaw, “Chebyshev series for mathematical functions”, in National Physical Laboratory Mathematical Tables, vol. 5, London: Her Majesty’s Stationery Office, 1962.
[2]
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions, 10th printing, New York: Dover, 1964, pp. 379. https://personal.math.ubc.ca/~cbm/aands/page_379.htm
[3]
https://metacpan.org/pod/distribution/Math-Cephes/lib/Math/Cephes.pod#i0:-Modified-Bessel-function-of-order-zero
#### Examples
    
    >>> import numpy as np
    >>> np.i0(0.)
    array(1.0)
    >>> np.i0([0, 1, 2, 3])
    array([1.        , 1.26606588, 2.2795853 , 4.88079259])
    
# numpy.identity
numpy.identity(n, dtype=None, *, like=None)[source]
    
Return the identity array.
The identity array is a square array with ones on the main diagonal.
Parameters:
    
nint
    
Number of rows (and columns) in `n` x `n` output.
dtypedata-type, optional
    
Data-type of the output. Defaults to `float`.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
`n` x `n` array with its main diagonal set to one, and all other elements 0.
#### Examples
    
    >>> import numpy as np
    >>> np.identity(3)
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    
# numpy.iinfo
classnumpy.iinfo(type)[source]
    
Machine limits for integer types.
Parameters:
    
int_typeinteger type, dtype, or instance
    
The kind of integer data type to get information about.
See also
`finfo`
    
The equivalent for floating point data types.
#### Examples
With types:
    
    >>> import numpy as np
    >>> ii16 = np.iinfo(np.int16)
    >>> ii16.min
    -32768
    >>> ii16.max
    32767
    >>> ii32 = np.iinfo(np.int32)
    >>> ii32.min
    -2147483648
    >>> ii32.max
    2147483647
    
With instances:
    
    >>> ii32 = np.iinfo(np.int32(10))
    >>> ii32.min
    -2147483648
    >>> ii32.max
    2147483647
    
Attributes:
    
bitsint
    
The number of bits occupied by the type.
dtypedtype
    
Returns the dtype for which `iinfo` returns information.
`min`int
    
Minimum value of given dtype.
`max`int
    
Maximum value of given dtype.
# numpy.imag
numpy.imag(val)[source]
    
Return the imaginary part of the complex argument.
Parameters:
    
valarray_like
    
Input array.
Returns:
    
outndarray or scalar
    
The imaginary component of the complex argument. If `val` is real, the type of `val` is used for the output. If `val` has complex elements, the returned type is float.
See also
`real`, `angle`, `real_if_close`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1+2j, 3+4j, 5+6j])
    >>> a.imag
    array([2.,  4.,  6.])
    >>> a.imag = np.array([8, 10, 12])
    >>> a
    array([1. +8.j,  3.+10.j,  5.+12.j])
    >>> np.imag(1 + 1j)
    1.0
    
# numpy.in1d
numpy.in1d(ar1, ar2, assume_unique=False, invert=False, *, kind=None)[source]
    
Test whether each element of a 1-D array is also present in a second array.
Deprecated since version 2.0: Use `isin` instead of `in1d` for new code.
Returns a boolean array the same length as `ar1` that is True where an element of `ar1` is in `ar2` and False otherwise.
Parameters:
    
ar1(M,) array_like
    
Input array.
ar2array_like
    
The values against which to test each value of `ar1`.
assume_uniquebool, optional
    
If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False.
invertbool, optional
    
If True, the values in the returned array are inverted (that is, False where an element of `ar1` is in `ar2` and True otherwise). Default is False. `np.in1d(a, b, invert=True)` is equivalent to (but is faster than) `np.invert(in1d(a, b))`.
kind{None, ‘sort’, ‘table’}, optional
    
The algorithm to use. This will not affect the final result, but will affect the speed and memory use. The default, None, will select automatically based on memory considerations.
  * If ‘sort’, will use a mergesort-based approach. This will have a memory usage of roughly 6 times the sum of the sizes of `ar1` and `ar2`, not accounting for size of dtypes.
  * If ‘table’, will use a lookup table approach similar to a counting sort. This is only available for boolean and integer arrays. This will have a memory usage of the size of `ar1` plus the max-min value of `ar2`. `assume_unique` has no effect when the ‘table’ option is used.
  * If None, will automatically choose ‘table’ if the required memory allocation is less than or equal to 6 times the sum of the sizes of `ar1` and `ar2`, otherwise will use ‘sort’. This is done to not use a large amount of memory by default, even though ‘table’ may be faster in most cases. If ‘table’ is chosen, `assume_unique` will have no effect.


Returns:
    
in1d(M,) ndarray, bool
    
The values `ar1[in1d]` are in `ar2`.
See also
`isin`
    
Version of this function that preserves the shape of ar1.
#### Notes
`in1d` can be considered as an element-wise function version of the python keyword `in`, for 1-D sequences. `in1d(a, b)` is roughly equivalent to `np.array([item in b for item in a])`. However, this idea fails if `ar2` is a set, or similar (non-sequence) container: As `ar2` is converted to an array, in those cases `asarray(ar2)` is an object array rather than the expected array of contained values.
Using `kind='table'` tends to be faster than `kind=’sort’` if the following relationship is true: `log10(len(ar2)) > (log10(max(ar2)-min(ar2)) - 2.27) / 0.927`, but may use greater memory. The default value for `kind` will be automatically selected based only on memory usage, so one may manually set `kind='table'` if memory constraints can be relaxed.
#### Examples
    
    >>> import numpy as np
    >>> test = np.array([0, 1, 2, 5, 0])
    >>> states = [0, 2]
    >>> mask = np.in1d(test, states)
    >>> mask
    array([ True, False,  True, False,  True])
    >>> test[mask]
    array([0, 2, 0])
    >>> mask = np.in1d(test, states, invert=True)
    >>> mask
    array([False,  True, False,  True, False])
    >>> test[mask]
    array([1, 5])
    
# numpy.indices
numpy.indices(dimensions, dtype=<class 'int'>, sparse=False)[source]
    
Return an array representing the indices of a grid.
Compute an array where the subarrays contain index values 0, 1, … varying only along the corresponding axis.
Parameters:
    
dimensionssequence of ints
    
The shape of the grid.
dtypedtype, optional
    
Data type of the result.
sparseboolean, optional
    
Return a sparse representation of the grid instead of a dense representation. Default is False.
Returns:
    
gridone ndarray or tuple of ndarrays
    
If sparse is False:
    
Returns one array of grid indices, `grid.shape = (len(dimensions),) + tuple(dimensions)`.
If sparse is True:
    
Returns a tuple of arrays, with `grid[i].shape = (1, ..., 1, dimensions[i], 1, ..., 1)` with dimensions[i] in the ith place
See also
`mgrid`, `ogrid`, `meshgrid`
#### Notes
The output shape in the dense case is obtained by prepending the number of dimensions in front of the tuple of dimensions, i.e. if `dimensions` is a tuple `(r0, ..., rN-1)` of length `N`, the output shape is `(N, r0, ..., rN-1)`.
The subarrays `grid[k]` contains the N-D array of indices along the `k-th` axis. Explicitly:
    
    grid[k, i0, i1, ..., iN-1] = ik
    
#### Examples
    
    >>> import numpy as np
    >>> grid = np.indices((2, 3))
    >>> grid.shape
    (2, 2, 3)
    >>> grid[0]        # row indices
    array([[0, 0, 0],
           [1, 1, 1]])
    >>> grid[1]        # column indices
    array([[0, 1, 2],
           [0, 1, 2]])
    
The indices can be used as an index into an array.
    
    >>> x = np.arange(20).reshape(5, 4)
    >>> row, col = np.indices((2, 3))
    >>> x[row, col]
    array([[0, 1, 2],
           [4, 5, 6]])
    
Note that it would be more straightforward in the above example to extract the required elements directly with `x[:2, :3]`.
If sparse is set to true, the grid will be returned in a sparse representation.
    
    >>> i, j = np.indices((2, 3), sparse=True)
    >>> i.shape
    (2, 1)
    >>> j.shape
    (1, 3)
    >>> i        # row indices
    array([[0],
           [1]])
    >>> j        # column indices
    array([[0, 1, 2]])
    
# numpy.info
numpy.info(object=None, maxwidth=76, output=None, toplevel='numpy')[source]
    
Get help information for an array, function, class, or module.
Parameters:
    
objectobject or str, optional
    
Input object or name to get information about. If `object` is an `ndarray` instance, information about the array is printed. If `object` is a numpy object, its docstring is given. If it is a string, available modules are searched for matching objects. If None, information about `info` itself is returned.
maxwidthint, optional
    
Printing width.
outputfile like object, optional
    
File like object that the output is written to, default is `None`, in which case `sys.stdout` will be used. The object has to be opened in ‘w’ or ‘a’ mode.
toplevelstr, optional
    
Start search at this level.
#### Notes
When used interactively with an object, `np.info(obj)` is equivalent to `help(obj)` on the Python prompt or `obj?` on the IPython prompt.
#### Examples
    
    >>> np.info(np.polyval) 
       polyval(p, x)
         Evaluate the polynomial p at x.
         ...
    
When using a string for `object` it is possible to get multiple results.
    
    >>> np.info('fft') 
         *** Found in numpy ***
    Core FFT routines
    ...
         *** Found in numpy.fft ***
     fft(a, n=None, axis=-1)
    ...
         *** Repeat reference found in numpy.fft.fftpack ***
         *** Total of 3 references found. ***
    
When the argument is an array, information about the array is printed.
    
    >>> a = np.array([[1 + 2j, 3, -4], [-5j, 6, 0]], dtype=np.complex64)
    >>> np.info(a)
    class:  ndarray
    shape:  (2, 3)
    strides:  (24, 8)
    itemsize:  8
    aligned:  True
    contiguous:  True
    fortran:  False
    data pointer: 0x562b6e0d2860  # may vary
    byteorder:  little
    byteswap:  False
    type: complex64
    
# numpy.inner
numpy.inner(a, b, /)
    
Inner product of two arrays.
Ordinary inner product of vectors for 1-D arrays (without complex conjugation), in higher dimensions a sum product over the last axes.
Parameters:
    
a, barray_like
    
If `a` and `b` are nonscalar, their last dimensions must match.
Returns:
    
outndarray
    
If `a` and `b` are both scalars or both 1-D arrays then a scalar is returned; otherwise an array is returned. `out.shape = (*a.shape[:-1], *b.shape[:-1])`
Raises:
    
ValueError
    
If both `a` and `b` are nonscalar and their last dimensions have different sizes.
See also
`tensordot`
    
Sum products over arbitrary axes.
`dot`
    
Generalised matrix product, using second last dimension of `b`.
`vecdot`
    
Vector dot product of two arrays.
`einsum`
    
Einstein summation convention.
#### Notes
For vectors (1-D arrays) it computes the ordinary inner-product:
    
    np.inner(a, b) = sum(a[:]*b[:])
    
More generally, if `ndim(a) = r > 0` and `ndim(b) = s > 0`:
    
    np.inner(a, b) = np.tensordot(a, b, axes=(-1,-1))
    
or explicitly:
    
    np.inner(a, b)[i0,...,ir-2,j0,...,js-2]
         = sum(a[i0,...,ir-2,:]*b[j0,...,js-2,:])
    
In addition `a` or `b` may be scalars, in which case:
    
    np.inner(a,b) = a*b
    
#### Examples
Ordinary inner product for vectors:
    
    >>> import numpy as np
    >>> a = np.array([1,2,3])
    >>> b = np.array([0,1,0])
    >>> np.inner(a, b)
    2
    
Some multidimensional examples:
    
    >>> a = np.arange(24).reshape((2,3,4))
    >>> b = np.arange(4)
    >>> c = np.inner(a, b)
    >>> c.shape
    (2, 3)
    >>> c
    array([[ 14,  38,  62],
           [ 86, 110, 134]])
    
    
    >>> a = np.arange(2).reshape((1,1,2))
    >>> b = np.arange(6).reshape((3,2))
    >>> c = np.inner(a, b)
    >>> c.shape
    (1, 1, 3)
    >>> c
    array([[[1, 3, 5]]])
    
An example where `b` is a scalar:
    
    >>> np.inner(np.eye(2), 7)
    array([[7., 0.],
           [0., 7.]])
    
# numpy.insert
numpy.insert(arr, obj, values, axis=None)[source]
    
Insert values along the given axis before the given indices.
Parameters:
    
arrarray_like
    
Input array.
objslice, int, array-like of ints or bools
    
Object that defines the index or indices before which `values` is inserted.
Changed in version 2.1.2: Boolean indices are now treated as a mask of elements to insert, rather than being cast to the integers 0 and 1.
Support for multiple insertions when `obj` is a single scalar or a sequence with one element (similar to calling insert multiple times).
valuesarray_like
    
Values to insert into `arr`. If the type of `values` is different from that of `arr`, `values` is converted to the type of `arr`. `values` should be shaped so that `arr[...,obj,...] = values` is legal.
axisint, optional
    
Axis along which to insert `values`. If `axis` is None then `arr` is flattened first.
Returns:
    
outndarray
    
A copy of `arr` with `values` inserted. Note that `insert` does not occur in-place: a new array is returned. If `axis` is None, `out` is a flattened array.
See also
`append`
    
Append elements at the end of an array.
`concatenate`
    
Join a sequence of arrays along an existing axis.
`delete`
    
Delete elements from an array.
#### Notes
Note that for higher dimensional inserts `obj=0` behaves very different from `obj=[0]` just like `arr[:,0,:] = values` is different from `arr[:,[0],:] = values`. This is because of the difference between basic and advanced indexing.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(6).reshape(3, 2)
    >>> a
    array([[0, 1],
           [2, 3],
           [4, 5]])
    >>> np.insert(a, 1, 6)
    array([0, 6, 1, 2, 3, 4, 5])
    >>> np.insert(a, 1, 6, axis=1)
    array([[0, 6, 1],
           [2, 6, 3],
           [4, 6, 5]])
    
Difference between sequence and scalars, showing how `obj=[1]` behaves different from `obj=1`:
    
    >>> np.insert(a, [1], [[7],[8],[9]], axis=1)
    array([[0, 7, 1],
           [2, 8, 3],
           [4, 9, 5]])
    >>> np.insert(a, 1, [[7],[8],[9]], axis=1)
    array([[0, 7, 8, 9, 1],
           [2, 7, 8, 9, 3],
           [4, 7, 8, 9, 5]])
    >>> np.array_equal(np.insert(a, 1, [7, 8, 9], axis=1),
    ...                np.insert(a, [1], [[7],[8],[9]], axis=1))
    True
    
    
    >>> b = a.flatten()
    >>> b
    array([0, 1, 2, 3, 4, 5])
    >>> np.insert(b, [2, 2], [6, 7])
    array([0, 1, 6, 7, 2, 3, 4, 5])
    
    
    >>> np.insert(b, slice(2, 4), [7, 8])
    array([0, 1, 7, 2, 8, 3, 4, 5])
    
    
    >>> np.insert(b, [2, 2], [7.13, False]) # type casting
    array([0, 1, 7, 0, 2, 3, 4, 5])
    
    
    >>> x = np.arange(8).reshape(2, 4)
    >>> idx = (1, 3)
    >>> np.insert(x, idx, 999, axis=1)
    array([[  0, 999,   1,   2, 999,   3],
           [  4, 999,   5,   6, 999,   7]])
    
# numpy.interp
numpy.interp(x, xp, fp, left=None, right=None, period=None)[source]
    
One-dimensional linear interpolation for monotonically increasing sample points.
Returns the one-dimensional piecewise linear interpolant to a function with given discrete data points (`xp`, `fp`), evaluated at `x`.
Parameters:
    
xarray_like
    
The x-coordinates at which to evaluate the interpolated values.
xp1-D sequence of floats
    
The x-coordinates of the data points, must be increasing if argument `period` is not specified. Otherwise, `xp` is internally sorted after normalizing the periodic boundaries with `xp = xp % period`.
fp1-D sequence of float or complex
    
The y-coordinates of the data points, same length as `xp`.
leftoptional float or complex corresponding to fp
    
Value to return for `x < xp[0]`, default is `fp[0]`.
rightoptional float or complex corresponding to fp
    
Value to return for `x > xp[-1]`, default is `fp[-1]`.
periodNone or float, optional
    
A period for the x-coordinates. This parameter allows the proper interpolation of angular x-coordinates. Parameters `left` and `right` are ignored if `period` is specified.
Returns:
    
yfloat or complex (corresponding to fp) or ndarray
    
The interpolated values, same shape as `x`.
Raises:
    
ValueError
    
If `xp` and `fp` have different length If `xp` or `fp` are not 1-D sequences If `period == 0`
Warning
The x-coordinate sequence is expected to be increasing, but this is not explicitly enforced. However, if the sequence `xp` is non-increasing, interpolation results are meaningless.
Note that, since NaN is unsortable, `xp` also cannot contain NaNs.
A simple check for `xp` being strictly increasing is:
    
    np.all(np.diff(xp) > 0)
    
See also
`scipy.interpolate`
#### Examples
    
    >>> import numpy as np
    >>> xp = [1, 2, 3]
    >>> fp = [3, 2, 0]
    >>> np.interp(2.5, xp, fp)
    1.0
    >>> np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp)
    array([3.  , 3.  , 2.5 , 0.56, 0.  ])
    >>> UNDEF = -99.0
    >>> np.interp(3.14, xp, fp, right=UNDEF)
    -99.0
    
Plot an interpolant to the sine function:
    
    >>> x = np.linspace(0, 2*np.pi, 10)
    >>> y = np.sin(x)
    >>> xvals = np.linspace(0, 2*np.pi, 50)
    >>> yinterp = np.interp(xvals, x, y)
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(x, y, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.plot(xvals, yinterp, '-x')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.show()
    
Interpolation with periodic x-coordinates:
    
    >>> x = [-180, -170, -185, 185, -10, -5, 0, 365]
    >>> xp = [190, -190, 350, -350]
    >>> fp = [5, 10, 3, 4]
    >>> np.interp(x, xp, fp, period=360)
    array([7.5 , 5.  , 8.75, 6.25, 3.  , 3.25, 3.5 , 3.75])
    
Complex interpolation:
    
    >>> x = [1.5, 4.0]
    >>> xp = [2,3,5]
    >>> fp = [1.0j, 0, 2+3j]
    >>> np.interp(x, xp, fp)
    array([0.+1.j , 1.+1.5j])
    
# numpy.intersect1d
numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)[source]
    
Find the intersection of two arrays.
Return the sorted, unique values that are in both of the input arrays.
Parameters:
    
ar1, ar2array_like
    
Input arrays. Will be flattened if not already 1D.
assume_uniquebool
    
If True, the input arrays are both assumed to be unique, which can speed up the calculation. If True but `ar1` or `ar2` are not unique, incorrect results and out-of-bounds indices could result. Default is False.
return_indicesbool
    
If True, the indices which correspond to the intersection of the two arrays are returned. The first instance of a value is used if there are multiple. Default is False.
Returns:
    
intersect1dndarray
    
Sorted 1D array of common and unique elements.
comm1ndarray
    
The indices of the first occurrences of the common values in `ar1`. Only provided if `return_indices` is True.
comm2ndarray
    
The indices of the first occurrences of the common values in `ar2`. Only provided if `return_indices` is True.
#### Examples
    
    >>> import numpy as np
    >>> np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
    array([1, 3])
    
To intersect more than two arrays, use functools.reduce:
    
    >>> from functools import reduce
    >>> reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
    array([3])
    
To return the indices of the values common to the input arrays along with the intersected values:
    
    >>> x = np.array([1, 1, 2, 3, 4])
    >>> y = np.array([2, 1, 4, 6])
    >>> xy, x_ind, y_ind = np.intersect1d(x, y, return_indices=True)
    >>> x_ind, y_ind
    (array([0, 2, 4]), array([1, 0, 2]))
    >>> xy, x[x_ind], y[y_ind]
    (array([1, 2, 4]), array([1, 2, 4]), array([1, 2, 4]))
    
# numpy.invert
numpy.invert(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'invert'>
    
Compute bit-wise inversion, or bit-wise NOT, element-wise.
Computes the bit-wise NOT of the underlying binary representation of the integers in the input arrays. This ufunc implements the C/Python operator `~`.
For signed integer inputs, the bit-wise NOT of the absolute value is returned. In a two’s-complement system, this operation effectively flips all the bits, resulting in a representation that corresponds to the negative of the input plus one. This is the most common method of representing signed integers on computers [1]. A N-bit two’s-complement system can represent every integer in the range \\(-2^{N-1}\\) to \\(+2^{N-1}-1\\).
Parameters:
    
xarray_like
    
Only integer and boolean types are handled.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Result. This is a scalar if `x` is a scalar.
See also
`bitwise_and`, `bitwise_or`, `bitwise_xor`
`logical_not`
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Notes
`numpy.bitwise_not` is an alias for `invert`:
    
    >>> np.bitwise_not is np.invert
    True
    
#### References
[1]
Wikipedia, “Two’s complement”, https://en.wikipedia.org/wiki/Two’s_complement
#### Examples
    
    >>> import numpy as np
    
We’ve seen that 13 is represented by `00001101`. The invert or bit-wise NOT of 13 is then:
    
    >>> x = np.invert(np.array(13, dtype=np.uint8))
    >>> x
    np.uint8(242)
    >>> np.binary_repr(x, width=8)
    '11110010'
    
The result depends on the bit-width:
    
    >>> x = np.invert(np.array(13, dtype=np.uint16))
    >>> x
    np.uint16(65522)
    >>> np.binary_repr(x, width=16)
    '1111111111110010'
    
When using signed integer types, the result is the bit-wise NOT of the unsigned type, interpreted as a signed integer:
    
    >>> np.invert(np.array([13], dtype=np.int8))
    array([-14], dtype=int8)
    >>> np.binary_repr(-14, width=8)
    '11110010'
    
Booleans are accepted as well:
    
    >>> np.invert(np.array([True, False]))
    array([False,  True])
    
The `~` operator can be used as a shorthand for `np.invert` on ndarrays.
    
    >>> x1 = np.array([True, False])
    >>> ~x1
    array([False,  True])
    
# numpy.is_busday
numpy.is_busday(dates, weekmask='1111100', holidays=None, busdaycal=None, out=None)
    
Calculates which of the given dates are valid days, and which are not.
Parameters:
    
datesarray_like of datetime64[D]
    
The array of dates to process.
weekmaskstr or array_like of bool, optional
    
A seven-element array indicating which of Monday through Sunday are valid days. May be specified as a length-seven list or array, like [1,1,1,1,1,0,0]; a length-seven string, like ‘1111100’; or a string like “Mon Tue Wed Thu Fri”, made up of 3-character abbreviations for weekdays, optionally separated by white space. Valid abbreviations are: Mon Tue Wed Thu Fri Sat Sun
holidaysarray_like of datetime64[D], optional
    
An array of dates to consider as invalid dates. They may be specified in any order, and NaT (not-a-time) dates are ignored. This list is saved in a normalized form that is suited for fast calculations of valid days.
busdaycalbusdaycalendar, optional
    
A `busdaycalendar` object which specifies the valid days. If this parameter is provided, neither weekmask nor holidays may be provided.
outarray of bool, optional
    
If provided, this array is filled with the result.
Returns:
    
outarray of bool
    
An array with the same shape as `dates`, containing True for each valid day, and False for each invalid day.
See also
`busdaycalendar`
    
An object that specifies a custom set of valid days.
`busday_offset`
    
Applies an offset counted in valid days.
`busday_count`
    
Counts how many valid days are in a half-open date range.
#### Examples
    
    >>> import numpy as np
    >>> # The weekdays are Friday, Saturday, and Monday
    ... np.is_busday(['2011-07-01', '2011-07-02', '2011-07-18'],
    ...                 holidays=['2011-07-01', '2011-07-04', '2011-07-17'])
    array([False, False,  True])
    
# numpy.isclose
numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)[source]
    
Returns a boolean array where two arrays are element-wise equal within a tolerance.
The tolerance values are positive, typically very small numbers. The relative difference (`rtol` * abs(`b`)) and the absolute difference `atol` are added together to compare against the absolute difference between `a` and `b`.
Warning
The default `atol` is not appropriate for comparing numbers with magnitudes much smaller than one (see Notes).
Parameters:
    
a, barray_like
    
Input arrays to compare.
rtolarray_like
    
The relative tolerance parameter (see Notes).
atolarray_like
    
The absolute tolerance parameter (see Notes).
equal_nanbool
    
Whether to compare NaN’s as equal. If True, NaN’s in `a` will be considered equal to NaN’s in `b` in the output array.
Returns:
    
yarray_like
    
Returns a boolean array of where `a` and `b` are equal within the given tolerance. If both `a` and `b` are scalars, returns a single boolean value.
See also
`allclose`
`math.isclose`
#### Notes
For finite values, isclose uses the following equation to test whether two floating point values are equivalent.:
    
    absolute(a - b) <= (atol + rtol * absolute(b))
    
Unlike the built-in `math.isclose`, the above equation is not symmetric in `a` and `b` – it assumes `b` is the reference value – so that `isclose(a, b)` might be different from `isclose(b, a)`.
The default value of `atol` is not appropriate when the reference value `b` has magnitude smaller than one. For example, it is unlikely that `a = 1e-9` and `b = 2e-9` should be considered “close”, yet `isclose(1e-9, 2e-9)` is `True` with default settings. Be sure to select `atol` for the use case at hand, especially for defining the threshold below which a non-zero value in `a` will be considered “close” to a very small or zero value in `b`.
`isclose` is not defined for non-numeric data types. `bool` is considered a numeric data-type for this purpose.
#### Examples
    
    >>> import numpy as np
    >>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
    array([ True, False])
    
    
    >>> np.isclose([1e10,1e-8], [1.00001e10,1e-9])
    array([ True, True])
    
    
    >>> np.isclose([1e10,1e-8], [1.0001e10,1e-9])
    array([False,  True])
    
    
    >>> np.isclose([1.0, np.nan], [1.0, np.nan])
    array([ True, False])
    
    
    >>> np.isclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
    array([ True, True])
    
    
    >>> np.isclose([1e-8, 1e-7], [0.0, 0.0])
    array([ True, False])
    
    
    >>> np.isclose([1e-100, 1e-7], [0.0, 0.0], atol=0.0)
    array([False, False])
    
    
    >>> np.isclose([1e-10, 1e-10], [1e-20, 0.0])
    array([ True,  True])
    
    
    >>> np.isclose([1e-10, 1e-10], [1e-20, 0.999999e-10], atol=0.0)
    array([False,  True])
    
# numpy.iscomplex
numpy.iscomplex(x)[source]
    
Returns a bool array, where True if input element is complex.
What is tested is whether the input has a non-zero imaginary part, not if the input type is complex.
Parameters:
    
xarray_like
    
Input array.
Returns:
    
outndarray of bools
    
Output array.
See also
`isreal`
`iscomplexobj`
    
Return True if x is a complex type or an array of complex numbers.
#### Examples
    
    >>> import numpy as np
    >>> np.iscomplex([1+1j, 1+0j, 4.5, 3, 2, 2j])
    array([ True, False, False, False, False,  True])
    
# numpy.iscomplexobj
numpy.iscomplexobj(x)[source]
    
Check for a complex type or an array of complex numbers.
The type of the input is checked, not the value. Even if the input has an imaginary part equal to zero, `iscomplexobj` evaluates to True.
Parameters:
    
xany
    
The input can be of any type and shape.
Returns:
    
iscomplexobjbool
    
The return value, True if `x` is of a complex type or has at least one complex element.
See also
`isrealobj`, `iscomplex`
#### Examples
    
    >>> import numpy as np
    >>> np.iscomplexobj(1)
    False
    >>> np.iscomplexobj(1+0j)
    True
    >>> np.iscomplexobj([3, 1+0j, True])
    True
    
# numpy.isdtype
numpy.isdtype(dtype, kind)[source]
    
Determine if a provided dtype is of a specified data type `kind`.
This function only supports built-in NumPy’s data types. Third-party dtypes are not yet supported.
Parameters:
    
dtypedtype
    
The input dtype.
kinddtype or str or tuple of dtypes/strs.
    
dtype or dtype kind. Allowed dtype kinds are: * `'bool'` : boolean kind * `'signed integer'` : signed integer data types * `'unsigned integer'` : unsigned integer data types * `'integral'` : integer data types * `'real floating'` : real-valued floating-point data types * `'complex floating'` : complex floating-point data types * `'numeric'` : numeric data types
Returns:
    
outbool
See also
`issubdtype`
#### Examples
    
    >>> import numpy as np
    >>> np.isdtype(np.float32, np.float64)
    False
    >>> np.isdtype(np.float32, "real floating")
    True
    >>> np.isdtype(np.complex128, ("real floating", "complex floating"))
    True
    
# numpy.isfinite
numpy.isfinite(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isfinite'>
    
Test element-wise for finiteness (not infinity and not Not a Number).
The result is returned as a boolean array.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray, bool
    
True where `x` is not positive infinity, negative infinity, or NaN; false otherwise. This is a scalar if `x` is a scalar.
See also
`isinf`, `isneginf`, `isposinf`, `isnan`
#### Notes
Not a Number, positive infinity and negative infinity are considered to be non-finite.
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Also that positive infinity is not equivalent to negative infinity. But infinity is equivalent to positive infinity. Errors result if the second argument is also supplied when `x` is a scalar input, or if first and second arguments have different shapes.
#### Examples
    
    >>> import numpy as np
    >>> np.isfinite(1)
    True
    >>> np.isfinite(0)
    True
    >>> np.isfinite(np.nan)
    False
    >>> np.isfinite(np.inf)
    False
    >>> np.isfinite(-np.inf)
    False
    >>> np.isfinite([np.log(-1.),1.,np.log(0)])
    array([False,  True, False])
    
    
    >>> x = np.array([-np.inf, 0., np.inf])
    >>> y = np.array([2, 2, 2])
    >>> np.isfinite(x, y)
    array([0, 1, 0])
    >>> y
    array([0, 1, 0])
    
# numpy.isfortran
numpy.isfortran(a)[source]
    
Check if the array is Fortran contiguous but not C contiguous.
This function is obsolete. If you only want to check if an array is Fortran contiguous use `a.flags.f_contiguous` instead.
Parameters:
    
andarray
    
Input array.
Returns:
    
isfortranbool
    
Returns True if the array is Fortran contiguous but not C contiguous.
#### Examples
np.array allows to specify whether the array is written in C-contiguous order (last index varies the fastest), or FORTRAN-contiguous order in memory (first index varies the fastest).
    
    >>> import numpy as np
    >>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C')
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> np.isfortran(a)
    False
    
    
    >>> b = np.array([[1, 2, 3], [4, 5, 6]], order='F')
    >>> b
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> np.isfortran(b)
    True
    
The transpose of a C-ordered array is a FORTRAN-ordered array.
    
    >>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C')
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> np.isfortran(a)
    False
    >>> b = a.T
    >>> b
    array([[1, 4],
           [2, 5],
           [3, 6]])
    >>> np.isfortran(b)
    True
    
C-ordered arrays evaluate as False even if they are also FORTRAN-ordered.
    
    >>> np.isfortran(np.array([1, 2], order='F'))
    False
    
# numpy.isin
numpy.isin(element, test_elements, assume_unique=False, invert=False, *, kind=None)[source]
    
Calculates `element in test_elements`, broadcasting over `element` only. Returns a boolean array of the same shape as `element` that is True where an element of `element` is in `test_elements` and False otherwise.
Parameters:
    
elementarray_like
    
Input array.
test_elementsarray_like
    
The values against which to test each value of `element`. This argument is flattened if it is an array or array_like. See notes for behavior with non-array-like parameters.
assume_uniquebool, optional
    
If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False.
invertbool, optional
    
If True, the values in the returned array are inverted, as if calculating `element not in test_elements`. Default is False. `np.isin(a, b, invert=True)` is equivalent to (but faster than) `np.invert(np.isin(a, b))`.
kind{None, ‘sort’, ‘table’}, optional
    
The algorithm to use. This will not affect the final result, but will affect the speed and memory use. The default, None, will select automatically based on memory considerations.
  * If ‘sort’, will use a mergesort-based approach. This will have a memory usage of roughly 6 times the sum of the sizes of `element` and `test_elements`, not accounting for size of dtypes.
  * If ‘table’, will use a lookup table approach similar to a counting sort. This is only available for boolean and integer arrays. This will have a memory usage of the size of `element` plus the max-min value of `test_elements`. `assume_unique` has no effect when the ‘table’ option is used.
  * If None, will automatically choose ‘table’ if the required memory allocation is less than or equal to 6 times the sum of the sizes of `element` and `test_elements`, otherwise will use ‘sort’. This is done to not use a large amount of memory by default, even though ‘table’ may be faster in most cases. If ‘table’ is chosen, `assume_unique` will have no effect.


Returns:
    
isinndarray, bool
    
Has the same shape as `element`. The values `element[isin]` are in `test_elements`.
#### Notes
`isin` is an element-wise function version of the python keyword `in`. `isin(a, b)` is roughly equivalent to `np.array([item in b for item in a])` if `a` and `b` are 1-D sequences.
`element` and `test_elements` are converted to arrays if they are not already. If `test_elements` is a set (or other non-sequence collection) it will be converted to an object array with one element, rather than an array of the values contained in `test_elements`. This is a consequence of the `array` constructor’s way of handling non-sequence collections. Converting the set to a list usually gives the desired behavior.
Using `kind='table'` tends to be faster than `kind=’sort’` if the following relationship is true: `log10(len(test_elements)) > (log10(max(test_elements)-min(test_elements)) - 2.27) / 0.927`, but may use greater memory. The default value for `kind` will be automatically selected based only on memory usage, so one may manually set `kind='table'` if memory constraints can be relaxed.
#### Examples
    
    >>> import numpy as np
    >>> element = 2*np.arange(4).reshape((2, 2))
    >>> element
    array([[0, 2],
           [4, 6]])
    >>> test_elements = [1, 2, 4, 8]
    >>> mask = np.isin(element, test_elements)
    >>> mask
    array([[False,  True],
           [ True, False]])
    >>> element[mask]
    array([2, 4])
    
The indices of the matched values can be obtained with `nonzero`:
    
    >>> np.nonzero(mask)
    (array([0, 1]), array([1, 0]))
    
The test can also be inverted:
    
    >>> mask = np.isin(element, test_elements, invert=True)
    >>> mask
    array([[ True, False],
           [False,  True]])
    >>> element[mask]
    array([0, 6])
    
Because of how `array` handles sets, the following does not work as expected:
    
    >>> test_set = {1, 2, 4, 8}
    >>> np.isin(element, test_set)
    array([[False, False],
           [False, False]])
    
Casting the set to a list gives the expected result:
    
    >>> np.isin(element, list(test_set))
    array([[False,  True],
           [ True, False]])
    
# numpy.isinf
numpy.isinf(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isinf'>
    
Test element-wise for positive or negative infinity.
Returns a boolean array of the same shape as `x`, True where `x == +/-inf`, otherwise False.
Parameters:
    
xarray_like
    
Input values
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
ybool (scalar) or boolean ndarray
    
True where `x` is positive or negative infinity, false otherwise. This is a scalar if `x` is a scalar.
See also
`isneginf`, `isposinf`, `isnan`, `isfinite`
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754).
Errors result if the second argument is supplied when the first argument is a scalar, or if the first and second arguments have different shapes.
#### Examples
    
    >>> import numpy as np
    >>> np.isinf(np.inf)
    True
    >>> np.isinf(np.nan)
    False
    >>> np.isinf(-np.inf)
    True
    >>> np.isinf([np.inf, -np.inf, 1.0, np.nan])
    array([ True,  True, False, False])
    
    
    >>> x = np.array([-np.inf, 0., np.inf])
    >>> y = np.array([2, 2, 2])
    >>> np.isinf(x, y)
    array([1, 0, 1])
    >>> y
    array([1, 0, 1])
    
# numpy.isnan
numpy.isnan(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isnan'>
    
Test element-wise for NaN and return result as a boolean array.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or bool
    
True where `x` is NaN, false otherwise. This is a scalar if `x` is a scalar.
See also
`isinf`, `isneginf`, `isposinf`, `isfinite`, `isnat`
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity.
#### Examples
    
    >>> import numpy as np
    >>> np.isnan(np.nan)
    True
    >>> np.isnan(np.inf)
    False
    >>> np.isnan([np.log(-1.),1.,np.log(0)])
    array([ True, False, False])
    
# numpy.isnat
numpy.isnat(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isnat'>
    
Test element-wise for NaT (not a time) and return result as a boolean array.
Parameters:
    
xarray_like
    
Input array with datetime or timedelta data type.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or bool
    
True where `x` is NaT, false otherwise. This is a scalar if `x` is a scalar.
See also
`isnan`, `isinf`, `isneginf`, `isposinf`, `isfinite`
#### Examples
    
    >>> import numpy as np
    >>> np.isnat(np.datetime64("NaT"))
    True
    >>> np.isnat(np.datetime64("2016-01-01"))
    False
    >>> np.isnat(np.array(["NaT", "2016-01-01"], dtype="datetime64[ns]"))
    array([ True, False])
    
# numpy.isneginf
numpy.isneginf(x, out=None)[source]
    
Test element-wise for negative infinity, return result as bool array.
Parameters:
    
xarray_like
    
The input array.
outarray_like, optional
    
A location into which the result is stored. If provided, it must have a shape that the input broadcasts to. If not provided or None, a freshly-allocated boolean array is returned.
Returns:
    
outndarray
    
A boolean array with the same dimensions as the input. If second argument is not supplied then a numpy boolean array is returned with values True where the corresponding element of the input is negative infinity and values False where the element of the input is not negative infinity.
If a second argument is supplied the result is stored there. If the type of that array is a numeric type the result is represented as zeros and ones, if the type is boolean then as False and True. The return value `out` is then a reference to that array.
See also
`isinf`, `isposinf`, `isnan`, `isfinite`
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754).
Errors result if the second argument is also supplied when x is a scalar input, if first and second arguments have different shapes, or if the first argument has complex values.
#### Examples
    
    >>> import numpy as np
    >>> np.isneginf(-np.inf)
    True
    >>> np.isneginf(np.inf)
    False
    >>> np.isneginf([-np.inf, 0., np.inf])
    array([ True, False, False])
    
    
    >>> x = np.array([-np.inf, 0., np.inf])
    >>> y = np.array([2, 2, 2])
    >>> np.isneginf(x, y)
    array([1, 0, 0])
    >>> y
    array([1, 0, 0])
    
# numpy.isposinf
numpy.isposinf(x, out=None)[source]
    
Test element-wise for positive infinity, return result as bool array.
Parameters:
    
xarray_like
    
The input array.
outarray_like, optional
    
A location into which the result is stored. If provided, it must have a shape that the input broadcasts to. If not provided or None, a freshly-allocated boolean array is returned.
Returns:
    
outndarray
    
A boolean array with the same dimensions as the input. If second argument is not supplied then a boolean array is returned with values True where the corresponding element of the input is positive infinity and values False where the element of the input is not positive infinity.
If a second argument is supplied the result is stored there. If the type of that array is a numeric type the result is represented as zeros and ones, if the type is boolean then as False and True. The return value `out` is then a reference to that array.
See also
`isinf`, `isneginf`, `isfinite`, `isnan`
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754).
Errors result if the second argument is also supplied when x is a scalar input, if first and second arguments have different shapes, or if the first argument has complex values
#### Examples
    
    >>> import numpy as np
    >>> np.isposinf(np.inf)
    True
    >>> np.isposinf(-np.inf)
    False
    >>> np.isposinf([-np.inf, 0., np.inf])
    array([False, False,  True])
    
    
    >>> x = np.array([-np.inf, 0., np.inf])
    >>> y = np.array([2, 2, 2])
    >>> np.isposinf(x, y)
    array([0, 0, 1])
    >>> y
    array([0, 0, 1])
    
# numpy.isreal
numpy.isreal(x)[source]
    
Returns a bool array, where True if input element is real.
If element has complex type with zero imaginary part, the return value for that element is True.
Parameters:
    
xarray_like
    
Input array.
Returns:
    
outndarray, bool
    
Boolean array of same shape as `x`.
See also
`iscomplex`
`isrealobj`
    
Return True if x is not a complex type.
#### Notes
`isreal` may behave unexpectedly for string or object arrays (see examples)
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1+1j, 1+0j, 4.5, 3, 2, 2j], dtype=complex)
    >>> np.isreal(a)
    array([False,  True,  True,  True,  True, False])
    
The function does not work on string arrays.
    
    >>> a = np.array([2j, "a"], dtype="U")
    >>> np.isreal(a)  # Warns about non-elementwise comparison
    False
    
Returns True for all elements in input array of `dtype=object` even if any of the elements is complex.
    
    >>> a = np.array([1, "2", 3+4j], dtype=object)
    >>> np.isreal(a)
    array([ True,  True,  True])
    
isreal should not be used with object arrays
    
    >>> a = np.array([1+2j, 2+1j], dtype=object)
    >>> np.isreal(a)
    array([ True,  True])
    
# numpy.isrealobj
numpy.isrealobj(x)[source]
    
Return True if x is a not complex type or an array of complex numbers.
The type of the input is checked, not the value. So even if the input has an imaginary part equal to zero, `isrealobj` evaluates to False if the data type is complex.
Parameters:
    
xany
    
The input can be of any type and shape.
Returns:
    
ybool
    
The return value, False if `x` is of a complex type.
See also
`iscomplexobj`, `isreal`
#### Notes
The function is only meant for arrays with numerical values but it accepts all other objects. Since it assumes array input, the return value of other objects may be True.
    
    >>> np.isrealobj('A string')
    True
    >>> np.isrealobj(False)
    True
    >>> np.isrealobj(None)
    True
    
#### Examples
    
    >>> import numpy as np
    >>> np.isrealobj(1)
    True
    >>> np.isrealobj(1+0j)
    False
    >>> np.isrealobj([3, 1+0j, True])
    False
    
# numpy.isscalar
numpy.isscalar(element)[source]
    
Returns True if the type of `element` is a scalar type.
Parameters:
    
elementany
    
Input argument, can be of any type and shape.
Returns:
    
valbool
    
True if `element` is a scalar type, False if it is not.
See also
`ndim`
    
Get the number of dimensions of an array
#### Notes
If you need a stricter way to identify a numerical scalar, use `isinstance(x, numbers.Number)`, as that returns `False` for most non-numerical elements such as strings.
In most cases `np.ndim(x) == 0` should be used instead of this function, as that will also return true for 0d arrays. This is how numpy overloads functions in the style of the `dx` arguments to `gradient` and the `bins` argument to `histogram`. Some key differences:
x
`isscalar(x)`
`np.ndim(x) == 0`  
PEP 3141 numeric objects (including builtins)
`True`
`True`  
builtin string and buffer objects
`True`
`True`  
other builtin objects, like `pathlib.Path`, `Exception`, the result of `re.compile`
`False`
`True`  
third-party objects like `matplotlib.figure.Figure`
`False`
`True`  
zero-dimensional numpy arrays
`False`
`True`  
other numpy arrays
`False`
`False`  
`list`, `tuple`, and other sequence objects
`False`
`False`  
#### Examples
    
    >>> import numpy as np
    
    
    >>> np.isscalar(3.1)
    True
    
    
    >>> np.isscalar(np.array(3.1))
    False
    
    
    >>> np.isscalar([3.1])
    False
    
    
    >>> np.isscalar(False)
    True
    
    
    >>> np.isscalar('numpy')
    True
    
NumPy supports PEP 3141 numbers:
    
    >>> from fractions import Fraction
    >>> np.isscalar(Fraction(5, 17))
    True
    >>> from numbers import Number
    >>> np.isscalar(Number())
    True
    
# numpy.issubdtype
numpy.issubdtype(arg1, arg2)[source]
    
Returns True if first argument is a typecode lower/equal in type hierarchy.
This is like the builtin `issubclass`, but for `dtype`s.
Parameters:
    
arg1, arg2dtype_like
    
`dtype` or object coercible to one
Returns:
    
outbool
See also
Scalars
    
Overview of the numpy type hierarchy.
#### Examples
`issubdtype` can be used to check the type of arrays:
    
    >>> ints = np.array([1, 2, 3], dtype=np.int32)
    >>> np.issubdtype(ints.dtype, np.integer)
    True
    >>> np.issubdtype(ints.dtype, np.floating)
    False
    
    
    >>> floats = np.array([1, 2, 3], dtype=np.float32)
    >>> np.issubdtype(floats.dtype, np.integer)
    False
    >>> np.issubdtype(floats.dtype, np.floating)
    True
    
Similar types of different sizes are not subdtypes of each other:
    
    >>> np.issubdtype(np.float64, np.float32)
    False
    >>> np.issubdtype(np.float32, np.float64)
    False
    
but both are subtypes of `floating`:
    
    >>> np.issubdtype(np.float64, np.floating)
    True
    >>> np.issubdtype(np.float32, np.floating)
    True
    
For convenience, dtype-like objects are allowed too:
    
    >>> np.issubdtype('S1', np.bytes_)
    True
    >>> np.issubdtype('i4', np.signedinteger)
    True
    
# numpy.iterable
numpy.iterable(y)[source]
    
Check whether or not an object can be iterated over.
Parameters:
    
yobject
    
Input object.
Returns:
    
bbool
    
Return `True` if the object has an iterator method or is a sequence and `False` otherwise.
#### Notes
In most cases, the results of `np.iterable(obj)` are consistent with `isinstance(obj, collections.abc.Iterable)`. One notable exception is the treatment of 0-dimensional arrays:
    
    >>> from collections.abc import Iterable
    >>> a = np.array(1.0)  # 0-dimensional numpy array
    >>> isinstance(a, Iterable)
    True
    >>> np.iterable(a)
    False
    
#### Examples
    
    >>> import numpy as np
    >>> np.iterable([1, 2, 3])
    True
    >>> np.iterable(2)
    False
    
# numpy.ix_
numpy.ix_(*args)[source]
    
Construct an open mesh from multiple sequences.
This function takes N 1-D sequences and returns N outputs with N dimensions each, such that the shape is 1 in all but one dimension and the dimension with the non-unit shape value cycles through all N dimensions.
Using `ix_` one can quickly construct index arrays that will index the cross product. `a[np.ix_([1,3],[2,5])]` returns the array `[[a[1,2] a[1,5]], [a[3,2] a[3,5]]]`.
Parameters:
    
args1-D sequences
    
Each sequence should be of integer or boolean type. Boolean sequences will be interpreted as boolean masks for the corresponding dimension (equivalent to passing in `np.nonzero(boolean_sequence)`).
Returns:
    
outtuple of ndarrays
    
N arrays with N dimensions each, with N the number of input sequences. Together these arrays form an open mesh.
See also
`ogrid`, `mgrid`, `meshgrid`
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(10).reshape(2, 5)
    >>> a
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    >>> ixgrid = np.ix_([0, 1], [2, 4])
    >>> ixgrid
    (array([[0],
           [1]]), array([[2, 4]]))
    >>> ixgrid[0].shape, ixgrid[1].shape
    ((2, 1), (1, 2))
    >>> a[ixgrid]
    array([[2, 4],
           [7, 9]])
    
    
    >>> ixgrid = np.ix_([True, True], [2, 4])
    >>> a[ixgrid]
    array([[2, 4],
           [7, 9]])
    >>> ixgrid = np.ix_([True, True], [False, False, True, False, True])
    >>> a[ixgrid]
    array([[2, 4],
           [7, 9]])
    
# numpy.kaiser
numpy.kaiser(M, beta)[source]
    
Return the Kaiser window.
The Kaiser window is a taper formed by using a Bessel function.
Parameters:
    
Mint
    
Number of points in the output window. If zero or less, an empty array is returned.
betafloat
    
Shape parameter for window.
Returns:
    
outarray
    
The window, with the maximum value normalized to one (the value one appears only if the number of samples is odd).
See also
`bartlett`, `blackman`, `hamming`, `hanning`
#### Notes
The Kaiser window is defined as
\\[w(n) = I_0\left( \beta \sqrt{1-\frac{4n^2}{(M-1)^2}} \right)/I_0(\beta)\\]
with
\\[\quad -\frac{M-1}{2} \leq n \leq \frac{M-1}{2},\\]
where \\(I_0\\) is the modified zeroth-order Bessel function.
The Kaiser was named for Jim Kaiser, who discovered a simple approximation to the DPSS window based on Bessel functions. The Kaiser window is a very good approximation to the Digital Prolate Spheroidal Sequence, or Slepian window, which is the transform which maximizes the energy in the main lobe of the window relative to total energy.
The Kaiser can approximate many other windows by varying the beta parameter.
beta
Window shape  
0
Rectangular  
5
Similar to a Hamming  
6
Similar to a Hanning  
8.6
Similar to a Blackman  
A beta value of 14 is probably a good starting point. Note that as beta gets large, the window narrows, and so the number of samples needs to be large enough to sample the increasingly narrow spike, otherwise NaNs will get returned.
Most references to the Kaiser window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means “removing the foot”, i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function.
#### References
[1]
J. F. Kaiser, “Digital Filters” - Ch 7 in “Systems analysis by digital computer”, Editors: F.F. Kuo and J.F. Kaiser, p 218-285. John Wiley and Sons, New York, (1966).
[2]
E.R. Kanasewich, “Time Sequence Analysis in Geophysics”, The University of Alberta Press, 1975, pp. 177-178.
[3]
Wikipedia, “Window function”, https://en.wikipedia.org/wiki/Window_function
#### Examples
    
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> np.kaiser(12, 14)
     array([7.72686684e-06, 3.46009194e-03, 4.65200189e-02, # may vary
            2.29737120e-01, 5.99885316e-01, 9.45674898e-01,
            9.45674898e-01, 5.99885316e-01, 2.29737120e-01,
            4.65200189e-02, 3.46009194e-03, 7.72686684e-06])
    
Plot the window and the frequency response.
    
    import matplotlib.pyplot as plt
    from numpy.fft import fft, fftshift
    window = np.kaiser(51, 14)
    plt.plot(window)
    plt.title("Kaiser window")
    plt.ylabel("Amplitude")
    plt.xlabel("Sample")
    plt.show()
    
    
    plt.figure()
    A = fft(window, 2048) / 25.5
    mag = np.abs(fftshift(A))
    freq = np.linspace(-0.5, 0.5, len(A))
    response = 20 * np.log10(mag)
    response = np.clip(response, -100, 100)
    plt.plot(freq, response)
    plt.title("Frequency response of Kaiser window")
    plt.ylabel("Magnitude [dB]")
    plt.xlabel("Normalized frequency [cycles per sample]")
    plt.axis('tight')
    plt.show()
    
# numpy.kron
numpy.kron(a, b)[source]
    
Kronecker product of two arrays.
Computes the Kronecker product, a composite array made of blocks of the second array scaled by the first.
Parameters:
    
a, barray_like
Returns:
    
outndarray
See also
`outer`
    
The outer product
#### Notes
The function assumes that the number of dimensions of `a` and `b` are the same, if necessary prepending the smallest with ones. If `a.shape = (r0,r1,..,rN)` and `b.shape = (s0,s1,...,sN)`, the Kronecker product has shape `(r0*s0, r1*s1, ..., rN*SN)`. The elements are products of elements from `a` and `b`, organized explicitly by:
    
    kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN]
    
where:
    
    kt = it * st + jt,  t = 0,...,N
    
In the common 2-D case (N=1), the block structure can be visualized:
    
    [[ a[0,0]*b,   a[0,1]*b,  ... , a[0,-1]*b  ],
     [  ...                              ...   ],
     [ a[-1,0]*b,  a[-1,1]*b, ... , a[-1,-1]*b ]]
    
#### Examples
    
    >>> import numpy as np
    >>> np.kron([1,10,100], [5,6,7])
    array([  5,   6,   7, ..., 500, 600, 700])
    >>> np.kron([5,6,7], [1,10,100])
    array([  5,  50, 500, ...,   7,  70, 700])
    
    
    >>> np.kron(np.eye(2), np.ones((2,2)))
    array([[1.,  1.,  0.,  0.],
           [1.,  1.,  0.,  0.],
           [0.,  0.,  1.,  1.],
           [0.,  0.,  1.,  1.]])
    
    
    >>> a = np.arange(100).reshape((2,5,2,5))
    >>> b = np.arange(24).reshape((2,3,4))
    >>> c = np.kron(a,b)
    >>> c.shape
    (2, 10, 6, 20)
    >>> I = (1,3,0,2)
    >>> J = (0,2,1)
    >>> J1 = (0,) + J             # extend to ndim=4
    >>> S1 = (1,) + b.shape
    >>> K = tuple(np.array(I) * np.array(S1) + np.array(J1))
    >>> c[K] == a[I]*b[J]
    True
    
# numpy.lcm
numpy.lcm(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'lcm'>
    
Returns the lowest common multiple of `|x1|` and `|x2|`
Parameters:
    
x1, x2array_like, int
    
Arrays of values. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
Returns:
    
yndarray or scalar
    
The lowest common multiple of the absolute value of the inputs This is a scalar if both `x1` and `x2` are scalars.
See also
`gcd`
    
The greatest common divisor
#### Examples
    
    >>> import numpy as np
    >>> np.lcm(12, 20)
    60
    >>> np.lcm.reduce([3, 12, 20])
    60
    >>> np.lcm.reduce([40, 12, 20])
    120
    >>> np.lcm(np.arange(6), 20)
    array([ 0, 20, 20, 60, 20, 20])
    
# numpy.ldexp
numpy.ldexp(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'ldexp'>
    
Returns x1 * 2**x2, element-wise.
The mantissas `x1` and twos exponents `x2` are used to construct floating point numbers `x1 * 2**x2`.
Parameters:
    
x1array_like
    
Array of multipliers.
x2array_like, int
    
Array of twos exponents. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The result of `x1 * 2**x2`. This is a scalar if both `x1` and `x2` are scalars.
See also
`frexp`
    
Return (y1, y2) from `x = y1 * 2**y2`, inverse to `ldexp`.
#### Notes
Complex dtypes are not supported, they will raise a TypeError.
`ldexp` is useful as the inverse of `frexp`, if used by itself it is more clear to simply use the expression `x1 * 2**x2`.
#### Examples
    
    >>> import numpy as np
    >>> np.ldexp(5, np.arange(4))
    array([ 5., 10., 20., 40.], dtype=float16)
    
    
    >>> x = np.arange(6)
    >>> np.ldexp(*np.frexp(x))
    array([ 0.,  1.,  2.,  3.,  4.,  5.])
    
# numpy.left_shift
numpy.left_shift(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'left_shift'>
    
Shift the bits of an integer to the left.
Bits are shifted to the left by appending `x2` 0s at the right of `x1`. Since the internal representation of numbers is in binary format, this operation is equivalent to multiplying `x1` by `2**x2`.
Parameters:
    
x1array_like of integer type
    
Input values.
x2array_like of integer type
    
Number of zeros to append to `x1`. Has to be non-negative. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outarray of integer type
    
Return `x1` with bits shifted `x2` times to the left. This is a scalar if both `x1` and `x2` are scalars.
See also
`right_shift`
    
Shift the bits of an integer to the right.
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    >>> np.binary_repr(5)
    '101'
    >>> np.left_shift(5, 2)
    20
    >>> np.binary_repr(20)
    '10100'
    
    
    >>> np.left_shift(5, [1,2,3])
    array([10, 20, 40])
    
Note that the dtype of the second argument may change the dtype of the result and can lead to unexpected results in some cases (see Casting Rules):
    
    >>> a = np.left_shift(np.uint8(255), np.int64(1))  # Expect 254
    >>> print(a, type(a)) # Unexpected result due to upcasting
    510 <class 'numpy.int64'>
    >>> b = np.left_shift(np.uint8(255), np.uint8(1))
    >>> print(b, type(b))
    254 <class 'numpy.uint8'>
    
The `<<` operator can be used as a shorthand for `np.left_shift` on ndarrays.
    
    >>> x1 = 5
    >>> x2 = np.array([1, 2, 3])
    >>> x1 << x2
    array([10, 20, 40])
    
# numpy.less
numpy.less(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'less'>
    
Return the truth value of (x1 < x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater`, `less_equal`, `greater_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.less([1, 2], [2, 2])
    array([ True, False])
    
The `<` operator can be used as a shorthand for `np.less` on ndarrays.
    
    >>> a = np.array([1, 2])
    >>> b = np.array([2, 2])
    >>> a < b
    array([ True, False])
    
# numpy.less_equal
numpy.less_equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'less_equal'>
    
Return the truth value of (x1 <= x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater`, `less`, `greater_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.less_equal([4, 2, 1], [2, 2, 2])
    array([False,  True,  True])
    
The `<=` operator can be used as a shorthand for `np.less_equal` on ndarrays.
    
    >>> a = np.array([4, 2, 1])
    >>> b = np.array([2, 2, 2])
    >>> a <= b
    array([False,  True,  True])
    
# numpy.lexsort
numpy.lexsort(keys, axis=-1)
    
Perform an indirect stable sort using a sequence of keys.
Given multiple sorting keys, lexsort returns an array of integer indices that describes the sort order by multiple keys. The last key in the sequence is used for the primary sort order, ties are broken by the second-to-last key, and so on.
Parameters:
    
keys(k, m, n, …) array-like
    
The `k` keys to be sorted. The last key (e.g, the last row if `keys` is a 2D array) is the primary sort key. Each element of `keys` along the zeroth axis must be an array-like object of the same shape.
axisint, optional
    
Axis to be indirectly sorted. By default, sort over the last axis of each sequence. Separate slices along `axis` sorted over independently; see last example.
Returns:
    
indices(m, n, …) ndarray of ints
    
Array of indices that sort the keys along the specified axis.
See also
`argsort`
    
Indirect sort.
`ndarray.sort`
    
In-place sort.
`sort`
    
Return a sorted copy of an array.
#### Examples
Sort names: first by surname, then by name.
    
    >>> import numpy as np
    >>> surnames =    ('Hertz',    'Galilei', 'Hertz')
    >>> first_names = ('Heinrich', 'Galileo', 'Gustav')
    >>> ind = np.lexsort((first_names, surnames))
    >>> ind
    array([1, 2, 0])
    
    
    >>> [surnames[i] + ", " + first_names[i] for i in ind]
    ['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich']
    
Sort according to two numerical keys, first by elements of `a`, then breaking ties according to elements of `b`:
    
    >>> a = [1, 5, 1, 4, 3, 4, 4]  # First sequence
    >>> b = [9, 4, 0, 4, 0, 2, 1]  # Second sequence
    >>> ind = np.lexsort((b, a))  # Sort by `a`, then by `b`
    >>> ind
    array([2, 0, 4, 6, 5, 3, 1])
    >>> [(a[i], b[i]) for i in ind]
    [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
    
Compare against `argsort`, which would sort each key independently.
    
    >>> np.argsort((b, a), kind='stable')
    array([[2, 4, 6, 5, 1, 3, 0],
           [0, 2, 4, 3, 5, 6, 1]])
    
To sort lexicographically with `argsort`, we would need to provide a structured array.
    
    >>> x = np.array([(ai, bi) for ai, bi in zip(a, b)],
    ...              dtype = np.dtype([('x', int), ('y', int)]))
    >>> np.argsort(x)  # or np.argsort(x, order=('x', 'y'))
    array([2, 0, 4, 6, 5, 3, 1])
    
The zeroth axis of `keys` always corresponds with the sequence of keys, so 2D arrays are treated just like other sequences of keys.
    
    >>> arr = np.asarray([b, a])
    >>> ind2 = np.lexsort(arr)
    >>> np.testing.assert_equal(ind2, ind)
    
Accordingly, the `axis` parameter refers to an axis of each key, not of the `keys` argument itself. For instance, the array `arr` is treated as a sequence of two 1-D keys, so specifying `axis=0` is equivalent to using the default axis, `axis=-1`.
    
    >>> np.testing.assert_equal(np.lexsort(arr, axis=0),
    ...                         np.lexsort(arr, axis=-1))
    
For higher-dimensional arrays, the axis parameter begins to matter. The resulting array has the same shape as each key, and the values are what we would expect if `lexsort` were performed on corresponding slices of the keys independently. For instance,
    
    >>> x = [[1, 2, 3, 4],
    ...      [4, 3, 2, 1],
    ...      [2, 1, 4, 3]]
    >>> y = [[2, 2, 1, 1],
    ...      [1, 2, 1, 2],
    ...      [1, 1, 2, 1]]
    >>> np.lexsort((x, y), axis=1)
    array([[2, 3, 0, 1],
           [2, 0, 3, 1],
           [1, 0, 3, 2]])
    
Each row of the result is what we would expect if we were to perform `lexsort` on the corresponding row of the keys:
    
    >>> for i in range(3):
    ...     print(np.lexsort((x[i], y[i])))
    [2 3 0 1]
    [2 0 3 1]
    [1 0 3 2]
    
# numpy.lib.add_docstring
lib.add_docstring(obj, docstring)
    
Add a docstring to a built-in obj if possible. If the obj already has a docstring raise a RuntimeError If this routine does not know how to add a docstring to the object raise a TypeError
# numpy.lib.add_newdoc
lib.add_newdoc(place, obj, doc, warn_on_python=True)[source]
    
Add documentation to an existing object, typically one defined in C
The purpose is to allow easier editing of the docstrings without requiring a re-compile. This exists primarily for internal use within numpy itself.
Parameters:
    
placestr
    
The absolute name of the module to import from
objstr or None
    
The name of the object to add documentation to, typically a class or function name.
doc{str, Tuple[str, str], List[Tuple[str, str]]}
    
If a string, the documentation to apply to `obj`
If a tuple, then the first element is interpreted as an attribute of `obj` and the second as the docstring to apply - `(method, docstring)`
If a list, then each element of the list should be a tuple of length two - `[(method1, docstring1), (method2, docstring2), ...]`
warn_on_pythonbool
    
If True, the default, emit `UserWarning` if this is used to attach documentation to a pure-python object.
#### Notes
This routine never raises an error if the docstring can’t be written, but will raise an error if the object being documented does not exist.
This routine cannot modify read-only docstrings, as appear in new-style classes or built-in functions. Because this routine never raises an error the caller must check manually that the docstrings were changed.
Since this function grabs the `char *` from a c-level str object and puts it into the `tp_doc` slot of the type of `obj`, it violates a number of C-API best-practices, by:
  * modifying a `PyTypeObject` after calling `PyType_Ready`
  * calling `Py_INCREF` on the str and losing the reference, so the str will never be released


If possible it should be avoided.
# numpy.lib.array_utils.byte_bounds
lib.array_utils.byte_bounds(a)[source]
    
Returns pointers to the end-points of an array.
Parameters:
    
andarray
    
Input array. It must conform to the Python-side of the array interface.
Returns:
    
(low, high)tuple of 2 integers
    
The first integer is the first byte of the array, the second integer is just past the last byte of the array. If `a` is not contiguous it will not use every byte between the (`low`, `high`) values.
#### Examples
    
    >>> import numpy as np
    >>> I = np.eye(2, dtype='f'); I.dtype
    dtype('float32')
    >>> low, high = np.lib.array_utils.byte_bounds(I)
    >>> high - low == I.size*I.itemsize
    True
    >>> I = np.eye(2); I.dtype
    dtype('float64')
    >>> low, high = np.lib.array_utils.byte_bounds(I)
    >>> high - low == I.size*I.itemsize
    True
    
# numpy.lib.array_utils
Miscellaneous utils.
#### Functions
`byte_bounds`(a)
Returns pointers to the end-points of an array.  
`normalize_axis_index`(axis, ndim[, msg_prefix])
Normalizes an axis index, `axis`, such that is a valid positive index into the shape of array with `ndim` dimensions.  
`normalize_axis_tuple`(axis, ndim[, argname, ...])
Normalizes an axis argument into a tuple of non-negative integer axes.  
# numpy.lib.array_utils.normalize_axis_index
lib.array_utils.normalize_axis_index(axis, ndim, msg_prefix=None)
    
Normalizes an axis index, `axis`, such that is a valid positive index into the shape of array with `ndim` dimensions. Raises an AxisError with an appropriate message if this is not possible.
Used internally by all axis-checking logic.
Parameters:
    
axisint
    
The un-normalized index of the axis. Can be negative
ndimint
    
The number of dimensions of the array that `axis` should be normalized against
msg_prefixstr
    
A prefix to put before the message, typically the name of the argument
Returns:
    
normalized_axisint
    
The normalized axis index, such that `0 <= normalized_axis < ndim`
Raises:
    
AxisError
    
If the axis index is invalid, when `-ndim <= axis < ndim` is false.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib.array_utils import normalize_axis_index
    >>> normalize_axis_index(0, ndim=3)
    0
    >>> normalize_axis_index(1, ndim=3)
    1
    >>> normalize_axis_index(-1, ndim=3)
    2
    
    
    >>> normalize_axis_index(3, ndim=3)
    Traceback (most recent call last):
    ...
    numpy.exceptions.AxisError: axis 3 is out of bounds for array ...
    >>> normalize_axis_index(-4, ndim=3, msg_prefix='axes_arg')
    Traceback (most recent call last):
    ...
    numpy.exceptions.AxisError: axes_arg: axis -4 is out of bounds ...
    
# numpy.lib.array_utils.normalize_axis_tuple
lib.array_utils.normalize_axis_tuple(axis, ndim, argname=None, allow_duplicate=False)[source]
    
Normalizes an axis argument into a tuple of non-negative integer axes.
This handles shorthands such as `1` and converts them to `(1,)`, as well as performing the handling of negative indices covered by `normalize_axis_index`.
By default, this forbids axes from being specified multiple times.
Used internally by multi-axis-checking logic.
Parameters:
    
axisint, iterable of int
    
The un-normalized index or indices of the axis.
ndimint
    
The number of dimensions of the array that `axis` should be normalized against.
argnamestr, optional
    
A prefix to put before the error message, typically the name of the argument.
allow_duplicatebool, optional
    
If False, the default, disallow an axis from being specified twice.
Returns:
    
normalized_axestuple of int
    
The normalized axis index, such that `0 <= normalized_axis < ndim`
Raises:
    
AxisError
    
If any axis provided is out of range
ValueError
    
If an axis is repeated
See also
`normalize_axis_index`
    
normalizing a single scalar axis
# numpy.lib.Arrayterator.flat
property
propertylib.Arrayterator.flat
    
A 1-D flat iterator for Arrayterator objects.
This iterator returns elements of the array to be iterated over in `Arrayterator` one by one. It is similar to `flatiter`.
See also
`lib.Arrayterator`
`flatiter`
#### Examples
    
    >>> a = np.arange(3 * 4 * 5 * 6).reshape(3, 4, 5, 6)
    >>> a_itor = np.lib.Arrayterator(a, 2)
    
    
    >>> for subarr in a_itor.flat:
    ...     if not subarr:
    ...         print(subarr, type(subarr))
    ...
    0 <class 'numpy.int64'>
    
# numpy.lib.Arrayterator
classnumpy.lib.Arrayterator(var, buf_size=None)[source]
    
Buffered iterator for big arrays.
`Arrayterator` creates a buffered iterator for reading big arrays in small contiguous blocks. The class is useful for objects stored in the file system. It allows iteration over the object without reading everything in memory; instead, small blocks are read and iterated over.
`Arrayterator` can be used with any object that supports multidimensional slices. This includes NumPy arrays, but also variables from Scientific.IO.NetCDF or pynetcdf for example.
Parameters:
    
vararray_like
    
The object to iterate over.
buf_sizeint, optional
    
The buffer size. If `buf_size` is supplied, the maximum amount of data that will be read into memory is `buf_size` elements. Default is None, which will read as many element as possible into memory.
See also
`numpy.ndenumerate`
    
Multidimensional array iterator.
`numpy.flatiter`
    
Flat array iterator.
`numpy.memmap`
    
Create a memory-map to an array stored in a binary file on disk.
#### Notes
The algorithm works by first finding a “running dimension”, along which the blocks will be extracted. Given an array of dimensions `(d1, d2, ..., dn)`, e.g. if `buf_size` is smaller than `d1`, the first dimension will be used. If, on the other hand, `d1 < buf_size < d1*d2` the second dimension will be used, and so on. Blocks are extracted along this dimension, and when the last block is returned the process continues from the next dimension, until all elements have been read.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(3 * 4 * 5 * 6).reshape(3, 4, 5, 6)
    >>> a_itor = np.lib.Arrayterator(a, 2)
    >>> a_itor.shape
    (3, 4, 5, 6)
    
Now we can iterate over `a_itor`, and it will return arrays of size two. Since `buf_size` was smaller than any dimension, the first dimension will be iterated over first:
    
    >>> for subarr in a_itor:
    ...     if not subarr.all():
    ...         print(subarr, subarr.shape) 
    >>> # [[[[0 1]]]] (1, 1, 1, 2)
    
Attributes:
    
var
buf_size
start
stop
step
`shape`
    
The shape of the array to be iterated over.
`flat`
    
A 1-D flat iterator for Arrayterator objects.
# numpy.lib.Arrayterator.shape
property
propertylib.Arrayterator.shape
    
The shape of the array to be iterated over.
For an example, see `Arrayterator`.
# numpy.lib.format.descr_to_dtype
lib.format.descr_to_dtype(descr)[source]
    
Returns a dtype based off the given description.
This is essentially the reverse of `dtype_to_descr`. It will remove the valueless padding fields created by, i.e. simple fields like dtype(‘float32’), and then convert the description to its corresponding dtype.
Parameters:
    
descrobject
    
The object retrieved by dtype.descr. Can be passed to `numpy.dtype` in order to replicate the input dtype.
Returns:
    
dtypedtype
    
The dtype constructed by the description.
# numpy.lib.format.drop_metadata
lib.format.drop_metadata(dtype, /)[source]
    
Returns the dtype unchanged if it contained no metadata or a copy of the dtype if it (or any of its structure dtypes) contained metadata.
This utility is used by `np.save` and `np.savez` to drop metadata before saving.
Note
Due to its limitation this function may move to a more appropriate home or change in the future and is considered semi-public API only.
Warning
This function does not preserve more strange things like record dtypes and user dtypes may simply return the wrong thing. If you need to be sure about the latter, check the result with: `np.can_cast(new_dtype, dtype, casting="no")`.
# numpy.lib.format.dtype_to_descr
lib.format.dtype_to_descr(dtype)[source]
    
Get a serializable descriptor from the dtype.
The .descr attribute of a dtype object cannot be round-tripped through the dtype() constructor. Simple types, like dtype(‘float32’), have a descr which looks like a record array with one field with ‘’ as a name. The dtype() constructor interprets this as a request to give a default name. Instead, we construct descriptor that can be passed to dtype().
Parameters:
    
dtypedtype
    
The dtype of the array that will be written to disk.
Returns:
    
descrobject
    
An object that can be passed to `numpy.dtype()` in order to replicate the input dtype.
# numpy.lib.format.header_data_from_array_1_0
lib.format.header_data_from_array_1_0(array)[source]
    
Get the dictionary of header metadata from a numpy.ndarray.
Parameters:
    
arraynumpy.ndarray
Returns:
    
ddict
    
This has the appropriate entries for writing its string representation to the header of the file.
# numpy.lib.format
Binary serialization
## NPY format
A simple format for saving numpy arrays to disk with the full information about them.
The `.npy` format is the standard binary file format in NumPy for persisting a single arbitrary NumPy array on disk. The format stores all of the shape and dtype information necessary to reconstruct the array correctly even on another machine with a different architecture. The format is designed to be as simple as possible while achieving its limited goals.
The `.npz` format is the standard format for persisting multiple NumPy arrays on disk. A `.npz` file is a zip file containing multiple `.npy` files, one for each array.
### Capabilities
  * Can represent all NumPy arrays including nested record arrays and object arrays.
  * Represents the data in its native binary form.
  * Supports Fortran-contiguous arrays directly.
  * Stores all of the necessary information to reconstruct the array including shape and dtype on a machine of a different architecture. Both little-endian and big-endian arrays are supported, and a file with little-endian numbers will yield a little-endian array on any machine reading the file. The types are described in terms of their actual sizes. For example, if a machine with a 64-bit C “long int” writes out an array with “long ints”, a reading machine with 32-bit C “long ints” will yield an array with 64-bit integers.
  * Is straightforward to reverse engineer. Datasets often live longer than the programs that created them. A competent developer should be able to create a solution in their preferred programming language to read most `.npy` files that they have been given without much documentation.
  * Allows memory-mapping of the data. See `open_memmap`.
  * Can be read from a filelike stream object instead of an actual file.
  * Stores object arrays, i.e. arrays containing elements that are arbitrary Python objects. Files with object arrays are not to be mmapable, but can be read and written to disk.


### Limitations
  * Arbitrary subclasses of numpy.ndarray are not completely preserved. Subclasses will be accepted for writing, but only the array data will be written out. A regular numpy.ndarray object will be created upon reading the file.


Warning
Due to limitations in the interpretation of structured dtypes, dtypes with fields with empty names will have the names replaced by ‘f0’, ‘f1’, etc. Such arrays will not round-trip through the format entirely accurately. The data is intact; only the field names will differ. We are working on a fix for this. This fix will not require a change in the file format. The arrays with such structures can still be saved and restored, and the correct dtype may be restored by using the `loadedarray.view(correct_dtype)` method.
### File extensions
We recommend using the `.npy` and `.npz` extensions for files saved in this format. This is by no means a requirement; applications may wish to use these file formats but use an extension specific to the application. In the absence of an obvious alternative, however, we suggest using `.npy` and `.npz`.
### Version numbering
The version numbering of these formats is independent of NumPy version numbering. If the format is upgraded, the code in `numpy.io` will still be able to read and write Version 1.0 files.
### Format Version 1.0
The first 6 bytes are a magic string: exactly `\x93NUMPY`.
The next 1 byte is an unsigned byte: the major version number of the file format, e.g. `\x01`.
The next 1 byte is an unsigned byte: the minor version number of the file format, e.g. `\x00`. Note: the version of the file format is not tied to the version of the numpy package.
The next 2 bytes form a little-endian unsigned short int: the length of the header data HEADER_LEN.
The next HEADER_LEN bytes form the header data describing the array’s format. It is an ASCII string which contains a Python literal expression of a dictionary. It is terminated by a newline (`\n`) and padded with spaces (`\x20`) to make the total of `len(magic string) + 2 + len(length) + HEADER_LEN` be evenly divisible by 64 for alignment purposes.
The dictionary contains three keys:
“descr”dtype.descr
    
An object that can be passed as an argument to the `numpy.dtype` constructor to create the array’s dtype.
“fortran_order”bool
    
Whether the array data is Fortran-contiguous or not. Since Fortran-contiguous arrays are a common form of non-C-contiguity, we allow them to be written directly to disk for efficiency.
“shape”tuple of int
    
The shape of the array.
For repeatability and readability, the dictionary keys are sorted in alphabetic order. This is for convenience only. A writer SHOULD implement this if possible. A reader MUST NOT depend on this.
Following the header comes the array data. If the dtype contains Python objects (i.e. `dtype.hasobject is True`), then the data is a Python pickle of the array. Otherwise the data is the contiguous (either C- or Fortran-, depending on `fortran_order`) bytes of the array. Consumers can figure out the number of bytes by multiplying the number of elements given by the shape (noting that `shape=()` means there is 1 element) by `dtype.itemsize`.
### Format Version 2.0
The version 1.0 format only allowed the array header to have a total size of 65535 bytes. This can be exceeded by structured arrays with a large number of columns. The version 2.0 format extends the header size to 4 GiB. `numpy.save` will automatically save in 2.0 format if the data requires it, else it will always use the more compatible 1.0 format.
The description of the fourth element of the header therefore has become: “The next 4 bytes form a little-endian unsigned int: the length of the header data HEADER_LEN.”
### Format Version 3.0
This version replaces the ASCII string (which in practice was latin1) with a utf8-encoded string, so supports structured types with any unicode field names.
### Notes
The `.npy` format, including motivation for creating it and a comparison of alternatives, is described in the “npy-format” NEP, however details have evolved with time and this document is more current.
#### Functions
`descr_to_dtype`(descr)
Returns a dtype based off the given description.  
`drop_metadata`(dtype, /)
Returns the dtype unchanged if it contained no metadata or a copy of the dtype if it (or any of its structure dtypes) contained metadata.  
`dtype_to_descr`(dtype)
Get a serializable descriptor from the dtype.  
`header_data_from_array_1_0`(array)
Get the dictionary of header metadata from a numpy.ndarray.  
`isfileobj`(f)  
`magic`(major, minor)
Return the magic string for the given file format version.  
`open_memmap`(filename[, mode, dtype, shape, ...])
Open a .npy file as a memory-mapped array.  
`read_array`(fp[, allow_pickle, ...])
Read an array from an NPY file.  
`read_array_header_1_0`(fp[, max_header_size])
Read an array header from a filelike object using the 1.0 file format version.  
`read_array_header_2_0`(fp[, max_header_size])
Read an array header from a filelike object using the 2.0 file format version.  
`read_magic`(fp)
Read the magic string to get the version of the file format.  
`write_array`(fp, array[, version, ...])
Write an array to an NPY file, including a header.  
`write_array_header_1_0`(fp, d)
Write the header for an array using the 1.0 format.  
`write_array_header_2_0`(fp, d)
Write the header for an array using the 2.0 format.  
# numpy.lib.format.isfileobj
lib.format.isfileobj(f)[source]
# numpy.lib.format.magic
lib.format.magic(major, minor)[source]
    
Return the magic string for the given file format version.
Parameters:
    
majorint in [0, 255]
minorint in [0, 255]
Returns:
    
magicstr
Raises:
    
ValueError if the version cannot be formatted.
# numpy.lib.format.open_memmap
lib.format.open_memmap(filename, mode='r+', dtype=None, shape=None, fortran_order=False, version=None, *, max_header_size=10000)[source]
    
Open a .npy file as a memory-mapped array.
This may be used to read an existing file or create a new one.
Parameters:
    
filenamestr or path-like
    
The name of the file on disk. This may not be a file-like object.
modestr, optional
    
The mode in which to open the file; the default is ‘r+’. In addition to the standard file modes, ‘c’ is also accepted to mean “copy on write.” See `memmap` for the available mode strings.
dtypedata-type, optional
    
The data type of the array if we are creating a new file in “write” mode, if not, `dtype` is ignored. The default value is None, which results in a data-type of `float64`.
shapetuple of int
    
The shape of the array if we are creating a new file in “write” mode, in which case this parameter is required. Otherwise, this parameter is ignored and is thus optional.
fortran_orderbool, optional
    
Whether the array should be Fortran-contiguous (True) or C-contiguous (False, the default) if we are creating a new file in “write” mode.
versiontuple of int (major, minor) or None
    
If the mode is a “write” mode, then this is the version of the file format used to create the file. None means use the oldest supported version that is able to store the data. Default: None
max_header_sizeint, optional
    
Maximum allowed size of the header. Large headers may not be safe to load securely and thus require explicitly passing a larger value. See `ast.literal_eval` for details.
Returns:
    
marraymemmap
    
The memory-mapped array.
Raises:
    
ValueError
    
If the data or the mode is invalid.
OSError
    
If the file is not found or cannot be opened correctly.
See also
`numpy.memmap`
# numpy.lib.format.read_array
lib.format.read_array(fp, allow_pickle=False, pickle_kwargs=None, *, max_header_size=10000)[source]
    
Read an array from an NPY file.
Parameters:
    
fpfile_like object
    
If this is not a real file object, then this may take extra memory and time.
allow_picklebool, optional
    
Whether to allow writing pickled data. Default: False
pickle_kwargsdict
    
Additional keyword arguments to pass to pickle.load. These are only useful when loading object arrays saved on Python 2 when using Python 3.
max_header_sizeint, optional
    
Maximum allowed size of the header. Large headers may not be safe to load securely and thus require explicitly passing a larger value. See `ast.literal_eval` for details. This option is ignored when `allow_pickle` is passed. In that case the file is by definition trusted and the limit is unnecessary.
Returns:
    
arrayndarray
    
The array from the data on disk.
Raises:
    
ValueError
    
If the data is invalid, or allow_pickle=False and the file contains an object array.
# numpy.lib.format.read_array_header_1_0
lib.format.read_array_header_1_0(fp, max_header_size=10000)[source]
    
Read an array header from a filelike object using the 1.0 file format version.
This will leave the file object located just after the header.
Parameters:
    
fpfilelike object
    
A file object or something with a `read()` method like a file.
Returns:
    
shapetuple of int
    
The shape of the array.
fortran_orderbool
    
The array data will be written out directly if it is either C-contiguous or Fortran-contiguous. Otherwise, it will be made contiguous before writing it out.
dtypedtype
    
The dtype of the file’s data.
max_header_sizeint, optional
    
Maximum allowed size of the header. Large headers may not be safe to load securely and thus require explicitly passing a larger value. See `ast.literal_eval` for details.
Raises:
    
ValueError
    
If the data is invalid.
# numpy.lib.format.read_array_header_2_0
lib.format.read_array_header_2_0(fp, max_header_size=10000)[source]
    
Read an array header from a filelike object using the 2.0 file format version.
This will leave the file object located just after the header.
Parameters:
    
fpfilelike object
    
A file object or something with a `read()` method like a file.
max_header_sizeint, optional
    
Maximum allowed size of the header. Large headers may not be safe to load securely and thus require explicitly passing a larger value. See `ast.literal_eval` for details.
Returns:
    
shapetuple of int
    
The shape of the array.
fortran_orderbool
    
The array data will be written out directly if it is either C-contiguous or Fortran-contiguous. Otherwise, it will be made contiguous before writing it out.
dtypedtype
    
The dtype of the file’s data.
Raises:
    
ValueError
    
If the data is invalid.
# numpy.lib.format.read_magic
lib.format.read_magic(fp)[source]
    
Read the magic string to get the version of the file format.
Parameters:
    
fpfilelike object
Returns:
    
majorint
minorint
# numpy.lib.format.write_array
lib.format.write_array(fp, array, version=None, allow_pickle=True, pickle_kwargs=None)[source]
    
Write an array to an NPY file, including a header.
If the array is neither C-contiguous nor Fortran-contiguous AND the file_like object is not a real file object, this function will have to copy data in memory.
Parameters:
    
fpfile_like object
    
An open, writable file object, or similar object with a `.write()` method.
arrayndarray
    
The array to write to disk.
version(int, int) or None, optional
    
The version number of the format. None means use the oldest supported version that is able to store the data. Default: None
allow_picklebool, optional
    
Whether to allow writing pickled data. Default: True
pickle_kwargsdict, optional
    
Additional keyword arguments to pass to pickle.dump, excluding ‘protocol’. These are only useful when pickling objects in object arrays on Python 3 to Python 2 compatible format.
Raises:
    
ValueError
    
If the array cannot be persisted. This includes the case of allow_pickle=False and array being an object array.
Various other errors
    
If the array contains Python objects as part of its dtype, the process of pickling them may raise various errors if the objects are not picklable.
# numpy.lib.format.write_array_header_1_0
lib.format.write_array_header_1_0(fp, d)[source]
    
Write the header for an array using the 1.0 format.
Parameters:
    
fpfilelike object
ddict
    
This has the appropriate entries for writing its string representation to the header of the file.
# numpy.lib.format.write_array_header_2_0
lib.format.write_array_header_2_0(fp, d)[source]
    
Write the header for an array using the 2.0 format.
    
The 2.0 format allows storing very large structured arrays.
Parameters:
    
fpfilelike object
ddict
    
This has the appropriate entries for writing its string representation to the header of the file.
# numpy.lib.introspect
Introspection helper functions.
#### Functions
`opt_func_info`([func_name, signature])
Returns a dictionary containing the currently supported CPU dispatched features for all optimized functions.  
# numpy.lib.introspect.opt_func_info
lib.introspect.opt_func_info(func_name=None, signature=None)[source]
    
Returns a dictionary containing the currently supported CPU dispatched features for all optimized functions.
Parameters:
    
func_namestr (optional)
    
Regular expression to filter by function name.
signaturestr (optional)
    
Regular expression to filter by data type.
Returns:
    
dict
    
A dictionary where keys are optimized function names and values are nested dictionaries indicating supported targets based on data types.
#### Examples
Retrieve dispatch information for functions named ‘add’ or ‘sub’ and data types ‘float64’ or ‘float32’:
    
    >>> import numpy as np
    >>> dict = np.lib.introspect.opt_func_info(
    ...     func_name="add|abs", signature="float64|complex64"
    ... )
    >>> import json
    >>> print(json.dumps(dict, indent=2))
        {
          "absolute": {
            "dd": {
              "current": "SSE41",
              "available": "SSE41 baseline(SSE SSE2 SSE3)"
            },
            "Ff": {
              "current": "FMA3__AVX2",
              "available": "AVX512F FMA3__AVX2 baseline(SSE SSE2 SSE3)"
            },
            "Dd": {
              "current": "FMA3__AVX2",
              "available": "AVX512F FMA3__AVX2 baseline(SSE SSE2 SSE3)"
            }
          },
          "add": {
            "ddd": {
              "current": "FMA3__AVX2",
              "available": "FMA3__AVX2 baseline(SSE SSE2 SSE3)"
            },
            "FFF": {
              "current": "FMA3__AVX2",
              "available": "FMA3__AVX2 baseline(SSE SSE2 SSE3)"
            }
          }
        }
    
# numpy.lib.mixins
Mixin classes for custom array types that don’t inherit from ndarray.
#### Classes
`NDArrayOperatorsMixin`()
Mixin defining all operator special methods using __array_ufunc__.  
# numpy.lib.mixins.NDArrayOperatorsMixin
classnumpy.lib.mixins.NDArrayOperatorsMixin[source]
    
Mixin defining all operator special methods using __array_ufunc__.
This class implements the special methods for almost all of Python’s builtin operators defined in the `operator` module, including comparisons (`==`, `>`, etc.) and arithmetic (`+`, `*`, `-`, etc.), by deferring to the `__array_ufunc__` method, which subclasses must implement.
It is useful for writing classes that do not inherit from `numpy.ndarray`, but that should support arithmetic and numpy universal functions like arrays as described in A Mechanism for Overriding Ufuncs.
As an trivial example, consider this implementation of an `ArrayLike` class that simply wraps a NumPy array and ensures that the result of any arithmetic operation is also an `ArrayLike` object:
    
    >>> import numbers
    >>> class ArrayLike(np.lib.mixins.NDArrayOperatorsMixin):
    ...     def __init__(self, value):
    ...         self.value = np.asarray(value)
    ...
    ...     # One might also consider adding the built-in list type to this
    ...     # list, to support operations like np.add(array_like, list)
    ...     _HANDLED_TYPES = (np.ndarray, numbers.Number)
    ...
    ...     def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
    ...         out = kwargs.get('out', ())
    ...         for x in inputs + out:
    ...             # Only support operations with instances of
    ...             # _HANDLED_TYPES. Use ArrayLike instead of type(self)
    ...             # for isinstance to allow subclasses that don't
    ...             # override __array_ufunc__ to handle ArrayLike objects.
    ...             if not isinstance(
    ...                 x, self._HANDLED_TYPES + (ArrayLike,)
    ...             ):
    ...                 return NotImplemented
    ...
    ...         # Defer to the implementation of the ufunc
    ...         # on unwrapped values.
    ...         inputs = tuple(x.value if isinstance(x, ArrayLike) else x
    ...                     for x in inputs)
    ...         if out:
    ...             kwargs['out'] = tuple(
    ...                 x.value if isinstance(x, ArrayLike) else x
    ...                 for x in out)
    ...         result = getattr(ufunc, method)(*inputs, **kwargs)
    ...
    ...         if type(result) is tuple:
    ...             # multiple return values
    ...             return tuple(type(self)(x) for x in result)
    ...         elif method == 'at':
    ...             # no return value
    ...             return None
    ...         else:
    ...             # one return value
    ...             return type(self)(result)
    ...
    ...     def __repr__(self):
    ...         return '%s(%r)' % (type(self).__name__, self.value)
    
In interactions between `ArrayLike` objects and numbers or numpy arrays, the result is always another `ArrayLike`:
    
    >>> x = ArrayLike([1, 2, 3])
    >>> x - 1
    ArrayLike(array([0, 1, 2]))
    >>> 1 - x
    ArrayLike(array([ 0, -1, -2]))
    >>> np.arange(3) - x
    ArrayLike(array([-1, -1, -1]))
    >>> x - np.arange(3)
    ArrayLike(array([1, 1, 1]))
    
Note that unlike `numpy.ndarray`, `ArrayLike` does not allow operations with arbitrary, unrecognized types. This ensures that interactions with ArrayLike preserve a well-defined casting hierarchy.
# numpy.lib.npyio.DataSource.abspath
method
lib.npyio.DataSource.abspath(path)[source]
    
Return absolute path of file in the DataSource directory.
If `path` is an URL, then `abspath` will return either the location the file exists locally or the location it would exist when opened using the `open` method.
Parameters:
    
pathstr or pathlib.Path
    
Can be a local file or a remote URL.
Returns:
    
outstr
    
Complete path, including the `DataSource` destination directory.
#### Notes
The functionality is based on `os.path.abspath`.
# numpy.lib.npyio.DataSource.exists
method
lib.npyio.DataSource.exists(path)[source]
    
Test if path exists.
Test if `path` exists as (and in this order):
  * a local file.
  * a remote URL that has been downloaded and stored locally in the `DataSource` directory.
  * a remote URL that has not been downloaded, but is valid and accessible.


Parameters:
    
pathstr or pathlib.Path
    
Can be a local file or a remote URL.
Returns:
    
outbool
    
True if `path` exists.
#### Notes
When `path` is an URL, `exists` will return True if it’s either stored locally in the `DataSource` directory, or is a valid remote URL. `DataSource` does not discriminate between the two, the file is accessible if it exists in either location.
# numpy.lib.npyio.DataSource
classnumpy.lib.npyio.DataSource(destpath='.')[source]
    
A generic data source file (file, http, ftp, …).
DataSources can be local files or remote files/URLs. The files may also be compressed or uncompressed. DataSource hides some of the low-level details of downloading the file, allowing you to simply pass in a valid file path (or URL) and obtain a file object.
Parameters:
    
destpathstr or None, optional
    
Path to the directory where the source file gets downloaded to for use. If `destpath` is None, a temporary directory will be created. The default path is the current directory.
#### Notes
URLs require a scheme string (`http://`) to be used, without it they will fail:
    
    >>> repos = np.lib.npyio.DataSource()
    >>> repos.exists('www.google.com/index.html')
    False
    >>> repos.exists('http://www.google.com/index.html')
    True
    
Temporary directories are deleted when the DataSource is deleted.
#### Examples
    
    >>> ds = np.lib.npyio.DataSource('/home/guido')
    >>> urlname = 'http://www.google.com/'
    >>> gfile = ds.open('http://www.google.com/')
    >>> ds.abspath(urlname)
    '/home/guido/www.google.com/index.html'
    
    >>> ds = np.lib.npyio.DataSource(None)  # use with temporary file
    >>> ds.open('/home/guido/foobar.txt')
    <open file '/home/guido.foobar.txt', mode 'r' at 0x91d4430>
    >>> ds.abspath('/home/guido/foobar.txt')
    '/tmp/.../home/guido/foobar.txt'
    
#### Methods
`abspath`(path)
Return absolute path of file in the DataSource directory.  
`exists`(path)
Test if path exists.  
`open`(path[, mode, encoding, newline])
Open and return file-like object.  
# numpy.lib.npyio.DataSource.open
method
lib.npyio.DataSource.open(path, mode='r', encoding=None, newline=None)[source]
    
Open and return file-like object.
If `path` is an URL, it will be downloaded, stored in the `DataSource` directory and opened from there.
Parameters:
    
pathstr or pathlib.Path
    
Local file path or URL to open.
mode{‘r’, ‘w’, ‘a’}, optional
    
Mode to open `path`. Mode ‘r’ for reading, ‘w’ for writing, ‘a’ to append. Available modes depend on the type of object specified by `path`. Default is ‘r’.
encoding{None, str}, optional
    
Open text file with given encoding. The default encoding will be what `open` uses.
newline{None, str}, optional
    
Newline to use when reading text file.
Returns:
    
outfile object
    
File object.
# numpy.lib.npyio
IO related functions.
#### Classes
`DataSource`([destpath])
A generic data source file (file, http, ftp, ...).  
`NpzFile`(fid)
A dictionary-like object with lazy-loading of files in the zipped archive provided on construction.  
# numpy.lib.npyio.NpzFile.close
method
lib.npyio.NpzFile.close()[source]
    
Close the file.
# numpy.lib.npyio.NpzFile.fid
attribute
lib.npyio.NpzFile.fid=None 
# numpy.lib.npyio.NpzFile.get
method
lib.npyio.NpzFile.get(key, default=None, /)[source]
    
D.get(k,[,d]) returns D[k] if k in D, else d. d defaults to None.
# numpy.lib.npyio.NpzFile
classnumpy.lib.npyio.NpzFile(fid)[source]
    
A dictionary-like object with lazy-loading of files in the zipped archive provided on construction.
`NpzFile` is used to load files in the NumPy `.npz` data archive format. It assumes that files in the archive have a `.npy` extension, other files are ignored.
The arrays and file strings are lazily loaded on either getitem access using `obj['key']` or attribute lookup using `obj.f.key`. A list of all files (without `.npy` extensions) can be obtained with `obj.files` and the ZipFile object itself using `obj.zip`.
Parameters:
    
fidfile, str, or pathlib.Path
    
The zipped archive to open. This is either a file-like object or a string containing the path to the archive.
own_fidbool, optional
    
Whether NpzFile should close the file handle. Requires that `fid` is a file-like object.
#### Examples
    
    >>> import numpy as np
    >>> from tempfile import TemporaryFile
    >>> outfile = TemporaryFile()
    >>> x = np.arange(10)
    >>> y = np.sin(x)
    >>> np.savez(outfile, x=x, y=y)
    >>> _ = outfile.seek(0)
    
    
    >>> npz = np.load(outfile)
    >>> isinstance(npz, np.lib.npyio.NpzFile)
    True
    >>> npz
    NpzFile 'object' with keys: x, y
    >>> sorted(npz.files)
    ['x', 'y']
    >>> npz['x']  # getitem access
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> npz.f.x  # attribute lookup
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
Attributes:
    
fileslist of str
    
List of all files in the archive with a `.npy` extension.
zipZipFile instance
    
The ZipFile object initialized with the zipped archive.
fBagObj instance
    
An object on which attribute can be performed as an alternative to getitem access on the `NpzFile` instance itself.
allow_picklebool, optional
    
Allow loading pickled data. Default: False
pickle_kwargsdict, optional
    
Additional keyword arguments to pass on to pickle.load. These are only useful when loading object arrays saved on Python 2 when using Python 3.
max_header_sizeint, optional
    
Maximum allowed size of the header. Large headers may not be safe to load securely and thus require explicitly passing a larger value. See `ast.literal_eval` for details. This option is ignored when `allow_pickle` is passed. In that case the file is by definition trusted and the limit is unnecessary.
#### Methods
`close`()
Close the file.  
`get`(key[, default])
D.get(k,[,d]) returns D[k] if k in D, else d.  
`items`()
D.items() returns a set-like object providing a view on the items  
`keys`()
D.keys() returns a set-like object providing a view on the keys  
`values`()
D.values() returns a set-like object providing a view on the values  
# numpy.lib.npyio.NpzFile.items
method
lib.npyio.NpzFile.items()[source]
    
D.items() returns a set-like object providing a view on the items
# numpy.lib.npyio.NpzFile.keys
method
lib.npyio.NpzFile.keys()[source]
    
D.keys() returns a set-like object providing a view on the keys
# numpy.lib.npyio.NpzFile.values
method
lib.npyio.NpzFile.values()[source]
    
D.values() returns a set-like object providing a view on the values
# numpy.lib.NumpyVersion
classnumpy.lib.NumpyVersion(vstring)[source]
    
Parse and compare numpy version strings.
NumPy has the following versioning scheme (numbers given are examples; they can be > 9 in principle):
  * Released version: ‘1.8.0’, ‘1.8.1’, etc.
  * Alpha: ‘1.8.0a1’, ‘1.8.0a2’, etc.
  * Beta: ‘1.8.0b1’, ‘1.8.0b2’, etc.
  * Release candidates: ‘1.8.0rc1’, ‘1.8.0rc2’, etc.
  * Development versions: ‘1.8.0.dev-f1234afa’ (git commit hash appended)
  * Development versions after a1: ‘1.8.0a1.dev-f1234afa’,
    
‘1.8.0b2.dev-f1234afa’, ‘1.8.1rc1.dev-f1234afa’, etc.
  * Development versions (no git hash available): ‘1.8.0.dev-Unknown’


Comparing needs to be done against a valid version string or other `NumpyVersion` instance. Note that all development versions of the same (pre-)release compare equal.
Parameters:
    
vstringstr
    
NumPy version string (`np.__version__`).
#### Examples
    
    >>> from numpy.lib import NumpyVersion
    >>> if NumpyVersion(np.__version__) < '1.7.0':
    ...     print('skip')
    >>> # skip
    
    
    >>> NumpyVersion('1.7')  # raises ValueError, add ".0"
    Traceback (most recent call last):
        ...
    ValueError: Not a valid numpy version string
    
# numpy.lib.scimath.arccos
lib.scimath.arccos(x)[source]
    
Compute the inverse cosine of x.
Return the “principal value” (for a description of this, see `numpy.arccos`) of the inverse cosine of `x`. For real `x` such that `abs(x) <= 1`, this is a real number in the closed interval \\([0, \pi]\\). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like or scalar
    
The value(s) whose arccos is (are) required.
Returns:
    
outndarray or scalar
    
The inverse cosine(s) of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array object is returned.
See also
`numpy.arccos`
#### Notes
For an arccos() that returns `NAN` when real `x` is not in the interval `[-1,1]`, use `numpy.arccos`.
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.arccos(1) # a scalar is returned
    0.0
    
    
    >>> np.emath.arccos([1,2])
    array([0.-0.j   , 0.-1.317j])
    
# numpy.lib.scimath.arcsin
lib.scimath.arcsin(x)[source]
    
Compute the inverse sine of x.
Return the “principal value” (for a description of this, see `numpy.arcsin`) of the inverse sine of `x`. For real `x` such that `abs(x) <= 1`, this is a real number in the closed interval \\([-\pi/2, \pi/2]\\). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like or scalar
    
The value(s) whose arcsin is (are) required.
Returns:
    
outndarray or scalar
    
The inverse sine(s) of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array object is returned.
See also
`numpy.arcsin`
#### Notes
For an arcsin() that returns `NAN` when real `x` is not in the interval `[-1,1]`, use `numpy.arcsin`.
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.arcsin(0)
    0.0
    
    
    >>> np.emath.arcsin([0,1])
    array([0.    , 1.5708])
    
# numpy.lib.scimath.arctanh
lib.scimath.arctanh(x)[source]
    
Compute the inverse hyperbolic tangent of `x`.
Return the “principal value” (for a description of this, see `numpy.arctanh`) of `arctanh(x)`. For real `x` such that `abs(x) < 1`, this is a real number. If `abs(x) > 1`, or if `x` is complex, the result is complex. Finally, `x = 1` returns``inf`` and `x=-1` returns `-inf`.
Parameters:
    
xarray_like
    
The value(s) whose arctanh is (are) required.
Returns:
    
outndarray or scalar
    
The inverse hyperbolic tangent(s) of the `x` value(s). If `x` was a scalar so is `out`, otherwise an array is returned.
See also
`numpy.arctanh`
#### Notes
For an arctanh() that returns `NAN` when real `x` is not in the interval `(-1,1)`, use `numpy.arctanh` (this latter, however, does return +/-inf for `x = +/-1`).
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.arctanh(0.5)
    0.5493061443340549
    
    
    >>> from numpy.testing import suppress_warnings
    >>> with suppress_warnings() as sup:
    ...     sup.filter(RuntimeWarning)
    ...     np.emath.arctanh(np.eye(2))
    array([[inf,  0.],
           [ 0., inf]])
    >>> np.emath.arctanh([1j])
    array([0.+0.7854j])
    
# numpy.lib.scimath
Wrapper functions to more user-friendly calling of certain math functions whose output data-type is different than the input data-type in certain domains of the input.
For example, for functions like `log` with branch cuts, the versions in this module provide the mathematically valid answers in the complex plane:
    
    >>> import math
    >>> np.emath.log(-math.exp(1)) == (1+1j*math.pi)
    True
    
Similarly, `sqrt`, other base logarithms, `power` and trig functions are correctly handled. See their respective docstrings for specific examples.
#### Functions
`arccos`(x)
Compute the inverse cosine of x.  
`arcsin`(x)
Compute the inverse sine of x.  
`arctanh`(x)
Compute the inverse hyperbolic tangent of `x`.  
`log`(x)
Compute the natural logarithm of `x`.  
`log10`(x)
Compute the logarithm base 10 of `x`.  
`log2`(x)
Compute the logarithm base 2 of `x`.  
`logn`(n, x)
Take log base n of x.  
`power`(x, p)
Return x to the power p, (x**p).  
`sqrt`(x)
Compute the square root of x.  
# numpy.lib.scimath.log
lib.scimath.log(x)[source]
    
Compute the natural logarithm of `x`.
Return the “principal value” (for a description of this, see `numpy.log`) of \\(log_e(x)\\). For real `x > 0`, this is a real number (`log(0)` returns `-inf` and `log(np.inf)` returns `inf`). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like
    
The value(s) whose log is (are) required.
Returns:
    
outndarray or scalar
    
The log of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array is returned.
See also
`numpy.log`
#### Notes
For a log() that returns `NAN` when real `x < 0`, use `numpy.log` (note, however, that otherwise `numpy.log` and this `log` are identical, i.e., both return `-inf` for `x = 0`, `inf` for `x = inf`, and, notably, the complex principle value if `x.imag != 0`).
#### Examples
    
    >>> import numpy as np
    >>> np.emath.log(np.exp(1))
    1.0
    
Negative arguments are handled “correctly” (recall that `exp(log(x)) == x` does not hold for real `x < 0`):
    
    >>> np.emath.log(-np.exp(1)) == (1 + np.pi * 1j)
    True
    
# numpy.lib.scimath.log10
lib.scimath.log10(x)[source]
    
Compute the logarithm base 10 of `x`.
Return the “principal value” (for a description of this, see `numpy.log10`) of \\(log_{10}(x)\\). For real `x > 0`, this is a real number (`log10(0)` returns `-inf` and `log10(np.inf)` returns `inf`). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like or scalar
    
The value(s) whose log base 10 is (are) required.
Returns:
    
outndarray or scalar
    
The log base 10 of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array object is returned.
See also
`numpy.log10`
#### Notes
For a log10() that returns `NAN` when real `x < 0`, use `numpy.log10` (note, however, that otherwise `numpy.log10` and this `log10` are identical, i.e., both return `-inf` for `x = 0`, `inf` for `x = inf`, and, notably, the complex principle value if `x.imag != 0`).
#### Examples
    
    >>> import numpy as np
    
(We set the printing precision so the example can be auto-tested)
    
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.log10(10**1)
    1.0
    
    
    >>> np.emath.log10([-10**1, -10**2, 10**2])
    array([1.+1.3644j, 2.+1.3644j, 2.+0.j    ])
    
# numpy.lib.scimath.log2
lib.scimath.log2(x)[source]
    
Compute the logarithm base 2 of `x`.
Return the “principal value” (for a description of this, see `numpy.log2`) of \\(log_2(x)\\). For real `x > 0`, this is a real number (`log2(0)` returns `-inf` and `log2(np.inf)` returns `inf`). Otherwise, the complex principle value is returned.
Parameters:
    
xarray_like
    
The value(s) whose log base 2 is (are) required.
Returns:
    
outndarray or scalar
    
The log base 2 of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array is returned.
See also
`numpy.log2`
#### Notes
For a log2() that returns `NAN` when real `x < 0`, use `numpy.log2` (note, however, that otherwise `numpy.log2` and this `log2` are identical, i.e., both return `-inf` for `x = 0`, `inf` for `x = inf`, and, notably, the complex principle value if `x.imag != 0`).
#### Examples
We set the printing precision so the example can be auto-tested:
    
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.log2(8)
    3.0
    >>> np.emath.log2([-4, -8, 8])
    array([2.+4.5324j, 3.+4.5324j, 3.+0.j    ])
    
# numpy.lib.scimath.logn
lib.scimath.logn(n, x)[source]
    
Take log base n of x.
If `x` contains negative inputs, the answer is computed and returned in the complex domain.
Parameters:
    
narray_like
    
The integer base(s) in which the log is taken.
xarray_like
    
The value(s) whose log base `n` is (are) required.
Returns:
    
outndarray or scalar
    
The log base `n` of the `x` value(s). If `x` was a scalar, so is `out`, otherwise an array is returned.
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.logn(2, [4, 8])
    array([2., 3.])
    >>> np.emath.logn(2, [-4, -8, 8])
    array([2.+4.5324j, 3.+4.5324j, 3.+0.j    ])
    
# numpy.lib.scimath.power
lib.scimath.power(x, p)[source]
    
Return x to the power p, (x**p).
If `x` contains negative values, the output is converted to the complex domain.
Parameters:
    
xarray_like
    
The input value(s).
parray_like of ints
    
The power(s) to which `x` is raised. If `x` contains multiple values, `p` has to either be a scalar, or contain the same number of values as `x`. In the latter case, the result is `x[0]**p[0], x[1]**p[1], ...`.
Returns:
    
outndarray or scalar
    
The result of `x**p`. If `x` and `p` are scalars, so is `out`, otherwise an array is returned.
See also
`numpy.power`
#### Examples
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    
    
    >>> np.emath.power(2, 2)
    4
    
    
    >>> np.emath.power([2, 4], 2)
    array([ 4, 16])
    
    
    >>> np.emath.power([2, 4], -2)
    array([0.25  ,  0.0625])
    
    
    >>> np.emath.power([-2, 4], 2)
    array([ 4.-0.j, 16.+0.j])
    
    
    >>> np.emath.power([2, 4], [2, 4])
    array([ 4, 256])
    
# numpy.lib.scimath.sqrt
lib.scimath.sqrt(x)[source]
    
Compute the square root of x.
For negative input elements, a complex value is returned (unlike `numpy.sqrt` which returns NaN).
Parameters:
    
xarray_like
    
The input value(s).
Returns:
    
outndarray or scalar
    
The square root of `x`. If `x` was a scalar, so is `out`, otherwise an array is returned.
See also
`numpy.sqrt`
#### Examples
For real, non-negative inputs this works just like `numpy.sqrt`:
    
    >>> import numpy as np
    
    
    >>> np.emath.sqrt(1)
    1.0
    >>> np.emath.sqrt([1, 4])
    array([1.,  2.])
    
But it automatically handles negative inputs:
    
    >>> np.emath.sqrt(-1)
    1j
    >>> np.emath.sqrt([-1,4])
    array([0.+1.j, 2.+0.j])
    
Different results are expected because: floating point 0.0 and -0.0 are distinct.
For more control, explicitly use complex() as follows:
    
    >>> np.emath.sqrt(complex(-4.0, 0.0))
    2j
    >>> np.emath.sqrt(complex(-4.0, -0.0))
    -2j
    
# numpy.lib.stride_tricks.as_strided
lib.stride_tricks.as_strided(x, shape=None, strides=None, subok=False, writeable=True)[source]
    
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:
    
xndarray
    
Array to create a new.
shapesequence of int, optional
    
The shape of the new array. Defaults to `x.shape`.
stridessequence of int, optional
    
The strides of the new array. Defaults to `x.strides`.
subokbool, optional
    
If True, subclasses are preserved.
writeablebool, optional
    
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:
    
viewndarray
See also
`broadcast_to`
    
broadcast an array to a given shape.
`reshape`
    
reshape an array.
`lib.stride_tricks.sliding_window_view`
    
userfriendly and safe function for a creation of sliding window views.
#### 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.
# numpy.lib.stride_tricks
Utilities that manipulate strides to achieve desirable effects.
An explanation of strides can be found in the The N-dimensional array (ndarray).
#### Functions
`as_strided`(x[, shape, strides, subok, writeable])
Create a view into the array with the given shape and strides.  
`sliding_window_view`(x, window_shape[, axis, ...])
Create a sliding window view into the array with the given window shape.  
# numpy.lib.stride_tricks.sliding_window_view
lib.stride_tricks.sliding_window_view(x, window_shape, axis=None, *, subok=False, writeable=False)[source]
    
Create a sliding window view into the array with the given window shape.
Also known as rolling or moving window, the window slides across all dimensions of the array and extracts subsets of the array at all window positions.
New in version 1.20.0.
Parameters:
    
xarray_like
    
Array to create the sliding window view from.
window_shapeint or tuple of int
    
Size of window over each axis that takes part in the sliding window. If `axis` is not present, must have same length as the number of input array dimensions. Single integers `i` are treated as if they were the tuple `(i,)`.
axisint or tuple of int, optional
    
Axis or axes along which the sliding window is applied. By default, the sliding window is applied to all axes and `window_shape[i]` will refer to axis `i` of `x`. If `axis` is given as a `tuple of int`, `window_shape[i]` will refer to the axis `axis[i]` of `x`. Single integers `i` are treated as if they were the tuple `(i,)`.
subokbool, optional
    
If True, sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default).
writeablebool, optional
    
When true, allow writing to the returned view. The default is false, as this should be used with caution: the returned view contains the same memory location multiple times, so writing to one location will cause others to change.
Returns:
    
viewndarray
    
Sliding window view of the array. The sliding window dimensions are inserted at the end, and the original dimensions are trimmed as required by the size of the sliding window. That is, `view.shape = x_shape_trimmed + window_shape`, where `x_shape_trimmed` is `x.shape` with every entry reduced by one less than the corresponding window size.
See also
`lib.stride_tricks.as_strided`
    
A lower-level and less safe routine for creating arbitrary views from custom shape and strides.
`broadcast_to`
    
broadcast an array to a given shape.
#### Notes
For many applications using a sliding window view can be convenient, but potentially very slow. Often specialized solutions exist, for example:
  * `scipy.signal.fftconvolve`
  * filtering functions in `scipy.ndimage`
  * moving window functions provided by bottleneck.


As a rough estimate, a sliding window approach with an input size of `N` and a window size of `W` will scale as `O(N*W)` where frequently a special algorithm can achieve `O(N)`. That means that the sliding window variant for a window size of 100 can be a 100 times slower than a more specialized version.
Nevertheless, for small window sizes, when no custom algorithm exists, or as a prototyping and developing tool, this function can be a good solution.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib.stride_tricks import sliding_window_view
    >>> x = np.arange(6)
    >>> x.shape
    (6,)
    >>> v = sliding_window_view(x, 3)
    >>> v.shape
    (4, 3)
    >>> v
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4],
           [3, 4, 5]])
    
This also works in more dimensions, e.g.
    
    >>> i, j = np.ogrid[:3, :4]
    >>> x = 10*i + j
    >>> x.shape
    (3, 4)
    >>> x
    array([[ 0,  1,  2,  3],
           [10, 11, 12, 13],
           [20, 21, 22, 23]])
    >>> shape = (2,2)
    >>> v = sliding_window_view(x, shape)
    >>> v.shape
    (2, 3, 2, 2)
    >>> v
    array([[[[ 0,  1],
             [10, 11]],
            [[ 1,  2],
             [11, 12]],
            [[ 2,  3],
             [12, 13]]],
           [[[10, 11],
             [20, 21]],
            [[11, 12],
             [21, 22]],
            [[12, 13],
             [22, 23]]]])
    
The axis can be specified explicitly:
    
    >>> v = sliding_window_view(x, 3, 0)
    >>> v.shape
    (1, 4, 3)
    >>> v
    array([[[ 0, 10, 20],
            [ 1, 11, 21],
            [ 2, 12, 22],
            [ 3, 13, 23]]])
    
The same axis can be used several times. In that case, every use reduces the corresponding original dimension:
    
    >>> v = sliding_window_view(x, (2, 3), (1, 1))
    >>> v.shape
    (3, 1, 2, 3)
    >>> v
    array([[[[ 0,  1,  2],
             [ 1,  2,  3]]],
           [[[10, 11, 12],
             [11, 12, 13]]],
           [[[20, 21, 22],
             [21, 22, 23]]]])
    
Combining with stepped slicing (`::step`), this can be used to take sliding views which skip elements:
    
    >>> x = np.arange(7)
    >>> sliding_window_view(x, 5)[:, ::2]
    array([[0, 2, 4],
           [1, 3, 5],
           [2, 4, 6]])
    
or views which move by multiple elements
    
    >>> x = np.arange(7)
    >>> sliding_window_view(x, 3)[::2, :]
    array([[0, 1, 2],
           [2, 3, 4],
           [4, 5, 6]])
    
A common application of `sliding_window_view` is the calculation of running statistics. The simplest example is the moving average:
    
    >>> x = np.arange(6)
    >>> x.shape
    (6,)
    >>> v = sliding_window_view(x, 3)
    >>> v.shape
    (4, 3)
    >>> v
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4],
           [3, 4, 5]])
    >>> moving_average = v.mean(axis=-1)
    >>> moving_average
    array([1., 2., 3., 4.])
    
Note that a sliding window approach is often not optimal (see Notes).
# numpy.lib.user_array.container
classnumpy.lib.user_array.container(data, dtype=None, copy=True)[source]
    
Standard container-class for easy multiple-inheritance.
#### Methods
copy  
tostring  
byteswap  
astype  
# numpy.linalg.cholesky
linalg.cholesky(a, /, *, upper=False)[source]
    
Cholesky decomposition.
Return the lower or upper Cholesky decomposition, `L * L.H` or `U.H * U`, of the square matrix `a`, where `L` is lower-triangular, `U` is upper-triangular, and `.H` is the conjugate transpose operator (which is the ordinary transpose if `a` is real-valued). `a` must be Hermitian (symmetric if real-valued) and positive-definite. No checking is performed to verify whether `a` is Hermitian or not. In addition, only the lower or upper-triangular and diagonal elements of `a` are used. Only `L` or `U` is actually returned.
Parameters:
    
a(…, M, M) array_like
    
Hermitian (symmetric if all elements are real), positive-definite input matrix.
upperbool
    
If `True`, the result must be the upper-triangular Cholesky factor. If `False`, the result must be the lower-triangular Cholesky factor. Default: `False`.
Returns:
    
L(…, M, M) array_like
    
Lower or upper-triangular Cholesky factor of `a`. Returns a matrix object if `a` is a matrix object.
Raises:
    
LinAlgError
    
If the decomposition fails, for example, if `a` is not positive-definite.
See also
`scipy.linalg.cholesky`
    
Similar function in SciPy.
`scipy.linalg.cholesky_banded`
    
Cholesky decompose a banded Hermitian positive-definite matrix.
`scipy.linalg.cho_factor`
    
Cholesky decomposition of a matrix, to use in `scipy.linalg.cho_solve`.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
The Cholesky decomposition is often used as a fast way of solving
\\[A \mathbf{x} = \mathbf{b}\\]
(when `A` is both Hermitian/symmetric and positive-definite).
First, we solve for \\(\mathbf{y}\\) in
\\[L \mathbf{y} = \mathbf{b},\\]
and then for \\(\mathbf{x}\\) in
\\[L^{H} \mathbf{x} = \mathbf{y}.\\]
#### Examples
    
    >>> import numpy as np
    >>> A = np.array([[1,-2j],[2j,5]])
    >>> A
    array([[ 1.+0.j, -0.-2.j],
           [ 0.+2.j,  5.+0.j]])
    >>> L = np.linalg.cholesky(A)
    >>> L
    array([[1.+0.j, 0.+0.j],
           [0.+2.j, 1.+0.j]])
    >>> np.dot(L, L.T.conj()) # verify that L * L.H = A
    array([[1.+0.j, 0.-2.j],
           [0.+2.j, 5.+0.j]])
    >>> A = [[1,-2j],[2j,5]] # what happens if A is only array_like?
    >>> np.linalg.cholesky(A) # an ndarray object is returned
    array([[1.+0.j, 0.+0.j],
           [0.+2.j, 1.+0.j]])
    >>> # But a matrix object is returned if A is a matrix object
    >>> np.linalg.cholesky(np.matrix(A))
    matrix([[ 1.+0.j,  0.+0.j],
            [ 0.+2.j,  1.+0.j]])
    >>> # The upper-triangular Cholesky factor can also be obtained.
    >>> np.linalg.cholesky(A, upper=True)
    array([[1.-0.j, 0.-2.j],
           [0.-0.j, 1.-0.j]])
    
# numpy.linalg.cond
linalg.cond(x, p=None)[source]
    
Compute the condition number of a matrix.
This function is capable of returning the condition number using one of seven different norms, depending on the value of `p` (see Parameters below).
Parameters:
    
x(…, M, N) array_like
    
The matrix whose condition number is sought.
p{None, 1, -1, 2, -2, inf, -inf, ‘fro’}, optional
    
Order of the norm used in the condition number computation:
p
norm for matrices  
None
2-norm, computed directly using the `SVD`  
‘fro’
Frobenius norm  
inf
max(sum(abs(x), axis=1))  
-inf
min(sum(abs(x), axis=1))  
1
max(sum(abs(x), axis=0))  
-1
min(sum(abs(x), axis=0))  
2
2-norm (largest sing. value)  
-2
smallest singular value  
inf means the `numpy.inf` object, and the Frobenius norm is the root-of-sum-of-squares norm.
Returns:
    
c{float, inf}
    
The condition number of the matrix. May be infinite.
See also
`numpy.linalg.norm`
#### Notes
The condition number of `x` is defined as the norm of `x` times the norm of the inverse of `x` [1]; the norm can be the usual L2-norm (root-of-sum-of-squares) or one of a number of other matrix norms.
#### References
[1]
G. Strang, Linear Algebra and Its Applications, Orlando, FL, Academic Press, Inc., 1980, pg. 285.
#### Examples
    
    >>> import numpy as np
    >>> from numpy import linalg as LA
    >>> a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]])
    >>> a
    array([[ 1,  0, -1],
           [ 0,  1,  0],
           [ 1,  0,  1]])
    >>> LA.cond(a)
    1.4142135623730951
    >>> LA.cond(a, 'fro')
    3.1622776601683795
    >>> LA.cond(a, np.inf)
    2.0
    >>> LA.cond(a, -np.inf)
    1.0
    >>> LA.cond(a, 1)
    2.0
    >>> LA.cond(a, -1)
    1.0
    >>> LA.cond(a, 2)
    1.4142135623730951
    >>> LA.cond(a, -2)
    0.70710678118654746 # may vary
    >>> (min(LA.svd(a, compute_uv=False)) *
    ... min(LA.svd(LA.inv(a), compute_uv=False)))
    0.70710678118654746 # may vary
    
# numpy.linalg.cross
linalg.cross(x1, x2, /, *, axis=-1)[source]
    
Returns the cross product of 3-element vectors.
If `x1` and/or `x2` are multi-dimensional arrays, then the cross-product of each pair of corresponding 3-element vectors is independently computed.
This function is Array API compatible, contrary to `numpy.cross`.
Parameters:
    
x1array_like
    
The first input array.
x2array_like
    
The second input array. Must be compatible with `x1` for all non-compute axes. The size of the axis over which to compute the cross-product must be the same size as the respective axis in `x1`.
axisint, optional
    
The axis (dimension) of `x1` and `x2` containing the vectors for which to compute the cross-product. Default: `-1`.
Returns:
    
outndarray
    
An array containing the cross products.
See also
`numpy.cross`
#### Examples
Vector cross-product.
    
    >>> x = np.array([1, 2, 3])
    >>> y = np.array([4, 5, 6])
    >>> np.linalg.cross(x, y)
    array([-3,  6, -3])
    
Multiple vector cross-products. Note that the direction of the cross product vector is defined by the right-hand rule.
    
    >>> x = np.array([[1,2,3], [4,5,6]])
    >>> y = np.array([[4,5,6], [1,2,3]])
    >>> np.linalg.cross(x, y)
    array([[-3,  6, -3],
           [ 3, -6,  3]])
    
    
    >>> x = np.array([[1, 2], [3, 4], [5, 6]])
    >>> y = np.array([[4, 5], [6, 1], [2, 3]])
    >>> np.linalg.cross(x, y, axis=0)
    array([[-24,  6],
           [ 18, 24],
           [-6,  -18]])
    
# numpy.linalg.det
linalg.det(a)[source]
    
Compute the determinant of an array.
Parameters:
    
a(…, M, M) array_like
    
Input array to compute determinants for.
Returns:
    
det(…) array_like
    
Determinant of `a`.
See also
`slogdet`
    
Another way to represent the determinant, more suitable for large matrices where underflow/overflow may occur.
`scipy.linalg.det`
    
Similar function in SciPy.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
The determinant is computed via LU factorization using the LAPACK routine `z/dgetrf`.
#### Examples
The determinant of a 2-D array [[a, b], [c, d]] is ad - bc:
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.linalg.det(a)
    -2.0 # may vary
    
Computing determinants for a stack of matrices:
    
    >>> a = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
    >>> a.shape
    (3, 2, 2)
    >>> np.linalg.det(a)
    array([-2., -3., -8.])
    
# numpy.linalg.diagonal
linalg.diagonal(x, /, *, offset=0)[source]
    
Returns specified diagonals of a matrix (or a stack of matrices) `x`.
This function is Array API compatible, contrary to `numpy.diagonal`, the matrix is assumed to be defined by the last two dimensions.
Parameters:
    
x(…,M,N) array_like
    
Input array having shape (…, M, N) and whose innermost two dimensions form MxN matrices.
offsetint, optional
    
Offset specifying the off-diagonal relative to the main diagonal, where:
    
    * offset = 0: the main diagonal.
    * offset > 0: off-diagonal above the main diagonal.
    * offset < 0: off-diagonal below the main diagonal.
    
Returns:
    
out(…,min(N,M)) ndarray
    
An array containing the diagonals and whose shape is determined by removing the last two dimensions and appending a dimension equal to the size of the resulting diagonals. The returned array must have the same data type as `x`.
See also
`numpy.diagonal`
#### Examples
    
    >>> a = np.arange(4).reshape(2, 2); a
    array([[0, 1],
           [2, 3]])
    >>> np.linalg.diagonal(a)
    array([0, 3])
    
A 3-D example:
    
    >>> a = np.arange(8).reshape(2, 2, 2); a
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    >>> np.linalg.diagonal(a)
    array([[0, 3],
           [4, 7]])
    
Diagonals adjacent to the main diagonal can be obtained by using the `offset` argument:
    
    >>> a = np.arange(9).reshape(3, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> np.linalg.diagonal(a, offset=1)  # First superdiagonal
    array([1, 5])
    >>> np.linalg.diagonal(a, offset=2)  # Second superdiagonal
    array([2])
    >>> np.linalg.diagonal(a, offset=-1)  # First subdiagonal
    array([3, 7])
    >>> np.linalg.diagonal(a, offset=-2)  # Second subdiagonal
    array([6])
    
The anti-diagonal can be obtained by reversing the order of elements using either `numpy.flipud` or `numpy.fliplr`.
    
    >>> a = np.arange(9).reshape(3, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> np.linalg.diagonal(np.fliplr(a))  # Horizontal flip
    array([2, 4, 6])
    >>> np.linalg.diagonal(np.flipud(a))  # Vertical flip
    array([6, 4, 2])
    
Note that the order in which the diagonal is retrieved varies depending on the flip function.
# numpy.linalg.eig
linalg.eig(a)[source]
    
Compute the eigenvalues and right eigenvectors of a square array.
Parameters:
    
a(…, M, M) array
    
Matrices for which the eigenvalues and right eigenvectors will be computed
Returns:
    
A namedtuple with the following attributes:
eigenvalues(…, M) array
    
The eigenvalues, each repeated according to its multiplicity. The eigenvalues are not necessarily ordered. The resulting array will be of complex type, unless the imaginary part is zero in which case it will be cast to a real type. When `a` is real the resulting eigenvalues will be real (0 imaginary part) or occur in conjugate pairs
eigenvectors(…, M, M) array
    
The normalized (unit “length”) eigenvectors, such that the column `eigenvectors[:,i]` is the eigenvector corresponding to the eigenvalue `eigenvalues[i]`.
Raises:
    
LinAlgError
    
If the eigenvalue computation does not converge.
See also
`eigvals`
    
eigenvalues of a non-symmetric array.
`eigh`
    
eigenvalues and eigenvectors of a real symmetric or complex Hermitian (conjugate symmetric) array.
`eigvalsh`
    
eigenvalues of a real symmetric or complex Hermitian (conjugate symmetric) array.
`scipy.linalg.eig`
    
Similar function in SciPy that also solves the generalized eigenvalue problem.
`scipy.linalg.schur`
    
Best choice for unitary and other non-Hermitian normal matrices.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
This is implemented using the `_geev` LAPACK routines which compute the eigenvalues and eigenvectors of general square arrays.
The number `w` is an eigenvalue of `a` if there exists a vector `v` such that `a @ v = w * v`. Thus, the arrays `a`, `eigenvalues`, and `eigenvectors` satisfy the equations `a @ eigenvectors[:,i] = eigenvalues[i] * eigenvectors[:,i]` for \\(i \in \\{0,...,M-1\\}\\).
The array `eigenvectors` may not be of maximum rank, that is, some of the columns may be linearly dependent, although round-off error may obscure that fact. If the eigenvalues are all different, then theoretically the eigenvectors are linearly independent and `a` can be diagonalized by a similarity transformation using `eigenvectors`, i.e, `inv(eigenvectors) @ a @ eigenvectors` is diagonal.
For non-Hermitian normal matrices the SciPy function `scipy.linalg.schur` is preferred because the matrix `eigenvectors` is guaranteed to be unitary, which is not the case when using `eig`. The Schur factorization produces an upper triangular matrix rather than a diagonal matrix, but for normal matrices only the diagonal of the upper triangular matrix is needed, the rest is roundoff error.
Finally, it is emphasized that `eigenvectors` consists of the right (as in right-hand side) eigenvectors of `a`. A vector `y` satisfying `y.T @ a = z * y.T` for some number `z` is called a left eigenvector of `a`, and, in general, the left and right eigenvectors of a matrix are not necessarily the (perhaps conjugate) transposes of each other.
#### References
G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, Various pp.
#### Examples
    
    >>> import numpy as np
    >>> from numpy import linalg as LA
    
(Almost) trivial example with real eigenvalues and eigenvectors.
    
    >>> eigenvalues, eigenvectors = LA.eig(np.diag((1, 2, 3)))
    >>> eigenvalues
    array([1., 2., 3.])
    >>> eigenvectors
    array([[1., 0., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])
    
Real matrix possessing complex eigenvalues and eigenvectors; note that the eigenvalues are complex conjugates of each other.
    
    >>> eigenvalues, eigenvectors = LA.eig(np.array([[1, -1], [1, 1]]))
    >>> eigenvalues
    array([1.+1.j, 1.-1.j])
    >>> eigenvectors
    array([[0.70710678+0.j        , 0.70710678-0.j        ],
           [0.        -0.70710678j, 0.        +0.70710678j]])
    
Complex-valued matrix with real eigenvalues (but complex-valued eigenvectors); note that `a.conj().T == a`, i.e., `a` is Hermitian.
    
    >>> a = np.array([[1, 1j], [-1j, 1]])
    >>> eigenvalues, eigenvectors = LA.eig(a)
    >>> eigenvalues
    array([2.+0.j, 0.+0.j])
    >>> eigenvectors
    array([[ 0.        +0.70710678j,  0.70710678+0.j        ], # may vary
           [ 0.70710678+0.j        , -0.        +0.70710678j]])
    
Be careful about round-off error!
    
    >>> a = np.array([[1 + 1e-9, 0], [0, 1 - 1e-9]])
    >>> # Theor. eigenvalues are 1 +/- 1e-9
    >>> eigenvalues, eigenvectors = LA.eig(a)
    >>> eigenvalues
    array([1., 1.])
    >>> eigenvectors
    array([[1., 0.],
           [0., 1.]])
    
# numpy.linalg.eigh
linalg.eigh(a, UPLO='L')[source]
    
Return the eigenvalues and eigenvectors of a complex Hermitian (conjugate symmetric) or a real symmetric matrix.
Returns two objects, a 1-D array containing the eigenvalues of `a`, and a 2-D square array or matrix (depending on the input type) of the corresponding eigenvectors (in columns).
Parameters:
    
a(…, M, M) array
    
Hermitian or real symmetric matrices whose eigenvalues and eigenvectors are to be computed.
UPLO{‘L’, ‘U’}, optional
    
Specifies whether the calculation is done with the lower triangular part of `a` (‘L’, default) or the upper triangular part (‘U’). Irrespective of this value only the real parts of the diagonal will be considered in the computation to preserve the notion of a Hermitian matrix. It therefore follows that the imaginary part of the diagonal will always be treated as zero.
Returns:
    
A namedtuple with the following attributes:
eigenvalues(…, M) ndarray
    
The eigenvalues in ascending order, each repeated according to its multiplicity.
eigenvectors{(…, M, M) ndarray, (…, M, M) matrix}
    
The column `eigenvectors[:, i]` is the normalized eigenvector corresponding to the eigenvalue `eigenvalues[i]`. Will return a matrix object if `a` is a matrix object.
Raises:
    
LinAlgError
    
If the eigenvalue computation does not converge.
See also
`eigvalsh`
    
eigenvalues of real symmetric or complex Hermitian (conjugate symmetric) arrays.
`eig`
    
eigenvalues and right eigenvectors for non-symmetric arrays.
`eigvals`
    
eigenvalues of non-symmetric arrays.
`scipy.linalg.eigh`
    
Similar function in SciPy (but also solves the generalized eigenvalue problem).
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
The eigenvalues/eigenvectors are computed using LAPACK routines `_syevd`, `_heevd`.
The eigenvalues of real symmetric or complex Hermitian matrices are always real. [1] The array `eigenvalues` of (column) eigenvectors is unitary and `a`, `eigenvalues`, and `eigenvectors` satisfy the equations `dot(a, eigenvectors[:, i]) = eigenvalues[i] * eigenvectors[:, i]`.
#### References
[1]
G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pg. 222.
#### Examples
    
    >>> import numpy as np
    >>> from numpy import linalg as LA
    >>> a = np.array([[1, -2j], [2j, 5]])
    >>> a
    array([[ 1.+0.j, -0.-2.j],
           [ 0.+2.j,  5.+0.j]])
    >>> eigenvalues, eigenvectors = LA.eigh(a)
    >>> eigenvalues
    array([0.17157288, 5.82842712])
    >>> eigenvectors
    array([[-0.92387953+0.j        , -0.38268343+0.j        ], # may vary
           [ 0.        +0.38268343j,  0.        -0.92387953j]])
    
    
    >>> (np.dot(a, eigenvectors[:, 0]) -
    ... eigenvalues[0] * eigenvectors[:, 0])  # verify 1st eigenval/vec pair
    array([5.55111512e-17+0.0000000e+00j, 0.00000000e+00+1.2490009e-16j])
    >>> (np.dot(a, eigenvectors[:, 1]) -
    ... eigenvalues[1] * eigenvectors[:, 1])  # verify 2nd eigenval/vec pair
    array([0.+0.j, 0.+0.j])
    
    
    >>> A = np.matrix(a) # what happens if input is a matrix object
    >>> A
    matrix([[ 1.+0.j, -0.-2.j],
            [ 0.+2.j,  5.+0.j]])
    >>> eigenvalues, eigenvectors = LA.eigh(A)
    >>> eigenvalues
    array([0.17157288, 5.82842712])
    >>> eigenvectors
    matrix([[-0.92387953+0.j        , -0.38268343+0.j        ], # may vary
            [ 0.        +0.38268343j,  0.        -0.92387953j]])
    
    
    >>> # demonstrate the treatment of the imaginary part of the diagonal
    >>> a = np.array([[5+2j, 9-2j], [0+2j, 2-1j]])
    >>> a
    array([[5.+2.j, 9.-2.j],
           [0.+2.j, 2.-1.j]])
    >>> # with UPLO='L' this is numerically equivalent to using LA.eig() with:
    >>> b = np.array([[5.+0.j, 0.-2.j], [0.+2.j, 2.-0.j]])
    >>> b
    array([[5.+0.j, 0.-2.j],
           [0.+2.j, 2.+0.j]])
    >>> wa, va = LA.eigh(a)
    >>> wb, vb = LA.eig(b)
    >>> wa
    array([1., 6.])
    >>> wb
    array([6.+0.j, 1.+0.j])
    >>> va
    array([[-0.4472136 +0.j        , -0.89442719+0.j        ], # may vary
           [ 0.        +0.89442719j,  0.        -0.4472136j ]])
    >>> vb
    array([[ 0.89442719+0.j       , -0.        +0.4472136j],
           [-0.        +0.4472136j,  0.89442719+0.j       ]])
    
# numpy.linalg.eigvals
linalg.eigvals(a)[source]
    
Compute the eigenvalues of a general matrix.
Main difference between `eigvals` and `eig`: the eigenvectors aren’t returned.
Parameters:
    
a(…, M, M) array_like
    
A complex- or real-valued matrix whose eigenvalues will be computed.
Returns:
    
w(…, M,) ndarray
    
The eigenvalues, each repeated according to its multiplicity. They are not necessarily ordered, nor are they necessarily real for real matrices.
Raises:
    
LinAlgError
    
If the eigenvalue computation does not converge.
See also
`eig`
    
eigenvalues and right eigenvectors of general arrays
`eigvalsh`
    
eigenvalues of real symmetric or complex Hermitian (conjugate symmetric) arrays.
`eigh`
    
eigenvalues and eigenvectors of real symmetric or complex Hermitian (conjugate symmetric) arrays.
`scipy.linalg.eigvals`
    
Similar function in SciPy.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
This is implemented using the `_geev` LAPACK routines which compute the eigenvalues and eigenvectors of general square arrays.
#### Examples
Illustration, using the fact that the eigenvalues of a diagonal matrix are its diagonal elements, that multiplying a matrix on the left by an orthogonal matrix, `Q`, and on the right by `Q.T` (the transpose of `Q`), preserves the eigenvalues of the “middle” matrix. In other words, if `Q` is orthogonal, then `Q * A * Q.T` has the same eigenvalues as `A`:
    
    >>> import numpy as np
    >>> from numpy import linalg as LA
    >>> x = np.random.random()
    >>> Q = np.array([[np.cos(x), -np.sin(x)], [np.sin(x), np.cos(x)]])
    >>> LA.norm(Q[0, :]), LA.norm(Q[1, :]), np.dot(Q[0, :],Q[1, :])
    (1.0, 1.0, 0.0)
    
Now multiply a diagonal matrix by `Q` on one side and by `Q.T` on the other:
    
    >>> D = np.diag((-1,1))
    >>> LA.eigvals(D)
    array([-1.,  1.])
    >>> A = np.dot(Q, D)
    >>> A = np.dot(A, Q.T)
    >>> LA.eigvals(A)
    array([ 1., -1.]) # random
    
# numpy.linalg.eigvalsh
linalg.eigvalsh(a, UPLO='L')[source]
    
Compute the eigenvalues of a complex Hermitian or real symmetric matrix.
Main difference from eigh: the eigenvectors are not computed.
Parameters:
    
a(…, M, M) array_like
    
A complex- or real-valued matrix whose eigenvalues are to be computed.
UPLO{‘L’, ‘U’}, optional
    
Specifies whether the calculation is done with the lower triangular part of `a` (‘L’, default) or the upper triangular part (‘U’). Irrespective of this value only the real parts of the diagonal will be considered in the computation to preserve the notion of a Hermitian matrix. It therefore follows that the imaginary part of the diagonal will always be treated as zero.
Returns:
    
w(…, M,) ndarray
    
The eigenvalues in ascending order, each repeated according to its multiplicity.
Raises:
    
LinAlgError
    
If the eigenvalue computation does not converge.
See also
`eigh`
    
eigenvalues and eigenvectors of real symmetric or complex Hermitian (conjugate symmetric) arrays.
`eigvals`
    
eigenvalues of general real or complex arrays.
`eig`
    
eigenvalues and right eigenvectors of general real or complex arrays.
`scipy.linalg.eigvalsh`
    
Similar function in SciPy.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
The eigenvalues are computed using LAPACK routines `_syevd`, `_heevd`.
#### Examples
    
    >>> import numpy as np
    >>> from numpy import linalg as LA
    >>> a = np.array([[1, -2j], [2j, 5]])
    >>> LA.eigvalsh(a)
    array([ 0.17157288,  5.82842712]) # may vary
    
    
    >>> # demonstrate the treatment of the imaginary part of the diagonal
    >>> a = np.array([[5+2j, 9-2j], [0+2j, 2-1j]])
    >>> a
    array([[5.+2.j, 9.-2.j],
           [0.+2.j, 2.-1.j]])
    >>> # with UPLO='L' this is numerically equivalent to using LA.eigvals()
    >>> # with:
    >>> b = np.array([[5.+0.j, 0.-2.j], [0.+2.j, 2.-0.j]])
    >>> b
    array([[5.+0.j, 0.-2.j],
           [0.+2.j, 2.+0.j]])
    >>> wa = LA.eigvalsh(a)
    >>> wb = LA.eigvals(b)
    >>> wa; wb
    array([1., 6.])
    array([6.+0.j, 1.+0.j])
    
# numpy.linalg.inv
linalg.inv(a)[source]
    
Compute the inverse of a matrix.
Given a square matrix `a`, return the matrix `ainv` satisfying `a @ ainv = ainv @ a = eye(a.shape[0])`.
Parameters:
    
a(…, M, M) array_like
    
Matrix to be inverted.
Returns:
    
ainv(…, M, M) ndarray or matrix
    
Inverse of the matrix `a`.
Raises:
    
LinAlgError
    
If `a` is not square or inversion fails.
See also
`scipy.linalg.inv`
    
Similar function in SciPy.
`numpy.linalg.cond`
    
Compute the condition number of a matrix.
`numpy.linalg.svd`
    
Compute the singular value decomposition of a matrix.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
If `a` is detected to be singular, a `LinAlgError` is raised. If `a` is ill-conditioned, a `LinAlgError` may or may not be raised, and results may be inaccurate due to floating-point errors.
#### References
[1]
Wikipedia, “Condition number”, https://en.wikipedia.org/wiki/Condition_number
#### Examples
    
    >>> import numpy as np
    >>> from numpy.linalg import inv
    >>> a = np.array([[1., 2.], [3., 4.]])
    >>> ainv = inv(a)
    >>> np.allclose(a @ ainv, np.eye(2))
    True
    >>> np.allclose(ainv @ a, np.eye(2))
    True
    
If a is a matrix object, then the return value is a matrix as well:
    
    >>> ainv = inv(np.matrix(a))
    >>> ainv
    matrix([[-2. ,  1. ],
            [ 1.5, -0.5]])
    
Inverses of several matrices can be computed at once:
    
    >>> a = np.array([[[1., 2.], [3., 4.]], [[1, 3], [3, 5]]])
    >>> inv(a)
    array([[[-2.  ,  1.  ],
            [ 1.5 , -0.5 ]],
           [[-1.25,  0.75],
            [ 0.75, -0.25]]])
    
If a matrix is close to singular, the computed inverse may not satisfy `a @ ainv = ainv @ a = eye(a.shape[0])` even if a `LinAlgError` is not raised:
    
    >>> a = np.array([[2,4,6],[2,0,2],[6,8,14]])
    >>> inv(a)  # No errors raised
    array([[-1.12589991e+15, -5.62949953e+14,  5.62949953e+14],
       [-1.12589991e+15, -5.62949953e+14,  5.62949953e+14],
       [ 1.12589991e+15,  5.62949953e+14, -5.62949953e+14]])
    >>> a @ inv(a)
    array([[ 0.   , -0.5  ,  0.   ],  # may vary
           [-0.5  ,  0.625,  0.25 ],
           [ 0.   ,  0.   ,  1.   ]])
    
To detect ill-conditioned matrices, you can use `numpy.linalg.cond` to compute its condition number [1]. The larger the condition number, the more ill-conditioned the matrix is. As a rule of thumb, if the condition number `cond(a) = 10**k`, then you may lose up to `k` digits of accuracy on top of what would be lost to the numerical method due to loss of precision from arithmetic methods.
    
    >>> from numpy.linalg import cond
    >>> cond(a)
    np.float64(8.659885634118668e+17)  # may vary
    
It is also possible to detect ill-conditioning by inspecting the matrix’s singular values directly. The ratio between the largest and the smallest singular value is the condition number:
    
    >>> from numpy.linalg import svd
    >>> sigma = svd(a, compute_uv=False)  # Do not compute singular vectors
    >>> sigma.max()/sigma.min()
    8.659885634118668e+17  # may vary
    
# numpy.linalg.LinAlgError
exceptionlinalg.LinAlgError[source]
    
Generic Python-exception-derived object raised by linalg functions.
General purpose exception class, derived from Python’s ValueError class, programmatically raised in linalg functions when a Linear Algebra-related condition would prevent further correct execution of the function.
Parameters:
    
None
#### Examples
    
    >>> from numpy import linalg as LA
    >>> LA.inv(np.zeros((2,2)))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "...linalg.py", line 350,
        in inv return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
      File "...linalg.py", line 249,
        in solve
        raise LinAlgError('Singular matrix')
    numpy.linalg.LinAlgError: Singular matrix
    
# numpy.linalg.lstsq
linalg.lstsq(a, b, rcond=None)[source]
    
Return the least-squares solution to a linear matrix equation.
Computes the vector `x` that approximately solves the equation `a @ x = b`. The equation may be under-, well-, or over-determined (i.e., the number of linearly independent rows of `a` can be less than, equal to, or greater than its number of linearly independent columns). If `a` is square and of full rank, then `x` (but for round-off error) is the “exact” solution of the equation. Else, `x` minimizes the Euclidean 2-norm \\(||b - ax||\\). If there are multiple minimizing solutions, the one with the smallest 2-norm \\(||x||\\) is returned.
Parameters:
    
a(M, N) array_like
    
“Coefficient” matrix.
b{(M,), (M, K)} array_like
    
Ordinate or “dependent variable” values. If `b` is two-dimensional, the least-squares solution is calculated for each of the `K` columns of `b`.
rcondfloat, optional
    
Cut-off ratio for small singular values of `a`. For the purposes of rank determination, singular values are treated as zero if they are smaller than `rcond` times the largest singular value of `a`. The default uses the machine precision times `max(M, N)`. Passing `-1` will use machine precision.
Changed in version 2.0: Previously, the default was `-1`, but a warning was given that this would change.
Returns:
    
x{(N,), (N, K)} ndarray
    
Least-squares solution. If `b` is two-dimensional, the solutions are in the `K` columns of `x`.
residuals{(1,), (K,), (0,)} ndarray
    
Sums of squared residuals: Squared Euclidean 2-norm for each column in `b - a @ x`. If the rank of `a` is < N or M <= N, this is an empty array. If `b` is 1-dimensional, this is a (1,) shape array. Otherwise the shape is (K,).
rankint
    
Rank of matrix `a`.
s(min(M, N),) ndarray
    
Singular values of `a`.
Raises:
    
LinAlgError
    
If computation does not converge.
See also
`scipy.linalg.lstsq`
    
Similar function in SciPy.
#### Notes
If `b` is a matrix, then all array results are returned as matrices.
#### Examples
Fit a line, `y = mx + c`, through some noisy data-points:
    
    >>> import numpy as np
    >>> x = np.array([0, 1, 2, 3])
    >>> y = np.array([-1, 0.2, 0.9, 2.1])
    
By examining the coefficients, we see that the line should have a gradient of roughly 1 and cut the y-axis at, more or less, -1.
We can rewrite the line equation as `y = Ap`, where `A = [[x 1]]` and `p = [[m], [c]]`. Now use `lstsq` to solve for `p`:
    
    >>> A = np.vstack([x, np.ones(len(x))]).T
    >>> A
    array([[ 0.,  1.],
           [ 1.,  1.],
           [ 2.,  1.],
           [ 3.,  1.]])
    
    
    >>> m, c = np.linalg.lstsq(A, y)[0]
    >>> m, c
    (1.0 -0.95) # may vary
    
Plot the data along with the fitted line:
    
    >>> import matplotlib.pyplot as plt
    >>> _ = plt.plot(x, y, 'o', label='Original data', markersize=10)
    >>> _ = plt.plot(x, m*x + c, 'r', label='Fitted line')
    >>> _ = plt.legend()
    >>> plt.show()
    
# numpy.linalg.matmul
linalg.matmul(x1, x2, /)[source]
    
Computes the matrix product.
This function is Array API compatible, contrary to `numpy.matmul`.
Parameters:
    
x1array_like
    
The first input array.
x2array_like
    
The second input array.
Returns:
    
outndarray
    
The matrix product of the inputs. This is a scalar only when both `x1`, `x2` are 1-d vectors.
Raises:
    
ValueError
    
If the last dimension of `x1` is not the same size as the second-to-last dimension of `x2`.
If a scalar value is passed in.
See also
`numpy.matmul`
#### Examples
For 2-D arrays it is the matrix product:
    
    >>> a = np.array([[1, 0],
    ...               [0, 1]])
    >>> b = np.array([[4, 1],
    ...               [2, 2]])
    >>> np.linalg.matmul(a, b)
    array([[4, 1],
           [2, 2]])
    
For 2-D mixed with 1-D, the result is the usual.
    
    >>> a = np.array([[1, 0],
    ...               [0, 1]])
    >>> b = np.array([1, 2])
    >>> np.linalg.matmul(a, b)
    array([1, 2])
    >>> np.linalg.matmul(b, a)
    array([1, 2])
    
Broadcasting is conventional for stacks of arrays
    
    >>> a = np.arange(2 * 2 * 4).reshape((2, 2, 4))
    >>> b = np.arange(2 * 2 * 4).reshape((2, 4, 2))
    >>> np.linalg.matmul(a,b).shape
    (2, 2, 2)
    >>> np.linalg.matmul(a, b)[0, 1, 1]
    98
    >>> sum(a[0, 1, :] * b[0 , :, 1])
    98
    
Vector, vector returns the scalar inner product, but neither argument is complex-conjugated:
    
    >>> np.linalg.matmul([2j, 3j], [2j, 3j])
    (-13+0j)
    
Scalar multiplication raises an error.
    
    >>> np.linalg.matmul([1,2], 3)
    Traceback (most recent call last):
    ...
    ValueError: matmul: Input operand 1 does not have enough dimensions ...
    
# numpy.linalg.matrix_norm
linalg.matrix_norm(x, /, *, keepdims=False, ord='fro')[source]
    
Computes the matrix norm of a matrix (or a stack of matrices) `x`.
This function is Array API compatible.
Parameters:
    
xarray_like
    
Input array having shape (…, M, N) and whose two innermost dimensions form `MxN` matrices.
keepdimsbool, optional
    
If this is set to True, the axes which are normed over are left in the result as dimensions with size one. Default: False.
ord{1, -1, 2, -2, inf, -inf, ‘fro’, ‘nuc’}, optional
    
The order of the norm. For details see the table under `Notes` in `numpy.linalg.norm`.
See also
`numpy.linalg.norm`
    
Generic norm function
#### Examples
    
    >>> from numpy import linalg as LA
    >>> a = np.arange(9) - 4
    >>> a
    array([-4, -3, -2, ...,  2,  3,  4])
    >>> b = a.reshape((3, 3))
    >>> b
    array([[-4, -3, -2],
           [-1,  0,  1],
           [ 2,  3,  4]])
    
    
    >>> LA.matrix_norm(b)
    7.745966692414834
    >>> LA.matrix_norm(b, ord='fro')
    7.745966692414834
    >>> LA.matrix_norm(b, ord=np.inf)
    9.0
    >>> LA.matrix_norm(b, ord=-np.inf)
    2.0
    
    
    >>> LA.matrix_norm(b, ord=1)
    7.0
    >>> LA.matrix_norm(b, ord=-1)
    6.0
    >>> LA.matrix_norm(b, ord=2)
    7.3484692283495345
    >>> LA.matrix_norm(b, ord=-2)
    1.8570331885190563e-016 # may vary
    
# numpy.linalg.matrix_power
linalg.matrix_power(a, n)[source]
    
Raise a square matrix to the (integer) power `n`.
For positive integers `n`, the power is computed by repeated matrix squarings and matrix multiplications. If `n == 0`, the identity matrix of the same shape as M is returned. If `n < 0`, the inverse is computed and then raised to the `abs(n)`.
Note
Stacks of object matrices are not currently supported.
Parameters:
    
a(…, M, M) array_like
    
Matrix to be “powered”.
nint
    
The exponent can be any integer or long integer, positive, negative, or zero.
Returns:
    
a**n(…, M, M) ndarray or matrix object
    
The return value is the same shape and type as `M`; if the exponent is positive or zero then the type of the elements is the same as those of `M`. If the exponent is negative the elements are floating-point.
Raises:
    
LinAlgError
    
For matrices that are not square or that (for negative powers) cannot be inverted numerically.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.linalg import matrix_power
    >>> i = np.array([[0, 1], [-1, 0]]) # matrix equiv. of the imaginary unit
    >>> matrix_power(i, 3) # should = -i
    array([[ 0, -1],
           [ 1,  0]])
    >>> matrix_power(i, 0)
    array([[1, 0],
           [0, 1]])
    >>> matrix_power(i, -3) # should = 1/(-i) = i, but w/ f.p. elements
    array([[ 0.,  1.],
           [-1.,  0.]])
    
Somewhat more sophisticated example
    
    >>> q = np.zeros((4, 4))
    >>> q[0:2, 0:2] = -i
    >>> q[2:4, 2:4] = i
    >>> q # one of the three quaternion units not equal to 1
    array([[ 0., -1.,  0.,  0.],
           [ 1.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  1.],
           [ 0.,  0., -1.,  0.]])
    >>> matrix_power(q, 2) # = -np.eye(4)
    array([[-1.,  0.,  0.,  0.],
           [ 0., -1.,  0.,  0.],
           [ 0.,  0., -1.,  0.],
           [ 0.,  0.,  0., -1.]])
    
# numpy.linalg.matrix_rank
linalg.matrix_rank(A, tol=None, hermitian=False, *, rtol=None)[source]
    
Return matrix rank of array using SVD method
Rank of the array is the number of singular values of the array that are greater than `tol`.
Parameters:
    
A{(M,), (…, M, N)} array_like
    
Input vector or stack of matrices.
tol(…) array_like, float, optional
    
Threshold below which SVD values are considered zero. If `tol` is None, and `S` is an array with singular values for `M`, and `eps` is the epsilon value for datatype of `S`, then `tol` is set to `S.max() * max(M, N) * eps`.
hermitianbool, optional
    
If True, `A` is assumed to be Hermitian (symmetric if real-valued), enabling a more efficient method for finding singular values. Defaults to False.
rtol(…) array_like, float, optional
    
Parameter for the relative tolerance component. Only `tol` or `rtol` can be set at a time. Defaults to `max(M, N) * eps`.
New in version 2.0.0.
Returns:
    
rank(…) array_like
    
Rank of A.
#### Notes
The default threshold to detect rank deficiency is a test on the magnitude of the singular values of `A`. By default, we identify singular values less than `S.max() * max(M, N) * eps` as indicating rank deficiency (with the symbols defined above). This is the algorithm MATLAB uses [1]. It also appears in Numerical recipes in the discussion of SVD solutions for linear least squares [2].
This default threshold is designed to detect rank deficiency accounting for the numerical errors of the SVD computation. Imagine that there is a column in `A` that is an exact (in floating point) linear combination of other columns in `A`. Computing the SVD on `A` will not produce a singular value exactly equal to 0 in general: any difference of the smallest SVD value from 0 will be caused by numerical imprecision in the calculation of the SVD. Our threshold for small SVD values takes this numerical imprecision into account, and the default threshold will detect such numerical rank deficiency. The threshold may declare a matrix `A` rank deficient even if the linear combination of some columns of `A` is not exactly equal to another column of `A` but only numerically very close to another column of `A`.
We chose our default threshold because it is in wide use. Other thresholds are possible. For example, elsewhere in the 2007 edition of Numerical recipes there is an alternative threshold of `S.max() * np.finfo(A.dtype).eps / 2. * np.sqrt(m + n + 1.)`. The authors describe this threshold as being based on “expected roundoff error” (p 71).
The thresholds above deal with floating point roundoff error in the calculation of the SVD. However, you may have more information about the sources of error in `A` that would make you consider other tolerance values to detect effective rank deficiency. The most useful measure of the tolerance depends on the operations you intend to use on your matrix. For example, if your data come from uncertain measurements with uncertainties greater than floating point epsilon, choosing a tolerance near that uncertainty may be preferable. The tolerance may be absolute if the uncertainties are absolute rather than relative.
#### References
[1]
MATLAB reference documentation, “Rank” https://www.mathworks.com/help/techdoc/ref/rank.html
[2]
W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flannery, “Numerical Recipes (3rd edition)”, Cambridge University Press, 2007, page 795.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.linalg import matrix_rank
    >>> matrix_rank(np.eye(4)) # Full rank matrix
    4
    >>> I=np.eye(4); I[-1,-1] = 0. # rank deficient matrix
    >>> matrix_rank(I)
    3
    >>> matrix_rank(np.ones((4,))) # 1 dimension - rank 1 unless all 0
    1
    >>> matrix_rank(np.zeros((4,)))
    0
    
# numpy.linalg.matrix_transpose
linalg.matrix_transpose(x, /)[source]
    
Transposes a matrix (or a stack of matrices) `x`.
This function is Array API compatible.
Parameters:
    
xarray_like
    
Input array having shape (…, M, N) and whose two innermost dimensions form `MxN` matrices.
Returns:
    
outndarray
    
An array containing the transpose for each matrix and having shape (…, N, M).
See also
`transpose`
    
Generic transpose method.
#### Examples
    
    >>> import numpy as np
    >>> np.matrix_transpose([[1, 2], [3, 4]])
    array([[1, 3],
           [2, 4]])
    
    
    >>> np.matrix_transpose([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    array([[[1, 3],
            [2, 4]],
           [[5, 7],
            [6, 8]]])
    
# numpy.linalg.multi_dot
linalg.multi_dot(arrays, *, out=None)[source]
    
Compute the dot product of two or more arrays in a single function call, while automatically selecting the fastest evaluation order.
`multi_dot` chains `numpy.dot` and uses optimal parenthesization of the matrices [1] [2]. Depending on the shapes of the matrices, this can speed up the multiplication a lot.
If the first argument is 1-D it is treated as a row vector. If the last argument is 1-D it is treated as a column vector. The other arguments must be 2-D.
Think of `multi_dot` as:
    
    def multi_dot(arrays): return functools.reduce(np.dot, arrays)
    
Parameters:
    
arrayssequence of array_like
    
If the first argument is 1-D it is treated as row vector. If the last argument is 1-D it is treated as column vector. The other arguments must be 2-D.
outndarray, optional
    
Output argument. This must have the exact kind that would be returned if it was not used. In particular, it must have the right type, must be C-contiguous, and its dtype must be the dtype that would be returned for `dot(a, b)`. This is a performance feature. Therefore, if these conditions are not met, an exception is raised, instead of attempting to be flexible.
Returns:
    
outputndarray
    
Returns the dot product of the supplied arrays.
See also
`numpy.dot`
    
dot multiplication with two arguments.
#### Notes
The cost for a matrix multiplication can be calculated with the following function:
    
    def cost(A, B):
        return A.shape[0] * A.shape[1] * B.shape[1]
    
Assume we have three matrices \\(A_{10x100}, B_{100x5}, C_{5x50}\\).
The costs for the two different parenthesizations are as follows:
    
    cost((AB)C) = 10*100*5 + 10*5*50   = 5000 + 2500   = 7500
    cost(A(BC)) = 10*100*50 + 100*5*50 = 50000 + 25000 = 75000
    
#### References
[1]
Cormen, “Introduction to Algorithms”, Chapter 15.2, p. 370-378
[2]
https://en.wikipedia.org/wiki/Matrix_chain_multiplication
#### Examples
`multi_dot` allows you to write:
    
    >>> import numpy as np
    >>> from numpy.linalg import multi_dot
    >>> # Prepare some data
    >>> A = np.random.random((10000, 100))
    >>> B = np.random.random((100, 1000))
    >>> C = np.random.random((1000, 5))
    >>> D = np.random.random((5, 333))
    >>> # the actual dot multiplication
    >>> _ = multi_dot([A, B, C, D])
    
instead of:
    
    >>> _ = np.dot(np.dot(np.dot(A, B), C), D)
    >>> # or
    >>> _ = A.dot(B).dot(C).dot(D)
    
# numpy.linalg.norm
linalg.norm(x, ord=None, axis=None, keepdims=False)[source]
    
Matrix or vector norm.
This function is able to return one of eight different matrix norms, or one of an infinite number of vector norms (described below), depending on the value of the `ord` parameter.
Parameters:
    
xarray_like
    
Input array. If `axis` is None, `x` must be 1-D or 2-D, unless `ord` is None. If both `axis` and `ord` are None, the 2-norm of `x.ravel` will be returned.
ord{int, float, inf, -inf, ‘fro’, ‘nuc’}, optional
    
Order of the norm (see table under `Notes` for what values are supported for matrices and vectors respectively). inf means numpy’s `inf` object. The default is None.
axis{None, int, 2-tuple of ints}, optional.
    
If `axis` is an integer, it specifies the axis of `x` along which to compute the vector norms. If `axis` is a 2-tuple, it specifies the axes that hold 2-D matrices, and the matrix norms of these matrices are computed. If `axis` is None then either a vector norm (when `x` is 1-D) or a matrix norm (when `x` is 2-D) is returned. The default is None.
keepdimsbool, optional
    
If this is set to True, the axes which are normed over are left in the result as dimensions with size one. With this option the result will broadcast correctly against the original `x`.
Returns:
    
nfloat or ndarray
    
Norm of the matrix or vector(s).
See also
`scipy.linalg.norm`
    
Similar function in SciPy.
#### Notes
For values of `ord < 1`, the result is, strictly speaking, not a mathematical ‘norm’, but it may still be useful for various numerical purposes.
The following norms can be calculated:
ord
norm for matrices
norm for vectors  
None
Frobenius norm
2-norm  
‘fro’
Frobenius norm
–  
‘nuc’
nuclear norm
–  
inf
max(sum(abs(x), axis=1))
max(abs(x))  
-inf
min(sum(abs(x), axis=1))
min(abs(x))  
0
–
sum(x != 0)  
1
max(sum(abs(x), axis=0))
as below  
-1
min(sum(abs(x), axis=0))
as below  
2
2-norm (largest sing. value)
as below  
-2
smallest singular value
as below  
other
–
sum(abs(x)**ord)**(1./ord)  
The Frobenius norm is given by [1]:
\\(||A||_F = [\sum_{i,j} abs(a_{i,j})^2]^{1/2}\\)
The nuclear norm is the sum of the singular values.
Both the Frobenius and nuclear norm orders are only defined for matrices and raise a ValueError when `x.ndim != 2`.
#### References
[1]
G. H. Golub and C. F. Van Loan, Matrix Computations, Baltimore, MD, Johns Hopkins University Press, 1985, pg. 15
#### Examples
    
    >>> import numpy as np
    >>> from numpy import linalg as LA
    >>> a = np.arange(9) - 4
    >>> a
    array([-4, -3, -2, ...,  2,  3,  4])
    >>> b = a.reshape((3, 3))
    >>> b
    array([[-4, -3, -2],
           [-1,  0,  1],
           [ 2,  3,  4]])
    
    
    >>> LA.norm(a)
    7.745966692414834
    >>> LA.norm(b)
    7.745966692414834
    >>> LA.norm(b, 'fro')
    7.745966692414834
    >>> LA.norm(a, np.inf)
    4.0
    >>> LA.norm(b, np.inf)
    9.0
    >>> LA.norm(a, -np.inf)
    0.0
    >>> LA.norm(b, -np.inf)
    2.0
    
    
    >>> LA.norm(a, 1)
    20.0
    >>> LA.norm(b, 1)
    7.0
    >>> LA.norm(a, -1)
    -4.6566128774142013e-010
    >>> LA.norm(b, -1)
    6.0
    >>> LA.norm(a, 2)
    7.745966692414834
    >>> LA.norm(b, 2)
    7.3484692283495345
    
    
    >>> LA.norm(a, -2)
    0.0
    >>> LA.norm(b, -2)
    1.8570331885190563e-016 # may vary
    >>> LA.norm(a, 3)
    5.8480354764257312 # may vary
    >>> LA.norm(a, -3)
    0.0
    
Using the `axis` argument to compute vector norms:
    
    >>> c = np.array([[ 1, 2, 3],
    ...               [-1, 1, 4]])
    >>> LA.norm(c, axis=0)
    array([ 1.41421356,  2.23606798,  5.        ])
    >>> LA.norm(c, axis=1)
    array([ 3.74165739,  4.24264069])
    >>> LA.norm(c, ord=1, axis=1)
    array([ 6.,  6.])
    
Using the `axis` argument to compute matrix norms:
    
    >>> m = np.arange(8).reshape(2,2,2)
    >>> LA.norm(m, axis=(1,2))
    array([  3.74165739,  11.22497216])
    >>> LA.norm(m[0, :, :]), LA.norm(m[1, :, :])
    (3.7416573867739413, 11.224972160321824)
    
# numpy.linalg.outer
linalg.outer(x1, x2, /)[source]
    
Compute the outer product of two vectors.
This function is Array API compatible. Compared to `np.outer` it accepts 1-dimensional inputs only.
Parameters:
    
x1(M,) array_like
    
One-dimensional input array of size `N`. Must have a numeric data type.
x2(N,) array_like
    
One-dimensional input array of size `M`. Must have a numeric data type.
Returns:
    
out(M, N) ndarray
    
`out[i, j] = a[i] * b[j]`
See also
`outer`
#### Examples
Make a (very coarse) grid for computing a Mandelbrot set:
    
    >>> rl = np.linalg.outer(np.ones((5,)), np.linspace(-2, 2, 5))
    >>> rl
    array([[-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.]])
    >>> im = np.linalg.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
    >>> im
    array([[0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j],
           [0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j],
           [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
           [0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j],
           [0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]])
    >>> grid = rl + im
    >>> grid
    array([[-2.+2.j, -1.+2.j,  0.+2.j,  1.+2.j,  2.+2.j],
           [-2.+1.j, -1.+1.j,  0.+1.j,  1.+1.j,  2.+1.j],
           [-2.+0.j, -1.+0.j,  0.+0.j,  1.+0.j,  2.+0.j],
           [-2.-1.j, -1.-1.j,  0.-1.j,  1.-1.j,  2.-1.j],
           [-2.-2.j, -1.-2.j,  0.-2.j,  1.-2.j,  2.-2.j]])
    
An example using a “vector” of letters:
    
    >>> x = np.array(['a', 'b', 'c'], dtype=object)
    >>> np.linalg.outer(x, [1, 2, 3])
    array([['a', 'aa', 'aaa'],
           ['b', 'bb', 'bbb'],
           ['c', 'cc', 'ccc']], dtype=object)
    
# numpy.linalg.pinv
linalg.pinv(a, rcond=None, hermitian=False, *, rtol=<no value>)[source]
    
Compute the (Moore-Penrose) pseudo-inverse of a matrix.
Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.
Parameters:
    
a(…, M, N) array_like
    
Matrix or stack of matrices to be pseudo-inverted.
rcond(…) array_like of float, optional
    
Cutoff for small singular values. Singular values less than or equal to `rcond * largest_singular_value` are set to zero. Broadcasts against the stack of matrices. Default: `1e-15`.
hermitianbool, optional
    
If True, `a` is assumed to be Hermitian (symmetric if real-valued), enabling a more efficient method for finding singular values. Defaults to False.
rtol(…) array_like of float, optional
    
Same as `rcond`, but it’s an Array API compatible parameter name. Only `rcond` or `rtol` can be set at a time. If none of them are provided then NumPy’s `1e-15` default is used. If `rtol=None` is passed then the API standard default is used.
New in version 2.0.0.
Returns:
    
B(…, N, M) ndarray
    
The pseudo-inverse of `a`. If `a` is a `matrix` instance, then so is `B`.
Raises:
    
LinAlgError
    
If the SVD computation does not converge.
See also
`scipy.linalg.pinv`
    
Similar function in SciPy.
`scipy.linalg.pinvh`
    
Compute the (Moore-Penrose) pseudo-inverse of a Hermitian matrix.
#### Notes
The pseudo-inverse of a matrix A, denoted \\(A^+\\), is defined as: “the matrix that ‘solves’ [the least-squares problem] \\(Ax = b\\),” i.e., if \\(\bar{x}\\) is said solution, then \\(A^+\\) is that matrix such that \\(\bar{x} = A^+b\\).
It can be shown that if \\(Q_1 \Sigma Q_2^T = A\\) is the singular value decomposition of A, then \\(A^+ = Q_2 \Sigma^+ Q_1^T\\), where \\(Q_{1,2}\\) are orthogonal matrices, \\(\Sigma\\) is a diagonal matrix consisting of A’s so-called singular values, (followed, typically, by zeros), and then \\(\Sigma^+\\) is simply the diagonal matrix consisting of the reciprocals of A’s singular values (again, followed by zeros). [1]
#### References
[1]
G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pp. 139-142.
#### Examples
The following example checks that `a * a+ * a == a` and `a+ * a * a+ == a+`:
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> a = rng.normal(size=(9, 6))
    >>> B = np.linalg.pinv(a)
    >>> np.allclose(a, np.dot(a, np.dot(B, a)))
    True
    >>> np.allclose(B, np.dot(B, np.dot(a, B)))
    True
    
# numpy.linalg.qr
linalg.qr(a, mode='reduced')[source]
    
Compute the qr factorization of a matrix.
Factor the matrix `a` as qr, where `q` is orthonormal and `r` is upper-triangular.
Parameters:
    
aarray_like, shape (…, M, N)
    
An array-like object with the dimensionality of at least 2.
mode{‘reduced’, ‘complete’, ‘r’, ‘raw’}, optional, default: ‘reduced’
    
If K = min(M, N), then
  * ‘reduced’ : returns Q, R with dimensions (…, M, K), (…, K, N)
  * ‘complete’ : returns Q, R with dimensions (…, M, M), (…, M, N)
  * ‘r’ : returns R only with dimensions (…, K, N)
  * ‘raw’ : returns h, tau with dimensions (…, N, M), (…, K,)


The options ‘reduced’, ‘complete, and ‘raw’ are new in numpy 1.8, see the notes for more information. The default is ‘reduced’, and to maintain backward compatibility with earlier versions of numpy both it and the old default ‘full’ can be omitted. Note that array h returned in ‘raw’ mode is transposed for calling Fortran. The ‘economic’ mode is deprecated. The modes ‘full’ and ‘economic’ may be passed using only the first letter for backwards compatibility, but all others must be spelled out. See the Notes for more explanation.
Returns:
    
When mode is ‘reduced’ or ‘complete’, the result will be a namedtuple with
the attributes `Q` and `R`.
Qndarray of float or complex, optional
    
A matrix with orthonormal columns. When mode = ‘complete’ the result is an orthogonal/unitary matrix depending on whether or not a is real/complex. The determinant may be either +/- 1 in that case. In case the number of dimensions in the input array is greater than 2 then a stack of the matrices with above properties is returned.
Rndarray of float or complex, optional
    
The upper-triangular matrix or a stack of upper-triangular matrices if the number of dimensions in the input array is greater than 2.
(h, tau)ndarrays of np.double or np.cdouble, optional
    
The array h contains the Householder reflectors that generate q along with r. The tau array contains scaling factors for the reflectors. In the deprecated ‘economic’ mode only h is returned.
Raises:
    
LinAlgError
    
If factoring fails.
See also
`scipy.linalg.qr`
    
Similar function in SciPy.
`scipy.linalg.rq`
    
Compute RQ decomposition of a matrix.
#### Notes
This is an interface to the LAPACK routines `dgeqrf`, `zgeqrf`, `dorgqr`, and `zungqr`.
For more information on the qr factorization, see for example: https://en.wikipedia.org/wiki/QR_factorization
Subclasses of `ndarray` are preserved except for the ‘raw’ mode. So if `a` is of type `matrix`, all the return values will be matrices too.
New ‘reduced’, ‘complete’, and ‘raw’ options for mode were added in NumPy 1.8.0 and the old option ‘full’ was made an alias of ‘reduced’. In addition the options ‘full’ and ‘economic’ were deprecated. Because ‘full’ was the previous default and ‘reduced’ is the new default, backward compatibility can be maintained by letting `mode` default. The ‘raw’ option was added so that LAPACK routines that can multiply arrays by q using the Householder reflectors can be used. Note that in this case the returned arrays are of type np.double or np.cdouble and the h array is transposed to be FORTRAN compatible. No routines using the ‘raw’ return are currently exposed by numpy, but some are available in lapack_lite and just await the necessary work.
#### Examples
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> a = rng.normal(size=(9, 6))
    >>> Q, R = np.linalg.qr(a)
    >>> np.allclose(a, np.dot(Q, R))  # a does equal QR
    True
    >>> R2 = np.linalg.qr(a, mode='r')
    >>> np.allclose(R, R2)  # mode='r' returns the same R as mode='full'
    True
    >>> a = np.random.normal(size=(3, 2, 2)) # Stack of 2 x 2 matrices as input
    >>> Q, R = np.linalg.qr(a)
    >>> Q.shape
    (3, 2, 2)
    >>> R.shape
    (3, 2, 2)
    >>> np.allclose(a, np.matmul(Q, R))
    True
    
Example illustrating a common use of `qr`: solving of least squares problems
What are the least-squares-best `m` and `y0` in `y = y0 + mx` for the following data: {(0,1), (1,0), (1,2), (2,1)}. (Graph the points and you’ll see that it should be y0 = 0, m = 1.) The answer is provided by solving the over-determined matrix equation `Ax = b`, where:
    
    A = array([[0, 1], [1, 1], [1, 1], [2, 1]])
    x = array([[y0], [m]])
    b = array([[1], [0], [2], [1]])
    
If A = QR such that Q is orthonormal (which is always possible via Gram-Schmidt), then `x = inv(R) * (Q.T) * b`. (In numpy practice, however, we simply use `lstsq`.)
    
    >>> A = np.array([[0, 1], [1, 1], [1, 1], [2, 1]])
    >>> A
    array([[0, 1],
           [1, 1],
           [1, 1],
           [2, 1]])
    >>> b = np.array([1, 2, 2, 3])
    >>> Q, R = np.linalg.qr(A)
    >>> p = np.dot(Q.T, b)
    >>> np.dot(np.linalg.inv(R), p)
    array([  1.,   1.])
    
# numpy.linalg.slogdet
linalg.slogdet(a)[source]
    
Compute the sign and (natural) logarithm of the determinant of an array.
If an array has a very small or very large determinant, then a call to `det` may overflow or underflow. This routine is more robust against such issues, because it computes the logarithm of the determinant rather than the determinant itself.
Parameters:
    
a(…, M, M) array_like
    
Input array, has to be a square 2-D array.
Returns:
    
A namedtuple with the following attributes:
sign(…) array_like
    
A number representing the sign of the determinant. For a real matrix, this is 1, 0, or -1. For a complex matrix, this is a complex number with absolute value 1 (i.e., it is on the unit circle), or else 0.
logabsdet(…) array_like
    
The natural log of the absolute value of the determinant.
If the determinant is zero, then `sign` will be 0 and `logabsdet`
will be -inf. In all cases, the determinant is equal to
`sign * np.exp(logabsdet)`.
See also
`det`
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
The determinant is computed via LU factorization using the LAPACK routine `z/dgetrf`.
#### Examples
The determinant of a 2-D array `[[a, b], [c, d]]` is `ad - bc`:
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> (sign, logabsdet) = np.linalg.slogdet(a)
    >>> (sign, logabsdet)
    (-1, 0.69314718055994529) # may vary
    >>> sign * np.exp(logabsdet)
    -2.0
    
Computing log-determinants for a stack of matrices:
    
    >>> a = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
    >>> a.shape
    (3, 2, 2)
    >>> sign, logabsdet = np.linalg.slogdet(a)
    >>> (sign, logabsdet)
    (array([-1., -1., -1.]), array([ 0.69314718,  1.09861229,  2.07944154]))
    >>> sign * np.exp(logabsdet)
    array([-2., -3., -8.])
    
This routine succeeds where ordinary `det` does not:
    
    >>> np.linalg.det(np.eye(500) * 0.1)
    0.0
    >>> np.linalg.slogdet(np.eye(500) * 0.1)
    (1, -1151.2925464970228)
    
# numpy.linalg.solve
linalg.solve(a, b)[source]
    
Solve a linear matrix equation, or system of linear scalar equations.
Computes the “exact” solution, `x`, of the well-determined, i.e., full rank, linear matrix equation `ax = b`.
Parameters:
    
a(…, M, M) array_like
    
Coefficient matrix.
b{(M,), (…, M, K)}, array_like
    
Ordinate or “dependent variable” values.
Returns:
    
x{(…, M,), (…, M, K)} ndarray
    
Solution to the system a x = b. Returned shape is (…, M) if b is shape (M,) and (…, M, K) if b is (…, M, K), where the “…” part is broadcasted between a and b.
Raises:
    
LinAlgError
    
If `a` is singular or not square.
See also
`scipy.linalg.solve`
    
Similar function in SciPy.
#### Notes
Broadcasting rules apply, see the `numpy.linalg` documentation for details.
The solutions are computed using LAPACK routine `_gesv`.
`a` must be square and of full-rank, i.e., all rows (or, equivalently, columns) must be linearly independent; if either is not true, use `lstsq` for the least-squares best “solution” of the system/equation.
Changed in version 2.0: The b array is only treated as a shape (M,) column vector if it is exactly 1-dimensional. In all other instances it is treated as a stack of (M, K) matrices. Previously b would be treated as a stack of (M,) vectors if b.ndim was equal to a.ndim - 1.
#### References
[1]
G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pg. 22.
#### Examples
Solve the system of equations: `x0 + 2 * x1 = 1` and `3 * x0 + 5 * x1 = 2`:
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 5]])
    >>> b = np.array([1, 2])
    >>> x = np.linalg.solve(a, b)
    >>> x
    array([-1.,  1.])
    
Check that the solution is correct:
    
    >>> np.allclose(np.dot(a, x), b)
    True
    
# numpy.linalg.svd
linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)[source]
    
Singular Value Decomposition.
When `a` is a 2D array, and `full_matrices=False`, then it is factorized as `u @ np.diag(s) @ vh = (u * s) @ vh`, where `u` and the Hermitian transpose of `vh` are 2D arrays with orthonormal columns and `s` is a 1D array of `a`’s singular values. When `a` is higher-dimensional, SVD is applied in stacked mode as explained below.
Parameters:
    
a(…, M, N) array_like
    
A real or complex array with `a.ndim >= 2`.
full_matricesbool, optional
    
If True (default), `u` and `vh` have the shapes `(..., M, M)` and `(..., N, N)`, respectively. Otherwise, the shapes are `(..., M, K)` and `(..., K, N)`, respectively, where `K = min(M, N)`.
compute_uvbool, optional
    
Whether or not to compute `u` and `vh` in addition to `s`. True by default.
hermitianbool, optional
    
If True, `a` is assumed to be Hermitian (symmetric if real-valued), enabling a more efficient method for finding singular values. Defaults to False.
Returns:
    
When `compute_uv` is True, the result is a namedtuple with the following
attribute names:
U{ (…, M, M), (…, M, K) } array
    
Unitary array(s). The first `a.ndim - 2` dimensions have the same size as those of the input `a`. The size of the last two dimensions depends on the value of `full_matrices`. Only returned when `compute_uv` is True.
S(…, K) array
    
Vector(s) with the singular values, within each vector sorted in descending order. The first `a.ndim - 2` dimensions have the same size as those of the input `a`.
Vh{ (…, N, N), (…, K, N) } array
    
Unitary array(s). The first `a.ndim - 2` dimensions have the same size as those of the input `a`. The size of the last two dimensions depends on the value of `full_matrices`. Only returned when `compute_uv` is True.
Raises:
    
LinAlgError
    
If SVD computation does not converge.
See also
`scipy.linalg.svd`
    
Similar function in SciPy.
`scipy.linalg.svdvals`
    
Compute singular values of a matrix.
#### Notes
The decomposition is performed using LAPACK routine `_gesdd`.
SVD is usually described for the factorization of a 2D matrix \\(A\\). The higher-dimensional case will be discussed below. In the 2D case, SVD is written as \\(A = U S V^H\\), where \\(A = a\\), \\(U= u\\), \\(S= \mathtt{np.diag}(s)\\) and \\(V^H = vh\\). The 1D array `s` contains the singular values of `a` and `u` and `vh` are unitary. The rows of `vh` are the eigenvectors of \\(A^H A\\) and the columns of `u` are the eigenvectors of \\(A A^H\\). In both cases the corresponding (possibly non-zero) eigenvalues are given by `s**2`.
If `a` has more than two dimensions, then broadcasting rules apply, as explained in Linear algebra on several matrices at once. This means that SVD is working in “stacked” mode: it iterates over all indices of the first `a.ndim - 2` dimensions and for each combination SVD is applied to the last two indices. The matrix `a` can be reconstructed from the decomposition with either `(u * s[..., None, :]) @ vh` or `u @ (s[..., None] * vh)`. (The `@` operator can be replaced by the function `np.matmul` for python versions below 3.5.)
If `a` is a `matrix` object (as opposed to an `ndarray`), then so are all the return values.
#### Examples
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> a = rng.normal(size=(9, 6)) + 1j*rng.normal(size=(9, 6))
    >>> b = rng.normal(size=(2, 7, 8, 3)) + 1j*rng.normal(size=(2, 7, 8, 3))
    
Reconstruction based on full SVD, 2D case:
    
    >>> U, S, Vh = np.linalg.svd(a, full_matrices=True)
    >>> U.shape, S.shape, Vh.shape
    ((9, 9), (6,), (6, 6))
    >>> np.allclose(a, np.dot(U[:, :6] * S, Vh))
    True
    >>> smat = np.zeros((9, 6), dtype=complex)
    >>> smat[:6, :6] = np.diag(S)
    >>> np.allclose(a, np.dot(U, np.dot(smat, Vh)))
    True
    
Reconstruction based on reduced SVD, 2D case:
    
    >>> U, S, Vh = np.linalg.svd(a, full_matrices=False)
    >>> U.shape, S.shape, Vh.shape
    ((9, 6), (6,), (6, 6))
    >>> np.allclose(a, np.dot(U * S, Vh))
    True
    >>> smat = np.diag(S)
    >>> np.allclose(a, np.dot(U, np.dot(smat, Vh)))
    True
    
Reconstruction based on full SVD, 4D case:
    
    >>> U, S, Vh = np.linalg.svd(b, full_matrices=True)
    >>> U.shape, S.shape, Vh.shape
    ((2, 7, 8, 8), (2, 7, 3), (2, 7, 3, 3))
    >>> np.allclose(b, np.matmul(U[..., :3] * S[..., None, :], Vh))
    True
    >>> np.allclose(b, np.matmul(U[..., :3], S[..., None] * Vh))
    True
    
Reconstruction based on reduced SVD, 4D case:
    
    >>> U, S, Vh = np.linalg.svd(b, full_matrices=False)
    >>> U.shape, S.shape, Vh.shape
    ((2, 7, 8, 3), (2, 7, 3), (2, 7, 3, 3))
    >>> np.allclose(b, np.matmul(U * S[..., None, :], Vh))
    True
    >>> np.allclose(b, np.matmul(U, S[..., None] * Vh))
    True
    
# numpy.linalg.svdvals
linalg.svdvals(x, /)[source]
    
Returns the singular values of a matrix (or a stack of matrices) `x`. When x is a stack of matrices, the function will compute the singular values for each matrix in the stack.
This function is Array API compatible.
Calling `np.svdvals(x)` to get singular values is the same as `np.svd(x, compute_uv=False, hermitian=False)`.
Parameters:
    
x(…, M, N) array_like
    
Input array having shape (…, M, N) and whose last two dimensions form matrices on which to perform singular value decomposition. Should have a floating-point data type.
Returns:
    
outndarray
    
An array with shape (…, K) that contains the vector(s) of singular values of length K, where K = min(M, N).
See also
`scipy.linalg.svdvals`
    
Compute singular values of a matrix.
#### Examples
    
    >>> np.linalg.svdvals([[1, 2, 3, 4, 5],
    ...                    [1, 4, 9, 16, 25],
    ...                    [1, 8, 27, 64, 125]])
    array([146.68862757,   5.57510612,   0.60393245])
    
Determine the rank of a matrix using singular values:
    
    >>> s = np.linalg.svdvals([[1, 2, 3],
    ...                        [2, 4, 6],
    ...                        [-1, 1, -1]]); s
    array([8.38434191e+00, 1.64402274e+00, 2.31534378e-16])
    >>> np.count_nonzero(s > 1e-10)  # Matrix of rank 2
    2
    
# numpy.linalg.tensordot
linalg.tensordot(x1, x2, /, *, axes=2)[source]
    
Compute tensor dot product along specified axes.
Given two tensors, `a` and `b`, and an array_like object containing two array_like objects, `(a_axes, b_axes)`, sum the products of `a`’s and `b`’s elements (components) over the axes specified by `a_axes` and `b_axes`. The third argument can be a single non-negative integer_like scalar, `N`; if it is such, then the last `N` dimensions of `a` and the first `N` dimensions of `b` are summed over.
Parameters:
    
a, barray_like
    
Tensors to “dot”.
axesint or (2,) array_like
    
  * integer_like If an int N, sum over the last N axes of `a` and the first N axes of `b` in order. The sizes of the corresponding axes must match.
  * (2,) array_like Or, a list of axes to be summed over, first sequence applying to `a`, second to `b`. Both elements array_like must be of the same length.


Returns:
    
outputndarray
    
The tensor dot product of the input.
See also
`dot`, `einsum`
#### Notes
Three common use cases are:
    
  * `axes = 0` : tensor product \\(a\otimes b\\)
  * `axes = 1` : tensor dot product \\(a\cdot b\\)
  * `axes = 2` : (default) tensor double contraction \\(a:b\\)


When `axes` is integer_like, the sequence of axes for evaluation will be: from the -Nth axis to the -1th axis in `a`, and from the 0th axis to (N-1)th axis in `b`. For example, `axes = 2` is the equal to `axes = [[-2, -1], [0, 1]]`. When N-1 is smaller than 0, or when -N is larger than -1, the element of `a` and `b` are defined as the `axes`.
When there is more than one axis to sum over - and they are not the last (first) axes of `a` (`b`) - the argument `axes` should consist of two sequences of the same length, with the first axis to sum over given first in both sequences, the second axis second, and so forth. The calculation can be referred to `numpy.einsum`.
The shape of the result consists of the non-contracted axes of the first tensor, followed by the non-contracted axes of the second.
#### Examples
An example on integer_like:
    
    >>> a_0 = np.array([[1, 2], [3, 4]])
    >>> b_0 = np.array([[5, 6], [7, 8]])
    >>> c_0 = np.tensordot(a_0, b_0, axes=0)
    >>> c_0.shape
    (2, 2, 2, 2)
    >>> c_0
    array([[[[ 5,  6],
             [ 7,  8]],
            [[10, 12],
             [14, 16]]],
           [[[15, 18],
             [21, 24]],
            [[20, 24],
             [28, 32]]]])
    
An example on array_like:
    
    >>> a = np.arange(60.).reshape(3,4,5)
    >>> b = np.arange(24.).reshape(4,3,2)
    >>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
    >>> c.shape
    (5, 2)
    >>> c
    array([[4400., 4730.],
           [4532., 4874.],
           [4664., 5018.],
           [4796., 5162.],
           [4928., 5306.]])
    
A slower but equivalent way of computing the same…
    
    >>> d = np.zeros((5,2))
    >>> for i in range(5):
    ...   for j in range(2):
    ...     for k in range(3):
    ...       for n in range(4):
    ...         d[i,j] += a[k,n,i] * b[n,k,j]
    >>> c == d
    array([[ True,  True],
           [ True,  True],
           [ True,  True],
           [ True,  True],
           [ True,  True]])
    
An extended example taking advantage of the overloading of + and *:
    
    >>> a = np.array(range(1, 9))
    >>> a.shape = (2, 2, 2)
    >>> A = np.array(('a', 'b', 'c', 'd'), dtype=object)
    >>> A.shape = (2, 2)
    >>> a; A
    array([[[1, 2],
            [3, 4]],
           [[5, 6],
            [7, 8]]])
    array([['a', 'b'],
           ['c', 'd']], dtype=object)
    
    
    >>> np.tensordot(a, A) # third argument default is 2 for double-contraction
    array(['abbcccdddd', 'aaaaabbbbbbcccccccdddddddd'], dtype=object)
    
    
    >>> np.tensordot(a, A, 1)
    array([[['acc', 'bdd'],
            ['aaacccc', 'bbbdddd']],
           [['aaaaacccccc', 'bbbbbdddddd'],
            ['aaaaaaacccccccc', 'bbbbbbbdddddddd']]], dtype=object)
    
    
    >>> np.tensordot(a, A, 0) # tensor product (result too long to incl.)
    array([[[[['a', 'b'],
              ['c', 'd']],
              ...
    
    
    >>> np.tensordot(a, A, (0, 1))
    array([[['abbbbb', 'cddddd'],
            ['aabbbbbb', 'ccdddddd']],
           [['aaabbbbbbb', 'cccddddddd'],
            ['aaaabbbbbbbb', 'ccccdddddddd']]], dtype=object)
    
    
    >>> np.tensordot(a, A, (2, 1))
    array([[['abb', 'cdd'],
            ['aaabbbb', 'cccdddd']],
           [['aaaaabbbbbb', 'cccccdddddd'],
            ['aaaaaaabbbbbbbb', 'cccccccdddddddd']]], dtype=object)
    
    
    >>> np.tensordot(a, A, ((0, 1), (0, 1)))
    array(['abbbcccccddddddd', 'aabbbbccccccdddddddd'], dtype=object)
    
    
    >>> np.tensordot(a, A, ((2, 1), (1, 0)))
    array(['acccbbdddd', 'aaaaacccccccbbbbbbdddddddd'], dtype=object)
    
# numpy.linalg.tensorinv
linalg.tensorinv(a, ind=2)[source]
    
Compute the ‘inverse’ of an N-dimensional array.
The result is an inverse for `a` relative to the tensordot operation `tensordot(a, b, ind)`, i. e., up to floating-point accuracy, `tensordot(tensorinv(a), a, ind)` is the “identity” tensor for the tensordot operation.
Parameters:
    
aarray_like
    
Tensor to ‘invert’. Its shape must be ‘square’, i. e., `prod(a.shape[:ind]) == prod(a.shape[ind:])`.
indint, optional
    
Number of first indices that are involved in the inverse sum. Must be a positive integer, default is 2.
Returns:
    
bndarray
    
`a`’s tensordot inverse, shape `a.shape[ind:] + a.shape[:ind]`.
Raises:
    
LinAlgError
    
If `a` is singular or not ‘square’ (in the above sense).
See also
`numpy.tensordot`, `tensorsolve`
#### Examples
    
    >>> import numpy as np
    >>> a = np.eye(4*6)
    >>> a.shape = (4, 6, 8, 3)
    >>> ainv = np.linalg.tensorinv(a, ind=2)
    >>> ainv.shape
    (8, 3, 4, 6)
    >>> rng = np.random.default_rng()
    >>> b = rng.normal(size=(4, 6))
    >>> np.allclose(np.tensordot(ainv, b), np.linalg.tensorsolve(a, b))
    True
    
    
    >>> a = np.eye(4*6)
    >>> a.shape = (24, 8, 3)
    >>> ainv = np.linalg.tensorinv(a, ind=1)
    >>> ainv.shape
    (8, 3, 24)
    >>> rng = np.random.default_rng()
    >>> b = rng.normal(size=24)
    >>> np.allclose(np.tensordot(ainv, b, 1), np.linalg.tensorsolve(a, b))
    True
    
# numpy.linalg.tensorsolve
linalg.tensorsolve(a, b, axes=None)[source]
    
Solve the tensor equation `a x = b` for x.
It is assumed that all indices of `x` are summed over in the product, together with the rightmost indices of `a`, as is done in, for example, `tensordot(a, x, axes=x.ndim)`.
Parameters:
    
aarray_like
    
Coefficient tensor, of shape `b.shape + Q`. `Q`, a tuple, equals the shape of that sub-tensor of `a` consisting of the appropriate number of its rightmost indices, and must be such that `prod(Q) == prod(b.shape)` (in which sense `a` is said to be ‘square’).
barray_like
    
Right-hand tensor, which can be of any shape.
axestuple of ints, optional
    
Axes in `a` to reorder to the right, before inversion. If None (default), no reordering is done.
Returns:
    
xndarray, shape Q
Raises:
    
LinAlgError
    
If `a` is singular or not ‘square’ (in the above sense).
See also
`numpy.tensordot`, `tensorinv`, `numpy.einsum`
#### Examples
    
    >>> import numpy as np
    >>> a = np.eye(2*3*4)
    >>> a.shape = (2*3, 4, 2, 3, 4)
    >>> rng = np.random.default_rng()
    >>> b = rng.normal(size=(2*3, 4))
    >>> x = np.linalg.tensorsolve(a, b)
    >>> x.shape
    (2, 3, 4)
    >>> np.allclose(np.tensordot(a, x, axes=3), b)
    True
    
# numpy.linalg.trace
linalg.trace(x, /, *, offset=0, dtype=None)[source]
    
Returns the sum along the specified diagonals of a matrix (or a stack of matrices) `x`.
This function is Array API compatible, contrary to `numpy.trace`.
Parameters:
    
x(…,M,N) array_like
    
Input array having shape (…, M, N) and whose innermost two dimensions form MxN matrices.
offsetint, optional
    
Offset specifying the off-diagonal relative to the main diagonal, where:
    
    * offset = 0: the main diagonal.
    * offset > 0: off-diagonal above the main diagonal.
    * offset < 0: off-diagonal below the main diagonal.
    
dtypedtype, optional
    
Data type of the returned array.
Returns:
    
outndarray
    
An array containing the traces and whose shape is determined by removing the last two dimensions and storing the traces in the last array dimension. For example, if x has rank k and shape: (I, J, K, …, L, M, N), then an output array has rank k-2 and shape: (I, J, K, …, L) where:
    
    out[i, j, k, ..., l] = trace(a[i, j, k, ..., l, :, :])
    
The returned array must have a data type as described by the dtype parameter above.
See also
`numpy.trace`
#### Examples
    
    >>> np.linalg.trace(np.eye(3))
    3.0
    >>> a = np.arange(8).reshape((2, 2, 2))
    >>> np.linalg.trace(a)
    array([3, 11])
    
Trace is computed with the last two axes as the 2-d sub-arrays. This behavior differs from `numpy.trace` which uses the first two axes by default.
    
    >>> a = np.arange(24).reshape((3, 2, 2, 2))
    >>> np.linalg.trace(a).shape
    (3, 2)
    
Traces adjacent to the main diagonal can be obtained by using the `offset` argument:
    
    >>> a = np.arange(9).reshape((3, 3)); a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> np.linalg.trace(a, offset=1)  # First superdiagonal
    6
    >>> np.linalg.trace(a, offset=2)  # Second superdiagonal
    2
    >>> np.linalg.trace(a, offset=-1)  # First subdiagonal
    10
    >>> np.linalg.trace(a, offset=-2)  # Second subdiagonal
    6
    
# numpy.linalg.vecdot
linalg.vecdot(x1, x2, /, *, axis=-1)[source]
    
Computes the vector dot product.
This function is restricted to arguments compatible with the Array API, contrary to `numpy.vecdot`.
Let \\(\mathbf{a}\\) be a vector in `x1` and \\(\mathbf{b}\\) be a corresponding vector in `x2`. The dot product is defined as:
\\[\mathbf{a} \cdot \mathbf{b} = \sum_{i=0}^{n-1} \overline{a_i}b_i\\]
over the dimension specified by `axis` and where \\(\overline{a_i}\\) denotes the complex conjugate if \\(a_i\\) is complex and the identity otherwise.
Parameters:
    
x1array_like
    
First input array.
x2array_like
    
Second input array.
axisint, optional
    
Axis over which to compute the dot product. Default: `-1`.
Returns:
    
outputndarray
    
The vector dot product of the input.
See also
`numpy.vecdot`
#### Examples
Get the projected size along a given normal for an array of vectors.
    
    >>> v = np.array([[0., 5., 0.], [0., 0., 10.], [0., 6., 8.]])
    >>> n = np.array([0., 0.6, 0.8])
    >>> np.linalg.vecdot(v, n)
    array([ 3.,  8., 10.])
    
# numpy.linalg.vector_norm
linalg.vector_norm(x, /, *, axis=None, keepdims=False, ord=2)[source]
    
Computes the vector norm of a vector (or batch of vectors) `x`.
This function is Array API compatible.
Parameters:
    
xarray_like
    
Input array.
axis{None, int, 2-tuple of ints}, optional
    
If an integer, `axis` specifies the axis (dimension) along which to compute vector norms. If an n-tuple, `axis` specifies the axes (dimensions) along which to compute batched vector norms. If `None`, the vector norm must be computed over all array values (i.e., equivalent to computing the vector norm of a flattened array). Default: `None`.
keepdimsbool, optional
    
If this is set to True, the axes which are normed over are left in the result as dimensions with size one. Default: False.
ord{int, float, inf, -inf}, optional
    
The order of the norm. For details see the table under `Notes` in `numpy.linalg.norm`.
See also
`numpy.linalg.norm`
    
Generic norm function
#### Examples
    
    >>> from numpy import linalg as LA
    >>> a = np.arange(9) + 1
    >>> a
    array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> b = a.reshape((3, 3))
    >>> b
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    
    >>> LA.vector_norm(b)
    16.881943016134134
    >>> LA.vector_norm(b, ord=np.inf)
    9.0
    >>> LA.vector_norm(b, ord=-np.inf)
    1.0
    
    
    >>> LA.vector_norm(b, ord=0)
    9.0
    >>> LA.vector_norm(b, ord=1)
    45.0
    >>> LA.vector_norm(b, ord=-1)
    0.3534857623790153
    >>> LA.vector_norm(b, ord=2)
    16.881943016134134
    >>> LA.vector_norm(b, ord=-2)
    0.8058837395885292
    
# numpy.linspace
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0, *, device=None)[source]
    
Return evenly spaced numbers over a specified interval.
Returns `num` evenly spaced samples, calculated over the interval [`start`, `stop`].
The endpoint of the interval can optionally be excluded.
Changed in version 1.20.0: Values are rounded towards `-inf` instead of `0` when an integer `dtype` is specified. The old behavior can still be obtained with `np.linspace(start, stop, num).astype(int)`
Parameters:
    
startarray_like
    
The starting value of the sequence.
stoparray_like
    
The end value of the sequence, unless `endpoint` is set to False. In that case, the sequence consists of all but the last of `num + 1` evenly spaced samples, so that `stop` is excluded. Note that the step size changes when `endpoint` is False.
numint, optional
    
Number of samples to generate. Default is 50. Must be non-negative.
endpointbool, optional
    
If True, `stop` is the last sample. Otherwise, it is not included. Default is True.
retstepbool, optional
    
If True, return (`samples`, `step`), where `step` is the spacing between samples.
dtypedtype, optional
    
The type of the output array. If `dtype` is not given, the data type is inferred from `start` and `stop`. The inferred dtype will never be an integer; `float` is chosen even if the arguments would produce an array of integers.
axisint, optional
    
The axis in the result to store the samples. Relevant only if start or stop are array-like. By default (0), the samples will be along a new axis inserted at the beginning. Use -1 to get an axis at the end.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
samplesndarray
    
There are `num` equally spaced samples in the closed interval `[start, stop]` or the half-open interval `[start, stop)` (depending on whether `endpoint` is True or False).
stepfloat, optional
    
Only returned if `retstep` is True
Size of spacing between samples.
See also
`arange`
    
Similar to `linspace`, but uses a step size (instead of the number of samples).
`geomspace`
    
Similar to `linspace`, but with numbers spaced evenly on a log scale (a geometric progression).
`logspace`
    
Similar to `geomspace`, but with the end points specified as logarithms.
How to create arrays with regularly-spaced values
#### Examples
    
    >>> import numpy as np
    >>> np.linspace(2.0, 3.0, num=5)
    array([2.  , 2.25, 2.5 , 2.75, 3.  ])
    >>> np.linspace(2.0, 3.0, num=5, endpoint=False)
    array([2. ,  2.2,  2.4,  2.6,  2.8])
    >>> np.linspace(2.0, 3.0, num=5, retstep=True)
    (array([2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25)
    
Graphical illustration:
    
    >>> import matplotlib.pyplot as plt
    >>> N = 8
    >>> y = np.zeros(N)
    >>> x1 = np.linspace(0, 10, N, endpoint=True)
    >>> x2 = np.linspace(0, 10, N, endpoint=False)
    >>> plt.plot(x1, y, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.plot(x2, y + 0.5, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.ylim([-0.5, 1])
    (-0.5, 1)
    >>> plt.show()
    
# numpy.load
numpy.load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII', *, max_header_size=10000)[source]
    
Load arrays or pickled objects from `.npy`, `.npz` or pickled files.
Warning
Loading files that contain object arrays uses the `pickle` module, which is not secure against erroneous or maliciously constructed data. Consider passing `allow_pickle=False` to load data that is known not to contain object arrays for the safer handling of untrusted sources.
Parameters:
    
filefile-like object, string, or pathlib.Path
    
The file to read. File-like objects must support the `seek()` and `read()` methods and must always be opened in binary mode. Pickled files require that the file-like object support the `readline()` method as well.
mmap_mode{None, ‘r+’, ‘r’, ‘w+’, ‘c’}, optional
    
If not None, then memory-map the file, using the given mode (see `numpy.memmap` for a detailed description of the modes). A memory-mapped array is kept on disk. However, it can be accessed and sliced like any ndarray. Memory mapping is especially useful for accessing small fragments of large files without reading the entire file into memory.
allow_picklebool, optional
    
Allow loading pickled object arrays stored in npy files. Reasons for disallowing pickles include security, as loading pickled data can execute arbitrary code. If pickles are disallowed, loading object arrays will fail. Default: False
fix_importsbool, optional
    
Only useful when loading Python 2 generated pickled files on Python 3, which includes npy/npz files containing object arrays. If `fix_imports` is True, pickle will try to map the old Python 2 names to the new names used in Python 3.
encodingstr, optional
    
What encoding to use when reading Python 2 strings. Only useful when loading Python 2 generated pickled files in Python 3, which includes npy/npz files containing object arrays. Values other than ‘latin1’, ‘ASCII’, and ‘bytes’ are not allowed, as they can corrupt numerical data. Default: ‘ASCII’
max_header_sizeint, optional
    
Maximum allowed size of the header. Large headers may not be safe to load securely and thus require explicitly passing a larger value. See `ast.literal_eval` for details. This option is ignored when `allow_pickle` is passed. In that case the file is by definition trusted and the limit is unnecessary.
Returns:
    
resultarray, tuple, dict, etc.
    
Data stored in the file. For `.npz` files, the returned instance of NpzFile class must be closed to avoid leaking file descriptors.
Raises:
    
OSError
    
If the input file does not exist or cannot be read.
UnpicklingError
    
If `allow_pickle=True`, but the file cannot be loaded as a pickle.
ValueError
    
The file contains an object array, but `allow_pickle=False` given.
EOFError
    
When calling `np.load` multiple times on the same file handle, if all data has already been read
See also
`save`, `savez`, `savez_compressed`, `loadtxt`
`memmap`
    
Create a memory-map to an array stored in a file on disk.
`lib.format.open_memmap`
    
Create or load a memory-mapped `.npy` file.
#### Notes
  * If the file contains pickle data, then whatever object is stored in the pickle is returned.
  * If the file is a `.npy` file, then a single array is returned.
  * If the file is a `.npz` file, then a dictionary-like object is returned, containing `{filename: array}` key-value pairs, one for each file in the archive.
  * If the file is a `.npz` file, the returned value supports the context manager protocol in a similar fashion to the open function:
        with load('foo.npz') as data:
            a = data['a']
        
The underlying file descriptor is closed when exiting the ‘with’ block.


#### Examples
    
    >>> import numpy as np
    
Store data to disk, and load it again:
    
    >>> np.save('/tmp/123', np.array([[1, 2, 3], [4, 5, 6]]))
    >>> np.load('/tmp/123.npy')
    array([[1, 2, 3],
           [4, 5, 6]])
    
Store compressed data to disk, and load it again:
    
    >>> a=np.array([[1, 2, 3], [4, 5, 6]])
    >>> b=np.array([1, 2])
    >>> np.savez('/tmp/123.npz', a=a, b=b)
    >>> data = np.load('/tmp/123.npz')
    >>> data['a']
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> data['b']
    array([1, 2])
    >>> data.close()
    
Mem-map the stored array, and then access the second row directly from disk:
    
    >>> X = np.load('/tmp/123.npy', mmap_mode='r')
    >>> X[1, :]
    memmap([4, 5, 6])
    
# numpy.loadtxt
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=None, max_rows=None, *, quotechar=None, like=None)[source]
    
Load data from a text file.
Parameters:
    
fnamefile, str, pathlib.Path, list of str, generator
    
File, filename, list, or generator to read. If the filename extension is `.gz` or `.bz2`, the file is first decompressed. Note that generators must return bytes or strings. The strings in a list or produced by a generator are treated as lines.
dtypedata-type, optional
    
Data-type of the resulting array; default: float. If this is a structured data-type, the resulting array will be 1-dimensional, and each row will be interpreted as an element of the array. In this case, the number of columns used must match the number of fields in the data-type.
commentsstr or sequence of str or None, optional
    
The characters or list of characters used to indicate the start of a comment. None implies no comments. For backwards compatibility, byte strings will be decoded as ‘latin1’. The default is ‘#’.
delimiterstr, optional
    
The character used to separate the values. For backwards compatibility, byte strings will be decoded as ‘latin1’. The default is whitespace.
Changed in version 1.23.0: Only single character delimiters are supported. Newline characters cannot be used as the delimiter.
convertersdict or callable, optional
    
Converter functions to customize value parsing. If `converters` is callable, the function is applied to all columns, else it must be a dict that maps column number to a parser function. See examples for further details. Default: None.
Changed in version 1.23.0: The ability to pass a single callable to be applied to all columns was added.
skiprowsint, optional
    
Skip the first `skiprows` lines, including comments; default: 0.
usecolsint or sequence, optional
    
Which columns to read, with 0 being the first. For example, `usecols = (1,4,5)` will extract the 2nd, 5th and 6th columns. The default, None, results in all columns being read.
unpackbool, optional
    
If True, the returned array is transposed, so that arguments may be unpacked using `x, y, z = loadtxt(...)`. When used with a structured data-type, arrays are returned for each field. Default is False.
ndminint, optional
    
The returned array will have at least `ndmin` dimensions. Otherwise mono-dimensional axes will be squeezed. Legal values: 0 (default), 1 or 2.
encodingstr, optional
    
Encoding used to decode the inputfile. Does not apply to input streams. The special value ‘bytes’ enables backward compatibility workarounds that ensures you receive byte arrays as results if possible and passes ‘latin1’ encoded strings to converters. Override this value to receive unicode arrays and pass strings as input to converters. If set to None the system default is used. The default value is ‘bytes’.
Changed in version 2.0: Before NumPy 2, the default was `'bytes'` for Python 2 compatibility. The default is now `None`.
max_rowsint, optional
    
Read `max_rows` rows of content after `skiprows` lines. The default is to read all the rows. Note that empty rows containing no data such as empty lines and comment lines are not counted towards `max_rows`, while such lines are counted in `skiprows`.
Changed in version 1.23.0: Lines containing no data, including comment lines (e.g., lines starting with ‘#’ or as specified via `comments`) are not counted towards `max_rows`.
quotecharunicode character or None, optional
    
The character used to denote the start and end of a quoted item. Occurrences of the delimiter or comment characters are ignored within a quoted item. The default value is `quotechar=None`, which means quoting support is disabled.
If two consecutive instances of `quotechar` are found within a quoted field, the first is treated as an escape character. See examples.
New in version 1.23.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Data read from the text file.
See also
`load`, `fromstring`, `fromregex`
`genfromtxt`
    
Load data with missing values handled as specified.
`scipy.io.loadmat`
    
reads MATLAB data files
#### Notes
This function aims to be a fast reader for simply formatted files. The `genfromtxt` function provides more sophisticated handling of, e.g., lines with missing values.
Each row in the input text file must have the same number of values to be able to read all values. If all rows do not have same number of values, a subset of up to n columns (where n is the least number of values present in all rows) can be read by specifying the columns via `usecols`.
The strings produced by the Python float.hex method can be used as input for floats.
#### Examples
    
    >>> import numpy as np
    >>> from io import StringIO   # StringIO behaves like a file object
    >>> c = StringIO("0 1\n2 3")
    >>> np.loadtxt(c)
    array([[0., 1.],
           [2., 3.]])
    
    
    >>> d = StringIO("M 21 72\nF 35 58")
    >>> np.loadtxt(d, dtype={'names': ('gender', 'age', 'weight'),
    ...                      'formats': ('S1', 'i4', 'f4')})
    array([(b'M', 21, 72.), (b'F', 35, 58.)],
          dtype=[('gender', 'S1'), ('age', '<i4'), ('weight', '<f4')])
    
    
    >>> c = StringIO("1,0,2\n3,0,4")
    >>> x, y = np.loadtxt(c, delimiter=',', usecols=(0, 2), unpack=True)
    >>> x
    array([1., 3.])
    >>> y
    array([2., 4.])
    
The `converters` argument is used to specify functions to preprocess the text prior to parsing. `converters` can be a dictionary that maps preprocessing functions to each column:
    
    >>> s = StringIO("1.618, 2.296\n3.141, 4.669\n")
    >>> conv = {
    ...     0: lambda x: np.floor(float(x)),  # conversion fn for column 0
    ...     1: lambda x: np.ceil(float(x)),  # conversion fn for column 1
    ... }
    >>> np.loadtxt(s, delimiter=",", converters=conv)
    array([[1., 3.],
           [3., 5.]])
    
`converters` can be a callable instead of a dictionary, in which case it is applied to all columns:
    
    >>> s = StringIO("0xDE 0xAD\n0xC0 0xDE")
    >>> import functools
    >>> conv = functools.partial(int, base=16)
    >>> np.loadtxt(s, converters=conv)
    array([[222., 173.],
           [192., 222.]])
    
This example shows how `converters` can be used to convert a field with a trailing minus sign into a negative number.
    
    >>> s = StringIO("10.01 31.25-\n19.22 64.31\n17.57- 63.94")
    >>> def conv(fld):
    ...     return -float(fld[:-1]) if fld.endswith("-") else float(fld)
    ...
    >>> np.loadtxt(s, converters=conv)
    array([[ 10.01, -31.25],
           [ 19.22,  64.31],
           [-17.57,  63.94]])
    
Using a callable as the converter can be particularly useful for handling values with different formatting, e.g. floats with underscores:
    
    >>> s = StringIO("1 2.7 100_000")
    >>> np.loadtxt(s, converters=float)
    array([1.e+00, 2.7e+00, 1.e+05])
    
This idea can be extended to automatically handle values specified in many different formats, such as hex values:
    
    >>> def conv(val):
    ...     try:
    ...         return float(val)
    ...     except ValueError:
    ...         return float.fromhex(val)
    >>> s = StringIO("1, 2.5, 3_000, 0b4, 0x1.4000000000000p+2")
    >>> np.loadtxt(s, delimiter=",", converters=conv)
    array([1.0e+00, 2.5e+00, 3.0e+03, 1.8e+02, 5.0e+00])
    
Or a format where the `-` sign comes after the number:
    
    >>> s = StringIO("10.01 31.25-\n19.22 64.31\n17.57- 63.94")
    >>> conv = lambda x: -float(x[:-1]) if x.endswith("-") else float(x)
    >>> np.loadtxt(s, converters=conv)
    array([[ 10.01, -31.25],
           [ 19.22,  64.31],
           [-17.57,  63.94]])
    
Support for quoted fields is enabled with the `quotechar` parameter. Comment and delimiter characters are ignored when they appear within a quoted item delineated by `quotechar`:
    
    >>> s = StringIO('"alpha, #42", 10.0\n"beta, #64", 2.0\n')
    >>> dtype = np.dtype([("label", "U12"), ("value", float)])
    >>> np.loadtxt(s, dtype=dtype, delimiter=",", quotechar='"')
    array([('alpha, #42', 10.), ('beta, #64',  2.)],
          dtype=[('label', '<U12'), ('value', '<f8')])
    
Quoted fields can be separated by multiple whitespace characters:
    
    >>> s = StringIO('"alpha, #42"       10.0\n"beta, #64" 2.0\n')
    >>> dtype = np.dtype([("label", "U12"), ("value", float)])
    >>> np.loadtxt(s, dtype=dtype, delimiter=None, quotechar='"')
    array([('alpha, #42', 10.), ('beta, #64',  2.)],
          dtype=[('label', '<U12'), ('value', '<f8')])
    
Two consecutive quote characters within a quoted field are treated as a single escaped character:
    
    >>> s = StringIO('"Hello, my name is ""Monty""!"')
    >>> np.loadtxt(s, dtype="U", delimiter=",", quotechar='"')
    array('Hello, my name is "Monty"!', dtype='<U26')
    
Read subset of columns when all rows do not contain equal number of values:
    
    >>> d = StringIO("1 2\n2 4\n3 9 12\n4 16 20")
    >>> np.loadtxt(d, usecols=(0, 1))
    array([[ 1.,  2.],
           [ 2.,  4.],
           [ 3.,  9.],
           [ 4., 16.]])
    
# numpy.log
numpy.log(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'log'>
    
Natural logarithm, element-wise.
The natural logarithm `log` is the inverse of the exponential function, so that `log(exp(x)) = x`. The natural logarithm is logarithm in base `e`.
Parameters:
    
xarray_like
    
Input value.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The natural logarithm of `x`, element-wise. This is a scalar if `x` is a scalar.
See also
`log10`, `log2`, `log1p`, `emath.log`
#### Notes
Logarithm is a multivalued function: for each `x` there is an infinite number of `z` such that `exp(z) = x`. The convention is to return the `z` whose imaginary part lies in `(-pi, pi]`.
For real-valued input data types, `log` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `log` is a complex analytical function that has a branch cut `[-inf, 0]` and is continuous from above on it. `log` handles the floating-point negative zero as an infinitesimal negative number, conforming to the C99 standard.
In the cases where the input has a negative real part and a very small negative complex part (approaching 0), the result is so close to `-pi` that it evaluates to exactly `-pi`.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 67. https://personal.math.ubc.ca/~cbm/aands/page_67.htm
[2]
Wikipedia, “Logarithm”. https://en.wikipedia.org/wiki/Logarithm
#### Examples
    
    >>> import numpy as np
    >>> np.log([1, np.e, np.e**2, 0])
    array([  0.,   1.,   2., -inf])
    
# numpy.log10
numpy.log10(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'log10'>
    
Return the base 10 logarithm of the input array, element-wise.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The logarithm to the base 10 of `x`, element-wise. NaNs are returned where x is negative. This is a scalar if `x` is a scalar.
See also
`emath.log10`
#### Notes
Logarithm is a multivalued function: for each `x` there is an infinite number of `z` such that `10**z = x`. The convention is to return the `z` whose imaginary part lies in `(-pi, pi]`.
For real-valued input data types, `log10` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `log10` is a complex analytical function that has a branch cut `[-inf, 0]` and is continuous from above on it. `log10` handles the floating-point negative zero as an infinitesimal negative number, conforming to the C99 standard.
In the cases where the input has a negative real part and a very small negative complex part (approaching 0), the result is so close to `-pi` that it evaluates to exactly `-pi`.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 67. https://personal.math.ubc.ca/~cbm/aands/page_67.htm
[2]
Wikipedia, “Logarithm”. https://en.wikipedia.org/wiki/Logarithm
#### Examples
    
    >>> import numpy as np
    >>> np.log10([1e-15, -3.])
    array([-15.,  nan])
    
# numpy.log1p
numpy.log1p(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'log1p'>
    
Return the natural logarithm of one plus the input array, element-wise.
Calculates `log(1 + x)`.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Natural logarithm of `1 + x`, element-wise. This is a scalar if `x` is a scalar.
See also
`expm1`
    
`exp(x) - 1`, the inverse of `log1p`.
#### Notes
For real-valued input, `log1p` is accurate also for `x` so small that `1 + x == 1` in floating-point accuracy.
Logarithm is a multivalued function: for each `x` there is an infinite number of `z` such that `exp(z) = 1 + x`. The convention is to return the `z` whose imaginary part lies in `[-pi, pi]`.
For real-valued input data types, `log1p` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `log1p` is a complex analytical function that has a branch cut `[-inf, -1]` and is continuous from above on it. `log1p` handles the floating-point negative zero as an infinitesimal negative number, conforming to the C99 standard.
#### References
[1]
M. Abramowitz and I.A. Stegun, “Handbook of Mathematical Functions”, 10th printing, 1964, pp. 67. https://personal.math.ubc.ca/~cbm/aands/page_67.htm
[2]
Wikipedia, “Logarithm”. https://en.wikipedia.org/wiki/Logarithm
#### Examples
    
    >>> import numpy as np
    >>> np.log1p(1e-99)
    1e-99
    >>> np.log(1 + 1e-99)
    0.0
    
# numpy.log2
numpy.log2(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'log2'>
    
Base-2 logarithm of `x`.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Base-2 logarithm of `x`. This is a scalar if `x` is a scalar.
See also
`log`, `log10`, `log1p`, `emath.log2`
#### Notes
Logarithm is a multivalued function: for each `x` there is an infinite number of `z` such that `2**z = x`. The convention is to return the `z` whose imaginary part lies in `(-pi, pi]`.
For real-valued input data types, `log2` always returns real output. For each value that cannot be expressed as a real number or infinity, it yields `nan` and sets the `invalid` floating point error flag.
For complex-valued input, `log2` is a complex analytical function that has a branch cut `[-inf, 0]` and is continuous from above on it. `log2` handles the floating-point negative zero as an infinitesimal negative number, conforming to the C99 standard.
In the cases where the input has a negative real part and a very small negative complex part (approaching 0), the result is so close to `-pi` that it evaluates to exactly `-pi`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([0, 1, 2, 2**4])
    >>> np.log2(x)
    array([-inf,   0.,   1.,   4.])
    
    
    >>> xi = np.array([0+1.j, 1, 2+0.j, 4.j])
    >>> np.log2(xi)
    array([ 0.+2.26618007j,  0.+0.j        ,  1.+0.j        ,  2.+2.26618007j])
    
# numpy.logaddexp
numpy.logaddexp(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'logaddexp'>
    
Logarithm of the sum of exponentiations of the inputs.
Calculates `log(exp(x1) + exp(x2))`. This function is useful in statistics where the calculated probabilities of events may be so small as to exceed the range of normal floating point numbers. In such cases the logarithm of the calculated probability is stored. This function allows adding probabilities stored in such a fashion.
Parameters:
    
x1, x2array_like
    
Input values. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
resultndarray
    
Logarithm of `exp(x1) + exp(x2)`. This is a scalar if both `x1` and `x2` are scalars.
See also
`logaddexp2`
    
Logarithm of the sum of exponentiations of inputs in base 2.
#### Examples
    
    >>> import numpy as np
    >>> prob1 = np.log(1e-50)
    >>> prob2 = np.log(2.5e-50)
    >>> prob12 = np.logaddexp(prob1, prob2)
    >>> prob12
    -113.87649168120691
    >>> np.exp(prob12)
    3.5000000000000057e-50
    
# numpy.logaddexp2
numpy.logaddexp2(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'logaddexp2'>
    
Logarithm of the sum of exponentiations of the inputs in base-2.
Calculates `log2(2**x1 + 2**x2)`. This function is useful in machine learning when the calculated probabilities of events may be so small as to exceed the range of normal floating point numbers. In such cases the base-2 logarithm of the calculated probability can be used instead. This function allows adding probabilities stored in such a fashion.
Parameters:
    
x1, x2array_like
    
Input values. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
resultndarray
    
Base-2 logarithm of `2**x1 + 2**x2`. This is a scalar if both `x1` and `x2` are scalars.
See also
`logaddexp`
    
Logarithm of the sum of exponentiations of the inputs.
#### Examples
    
    >>> import numpy as np
    >>> prob1 = np.log2(1e-50)
    >>> prob2 = np.log2(2.5e-50)
    >>> prob12 = np.logaddexp2(prob1, prob2)
    >>> prob1, prob2, prob12
    (-166.09640474436813, -164.77447664948076, -164.28904982231052)
    >>> 2**prob12
    3.4999999999999914e-50
    
# numpy.logical_and
numpy.logical_and(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'logical_and'>
    
Compute the truth value of x1 AND x2 element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or bool
    
Boolean result of the logical AND operation applied to the elements of `x1` and `x2`; the shape is determined by broadcasting. This is a scalar if both `x1` and `x2` are scalars.
See also
`logical_or`, `logical_not`, `logical_xor`
`bitwise_and`
#### Examples
    
    >>> import numpy as np
    >>> np.logical_and(True, False)
    False
    >>> np.logical_and([True, False], [False, False])
    array([False, False])
    
    
    >>> x = np.arange(5)
    >>> np.logical_and(x>1, x<4)
    array([False, False,  True,  True, False])
    
The `&` operator can be used as a shorthand for `np.logical_and` on boolean ndarrays.
    
    >>> a = np.array([True, False])
    >>> b = np.array([False, False])
    >>> a & b
    array([False, False])
    
# numpy.logical_not
numpy.logical_not(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'logical_not'>
    
Compute the truth value of NOT x element-wise.
Parameters:
    
xarray_like
    
Logical NOT is applied to the elements of `x`.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
ybool or ndarray of bool
    
Boolean result with the same shape as `x` of the NOT operation on elements of `x`. This is a scalar if `x` is a scalar.
See also
`logical_and`, `logical_or`, `logical_xor`
#### Examples
    
    >>> import numpy as np
    >>> np.logical_not(3)
    False
    >>> np.logical_not([True, False, 0, 1])
    array([False,  True,  True, False])
    
    
    >>> x = np.arange(5)
    >>> np.logical_not(x<3)
    array([False, False, False,  True,  True])
    
# numpy.logical_or
numpy.logical_or(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'logical_or'>
    
Compute the truth value of x1 OR x2 element-wise.
Parameters:
    
x1, x2array_like
    
Logical OR is applied to the elements of `x1` and `x2`. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or bool
    
Boolean result of the logical OR operation applied to the elements of `x1` and `x2`; the shape is determined by broadcasting. This is a scalar if both `x1` and `x2` are scalars.
See also
`logical_and`, `logical_not`, `logical_xor`
`bitwise_or`
#### Examples
    
    >>> import numpy as np
    >>> np.logical_or(True, False)
    True
    >>> np.logical_or([True, False], [False, False])
    array([ True, False])
    
    
    >>> x = np.arange(5)
    >>> np.logical_or(x < 1, x > 3)
    array([ True, False, False, False,  True])
    
The `|` operator can be used as a shorthand for `np.logical_or` on boolean ndarrays.
    
    >>> a = np.array([True, False])
    >>> b = np.array([False, False])
    >>> a | b
    array([ True, False])
    
# numpy.logical_xor
numpy.logical_xor(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'logical_xor'>
    
Compute the truth value of x1 XOR x2, element-wise.
Parameters:
    
x1, x2array_like
    
Logical XOR is applied to the elements of `x1` and `x2`. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
ybool or ndarray of bool
    
Boolean result of the logical XOR operation applied to the elements of `x1` and `x2`; the shape is determined by broadcasting. This is a scalar if both `x1` and `x2` are scalars.
See also
`logical_and`, `logical_or`, `logical_not`, `bitwise_xor`
#### Examples
    
    >>> import numpy as np
    >>> np.logical_xor(True, False)
    True
    >>> np.logical_xor([True, True, False, False], [True, False, True, False])
    array([False,  True,  True, False])
    
    
    >>> x = np.arange(5)
    >>> np.logical_xor(x < 1, x > 3)
    array([ True, False, False, False,  True])
    
Simple example showing support of broadcasting
    
    >>> np.logical_xor(0, np.eye(2))
    array([[ True, False],
           [False,  True]])
    
# numpy.logspace
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)[source]
    
Return numbers spaced evenly on a log scale.
In linear space, the sequence starts at `base ** start` (`base` to the power of `start`) and ends with `base ** stop` (see `endpoint` below).
Changed in version 1.25.0: Non-scalar ‘base` is now supported
Parameters:
    
startarray_like
    
`base ** start` is the starting value of the sequence.
stoparray_like
    
`base ** stop` is the final value of the sequence, unless `endpoint` is False. In that case, `num + 1` values are spaced over the interval in log-space, of which all but the last (a sequence of length `num`) are returned.
numinteger, optional
    
Number of samples to generate. Default is 50.
endpointboolean, optional
    
If true, `stop` is the last sample. Otherwise, it is not included. Default is True.
basearray_like, optional
    
The base of the log space. The step size between the elements in `ln(samples) / ln(base)` (or `log_base(samples)`) is uniform. Default is 10.0.
dtypedtype
    
The type of the output array. If `dtype` is not given, the data type is inferred from `start` and `stop`. The inferred type will never be an integer; `float` is chosen even if the arguments would produce an array of integers.
axisint, optional
    
The axis in the result to store the samples. Relevant only if start, stop, or base are array-like. By default (0), the samples will be along a new axis inserted at the beginning. Use -1 to get an axis at the end.
Returns:
    
samplesndarray
    
`num` samples, equally spaced on a log scale.
See also
`arange`
    
Similar to linspace, with the step size specified instead of the number of samples. Note that, when used with a float endpoint, the endpoint may or may not be included.
`linspace`
    
Similar to logspace, but with the samples uniformly distributed in linear space, instead of log space.
`geomspace`
    
Similar to logspace, but with endpoints specified directly.
How to create arrays with regularly-spaced values
#### Notes
If base is a scalar, logspace is equivalent to the code
    
    >>> y = np.linspace(start, stop, num=num, endpoint=endpoint)
    ... 
    >>> power(base, y).astype(dtype)
    ... 
    
#### Examples
    
    >>> import numpy as np
    >>> np.logspace(2.0, 3.0, num=4)
    array([ 100.        ,  215.443469  ,  464.15888336, 1000.        ])
    >>> np.logspace(2.0, 3.0, num=4, endpoint=False)
    array([100.        ,  177.827941  ,  316.22776602,  562.34132519])
    >>> np.logspace(2.0, 3.0, num=4, base=2.0)
    array([4.        ,  5.0396842 ,  6.34960421,  8.        ])
    >>> np.logspace(2.0, 3.0, num=4, base=[2.0, 3.0], axis=-1)
    array([[ 4.        ,  5.0396842 ,  6.34960421,  8.        ],
           [ 9.        , 12.98024613, 18.72075441, 27.        ]])
    
Graphical illustration:
    
    >>> import matplotlib.pyplot as plt
    >>> N = 10
    >>> x1 = np.logspace(0.1, 1, N, endpoint=True)
    >>> x2 = np.logspace(0.1, 1, N, endpoint=False)
    >>> y = np.zeros(N)
    >>> plt.plot(x1, y, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.plot(x2, y + 0.5, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.ylim([-0.5, 1])
    (-0.5, 1)
    >>> plt.show()
    
# numpy.ma.all
ma.all(self, axis=None, out=None, keepdims=<no value>)=<numpy.ma.core._frommethod object>
    
Returns True if all elements evaluate to True.
The output array is masked where all the values along the given axis are masked: if the output would have been a scalar and that all the values are masked, then the output is `masked`.
Refer to `numpy.all` for full documentation.
See also
`numpy.ndarray.all`
    
corresponding function for ndarrays
`numpy.all`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> np.ma.array([1,2,3]).all()
    True
    >>> a = np.ma.array([1,2,3], mask=True)
    >>> (a.all() is np.ma.masked)
    True
    
# numpy.ma.allclose
ma.allclose(a, b, masked_equal=True, rtol=1e-05, atol=1e-08)[source]
    
Returns True if two arrays are element-wise equal within a tolerance.
This function is equivalent to `allclose` except that masked values are treated as equal (default) or unequal, depending on the `masked_equal` argument.
Parameters:
    
a, barray_like
    
Input arrays to compare.
masked_equalbool, optional
    
Whether masked values in `a` and `b` are considered equal (True) or not (False). They are considered equal by default.
rtolfloat, optional
    
Relative tolerance. The relative difference is equal to `rtol * b`. Default is 1e-5.
atolfloat, optional
    
Absolute tolerance. The absolute difference is equal to `atol`. Default is 1e-8.
Returns:
    
ybool
    
Returns True if the two arrays are equal within the given tolerance, False otherwise. If either array contains NaN, then False is returned.
See also
`all`, `any`
`numpy.allclose`
    
the non-masked `allclose`.
#### Notes
If the following equation is element-wise True, then `allclose` returns True:
    
    absolute(`a` - `b`) <= (`atol` + `rtol` * absolute(`b`))
    
Return True if all elements of `a` and `b` are equal subject to given tolerances.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1e10, 1e-7, 42.0], mask=[0, 0, 1])
    >>> a
    masked_array(data=[10000000000.0, 1e-07, --],
                 mask=[False, False,  True],
           fill_value=1e+20)
    >>> b = np.ma.array([1e10, 1e-8, -42.0], mask=[0, 0, 1])
    >>> np.ma.allclose(a, b)
    False
    
    
    >>> a = np.ma.array([1e10, 1e-8, 42.0], mask=[0, 0, 1])
    >>> b = np.ma.array([1.00001e10, 1e-9, -42.0], mask=[0, 0, 1])
    >>> np.ma.allclose(a, b)
    True
    >>> np.ma.allclose(a, b, masked_equal=False)
    False
    
Masked values are not compared directly.
    
    >>> a = np.ma.array([1e10, 1e-8, 42.0], mask=[0, 0, 1])
    >>> b = np.ma.array([1.00001e10, 1e-9, 42.0], mask=[0, 0, 1])
    >>> np.ma.allclose(a, b)
    True
    >>> np.ma.allclose(a, b, masked_equal=False)
    False
    
# numpy.ma.allequal
ma.allequal(a, b, fill_value=True)[source]
    
Return True if all entries of a and b are equal, using fill_value as a truth value where either or both are masked.
Parameters:
    
a, barray_like
    
Input arrays to compare.
fill_valuebool, optional
    
Whether masked values in a or b are considered equal (True) or not (False).
Returns:
    
ybool
    
Returns True if the two arrays are equal within the given tolerance, False otherwise. If either array contains NaN, then False is returned.
See also
`all`, `any`
`numpy.ma.allclose`
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1e10, 1e-7, 42.0], mask=[0, 0, 1])
    >>> a
    masked_array(data=[10000000000.0, 1e-07, --],
                 mask=[False, False,  True],
           fill_value=1e+20)
    
    
    >>> b = np.array([1e10, 1e-7, -42.0])
    >>> b
    array([  1.00000000e+10,   1.00000000e-07,  -4.20000000e+01])
    >>> np.ma.allequal(a, b, fill_value=False)
    False
    >>> np.ma.allequal(a, b)
    True
    
# numpy.ma.amax
ma.amax(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the maximum of an array or maximum along an axis.
`amax` is an alias of `max`.
See also
`max`
    
alias of this function
`ndarray.max`
    
equivalent method
# numpy.ma.amin
ma.amin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the minimum of an array or minimum along an axis.
`amin` is an alias of `min`.
See also
`min`
    
alias of this function
`ndarray.min`
    
equivalent method
# numpy.ma.anom
ma.anom(self, axis=None, dtype=None)=<numpy.ma.core._frommethod object>
    
Compute the anomalies (deviations from the arithmetic mean) along the given axis.
Returns an array of anomalies, with the same shape as the input and where the arithmetic mean is computed along the given axis.
Parameters:
    
axisint, optional
    
Axis over which the anomalies are taken. The default is to use the mean of the flattened array as reference.
dtypedtype, optional
    
Type to use in computing the variance. For arrays of integer type
    
the default is float32; for arrays of float types it is the same as the array type.
See also
`mean`
    
Compute the mean of the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1,2,3])
    >>> a.anom()
    masked_array(data=[-1.,  0.,  1.],
                 mask=False,
           fill_value=1e+20)
    
# numpy.ma.anomalies
ma.anomalies(self, axis=None, dtype=None)=<numpy.ma.core._frommethod object>
    
Compute the anomalies (deviations from the arithmetic mean) along the given axis.
Returns an array of anomalies, with the same shape as the input and where the arithmetic mean is computed along the given axis.
Parameters:
    
axisint, optional
    
Axis over which the anomalies are taken. The default is to use the mean of the flattened array as reference.
dtypedtype, optional
    
Type to use in computing the variance. For arrays of integer type
    
the default is float32; for arrays of float types it is the same as the array type.
See also
`mean`
    
Compute the mean of the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1,2,3])
    >>> a.anom()
    masked_array(data=[-1.,  0.,  1.],
                 mask=False,
           fill_value=1e+20)
    
# numpy.ma.any
ma.any(self, axis=None, out=None, keepdims=<no value>)=<numpy.ma.core._frommethod object>
    
Returns True if any of the elements of `a` evaluate to True.
Masked values are considered as False during computation.
Refer to `numpy.any` for full documentation.
See also
`numpy.ndarray.any`
    
corresponding function for ndarrays
`numpy.any`
    
equivalent function
# numpy.ma.append
ma.append(a, b, axis=None)[source]
    
Append values to the end of an array.
Parameters:
    
aarray_like
    
Values are appended to a copy of this array.
barray_like
    
These values are appended to a copy of `a`. It must be of the correct shape (the same shape as `a`, excluding `axis`). If `axis` is not specified, `b` can be any shape and will be flattened before use.
axisint, optional
    
The axis along which `v` are appended. If `axis` is not given, both `a` and `b` are flattened before use.
Returns:
    
appendMaskedArray
    
A copy of `a` with `b` appended to `axis`. Note that `append` does not occur in-place: a new array is allocated and filled. If `axis` is None, the result is a flattened array.
See also
`numpy.append`
    
Equivalent function in the top-level NumPy module.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = ma.masked_values([1, 2, 3], 2)
    >>> b = ma.masked_values([[4, 5, 6], [7, 8, 9]], 7)
    >>> ma.append(a, b)
    masked_array(data=[1, --, 3, 4, 5, 6, --, 8, 9],
                 mask=[False,  True, False, False, False, False,  True, False,
                       False],
           fill_value=999999)
    
# numpy.ma.apply_along_axis
ma.apply_along_axis(func1d, axis, arr, *args, **kwargs)[source]
    
Apply a function to 1-D slices along the given axis.
Execute `func1d(a, *args, **kwargs)` where `func1d` operates on 1-D arrays and `a` is a 1-D slice of `arr` along `axis`.
This is equivalent to (but faster than) the following use of `ndindex` and `s_`, which sets each of `ii`, `jj`, and `kk` to a tuple of indices:
    
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            f = func1d(arr[ii + s_[:,] + kk])
            Nj = f.shape
            for jj in ndindex(Nj):
                out[ii + jj + kk] = f[jj]
    
Equivalently, eliminating the inner loop, this can be expressed as:
    
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            out[ii + s_[...,] + kk] = func1d(arr[ii + s_[:,] + kk])
    
Parameters:
    
func1dfunction (M,) -> (Nj…)
    
This function should accept 1-D arrays. It is applied to 1-D slices of `arr` along the specified axis.
axisinteger
    
Axis along which `arr` is sliced.
arrndarray (Ni…, M, Nk…)
    
Input array.
argsany
    
Additional arguments to `func1d`.
kwargsany
    
Additional named arguments to `func1d`.
Returns:
    
outndarray (Ni…, Nj…, Nk…)
    
The output array. The shape of `out` is identical to the shape of `arr`, except along the `axis` dimension. This axis is removed, and replaced with new dimensions equal to the shape of the return value of `func1d`. So if `func1d` returns a scalar `out` will have one fewer dimensions than `arr`.
See also
`apply_over_axes`
    
Apply a function repeatedly over multiple axes.
#### Examples
    
    >>> import numpy as np
    >>> def my_func(a):
    ...     """Average first and last element of a 1-D array"""
    ...     return (a[0] + a[-1]) * 0.5
    >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
    >>> np.apply_along_axis(my_func, 0, b)
    array([4., 5., 6.])
    >>> np.apply_along_axis(my_func, 1, b)
    array([2.,  5.,  8.])
    
For a function that returns a 1D array, the number of dimensions in `outarr` is the same as `arr`.
    
    >>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])
    >>> np.apply_along_axis(sorted, 1, b)
    array([[1, 7, 8],
           [3, 4, 9],
           [2, 5, 6]])
    
For a function that returns a higher dimensional array, those dimensions are inserted in place of the `axis` dimension.
    
    >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
    >>> np.apply_along_axis(np.diag, -1, b)
    array([[[1, 0, 0],
            [0, 2, 0],
            [0, 0, 3]],
           [[4, 0, 0],
            [0, 5, 0],
            [0, 0, 6]],
           [[7, 0, 0],
            [0, 8, 0],
            [0, 0, 9]]])
    
# numpy.ma.apply_over_axes
ma.apply_over_axes(func, a, axes)[source]
    
Apply a function repeatedly over multiple axes.
`func` is called as `res = func(a, axis)`, where `axis` is the first element of `axes`. The result `res` of the function call must have either the same dimensions as `a` or one less dimension. If `res` has one less dimension than `a`, a dimension is inserted before `axis`. The call to `func` is then repeated for each axis in `axes`, with `res` as the first argument.
Parameters:
    
funcfunction
    
This function must take two arguments, `func(a, axis)`.
aarray_like
    
Input array.
axesarray_like
    
Axes over which `func` is applied; the elements must be integers.
Returns:
    
apply_over_axisndarray
    
The output array. The number of dimensions is the same as `a`, but the shape can be different. This depends on whether `func` changes the shape of its output with respect to its input.
See also
`apply_along_axis`
    
Apply a function to 1-D slices of an array along the given axis.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.arange(24).reshape(2,3,4)
    >>> a[:,0,1] = np.ma.masked
    >>> a[:,1,:] = np.ma.masked
    >>> a
    masked_array(
      data=[[[0, --, 2, 3],
             [--, --, --, --],
             [8, 9, 10, 11]],
            [[12, --, 14, 15],
             [--, --, --, --],
             [20, 21, 22, 23]]],
      mask=[[[False,  True, False, False],
             [ True,  True,  True,  True],
             [False, False, False, False]],
            [[False,  True, False, False],
             [ True,  True,  True,  True],
             [False, False, False, False]]],
      fill_value=999999)
    >>> np.ma.apply_over_axes(np.ma.sum, a, [0,2])
    masked_array(
      data=[[[46],
             [--],
             [124]]],
      mask=[[[False],
             [ True],
             [False]]],
      fill_value=999999)
    
Tuple axis arguments to ufuncs are equivalent:
    
    >>> np.ma.sum(a, axis=(0,2)).reshape((1,-1,1))
    masked_array(
      data=[[[46],
             [--],
             [124]]],
      mask=[[[False],
             [ True],
             [False]]],
      fill_value=999999)
    
# numpy.ma.arange
ma.arange([start, ]stop, [step, ]dtype=None, *, device=None, like=None)=<numpy.ma.core._convert2ma object>
    
Return evenly spaced values within a given interval.
`arange` can be called with a varying number of positional arguments:
  * `arange(stop)`: Values are generated within the half-open interval `[0, stop)` (in other words, the interval including `start` but excluding `stop`).
  * `arange(start, stop)`: Values are generated within the half-open interval `[start, stop)`.
  * `arange(start, stop, step)` Values are generated within the half-open interval `[start, stop)`, with spacing between values given by `step`.


For integer arguments the function is roughly equivalent to the Python built-in `range`, but returns an ndarray rather than a `range` instance.
When using a non-integer step, such as 0.1, it is often better to use `numpy.linspace`.
See the Warning sections below for more information.
Parameters:
    
startinteger or real, optional
    
Start of interval. The interval includes this value. The default start value is 0.
stopinteger or real
    
End of interval. The interval does not include this value, except in some cases where `step` is not an integer and floating point round-off affects the length of `out`.
stepinteger or real, optional
    
Spacing between values. For any output `out`, this is the distance between two adjacent values, `out[i+1] - out[i]`. The default step size is 1. If `step` is specified as a position argument, `start` must also be given.
dtypedtype, optional
    
The type of the output array. If `dtype` is not given, infer the data type from the other input arguments.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
arangeMaskedArray
    
Array of evenly spaced values.
For floating point arguments, the length of the result is `ceil((stop - start)/step)`. Because of floating point overflow, this rule may result in the last element of `out` being greater than `stop`.
Warning
The length of the output might not be numerically stable.
Another stability issue is due to the internal implementation of `numpy.arange`. The actual step value used to populate the array is `dtype(start + step) - dtype(start)` and not `step`. Precision loss can occur here, due to casting or due to using floating points when `start` is much larger than `step`. This can lead to unexpected behaviour. For example:
    
    >>> np.arange(0, 5, 0.5, dtype=int)
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    >>> np.arange(-3, 3, 0.5, dtype=int)
    array([-3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8])
    
In such cases, the use of `numpy.linspace` should be preferred.
The built-in `range` generates Python built-in integers that have arbitrary size, while `numpy.arange` produces `numpy.int32` or `numpy.int64` numbers. This may result in incorrect results for large integer values:
    
    >>> power = 40
    >>> modulo = 10000
    >>> x1 = [(n ** power) % modulo for n in range(8)]
    >>> x2 = [(n ** power) % modulo for n in np.arange(8)]
    >>> print(x1)
    [0, 1, 7776, 8801, 6176, 625, 6576, 4001]  # correct
    >>> print(x2)
    [0, 1, 7776, 7185, 0, 5969, 4816, 3361]  # incorrect
    
See also
`numpy.linspace`
    
Evenly spaced numbers with careful handling of endpoints.
`numpy.ogrid`
    
Arrays of evenly spaced numbers in N-dimensions.
`numpy.mgrid`
    
Grid-shaped arrays of evenly spaced numbers in N-dimensions.
How to create arrays with regularly-spaced values
#### Examples
    
    >>> import numpy as np
    >>> np.arange(3)
    array([0, 1, 2])
    >>> np.arange(3.0)
    array([ 0.,  1.,  2.])
    >>> np.arange(3,7)
    array([3, 4, 5, 6])
    >>> np.arange(3,7,2)
    array([3, 5])
    
# numpy.ma.argmax
ma.argmax(self, axis=None, fill_value=None, out=None)=<numpy.ma.core._frommethod object>
    
Returns array of indices of the maximum values along the given axis. Masked values are treated as if they had the value fill_value.
Parameters:
    
axis{None, integer}
    
If None, the index is into the flattened array, otherwise along the specified axis
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, the output of maximum_fill_value(self._data) is used instead.
out{None, array}, optional
    
Array into which the result can be placed. Its type is preserved and it must be of the right shape to hold the output.
Returns:
    
index_array{integer_array}
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(6).reshape(2,3)
    >>> a.argmax()
    5
    >>> a.argmax(0)
    array([1, 1, 1])
    >>> a.argmax(1)
    array([2, 2])
    
# numpy.ma.argmin
ma.argmin(self, axis=None, fill_value=None, out=None)=<numpy.ma.core._frommethod object>
    
Return array of indices to the minimum values along the given axis.
Parameters:
    
axis{None, integer}
    
If None, the index is into the flattened array, otherwise along the specified axis
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, the output of minimum_fill_value(self._data) is used instead.
out{None, array}, optional
    
Array into which the result can be placed. Its type is preserved and it must be of the right shape to hold the output.
Returns:
    
ndarray or scalar
    
If multi-dimension input, returns a new ndarray of indices to the minimum values along the given axis. Otherwise, returns a scalar of index to the minimum values along the given axis.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(4), mask=[1,1,0,0])
    >>> x.shape = (2,2)
    >>> x
    masked_array(
      data=[[--, --],
            [2, 3]],
      mask=[[ True,  True],
            [False, False]],
      fill_value=999999)
    >>> x.argmin(axis=0, fill_value=-1)
    array([0, 0])
    >>> x.argmin(axis=0, fill_value=9)
    array([1, 1])
    
# numpy.ma.argsort
ma.argsort(a, axis=<no value>, kind=None, order=None, endwith=True, fill_value=None, *, stable=None)[source]
    
Return an ndarray of indices that sort the array along the specified axis. Masked values are filled beforehand to `fill_value`.
Parameters:
    
axisint, optional
    
Axis along which to sort. If None, the default, the flattened array is used.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
The sorting algorithm used.
orderlist, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. Not all fields need be specified.
endwith{True, False}, optional
    
Whether missing values (if any) should be treated as the largest values (True) or the smallest values (False) When the array contains unmasked values at the same extremes of the datatype, the ordering of these values and the masked values is undefined.
fill_valuescalar or None, optional
    
Value used internally for the masked values. If `fill_value` is not None, it supersedes `endwith`.
stablebool, optional
    
Only for compatibility with `np.argsort`. Ignored.
Returns:
    
index_arrayndarray, int
    
Array of indices that sort `a` along the specified axis. In other words, `a[index_array]` yields a sorted `a`.
See also
`ma.MaskedArray.sort`
    
Describes sorting algorithms used.
`lexsort`
    
Indirect stable sort with multiple keys.
`numpy.ndarray.sort`
    
Inplace sort.
#### Notes
See `sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([3,2,1], mask=[False, False, True])
    >>> a
    masked_array(data=[3, 2, --],
                 mask=[False, False,  True],
           fill_value=999999)
    >>> a.argsort()
    array([1, 0, 2])
    
# numpy.ma.around
ma.around=<numpy.ma.core._MaskedUnaryOperation object>
    
Round an array to the given number of decimals.
`around` is an alias of `round`.
See also
`ndarray.round`
    
equivalent method
`round`
    
alias for this function
`ceil`, `fix`, `floor`, `rint`, `trunc`
# numpy.ma.array
ma.array(data, dtype=None, copy=False, order=None, mask=np.False_, fill_value=None, keep_mask=True, hard_mask=False, shrink=True, subok=True, ndmin=0)[source]
    
An array class with possibly masked values.
Masked values of True exclude the corresponding element from any computation.
Construction:
    
    x = MaskedArray(data, mask=nomask, dtype=None, copy=False, subok=True,
                    ndmin=0, fill_value=None, keep_mask=True, hard_mask=None,
                    shrink=True, order=None)
    
Parameters:
    
dataarray_like
    
Input data.
masksequence, optional
    
Mask. Must be convertible to an array of booleans with the same shape as `data`. True indicates a masked (i.e. invalid) data.
dtypedtype, optional
    
Data type of the output. If `dtype` is None, the type of the data argument (`data.dtype`) is used. If `dtype` is not None and different from `data.dtype`, a copy is performed.
copybool, optional
    
Whether to copy the input data (True), or to use a reference instead. Default is False.
subokbool, optional
    
Whether to return a subclass of `MaskedArray` if possible (True) or a plain `MaskedArray`. Default is True.
ndminint, optional
    
Minimum number of dimensions. Default is 0.
fill_valuescalar, optional
    
Value used to fill in the masked values when necessary. If None, a default based on the data-type is used.
keep_maskbool, optional
    
Whether to combine `mask` with the mask of the input data, if any (True), or to use only `mask` for the output (False). Default is True.
hard_maskbool, optional
    
Whether to use a hard mask or not. With a hard mask, masked values cannot be unmasked. Default is False.
shrinkbool, optional
    
Whether to force compression of an empty mask. Default is True.
order{‘C’, ‘F’, ‘A’}, optional
    
Specify the order of the array. If order is ‘C’, then the array will be in C-contiguous order (last-index varies the fastest). If order is ‘F’, then the returned array will be in Fortran-contiguous order (first-index varies the fastest). If order is ‘A’ (default), then the returned array may be in any order (either C-, Fortran-contiguous, or even discontiguous), unless a copy is required, in which case it will be C-contiguous.
#### Examples
    
    >>> import numpy as np
    
The `mask` can be initialized with an array of boolean values with the same shape as `data`.
    
    >>> data = np.arange(6).reshape((2, 3))
    >>> np.ma.MaskedArray(data, mask=[[False, True, False],
    ...                               [False, False, True]])
    masked_array(
      data=[[0, --, 2],
            [3, 4, --]],
      mask=[[False,  True, False],
            [False, False,  True]],
      fill_value=999999)
    
Alternatively, the `mask` can be initialized to homogeneous boolean array with the same shape as `data` by passing in a scalar boolean value:
    
    >>> np.ma.MaskedArray(data, mask=False)
    masked_array(
      data=[[0, 1, 2],
            [3, 4, 5]],
      mask=[[False, False, False],
            [False, False, False]],
      fill_value=999999)
    
    
    >>> np.ma.MaskedArray(data, mask=True)
    masked_array(
      data=[[--, --, --],
            [--, --, --]],
      mask=[[ True,  True,  True],
            [ True,  True,  True]],
      fill_value=999999,
      dtype=int64)
    
Note
The recommended practice for initializing `mask` with a scalar boolean value is to use `True`/`False` rather than `np.True_`/`np.False_`. The reason is `nomask` is represented internally as `np.False_`.
    
    >>> np.False_ is np.ma.nomask
    True
    
# numpy.ma.asanyarray
ma.asanyarray(a, dtype=None)[source]
    
Convert the input to a masked array, conserving subclasses.
If `a` is a subclass of `MaskedArray`, its class is conserved. No copy is performed if the input is already an `ndarray`.
Parameters:
    
aarray_like
    
Input data, in any form that can be converted to an array.
dtypedtype, optional
    
By default, the data-type is inferred from the input data.
order{‘C’, ‘F’}, optional
    
Whether to use row-major (‘C’) or column-major (‘FORTRAN’) memory representation. Default is ‘C’.
Returns:
    
outMaskedArray
    
MaskedArray interpretation of `a`.
See also
`asarray`
    
Similar to `asanyarray`, but does not conserve subclass.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(10.).reshape(2, 5)
    >>> x
    array([[0., 1., 2., 3., 4.],
           [5., 6., 7., 8., 9.]])
    >>> np.ma.asanyarray(x)
    masked_array(
      data=[[0., 1., 2., 3., 4.],
            [5., 6., 7., 8., 9.]],
      mask=False,
      fill_value=1e+20)
    >>> type(np.ma.asanyarray(x))
    <class 'numpy.ma.MaskedArray'>
    
# numpy.ma.asarray
ma.asarray(a, dtype=None, order=None)[source]
    
Convert the input to a masked array of the given data-type.
No copy is performed if the input is already an `ndarray`. If `a` is a subclass of `MaskedArray`, a base class `MaskedArray` is returned.
Parameters:
    
aarray_like
    
Input data, in any form that can be converted to a masked array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists, ndarrays and masked arrays.
dtypedtype, optional
    
By default, the data-type is inferred from the input data.
order{‘C’, ‘F’}, optional
    
Whether to use row-major (‘C’) or column-major (‘FORTRAN’) memory representation. Default is ‘C’.
Returns:
    
outMaskedArray
    
Masked array interpretation of `a`.
See also
`asanyarray`
    
Similar to `asarray`, but conserves subclasses.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(10.).reshape(2, 5)
    >>> x
    array([[0., 1., 2., 3., 4.],
           [5., 6., 7., 8., 9.]])
    >>> np.ma.asarray(x)
    masked_array(
      data=[[0., 1., 2., 3., 4.],
            [5., 6., 7., 8., 9.]],
      mask=False,
      fill_value=1e+20)
    >>> type(np.ma.asarray(x))
    <class 'numpy.ma.MaskedArray'>
    
# numpy.ma.atleast_1d
ma.atleast_1d=<numpy.ma.extras._fromnxfunction_allargs object>
    
Convert inputs to arrays with at least one dimension.
Scalar inputs are converted to 1-dimensional arrays, whilst higher-dimensional inputs are preserved.
Parameters:
    
arys1, arys2, …array_like
    
One or more input arrays.
Returns:
    
retndarray
    
An array, or tuple of arrays, each with `a.ndim >= 1`. Copies are made only if necessary.
See also
`atleast_2d`, `atleast_3d`
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> np.atleast_1d(1.0)
    array([1.])
    
    
    >>> x = np.arange(9.0).reshape(3,3)
    >>> np.atleast_1d(x)
    array([[0., 1., 2.],
           [3., 4., 5.],
           [6., 7., 8.]])
    >>> np.atleast_1d(x) is x
    True
    
    
    >>> np.atleast_1d(1, [3, 4])
    (array([1]), array([3, 4]))
    
# numpy.ma.atleast_2d
ma.atleast_2d=<numpy.ma.extras._fromnxfunction_allargs object>
    
View inputs as arrays with at least two dimensions.
Parameters:
    
arys1, arys2, …array_like
    
One or more array-like sequences. Non-array inputs are converted to arrays. Arrays that already have two or more dimensions are preserved.
Returns:
    
res, res2, …ndarray
    
An array, or tuple of arrays, each with `a.ndim >= 2`. Copies are avoided where possible, and views with two or more dimensions are returned.
See also
`atleast_1d`, `atleast_3d`
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> np.atleast_2d(3.0)
    array([[3.]])
    
    
    >>> x = np.arange(3.0)
    >>> np.atleast_2d(x)
    array([[0., 1., 2.]])
    >>> np.atleast_2d(x).base is x
    True
    
    
    >>> np.atleast_2d(1, [1, 2], [[1, 2]])
    (array([[1]]), array([[1, 2]]), array([[1, 2]]))
    
# numpy.ma.atleast_3d
ma.atleast_3d=<numpy.ma.extras._fromnxfunction_allargs object>
    
View inputs as arrays with at least three dimensions.
Parameters:
    
arys1, arys2, …array_like
    
One or more array-like sequences. Non-array inputs are converted to arrays. Arrays that already have three or more dimensions are preserved.
Returns:
    
res1, res2, …ndarray
    
An array, or tuple of arrays, each with `a.ndim >= 3`. Copies are avoided where possible, and views with three or more dimensions are returned. For example, a 1-D array of shape `(N,)` becomes a view of shape `(1, N, 1)`, and a 2-D array of shape `(M, N)` becomes a view of shape `(M, N, 1)`.
See also
`atleast_1d`, `atleast_2d`
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> np.atleast_3d(3.0)
    array([[[3.]]])
    
    
    >>> x = np.arange(3.0)
    >>> np.atleast_3d(x).shape
    (1, 3, 1)
    
    
    >>> x = np.arange(12.0).reshape(4,3)
    >>> np.atleast_3d(x).shape
    (4, 3, 1)
    >>> np.atleast_3d(x).base is x.base  # x is a reshape, so not base itself
    True
    
    
    >>> for arr in np.atleast_3d([1, 2], [[1, 2]], [[[1, 2]]]):
    ...     print(arr, arr.shape) 
    ...
    [[[1]
      [2]]] (1, 2, 1)
    [[[1]
      [2]]] (1, 2, 1)
    [[[1 2]]] (1, 1, 2)
    
# numpy.ma.average
ma.average(a, axis=None, weights=None, returned=False, *, keepdims=<no value>)[source]
    
Return the weighted average of array over the given axis.
Parameters:
    
aarray_like
    
Data to be averaged. Masked entries are not taken into account in the computation.
axisNone or int or tuple of ints, optional
    
Axis or axes along which to average `a`. The default, `axis=None`, will average over all of the elements of the input array. If axis is a tuple of ints, averaging is performed on all of the axes specified in the tuple instead of a single axis or all the axes as before.
weightsarray_like, optional
    
An array of weights associated with the values in `a`. Each value in `a` contributes to the average according to its associated weight. The array of weights must be the same shape as `a` if no axis is specified, otherwise the weights must have dimensions and shape consistent with `a` along the specified axis. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. The calculation is:
    
    avg = sum(a * weights) / sum(weights)
    
where the sum is over all included elements. The only constraint on the values of `weights` is that `sum(weights)` must not be 0.
returnedbool, optional
    
Flag indicating whether a tuple `(result, sum of weights)` should be returned as output (True), or just the result (False). Default is False.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`. Note: `keepdims` will not work with instances of `numpy.matrix` or other classes whose methods do not support `keepdims`.
New in version 1.23.0.
Returns:
    
average, [sum_of_weights](tuple of) scalar or MaskedArray
    
The average along the specified axis. When returned is `True`, return a tuple with the average as the first element and the sum of the weights as the second element. The return type is `np.float64` if `a` is of integer type and floats smaller than `float64`, or the input data-type, otherwise. If returned, `sum_of_weights` is always `float64`.
Raises:
    
ZeroDivisionError
    
When all weights along axis are zero. See `numpy.ma.average` for a version robust to this type of error.
TypeError
    
When `weights` does not have the same shape as `a`, and `axis=None`.
ValueError
    
When `weights` does not have dimensions and shape consistent with `a` along specified `axis`.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1., 2., 3., 4.], mask=[False, False, True, True])
    >>> np.ma.average(a, weights=[3, 1, 0, 0])
    1.25
    
    
    >>> x = np.ma.arange(6.).reshape(3, 2)
    >>> x
    masked_array(
      data=[[0., 1.],
            [2., 3.],
            [4., 5.]],
      mask=False,
      fill_value=1e+20)
    >>> data = np.arange(8).reshape((2, 2, 2))
    >>> data
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    >>> np.ma.average(data, axis=(0, 1), weights=[[1./4, 3./4], [1., 1./2]])
    masked_array(data=[3.4, 4.4],
             mask=[False, False],
       fill_value=1e+20)
    >>> np.ma.average(data, axis=0, weights=[[1./4, 3./4], [1., 1./2]])
    Traceback (most recent call last):
        ...
    ValueError: Shape of weights must be consistent
    with shape of a along specified axis.
    
    
    >>> avg, sumweights = np.ma.average(x, axis=0, weights=[1, 2, 3],
    ...                                 returned=True)
    >>> avg
    masked_array(data=[2.6666666666666665, 3.6666666666666665],
                 mask=[False, False],
           fill_value=1e+20)
    
With `keepdims=True`, the following result has shape (3, 1).
    
    >>> np.ma.average(x, axis=1, keepdims=True)
    masked_array(
      data=[[0.5],
            [2.5],
            [4.5]],
      mask=False,
      fill_value=1e+20)
    
# numpy.ma.choose
ma.choose(indices, choices, out=None, mode='raise')[source]
    
Use an index array to construct a new array from a list of choices.
Given an array of integers and a list of n choice arrays, this method will create a new array that merges each of the choice arrays. Where a value in `index` is i, the new array will have the value that choices[i] contains in the same place.
Parameters:
    
indicesndarray of ints
    
This array must contain integers in `[0, n-1]`, where n is the number of choices.
choicessequence of arrays
    
Choice arrays. The index array and all of the choices should be broadcastable to the same shape.
outarray, optional
    
If provided, the result will be inserted into this array. It should be of the appropriate shape and `dtype`.
mode{‘raise’, ‘wrap’, ‘clip’}, optional
    
Specifies how out-of-bounds indices will behave.
  * ‘raise’ : raise an error
  * ‘wrap’ : wrap around
  * ‘clip’ : clip to the range


Returns:
    
merged_arrayarray
See also
`choose`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> choice = np.array([[1,1,1], [2,2,2], [3,3,3]])
    >>> a = np.array([2, 1, 0])
    >>> np.ma.choose(a, choice)
    masked_array(data=[3, 2, 1],
                 mask=False,
           fill_value=999999)
    
# numpy.ma.clip
ma.clip=<numpy.ma.core._convert2ma object>
    
Clip (limit) the values in an array.
Given an interval, values outside the interval are clipped to the interval edges. For example, if an interval of `[0, 1]` is specified, values smaller than 0 become 0, and values larger than 1 become 1.
Equivalent to but faster than `np.minimum(a_max, np.maximum(a, a_min))`.
No check is performed to ensure `a_min < a_max`.
Parameters:
    
aarray_like
    
Array containing elements to clip.
a_min, a_maxarray_like or None
    
Minimum and maximum value. If `None`, clipping is not performed on the corresponding edge. If both `a_min` and `a_max` are `None`, the elements of the returned array stay the same. Both are broadcasted against `a`.
outndarray, optional
    
The results will be placed in this array. It may be the input array for in-place clipping. `out` must be of the right shape to hold the output. Its type is preserved.
min, maxarray_like or None
    
Array API compatible alternatives for `a_min` and `a_max` arguments. Either `a_min` and `a_max` or `min` and `max` can be passed at the same time. Default: `None`.
New in version 2.1.0.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
clipped_arrayMaskedArray
    
An array with the elements of `a`, but where values < `a_min` are replaced with `a_min`, and those > `a_max` with `a_max`.
See also
Output type determination
#### Notes
When `a_min` is greater than `a_max`, `clip` returns an array in which all values are equal to `a_max`, as shown in the second example.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(10)
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.clip(a, 1, 8)
    array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8])
    >>> np.clip(a, 8, 1)
    array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    >>> np.clip(a, 3, 6, out=a)
    array([3, 3, 3, 3, 4, 5, 6, 6, 6, 6])
    >>> a
    array([3, 3, 3, 3, 4, 5, 6, 6, 6, 6])
    >>> a = np.arange(10)
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.clip(a, [3, 4, 1, 1, 1, 4, 4, 4, 4, 4], 8)
    array([3, 4, 2, 3, 4, 5, 6, 7, 8, 8])
    
# numpy.ma.clump_masked
ma.clump_masked(a)[source]
    
Returns a list of slices corresponding to the masked clumps of a 1-D array. (A “clump” is defined as a contiguous region of the array).
Parameters:
    
andarray
    
A one-dimensional masked array.
Returns:
    
sliceslist of slice
    
The list of slices, one for each continuous region of masked elements in `a`.
See also
`flatnotmasked_edges`, `flatnotmasked_contiguous`, `notmasked_edges`
`notmasked_contiguous`, `clump_unmasked`
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.masked_array(np.arange(10))
    >>> a[[0, 1, 2, 6, 8, 9]] = np.ma.masked
    >>> np.ma.clump_masked(a)
    [slice(0, 3, None), slice(6, 7, None), slice(8, 10, None)]
    
# numpy.ma.clump_unmasked
ma.clump_unmasked(a)[source]
    
Return list of slices corresponding to the unmasked clumps of a 1-D array. (A “clump” is defined as a contiguous region of the array).
Parameters:
    
andarray
    
A one-dimensional masked array.
Returns:
    
sliceslist of slice
    
The list of slices, one for each continuous region of unmasked elements in `a`.
See also
`flatnotmasked_edges`, `flatnotmasked_contiguous`, `notmasked_edges`
`notmasked_contiguous`, `clump_masked`
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.masked_array(np.arange(10))
    >>> a[[0, 1, 2, 6, 8, 9]] = np.ma.masked
    >>> np.ma.clump_unmasked(a)
    [slice(3, 6, None), slice(7, 8, None)]
    
# numpy.ma.column_stack
ma.column_stack=<numpy.ma.extras._fromnxfunction_seq object>
    
Stack 1-D arrays as columns into a 2-D array.
Take a sequence of 1-D arrays and stack them as columns to make a single 2-D array. 2-D arrays are stacked as-is, just like with `hstack`. 1-D arrays are turned into 2-D columns first.
Parameters:
    
tupsequence of 1-D or 2-D arrays.
    
Arrays to stack. All of them must have the same first dimension.
Returns:
    
stacked2-D array
    
The array formed by stacking the given arrays.
See also
`stack`, `hstack`, `vstack`, `concatenate`
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((1,2,3))
    >>> b = np.array((2,3,4))
    >>> np.column_stack((a,b))
    array([[1, 2],
           [2, 3],
           [3, 4]])
    
# numpy.ma.common_fill_value
ma.common_fill_value(a, b)[source]
    
Return the common filling value of two masked arrays, if any.
If `a.fill_value == b.fill_value`, return the fill value, otherwise return None.
Parameters:
    
a, bMaskedArray
    
The masked arrays for which to compare fill values.
Returns:
    
fill_valuescalar or None
    
The common fill value, or None.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([0, 1.], fill_value=3)
    >>> y = np.ma.array([0, 1.], fill_value=3)
    >>> np.ma.common_fill_value(x, y)
    3.0
    
# numpy.ma.compress_cols
ma.compress_cols(a)[source]
    
Suppress whole columns of a 2-D array that contain masked values.
This is equivalent to `np.ma.compress_rowcols(a, 1)`, see `compress_rowcols` for details.
Parameters:
    
xarray_like, MaskedArray
    
The array to operate on. If not a MaskedArray instance (or if no array elements are masked), `x` is interpreted as a MaskedArray with `mask` set to `nomask`. Must be a 2D array.
Returns:
    
compressed_arrayndarray
    
The compressed array.
See also
`compress_rowcols`
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array(np.arange(9).reshape(3, 3), mask=[[1, 0, 0],
    ...                                                   [1, 0, 0],
    ...                                                   [0, 0, 0]])
    >>> np.ma.compress_cols(a)
    array([[1, 2],
           [4, 5],
           [7, 8]])
    
# numpy.ma.compress_nd
ma.compress_nd(x, axis=None)[source]
    
Suppress slices from multiple dimensions which contain masked values.
Parameters:
    
xarray_like, MaskedArray
    
The array to operate on. If not a MaskedArray instance (or if no array elements are masked), `x` is interpreted as a MaskedArray with `mask` set to `nomask`.
axistuple of ints or int, optional
    
Which dimensions to suppress slices from can be configured with this parameter. - If axis is a tuple of ints, those are the axes to suppress slices from. - If axis is an int, then that is the only axis to suppress slices from. - If axis is None, all axis are selected.
Returns:
    
compress_arrayndarray
    
The compressed array.
#### Examples
    
    >>> import numpy as np
    >>> arr = [[1, 2], [3, 4]]
    >>> mask = [[0, 1], [0, 0]]
    >>> x = np.ma.array(arr, mask=mask)
    >>> np.ma.compress_nd(x, axis=0)
    array([[3, 4]])
    >>> np.ma.compress_nd(x, axis=1)
    array([[1],
           [3]])
    >>> np.ma.compress_nd(x)
    array([[3]])
    
# numpy.ma.compress_rowcols
ma.compress_rowcols(x, axis=None)[source]
    
Suppress the rows and/or columns of a 2-D array that contain masked values.
The suppression behavior is selected with the `axis` parameter.
  * If axis is None, both rows and columns are suppressed.
  * If axis is 0, only rows are suppressed.
  * If axis is 1 or -1, only columns are suppressed.


Parameters:
    
xarray_like, MaskedArray
    
The array to operate on. If not a MaskedArray instance (or if no array elements are masked), `x` is interpreted as a MaskedArray with `mask` set to `nomask`. Must be a 2D array.
axisint, optional
    
Axis along which to perform the operation. Default is None.
Returns:
    
compressed_arrayndarray
    
The compressed array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(9).reshape(3, 3), mask=[[1, 0, 0],
    ...                                                   [1, 0, 0],
    ...                                                   [0, 0, 0]])
    >>> x
    masked_array(
      data=[[--, 1, 2],
            [--, 4, 5],
            [6, 7, 8]],
      mask=[[ True, False, False],
            [ True, False, False],
            [False, False, False]],
      fill_value=999999)
    
    
    >>> np.ma.compress_rowcols(x)
    array([[7, 8]])
    >>> np.ma.compress_rowcols(x, 0)
    array([[6, 7, 8]])
    >>> np.ma.compress_rowcols(x, 1)
    array([[1, 2],
           [4, 5],
           [7, 8]])
    
# numpy.ma.compress_rows
ma.compress_rows(a)[source]
    
Suppress whole rows of a 2-D array that contain masked values.
This is equivalent to `np.ma.compress_rowcols(a, 0)`, see `compress_rowcols` for details.
Parameters:
    
xarray_like, MaskedArray
    
The array to operate on. If not a MaskedArray instance (or if no array elements are masked), `x` is interpreted as a MaskedArray with `mask` set to `nomask`. Must be a 2D array.
Returns:
    
compressed_arrayndarray
    
The compressed array.
See also
`compress_rowcols`
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array(np.arange(9).reshape(3, 3), mask=[[1, 0, 0],
    ...                                                   [1, 0, 0],
    ...                                                   [0, 0, 0]])
    >>> np.ma.compress_rows(a)
    array([[6, 7, 8]])
    
# numpy.ma.compressed
ma.compressed(x)[source]
    
Return all the non-masked data as a 1-D array.
This function is equivalent to calling the “compressed” method of a `ma.MaskedArray`, see `ma.MaskedArray.compressed` for details.
See also
`ma.MaskedArray.compressed`
    
Equivalent method.
#### Examples
    
    >>> import numpy as np
    
Create an array with negative values masked:
    
    >>> import numpy as np
    >>> x = np.array([[1, -1, 0], [2, -1, 3], [7, 4, -1]])
    >>> masked_x = np.ma.masked_array(x, mask=x < 0)
    >>> masked_x
    masked_array(
      data=[[1, --, 0],
            [2, --, 3],
            [7, 4, --]],
      mask=[[False,  True, False],
            [False,  True, False],
            [False, False,  True]],
      fill_value=999999)
    
Compress the masked array into a 1-D array of non-masked values:
    
    >>> np.ma.compressed(masked_x)
    array([1, 0, 2, 3, 7, 4])
    
# numpy.ma.concatenate
ma.concatenate(arrays, axis=0)[source]
    
Concatenate a sequence of arrays along the given axis.
Parameters:
    
arrayssequence of array_like
    
The arrays must have the same shape, except in the dimension corresponding to `axis` (the first, by default).
axisint, optional
    
The axis along which the arrays will be joined. Default is 0.
Returns:
    
resultMaskedArray
    
The concatenated array with any masked entries preserved.
See also
`numpy.concatenate`
    
Equivalent function in the top-level NumPy module.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = ma.arange(3)
    >>> a[1] = ma.masked
    >>> b = ma.arange(2, 5)
    >>> a
    masked_array(data=[0, --, 2],
                 mask=[False,  True, False],
           fill_value=999999)
    >>> b
    masked_array(data=[2, 3, 4],
                 mask=False,
           fill_value=999999)
    >>> ma.concatenate([a, b])
    masked_array(data=[0, --, 2, 2, 3, 4],
                 mask=[False,  True, False, False, False, False],
           fill_value=999999)
    
# numpy.ma.conjugate
ma.conjugate(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<numpy.ma.core._MaskedUnaryOperation object>
    
Return the complex conjugate, element-wise.
The complex conjugate of a complex number is obtained by changing the sign of its imaginary part.
Parameters:
    
xarray_like
    
Input value.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The complex conjugate of `x`, with same dtype as `y`. This is a scalar if `x` is a scalar.
#### Notes
`conj` is an alias for `conjugate`:
    
    >>> np.conj is np.conjugate
    True
    
#### Examples
    
    >>> import numpy as np
    >>> np.conjugate(1+2j)
    (1-2j)
    
    
    >>> x = np.eye(2) + 1j * np.eye(2)
    >>> np.conjugate(x)
    array([[ 1.-1.j,  0.-0.j],
           [ 0.-0.j,  1.-1.j]])
    
# numpy.ma.convolve
ma.convolve(a, v, mode='full', propagate_mask=True)[source]
    
Returns the discrete, linear convolution of two one-dimensional sequences.
Parameters:
    
a, varray_like
    
Input sequences.
mode{‘valid’, ‘same’, ‘full’}, optional
    
Refer to the `np.convolve` docstring.
propagate_maskbool
    
If True, then if any masked element is included in the sum for a result element, then the result is masked. If False, then the result element is only masked if no non-masked cells contribute towards it
Returns:
    
outMaskedArray
    
Discrete, linear convolution of `a` and `v`.
See also
`numpy.convolve`
    
Equivalent function in the top-level NumPy module.
# numpy.ma.copy
ma.copy(self, *args, **params) a.copy(order='C')=<numpy.ma.core._frommethod object>
    
Return a copy of the array.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `numpy.copy` are very similar but have different default values for their order= arguments, and this function always passes sub-classes through.)
See also
`numpy.copy`
    
Similar function with different default behavior
`numpy.copyto`
#### Notes
This function is the preferred method for creating an array copy. The function `numpy.copy` is similar, but it defaults to using order ‘K’, and will not pass sub-classes through by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3],[4,5,6]], order='F')
    
    
    >>> y = x.copy()
    
    
    >>> x.fill(0)
    
    
    >>> x
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> y.flags['C_CONTIGUOUS']
    True
    
For arrays containing Python objects (e.g. dtype=object), the copy is a shallow one. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):
    
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> b = a.copy()
    >>> b[2][0] = 10
    >>> a
    array([1, 'm', list([10, 3, 4])], dtype=object)
    
To ensure all elements within an `object` array are copied, use `copy.deepcopy`:
    
    >>> import copy
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> c = copy.deepcopy(a)
    >>> c[2][0] = 10
    >>> c
    array([1, 'm', list([10, 3, 4])], dtype=object)
    >>> a
    array([1, 'm', list([2, 3, 4])], dtype=object)
    
# numpy.ma.corrcoef
ma.corrcoef(x, y=None, rowvar=True, bias=<no value>, allow_masked=True, ddof=<no value>)[source]
    
Return Pearson product-moment correlation coefficients.
Except for the handling of missing data this function does the same as `numpy.corrcoef`. For more details and examples, see `numpy.corrcoef`.
Parameters:
    
xarray_like
    
A 1-D or 2-D array containing multiple variables and observations. Each row of `x` represents a variable, and each column a single observation of all those variables. Also see `rowvar` below.
yarray_like, optional
    
An additional set of variables and observations. `y` has the same shape as `x`.
rowvarbool, optional
    
If `rowvar` is True (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations.
bias_NoValue, optional
    
Has no effect, do not use.
Deprecated since version 1.10.0.
allow_maskedbool, optional
    
If True, masked values are propagated pair-wise: if a value is masked in `x`, the corresponding value is masked in `y`. If False, raises an exception. Because `bias` is deprecated, this argument needs to be treated as keyword only to avoid a warning.
ddof_NoValue, optional
    
Has no effect, do not use.
Deprecated since version 1.10.0.
See also
`numpy.corrcoef`
    
Equivalent function in top-level NumPy module.
`cov`
    
Estimate the covariance matrix.
#### Notes
This function accepts but discards arguments `bias` and `ddof`. This is for backwards compatibility with previous versions of this function. These arguments had no effect on the return values of the function and can be safely ignored in this and previous versions of numpy.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[0, 1], [1, 1]], mask=[0, 1, 0, 1])
    >>> np.ma.corrcoef(x)
    masked_array(
      data=[[--, --],
            [--, --]],
      mask=[[ True,  True],
            [ True,  True]],
      fill_value=1e+20,
      dtype=float64)
    
# numpy.ma.correlate
ma.correlate(a, v, mode='valid', propagate_mask=True)[source]
    
Cross-correlation of two 1-dimensional sequences.
Parameters:
    
a, varray_like
    
Input sequences.
mode{‘valid’, ‘same’, ‘full’}, optional
    
Refer to the `np.convolve` docstring. Note that the default is ‘valid’, unlike `convolve`, which uses ‘full’.
propagate_maskbool
    
If True, then a result element is masked if any masked element contributes towards it. If False, then a result element is only masked if no non-masked element contribute towards it
Returns:
    
outMaskedArray
    
Discrete cross-correlation of `a` and `v`.
See also
`numpy.correlate`
    
Equivalent function in the top-level NumPy module.
#### Examples
Basic correlation:
    
    >>> a = np.ma.array([1, 2, 3])
    >>> v = np.ma.array([0, 1, 0])
    >>> np.ma.correlate(a, v, mode='valid')
    masked_array(data=[2],
                 mask=[False],
           fill_value=999999)
    
Correlation with masked elements:
    
    >>> a = np.ma.array([1, 2, 3], mask=[False, True, False])
    >>> v = np.ma.array([0, 1, 0])
    >>> np.ma.correlate(a, v, mode='valid', propagate_mask=True)
    masked_array(data=[--],
                 mask=[ True],
           fill_value=999999,
                dtype=int64)
    
Correlation with different modes and mixed array types:
    
    >>> a = np.ma.array([1, 2, 3])
    >>> v = np.ma.array([0, 1, 0])
    >>> np.ma.correlate(a, v, mode='full')
    masked_array(data=[0, 1, 2, 3, 0],
                 mask=[False, False, False, False, False],
           fill_value=999999)
    
# numpy.ma.count
ma.count(self, axis=None, keepdims=<no value>)=<numpy.ma.core._frommethod object>
    
Count the non-masked elements of the array along the given axis.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Axis or axes along which the count is performed. The default, None, performs the count over all the dimensions of the input array. `axis` may be negative, in which case it counts from the last to the first axis. If this is a tuple of ints, the count is performed on multiple axes, instead of a single axis or all the axes as before.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
resultndarray or scalar
    
An array with the same shape as the input array, with the specified axis removed. If the array is a 0-d array, or if `axis` is None, a scalar is returned.
See also
`ma.count_masked`
    
Count masked elements in array or along a given axis.
#### Examples
    
    >>> import numpy.ma as ma
    >>> a = ma.arange(6).reshape((2, 3))
    >>> a[1, :] = ma.masked
    >>> a
    masked_array(
      data=[[0, 1, 2],
            [--, --, --]],
      mask=[[False, False, False],
            [ True,  True,  True]],
      fill_value=999999)
    >>> a.count()
    3
    
When the `axis` keyword is specified an array of appropriate size is returned.
    
    >>> a.count(axis=0)
    array([1, 1, 1])
    >>> a.count(axis=1)
    array([3, 0])
    
# numpy.ma.count_masked
ma.count_masked(arr, axis=None)[source]
    
Count the number of masked elements along the given axis.
Parameters:
    
arrarray_like
    
An array with (possibly) masked elements.
axisint, optional
    
Axis along which to count. If None (default), a flattened version of the array is used.
Returns:
    
countint, ndarray
    
The total number of masked elements (axis=None) or the number of masked elements along each slice of the given axis.
See also
`MaskedArray.count`
    
Count non-masked elements.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(9).reshape((3,3))
    >>> a = np.ma.array(a)
    >>> a[1, 0] = np.ma.masked
    >>> a[1, 2] = np.ma.masked
    >>> a[2, 1] = np.ma.masked
    >>> a
    masked_array(
      data=[[0, 1, 2],
            [--, 4, --],
            [6, --, 8]],
      mask=[[False, False, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> np.ma.count_masked(a)
    3
    
When the `axis` keyword is used an array is returned.
    
    >>> np.ma.count_masked(a, axis=0)
    array([1, 1, 1])
    >>> np.ma.count_masked(a, axis=1)
    array([0, 2, 1])
    
# numpy.ma.cov
ma.cov(x, y=None, rowvar=True, bias=False, allow_masked=True, ddof=None)[source]
    
Estimate the covariance matrix.
Except for the handling of missing data this function does the same as `numpy.cov`. For more details and examples, see `numpy.cov`.
By default, masked values are recognized as such. If `x` and `y` have the same shape, a common mask is allocated: if `x[i,j]` is masked, then `y[i,j]` will also be masked. Setting `allow_masked` to False will raise an exception if values are missing in either of the input arrays.
Parameters:
    
xarray_like
    
A 1-D or 2-D array containing multiple variables and observations. Each row of `x` represents a variable, and each column a single observation of all those variables. Also see `rowvar` below.
yarray_like, optional
    
An additional set of variables and observations. `y` has the same shape as `x`.
rowvarbool, optional
    
If `rowvar` is True (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations.
biasbool, optional
    
Default normalization (False) is by `(N-1)`, where `N` is the number of observations given (unbiased estimate). If `bias` is True, then normalization is by `N`. This keyword can be overridden by the keyword `ddof` in numpy versions >= 1.5.
allow_maskedbool, optional
    
If True, masked values are propagated pair-wise: if a value is masked in `x`, the corresponding value is masked in `y`. If False, raises a `ValueError` exception when some values are missing.
ddof{None, int}, optional
    
If not `None` normalization is by `(N - ddof)`, where `N` is the number of observations; this overrides the value implied by `bias`. The default value is `None`.
Raises:
    
ValueError
    
Raised if some values are missing and `allow_masked` is False.
See also
`numpy.cov`
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[0, 1], [1, 1]], mask=[0, 1, 0, 1])
    >>> y = np.ma.array([[1, 0], [0, 1]], mask=[0, 0, 1, 1])
    >>> np.ma.cov(x, y)
    masked_array(
    data=[[--, --, --, --],
          [--, --, --, --],
          [--, --, --, --],
          [--, --, --, --]],
    mask=[[ True,  True,  True,  True],
          [ True,  True,  True,  True],
          [ True,  True,  True,  True],
          [ True,  True,  True,  True]],
    fill_value=1e+20,
    dtype=float64)
    
# numpy.ma.cumprod
ma.cumprod(self, axis=None, dtype=None, out=None)=<numpy.ma.core._frommethod object>
    
Return the cumulative product of the array elements over the given axis.
Masked values are set to 1 internally during the computation. However, their position is saved, and the result will be masked at the same locations.
Refer to `numpy.cumprod` for full documentation.
See also
`numpy.ndarray.cumprod`
    
corresponding function for ndarrays
`numpy.cumprod`
    
equivalent function
#### Notes
The mask is lost if `out` is not a valid MaskedArray !
Arithmetic is modular when using integer types, and no error is raised on overflow.
# numpy.ma.cumsum
ma.cumsum(self, axis=None, dtype=None, out=None)=<numpy.ma.core._frommethod object>
    
Return the cumulative sum of the array elements over the given axis.
Masked values are set to 0 internally during the computation. However, their position is saved, and the result will be masked at the same locations.
Refer to `numpy.cumsum` for full documentation.
See also
`numpy.ndarray.cumsum`
    
corresponding function for ndarrays
`numpy.cumsum`
    
equivalent function
#### Notes
The mask is lost if `out` is not a valid `ma.MaskedArray` !
Arithmetic is modular when using integer types, and no error is raised on overflow.
#### Examples
    
    >>> import numpy as np
    >>> marr = np.ma.array(np.arange(10), mask=[0,0,0,1,1,1,0,0,0,0])
    >>> marr.cumsum()
    masked_array(data=[0, 1, 3, --, --, --, 9, 16, 24, 33],
                 mask=[False, False, False,  True,  True,  True, False, False,
                       False, False],
           fill_value=999999)
    
# numpy.ma.default_fill_value
ma.default_fill_value(obj)[source]
    
Return the default fill value for the argument object.
The default filling value depends on the datatype of the input array or the type of the input scalar:
datatype
default  
bool
True  
int
999999  
float
1.e20  
complex
1.e20+0j  
object
‘?’  
string
‘N/A’  
For structured types, a structured scalar is returned, with each field the default fill value for its type.
For subarray types, the fill value is an array of the same size containing the default scalar fill value.
Parameters:
    
objndarray, dtype or scalar
    
The array data-type or scalar for which the default fill value is returned.
Returns:
    
fill_valuescalar
    
The default fill value.
#### Examples
    
    >>> import numpy as np
    >>> np.ma.default_fill_value(1)
    999999
    >>> np.ma.default_fill_value(np.array([1.1, 2., np.pi]))
    1e+20
    >>> np.ma.default_fill_value(np.dtype(complex))
    (1e+20+0j)
    
# numpy.ma.diag
ma.diag(v, k=0)[source]
    
Extract a diagonal or construct a diagonal array.
This function is the equivalent of `numpy.diag` that takes masked values into account, see `numpy.diag` for details.
See also
`numpy.diag`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    
Create an array with negative values masked:
    
    >>> import numpy as np
    >>> x = np.array([[11.2, -3.973, 18], [0.801, -1.41, 12], [7, 33, -12]])
    >>> masked_x = np.ma.masked_array(x, mask=x < 0)
    >>> masked_x
    masked_array(
      data=[[11.2, --, 18.0],
            [0.801, --, 12.0],
            [7.0, 33.0, --]],
      mask=[[False,  True, False],
            [False,  True, False],
            [False, False,  True]],
      fill_value=1e+20)
    
Isolate the main diagonal from the masked array:
    
    >>> np.ma.diag(masked_x)
    masked_array(data=[11.2, --, --],
                 mask=[False,  True,  True],
           fill_value=1e+20)
    
Isolate the first diagonal below the main diagonal:
    
    >>> np.ma.diag(masked_x, -1)
    masked_array(data=[0.801, 33.0],
                 mask=[False, False],
           fill_value=1e+20)
    
# numpy.ma.diagflat
ma.diagflat=<numpy.ma.extras._fromnxfunction_single object>
    
Create a two-dimensional array with the flattened input as a diagonal.
Parameters:
    
varray_like
    
Input data, which is flattened and set as the `k`-th diagonal of the output.
kint, optional
    
Diagonal to set; 0, the default, corresponds to the “main” diagonal, a positive (negative) `k` giving the number of the diagonal above (below) the main.
Returns:
    
outndarray
    
The 2-D output array.
See also
`diag`
    
MATLAB work-alike for 1-D and 2-D arrays.
`diagonal`
    
Return specified diagonals.
`trace`
    
Sum along diagonals.
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> np.diagflat([[1,2], [3,4]])
    array([[1, 0, 0, 0],
           [0, 2, 0, 0],
           [0, 0, 3, 0],
           [0, 0, 0, 4]])
    
    
    >>> np.diagflat([1,2], 1)
    array([[0, 1, 0],
           [0, 0, 2],
           [0, 0, 0]])
    
# numpy.ma.diff
ma.diff(a, /, n=1, axis=-1, prepend=<no value>, append=<no value>)[source]
    
Calculate the n-th discrete difference along the given axis. The first difference is given by `out[i] = a[i+1] - a[i]` along the given axis, higher differences are calculated by using `diff` recursively. Preserves the input mask.
Parameters:
    
aarray_like
    
Input array
nint, optional
    
The number of times values are differenced. If zero, the input is returned as-is.
axisint, optional
    
The axis along which the difference is taken, default is the last axis.
prepend, appendarray_like, optional
    
Values to prepend or append to `a` along axis prior to performing the difference. Scalar values are expanded to arrays with length 1 in the direction of axis and the shape of the input array in along all other axes. Otherwise the dimension and shape must match `a` except along axis.
Returns:
    
diffMaskedArray
    
The n-th differences. The shape of the output is the same as `a` except along `axis` where the dimension is smaller by `n`. The type of the output is the same as the type of the difference between any two elements of `a`. This is the same as the type of `a` in most cases. A notable exception is `datetime64`, which results in a `timedelta64` output array.
See also
`numpy.diff`
    
Equivalent function in the top-level NumPy module.
#### Notes
Type is preserved for boolean arrays, so the result will contain `False` when consecutive elements are the same and `True` when they differ.
For unsigned integer arrays, the results will also be unsigned. This should not be surprising, as the result is consistent with calculating the difference directly:
    
    >>> u8_arr = np.array([1, 0], dtype=np.uint8)
    >>> np.ma.diff(u8_arr)
    masked_array(data=[255],
                 mask=False,
           fill_value=np.uint64(999999),
                dtype=uint8)
    >>> u8_arr[1,...] - u8_arr[0,...]
    np.uint8(255)
    
If this is not desirable, then the array should be cast to a larger integer type first:
    
    >>> i16_arr = u8_arr.astype(np.int16)
    >>> np.ma.diff(i16_arr)
    masked_array(data=[-1],
                 mask=False,
           fill_value=np.int64(999999),
                dtype=int16)
    
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3, 4, 7, 0, 2, 3])
    >>> x = np.ma.masked_where(a < 2, a)
    >>> np.ma.diff(x)
    masked_array(data=[--, 1, 1, 3, --, --, 1],
            mask=[ True, False, False, False,  True,  True, False],
        fill_value=999999)
    
    
    >>> np.ma.diff(x, n=2)
    masked_array(data=[--, 0, 2, --, --, --],
                mask=[ True, False, False,  True,  True,  True],
        fill_value=999999)
    
    
    >>> a = np.array([[1, 3, 1, 5, 10], [0, 1, 5, 6, 8]])
    >>> x = np.ma.masked_equal(a, value=1)
    >>> np.ma.diff(x)
    masked_array(
        data=[[--, --, --, 5],
                [--, --, 1, 2]],
        mask=[[ True,  True,  True, False],
                [ True,  True, False, False]],
        fill_value=1)
    
    
    >>> np.ma.diff(x, axis=0)
    masked_array(data=[[--, --, --, 1, -2]],
            mask=[[ True,  True,  True, False, False]],
        fill_value=1)
    
# numpy.ma.dot
ma.dot(a, b, strict=False, out=None)[source]
    
Return the dot product of two arrays.
This function is the equivalent of `numpy.dot` that takes masked values into account. Note that `strict` and `out` are in different position than in the method version. In order to maintain compatibility with the corresponding method, it is recommended that the optional arguments be treated as keyword only. At some point that may be mandatory.
Parameters:
    
a, bmasked_array_like
    
Inputs arrays.
strictbool, optional
    
Whether masked data are propagated (True) or set to 0 (False) for the computation. Default is False. Propagating the mask means that if a masked value appears in a row or column, the whole row or column is considered masked.
outmasked_array, optional
    
Output argument. This must have the exact kind that would be returned if it was not used. In particular, it must have the right type, must be C-contiguous, and its dtype must be the dtype that would be returned for `dot(a,b)`. This is a performance feature. Therefore, if these conditions are not met, an exception is raised, instead of attempting to be flexible.
See also
`numpy.dot`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([[1, 2, 3], [4, 5, 6]], mask=[[1, 0, 0], [0, 0, 0]])
    >>> b = np.ma.array([[1, 2], [3, 4], [5, 6]], mask=[[1, 0], [0, 0], [0, 0]])
    >>> np.ma.dot(a, b)
    masked_array(
      data=[[21, 26],
            [45, 64]],
      mask=[[False, False],
            [False, False]],
      fill_value=999999)
    >>> np.ma.dot(a, b, strict=True)
    masked_array(
      data=[[--, --],
            [--, 64]],
      mask=[[ True,  True],
            [ True, False]],
      fill_value=999999)
    
# numpy.ma.dstack
ma.dstack=<numpy.ma.extras._fromnxfunction_seq object>
    
Stack arrays in sequence depth wise (along third axis).
This is equivalent to concatenation along the third axis after 2-D arrays of shape `(M,N)` have been reshaped to `(M,N,1)` and 1-D arrays of shape `(N,)` have been reshaped to `(1,N,1)`. Rebuilds arrays divided by `dsplit`.
This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations.
Parameters:
    
tupsequence of arrays
    
The arrays must have the same shape along all but the third axis. 1-D or 2-D arrays must have the same shape.
Returns:
    
stackedndarray
    
The array formed by stacking the given arrays, will be at least 3-D.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`vstack`
    
Stack arrays in sequence vertically (row wise).
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`dsplit`
    
Split array along third axis.
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((1,2,3))
    >>> b = np.array((2,3,4))
    >>> np.dstack((a,b))
    array([[[1, 2],
            [2, 3],
            [3, 4]]])
    
    
    >>> a = np.array([[1],[2],[3]])
    >>> b = np.array([[2],[3],[4]])
    >>> np.dstack((a,b))
    array([[[1, 2]],
           [[2, 3]],
           [[3, 4]]])
    
# numpy.ma.ediff1d
ma.ediff1d(arr, to_end=None, to_begin=None)[source]
    
Compute the differences between consecutive elements of an array.
This function is the equivalent of `numpy.ediff1d` that takes masked values into account, see `numpy.ediff1d` for details.
See also
`numpy.ediff1d`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> arr = np.ma.array([1, 2, 4, 7, 0])
    >>> np.ma.ediff1d(arr)
    masked_array(data=[ 1,  2,  3, -7],
                 mask=False,
           fill_value=999999)
    
# numpy.ma.empty
ma.empty(shape, dtype=float, order='C', *, device=None, like=None)=<numpy.ma.core._convert2ma object>
    
Return a new array of given shape and type, without initializing entries.
Parameters:
    
shapeint or tuple of int
    
Shape of the empty array, e.g., `(2, 3)` or `2`.
dtypedata-type, optional
    
Desired output data-type for the array, e.g, `numpy.int8`. Default is `numpy.float64`.
order{‘C’, ‘F’}, optional, default: ‘C’
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
devicestr, optional
    
The device on which to place the created array. Default: `None`. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outMaskedArray
    
Array of uninitialized (arbitrary) data of the given shape, dtype, and order. Object arrays will be initialized to None.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`ones`
    
Return a new array setting values to one.
`zeros`
    
Return a new array setting values to zero.
`full`
    
Return a new array of given shape filled with value.
#### Notes
Unlike other array creation functions (e.g. `zeros`, `ones`, `full`), `empty` does not initialize the values of the array, and may therefore be marginally faster. However, the values stored in the newly allocated array are arbitrary. For reproducible behavior, be sure to set each element of the array before reading.
#### Examples
    
    >>> import numpy as np
    >>> np.empty([2, 2])
    array([[ -9.74499359e+001,   6.69583040e-309],
           [  2.13182611e-314,   3.06959433e-309]])         #uninitialized
    
    
    >>> np.empty([2, 2], dtype=int)
    array([[-1073741821, -1067949133],
           [  496041986,    19249760]])                     #uninitialized
    
# numpy.ma.empty_like
ma.empty_like(prototype, dtype=None, order='K', subok=True, shape=None, *, device=None)=<numpy.ma.core._convert2ma object>
    
Return a new array with the same shape and type as a given array.
Parameters:
    
prototypearray_like
    
The shape and data-type of `prototype` define these same attributes of the returned array.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `prototype` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `prototype` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `prototype`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outMaskedArray
    
Array of uninitialized (arbitrary) data with the same shape and type as `prototype`.
See also
`ones_like`
    
Return an array of ones with shape and type of input.
`zeros_like`
    
Return an array of zeros with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`empty`
    
Return a new uninitialized array.
#### Notes
Unlike other array creation functions (e.g. `zeros_like`, `ones_like`, `full_like`), `empty_like` does not initialize the values of the array, and may therefore be marginally faster. However, the values stored in the newly allocated array are arbitrary. For reproducible behavior, be sure to set each element of the array before reading.
#### Examples
    
    >>> import numpy as np
    >>> a = ([1,2,3], [4,5,6])                         # a is array-like
    >>> np.empty_like(a)
    array([[-1073741821, -1073741821,           3],    # uninitialized
           [          0,           0, -1073741821]])
    >>> a = np.array([[1., 2., 3.],[4.,5.,6.]])
    >>> np.empty_like(a)
    array([[ -2.00000715e+000,   1.48219694e-323,  -2.00000572e+000], # uninitialized
           [  4.38791518e-305,  -2.00000715e+000,   4.17269252e-309]])
    
# numpy.ma.expand_dims
ma.expand_dims(a, axis)[source]
    
Expand the shape of an array.
Insert a new axis that will appear at the `axis` position in the expanded array shape.
Parameters:
    
aarray_like
    
Input array.
axisint or tuple of ints
    
Position in the expanded axes where the new axis (or axes) is placed.
Deprecated since version 1.13.0: Passing an axis where `axis > a.ndim` will be treated as `axis == a.ndim`, and passing `axis < -a.ndim - 1` will be treated as `axis == 0`. This behavior is deprecated.
Returns:
    
resultndarray
    
View of `a` with the number of dimensions increased.
See also
`squeeze`
    
The inverse operation, removing singleton dimensions
`reshape`
    
Insert, remove, and combine dimensions, and resize existing ones
`atleast_1d`, `atleast_2d`, `atleast_3d`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2])
    >>> x.shape
    (2,)
    
The following is equivalent to `x[np.newaxis, :]` or `x[np.newaxis]`:
    
    >>> y = np.expand_dims(x, axis=0)
    >>> y
    array([[1, 2]])
    >>> y.shape
    (1, 2)
    
The following is equivalent to `x[:, np.newaxis]`:
    
    >>> y = np.expand_dims(x, axis=1)
    >>> y
    array([[1],
           [2]])
    >>> y.shape
    (2, 1)
    
`axis` may also be a tuple:
    
    >>> y = np.expand_dims(x, axis=(0, 1))
    >>> y
    array([[[1, 2]]])
    
    
    >>> y = np.expand_dims(x, axis=(2, 0))
    >>> y
    array([[[1],
            [2]]])
    
Note that some examples may use `None` instead of `np.newaxis`. These are the same objects:
    
    >>> np.newaxis is None
    True
    
# numpy.ma.filled
ma.filled(a, fill_value=None)[source]
    
Return input as an `ndarray`, with masked values replaced by `fill_value`.
If `a` is not a `MaskedArray`, `a` itself is returned. If `a` is a `MaskedArray` with no masked values, then `a.data` is returned. If `a` is a `MaskedArray` and `fill_value` is None, `fill_value` is set to `a.fill_value`.
Parameters:
    
aMaskedArray or array_like
    
An input object.
fill_valuearray_like, optional.
    
Can be scalar or non-scalar. If non-scalar, the resulting filled array should be broadcastable over input array. Default is None.
Returns:
    
andarray
    
The filled array.
See also
`compressed`
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = ma.array(np.arange(9).reshape(3, 3), mask=[[1, 0, 0],
    ...                                                [1, 0, 0],
    ...                                                [0, 0, 0]])
    >>> x.filled()
    array([[999999,      1,      2],
           [999999,      4,      5],
           [     6,      7,      8]])
    >>> x.filled(fill_value=333)
    array([[333,   1,   2],
           [333,   4,   5],
           [  6,   7,   8]])
    >>> x.filled(fill_value=np.arange(3))
    array([[0, 1, 2],
           [0, 4, 5],
           [6, 7, 8]])
    
# numpy.ma.fix_invalid
ma.fix_invalid(a, mask=np.False_, copy=True, fill_value=None)[source]
    
Return input with invalid data masked and replaced by a fill value.
Invalid data means values of `nan`, `inf`, etc.
Parameters:
    
aarray_like
    
Input array, a (subclass of) ndarray.
masksequence, optional
    
Mask. Must be convertible to an array of booleans with the same shape as `data`. True indicates a masked (i.e. invalid) data.
copybool, optional
    
Whether to use a copy of `a` (True) or to fix `a` in place (False). Default is True.
fill_valuescalar, optional
    
Value used for fixing invalid data. Default is None, in which case the `a.fill_value` is used.
Returns:
    
bMaskedArray
    
The input array with invalid entries fixed.
#### Notes
A copy is performed by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1., -1, np.nan, np.inf], mask=[1] + [0]*3)
    >>> x
    masked_array(data=[--, -1.0, nan, inf],
                 mask=[ True, False, False, False],
           fill_value=1e+20)
    >>> np.ma.fix_invalid(x)
    masked_array(data=[--, -1.0, --, --],
                 mask=[ True, False,  True,  True],
           fill_value=1e+20)
    
    
    >>> fixed = np.ma.fix_invalid(x)
    >>> fixed.data
    array([ 1.e+00, -1.e+00,  1.e+20,  1.e+20])
    >>> x.data
    array([ 1., -1., nan, inf])
    
# numpy.ma.flatnotmasked_contiguous
ma.flatnotmasked_contiguous(a)[source]
    
Find contiguous unmasked data in a masked array.
Parameters:
    
aarray_like
    
The input array.
Returns:
    
slice_listlist
    
A sorted sequence of `slice` objects (start index, end index).
See also
`flatnotmasked_edges`, `notmasked_contiguous`, `notmasked_edges`
`clump_masked`, `clump_unmasked`
#### Notes
Only accepts 2-D arrays at most.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.arange(10)
    >>> np.ma.flatnotmasked_contiguous(a)
    [slice(0, 10, None)]
    
    
    >>> mask = (a < 3) | (a > 8) | (a == 5)
    >>> a[mask] = np.ma.masked
    >>> np.array(a[~a.mask])
    array([3, 4, 6, 7, 8])
    
    
    >>> np.ma.flatnotmasked_contiguous(a)
    [slice(3, 5, None), slice(6, 9, None)]
    >>> a[:] = np.ma.masked
    >>> np.ma.flatnotmasked_contiguous(a)
    []
    
# numpy.ma.flatnotmasked_edges
ma.flatnotmasked_edges(a)[source]
    
Find the indices of the first and last unmasked values.
Expects a 1-D `MaskedArray`, returns None if all values are masked.
Parameters:
    
aarray_like
    
Input 1-D `MaskedArray`
Returns:
    
edgesndarray or None
    
The indices of first and last non-masked value in the array. Returns None if all values are masked.
See also
`flatnotmasked_contiguous`, `notmasked_contiguous`, `notmasked_edges`
`clump_masked`, `clump_unmasked`
#### Notes
Only accepts 1-D arrays.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.arange(10)
    >>> np.ma.flatnotmasked_edges(a)
    array([0, 9])
    
    
    >>> mask = (a < 3) | (a > 8) | (a == 5)
    >>> a[mask] = np.ma.masked
    >>> np.array(a[~a.mask])
    array([3, 4, 6, 7, 8])
    
    
    >>> np.ma.flatnotmasked_edges(a)
    array([3, 8])
    
    
    >>> a[:] = np.ma.masked
    >>> print(np.ma.flatnotmasked_edges(a))
    None
    
# numpy.ma.flatten_mask
ma.flatten_mask(mask)[source]
    
Returns a completely flattened version of the mask, where nested fields are collapsed.
Parameters:
    
maskarray_like
    
Input array, which will be interpreted as booleans.
Returns:
    
flattened_maskndarray of bools
    
The flattened input.
#### Examples
    
    >>> import numpy as np
    >>> mask = np.array([0, 0, 1])
    >>> np.ma.flatten_mask(mask)
    array([False, False,  True])
    
    
    >>> mask = np.array([(0, 0), (0, 1)], dtype=[('a', bool), ('b', bool)])
    >>> np.ma.flatten_mask(mask)
    array([False, False, False,  True])
    
    
    >>> mdtype = [('a', bool), ('b', [('ba', bool), ('bb', bool)])]
    >>> mask = np.array([(0, (0, 0)), (0, (0, 1))], dtype=mdtype)
    >>> np.ma.flatten_mask(mask)
    array([False, False, False, False, False,  True])
    
# numpy.ma.flatten_structured_array
ma.flatten_structured_array(a)[source]
    
Flatten a structured array.
The data type of the output is chosen such that it can represent all of the (nested) fields.
Parameters:
    
astructured array
Returns:
    
outputmasked array or ndarray
    
A flattened masked array if the input is a masked array, otherwise a standard ndarray.
#### Examples
    
    >>> import numpy as np
    >>> ndtype = [('a', int), ('b', float)]
    >>> a = np.array([(1, 1), (2, 2)], dtype=ndtype)
    >>> np.ma.flatten_structured_array(a)
    array([[1., 1.],
           [2., 2.]])
    
# numpy.ma.frombuffer
ma.frombuffer(buffer, dtype=float, count=-1, offset=0, *, like=None)=<numpy.ma.core._convert2ma object>
    
Interpret a buffer as a 1-dimensional array.
Parameters:
    
bufferbuffer_like
    
An object that exposes the buffer interface.
dtypedata-type, optional
    
Data-type of the returned array; default: float.
countint, optional
    
Number of items to read. `-1` means all data in the buffer.
offsetint, optional
    
Start reading the buffer from this offset (in bytes); default: 0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
out: MaskedArray
See also
`ndarray.tobytes`
    
Inverse of this operation, construct Python bytes from the raw data bytes in the array.
#### Notes
If the buffer has data that is not in machine byte-order, this should be specified as part of the data-type, e.g.:
    
    >>> dt = np.dtype(int)
    >>> dt = dt.newbyteorder('>')
    >>> np.frombuffer(buf, dtype=dt) 
    
The data of the resulting array will not be byteswapped, but will be interpreted correctly.
This function creates a view into the original object. This should be safe in general, but it may make sense to copy the result when the original object is mutable or untrusted.
#### Examples
    
    >>> import numpy as np
    >>> s = b'hello world'
    >>> np.frombuffer(s, dtype='S1', count=5, offset=6)
    array([b'w', b'o', b'r', b'l', b'd'], dtype='|S1')
    
    
    >>> np.frombuffer(b'\x01\x02', dtype=np.uint8)
    array([1, 2], dtype=uint8)
    >>> np.frombuffer(b'\x01\x02\x03\x04\x05', dtype=np.uint8, count=3)
    array([1, 2, 3], dtype=uint8)
    
# numpy.ma.fromflex
ma.fromflex(fxarray)[source]
    
Build a masked array from a suitable flexible-type array.
The input array has to have a data-type with `_data` and `_mask` fields. This type of array is output by `MaskedArray.toflex`.
Parameters:
    
fxarrayndarray
    
The structured input array, containing `_data` and `_mask` fields. If present, other fields are discarded.
Returns:
    
resultMaskedArray
    
The constructed masked array.
See also
`MaskedArray.toflex`
    
Build a flexible-type array from a masked array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(9).reshape(3, 3), mask=[0] + [1, 0] * 4)
    >>> rec = x.toflex()
    >>> rec
    array([[(0, False), (1,  True), (2, False)],
           [(3,  True), (4, False), (5,  True)],
           [(6, False), (7,  True), (8, False)]],
          dtype=[('_data', '<i8'), ('_mask', '?')])
    >>> x2 = np.ma.fromflex(rec)
    >>> x2
    masked_array(
      data=[[0, --, 2],
            [--, 4, --],
            [6, --, 8]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    
Extra fields can be present in the structured array but are discarded:
    
    >>> dt = [('_data', '<i4'), ('_mask', '|b1'), ('field3', '<f4')]
    >>> rec2 = np.zeros((2, 2), dtype=dt)
    >>> rec2
    array([[(0, False, 0.), (0, False, 0.)],
           [(0, False, 0.), (0, False, 0.)]],
          dtype=[('_data', '<i4'), ('_mask', '?'), ('field3', '<f4')])
    >>> y = np.ma.fromflex(rec2)
    >>> y
    masked_array(
      data=[[0, 0],
            [0, 0]],
      mask=[[False, False],
            [False, False]],
      fill_value=np.int64(999999),
      dtype=int32)
    
# numpy.ma.fromfunction
ma.fromfunction(function, shape, **dtype)=<numpy.ma.core._convert2ma object>
    
Construct an array by executing a function over each coordinate.
The resulting array therefore has a value `fn(x, y, z)` at coordinate `(x, y, z)`.
Parameters:
    
functioncallable
    
The function is called with N parameters, where N is the rank of `shape`. Each parameter represents the coordinates of the array varying along a specific axis. For example, if `shape` were `(2, 2)`, then the parameters would be `array([[0, 0], [1, 1]])` and `array([[0, 1], [0, 1]])`
shape(N,) tuple of ints
    
Shape of the output array, which also determines the shape of the coordinate arrays passed to `function`.
dtypedata-type, optional
    
Data-type of the coordinate arrays passed to `function`. By default, `dtype` is float.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
fromfunction: MaskedArray
    
The result of the call to `function` is passed back directly. Therefore the shape of `fromfunction` is completely determined by `function`. If `function` returns a scalar value, the shape of `fromfunction` would not match the `shape` parameter.
See also
`indices`, `meshgrid`
#### Notes
Keywords other than `dtype` and `like` are passed to `function`.
#### Examples
    
    >>> import numpy as np
    >>> np.fromfunction(lambda i, j: i, (2, 2), dtype=float)
    array([[0., 0.],
           [1., 1.]])
    
    
    >>> np.fromfunction(lambda i, j: j, (2, 2), dtype=float)
    array([[0., 1.],
           [0., 1.]])
    
    
    >>> np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
    array([[ True, False, False],
           [False,  True, False],
           [False, False,  True]])
    
    
    >>> np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4]])
    
# numpy.ma.getdata
ma.getdata(a, subok=True)[source]
    
Return the data of a masked array as an ndarray.
Return the data of `a` (if any) as an ndarray if `a` is a `MaskedArray`, else return `a` as a ndarray or subclass (depending on `subok`) if not.
Parameters:
    
aarray_like
    
Input `MaskedArray`, alternatively a ndarray or a subclass thereof.
subokbool
    
Whether to force the output to be a `pure` ndarray (False) or to return a subclass of ndarray if appropriate (True, default).
See also
`getmask`
    
Return the mask of a masked array, or nomask.
`getmaskarray`
    
Return the mask of a masked array, or full array of False.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = ma.masked_equal([[1,2],[3,4]], 2)
    >>> a
    masked_array(
      data=[[1, --],
            [3, 4]],
      mask=[[False,  True],
            [False, False]],
      fill_value=2)
    >>> ma.getdata(a)
    array([[1, 2],
           [3, 4]])
    
Equivalently use the `MaskedArray` `data` attribute.
    
    >>> a.data
    array([[1, 2],
           [3, 4]])
    
# numpy.ma.getmask
ma.getmask(a)[source]
    
Return the mask of a masked array, or nomask.
Return the mask of `a` as an ndarray if `a` is a `MaskedArray` and the mask is not `nomask`, else return `nomask`. To guarantee a full array of booleans of the same shape as a, use `getmaskarray`.
Parameters:
    
aarray_like
    
Input `MaskedArray` for which the mask is required.
See also
`getdata`
    
Return the data of a masked array as an ndarray.
`getmaskarray`
    
Return the mask of a masked array, or full array of False.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = ma.masked_equal([[1,2],[3,4]], 2)
    >>> a
    masked_array(
      data=[[1, --],
            [3, 4]],
      mask=[[False,  True],
            [False, False]],
      fill_value=2)
    >>> ma.getmask(a)
    array([[False,  True],
           [False, False]])
    
Equivalently use the `MaskedArray` `mask` attribute.
    
    >>> a.mask
    array([[False,  True],
           [False, False]])
    
Result when mask == `nomask`
    
    >>> b = ma.masked_array([[1,2],[3,4]])
    >>> b
    masked_array(
      data=[[1, 2],
            [3, 4]],
      mask=False,
      fill_value=999999)
    >>> ma.nomask
    False
    >>> ma.getmask(b) == ma.nomask
    True
    >>> b.mask == ma.nomask
    True
    
# numpy.ma.getmaskarray
ma.getmaskarray(arr)[source]
    
Return the mask of a masked array, or full boolean array of False.
Return the mask of `arr` as an ndarray if `arr` is a `MaskedArray` and the mask is not `nomask`, else return a full boolean array of False of the same shape as `arr`.
Parameters:
    
arrarray_like
    
Input `MaskedArray` for which the mask is required.
See also
`getmask`
    
Return the mask of a masked array, or nomask.
`getdata`
    
Return the data of a masked array as an ndarray.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = ma.masked_equal([[1,2],[3,4]], 2)
    >>> a
    masked_array(
      data=[[1, --],
            [3, 4]],
      mask=[[False,  True],
            [False, False]],
      fill_value=2)
    >>> ma.getmaskarray(a)
    array([[False,  True],
           [False, False]])
    
Result when mask == `nomask`
    
    >>> b = ma.masked_array([[1,2],[3,4]])
    >>> b
    masked_array(
      data=[[1, 2],
            [3, 4]],
      mask=False,
      fill_value=999999)
    >>> ma.getmaskarray(b)
    array([[False, False],
           [False, False]])
    
# numpy.ma.harden_mask
ma.harden_mask(self)=<numpy.ma.core._frommethod object>
    
Force the mask to hard, preventing unmasking by assignment.
Whether the mask of a masked array is hard or soft is determined by its `hardmask` property. `harden_mask` sets `hardmask` to `True` (and returns the modified self).
See also
`ma.MaskedArray.hardmask`
`ma.MaskedArray.soften_mask`
# numpy.ma.hsplit
ma.hsplit=<numpy.ma.extras._fromnxfunction_single object>
    
Split an array into multiple sub-arrays horizontally (column-wise).
Please refer to the `split` documentation. `hsplit` is equivalent to `split` with `axis=1`, the array is always split along the second axis except for 1-D arrays, where it is split at `axis=0`.
See also
`split`
    
Split an array into multiple sub-arrays of equal size.
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(16.0).reshape(4, 4)
    >>> x
    array([[ 0.,   1.,   2.,   3.],
           [ 4.,   5.,   6.,   7.],
           [ 8.,   9.,  10.,  11.],
           [12.,  13.,  14.,  15.]])
    >>> np.hsplit(x, 2)
    [array([[  0.,   1.],
           [  4.,   5.],
           [  8.,   9.],
           [12.,  13.]]),
     array([[  2.,   3.],
           [  6.,   7.],
           [10.,  11.],
           [14.,  15.]])]
    >>> np.hsplit(x, np.array([3, 6]))
    [array([[ 0.,   1.,   2.],
           [ 4.,   5.,   6.],
           [ 8.,   9.,  10.],
           [12.,  13.,  14.]]),
     array([[ 3.],
           [ 7.],
           [11.],
           [15.]]),
     array([], shape=(4, 0), dtype=float64)]
    
With a higher dimensional array the split is still along the second axis.
    
    >>> x = np.arange(8.0).reshape(2, 2, 2)
    >>> x
    array([[[0.,  1.],
            [2.,  3.]],
           [[4.,  5.],
            [6.,  7.]]])
    >>> np.hsplit(x, 2)
    [array([[[0.,  1.]],
           [[4.,  5.]]]),
     array([[[2.,  3.]],
           [[6.,  7.]]])]
    
With a 1-D array, the split is along axis 0.
    
    >>> x = np.array([0, 1, 2, 3, 4, 5])
    >>> np.hsplit(x, 2)
    [array([0, 1, 2]), array([3, 4, 5])]
    
# numpy.ma.hstack
ma.hstack=<numpy.ma.extras._fromnxfunction_seq object>
    
Stack arrays in sequence horizontally (column wise).
This is equivalent to concatenation along the second axis, except for 1-D arrays where it concatenates along the first axis. Rebuilds arrays divided by `hsplit`.
This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations.
Parameters:
    
tupsequence of ndarrays
    
The arrays must have the same shape along all but the second axis, except 1-D arrays which can be any length. In the case of a single array_like input, it will be treated as a sequence of arrays; i.e., each element along the zeroth axis is treated as a separate array.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.24.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’.
New in version 1.24.
Returns:
    
stackedndarray
    
The array formed by stacking the given arrays.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`vstack`
    
Stack arrays in sequence vertically (row wise).
`dstack`
    
Stack arrays in sequence depth wise (along third axis).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`hsplit`
    
Split an array into multiple sub-arrays horizontally (column-wise).
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((1,2,3))
    >>> b = np.array((4,5,6))
    >>> np.hstack((a,b))
    array([1, 2, 3, 4, 5, 6])
    >>> a = np.array([[1],[2],[3]])
    >>> b = np.array([[4],[5],[6]])
    >>> np.hstack((a,b))
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
# numpy.ma.identity
ma.identity(n, dtype=None)=<numpy.ma.core._convert2ma object>
    
Return the identity array.
The identity array is a square array with ones on the main diagonal.
Parameters:
    
nint
    
Number of rows (and columns) in `n` x `n` output.
dtypedata-type, optional
    
Data-type of the output. Defaults to `float`.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outMaskedArray
    
`n` x `n` array with its main diagonal set to one, and all other elements 0.
#### Examples
    
    >>> import numpy as np
    >>> np.identity(3)
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    
# numpy.ma.in1d
ma.in1d(ar1, ar2, assume_unique=False, invert=False)[source]
    
Test whether each element of an array is also present in a second array.
The output is always a masked array. See `numpy.in1d` for more details.
We recommend using `isin` instead of `in1d` for new code.
See also
`isin`
    
Version of this function that preserves the shape of ar1.
`numpy.in1d`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> ar1 = np.ma.array([0, 1, 2, 5, 0])
    >>> ar2 = [0, 2]
    >>> np.ma.in1d(ar1, ar2)
    masked_array(data=[ True, False,  True, False,  True],
                 mask=False,
           fill_value=True)
    
# numpy.ma.indices
ma.indices(dimensions, dtype=<class 'int'>, sparse=False)=<numpy.ma.core._convert2ma object>
    
Return an array representing the indices of a grid.
Compute an array where the subarrays contain index values 0, 1, … varying only along the corresponding axis.
Parameters:
    
dimensionssequence of ints
    
The shape of the grid.
dtypedtype, optional
    
Data type of the result.
sparseboolean, optional
    
Return a sparse representation of the grid instead of a dense representation. Default is False.
Returns:
    
gridone MaskedArray or tuple of MaskedArrays
    
If sparse is False:
    
Returns one array of grid indices, `grid.shape = (len(dimensions),) + tuple(dimensions)`.
If sparse is True:
    
Returns a tuple of arrays, with `grid[i].shape = (1, ..., 1, dimensions[i], 1, ..., 1)` with dimensions[i] in the ith place
See also
`mgrid`, `ogrid`, `meshgrid`
#### Notes
The output shape in the dense case is obtained by prepending the number of dimensions in front of the tuple of dimensions, i.e. if `dimensions` is a tuple `(r0, ..., rN-1)` of length `N`, the output shape is `(N, r0, ..., rN-1)`.
The subarrays `grid[k]` contains the N-D array of indices along the `k-th` axis. Explicitly:
    
    grid[k, i0, i1, ..., iN-1] = ik
    
#### Examples
    
    >>> import numpy as np
    >>> grid = np.indices((2, 3))
    >>> grid.shape
    (2, 2, 3)
    >>> grid[0]        # row indices
    array([[0, 0, 0],
           [1, 1, 1]])
    >>> grid[1]        # column indices
    array([[0, 1, 2],
           [0, 1, 2]])
    
The indices can be used as an index into an array.
    
    >>> x = np.arange(20).reshape(5, 4)
    >>> row, col = np.indices((2, 3))
    >>> x[row, col]
    array([[0, 1, 2],
           [4, 5, 6]])
    
Note that it would be more straightforward in the above example to extract the required elements directly with `x[:2, :3]`.
If sparse is set to true, the grid will be returned in a sparse representation.
    
    >>> i, j = np.indices((2, 3), sparse=True)
    >>> i.shape
    (2, 1)
    >>> j.shape
    (1, 3)
    >>> i        # row indices
    array([[0],
           [1]])
    >>> j        # column indices
    array([[0, 1, 2]])
    
# numpy.ma.inner
ma.inner(a, b, /)[source]
    
Inner product of two arrays.
Ordinary inner product of vectors for 1-D arrays (without complex conjugation), in higher dimensions a sum product over the last axes.
Parameters:
    
a, barray_like
    
If `a` and `b` are nonscalar, their last dimensions must match.
Returns:
    
outndarray
    
If `a` and `b` are both scalars or both 1-D arrays then a scalar is returned; otherwise an array is returned. `out.shape = (*a.shape[:-1], *b.shape[:-1])`
Raises:
    
ValueError
    
If both `a` and `b` are nonscalar and their last dimensions have different sizes.
See also
`tensordot`
    
Sum products over arbitrary axes.
`dot`
    
Generalised matrix product, using second last dimension of `b`.
`vecdot`
    
Vector dot product of two arrays.
`einsum`
    
Einstein summation convention.
#### Notes
Masked values are replaced by 0.
For vectors (1-D arrays) it computes the ordinary inner-product:
    
    np.inner(a, b) = sum(a[:]*b[:])
    
More generally, if `ndim(a) = r > 0` and `ndim(b) = s > 0`:
    
    np.inner(a, b) = np.tensordot(a, b, axes=(-1,-1))
    
or explicitly:
    
    np.inner(a, b)[i0,...,ir-2,j0,...,js-2]
         = sum(a[i0,...,ir-2,:]*b[j0,...,js-2,:])
    
In addition `a` or `b` may be scalars, in which case:
    
    np.inner(a,b) = a*b
    
#### Examples
Ordinary inner product for vectors:
    
    >>> import numpy as np
    >>> a = np.array([1,2,3])
    >>> b = np.array([0,1,0])
    >>> np.inner(a, b)
    2
    
Some multidimensional examples:
    
    >>> a = np.arange(24).reshape((2,3,4))
    >>> b = np.arange(4)
    >>> c = np.inner(a, b)
    >>> c.shape
    (2, 3)
    >>> c
    array([[ 14,  38,  62],
           [ 86, 110, 134]])
    
    
    >>> a = np.arange(2).reshape((1,1,2))
    >>> b = np.arange(6).reshape((3,2))
    >>> c = np.inner(a, b)
    >>> c.shape
    (1, 1, 3)
    >>> c
    array([[[1, 3, 5]]])
    
An example where `b` is a scalar:
    
    >>> np.inner(np.eye(2), 7)
    array([[7., 0.],
           [0., 7.]])
    
# numpy.ma.innerproduct
ma.innerproduct(a, b, /)[source]
    
Inner product of two arrays.
Ordinary inner product of vectors for 1-D arrays (without complex conjugation), in higher dimensions a sum product over the last axes.
Parameters:
    
a, barray_like
    
If `a` and `b` are nonscalar, their last dimensions must match.
Returns:
    
outndarray
    
If `a` and `b` are both scalars or both 1-D arrays then a scalar is returned; otherwise an array is returned. `out.shape = (*a.shape[:-1], *b.shape[:-1])`
Raises:
    
ValueError
    
If both `a` and `b` are nonscalar and their last dimensions have different sizes.
See also
`tensordot`
    
Sum products over arbitrary axes.
`dot`
    
Generalised matrix product, using second last dimension of `b`.
`vecdot`
    
Vector dot product of two arrays.
`einsum`
    
Einstein summation convention.
#### Notes
Masked values are replaced by 0.
For vectors (1-D arrays) it computes the ordinary inner-product:
    
    np.inner(a, b) = sum(a[:]*b[:])
    
More generally, if `ndim(a) = r > 0` and `ndim(b) = s > 0`:
    
    np.inner(a, b) = np.tensordot(a, b, axes=(-1,-1))
    
or explicitly:
    
    np.inner(a, b)[i0,...,ir-2,j0,...,js-2]
         = sum(a[i0,...,ir-2,:]*b[j0,...,js-2,:])
    
In addition `a` or `b` may be scalars, in which case:
    
    np.inner(a,b) = a*b
    
#### Examples
Ordinary inner product for vectors:
    
    >>> import numpy as np
    >>> a = np.array([1,2,3])
    >>> b = np.array([0,1,0])
    >>> np.inner(a, b)
    2
    
Some multidimensional examples:
    
    >>> a = np.arange(24).reshape((2,3,4))
    >>> b = np.arange(4)
    >>> c = np.inner(a, b)
    >>> c.shape
    (2, 3)
    >>> c
    array([[ 14,  38,  62],
           [ 86, 110, 134]])
    
    
    >>> a = np.arange(2).reshape((1,1,2))
    >>> b = np.arange(6).reshape((3,2))
    >>> c = np.inner(a, b)
    >>> c.shape
    (1, 1, 3)
    >>> c
    array([[[1, 3, 5]]])
    
An example where `b` is a scalar:
    
    >>> np.inner(np.eye(2), 7)
    array([[7., 0.],
           [0., 7.]])
    
# numpy.ma.intersect1d
ma.intersect1d(ar1, ar2, assume_unique=False)[source]
    
Returns the unique elements common to both arrays.
Masked values are considered equal one to the other. The output is always a masked array.
See `numpy.intersect1d` for more details.
See also
`numpy.intersect1d`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1, 3, 3, 3], mask=[0, 0, 0, 1])
    >>> y = np.ma.array([3, 1, 1, 1], mask=[0, 0, 0, 1])
    >>> np.ma.intersect1d(x, y)
    masked_array(data=[1, 3, --],
                 mask=[False, False,  True],
           fill_value=999999)
    
# numpy.ma.is_mask
ma.is_mask(m)[source]
    
Return True if m is a valid, standard mask.
This function does not check the contents of the input, only that the type is MaskType. In particular, this function returns False if the mask has a flexible dtype.
Parameters:
    
marray_like
    
Array to test.
Returns:
    
resultbool
    
True if `m.dtype.type` is MaskType, False otherwise.
See also
`ma.isMaskedArray`
    
Test whether input is an instance of MaskedArray.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> m = ma.masked_equal([0, 1, 0, 2, 3], 0)
    >>> m
    masked_array(data=[--, 1, --, 2, 3],
                 mask=[ True, False,  True, False, False],
           fill_value=0)
    >>> ma.is_mask(m)
    False
    >>> ma.is_mask(m.mask)
    True
    
Input must be an ndarray (or have similar attributes) for it to be considered a valid mask.
    
    >>> m = [False, True, False]
    >>> ma.is_mask(m)
    False
    >>> m = np.array([False, True, False])
    >>> m
    array([False,  True, False])
    >>> ma.is_mask(m)
    True
    
Arrays with complex dtypes don’t return True.
    
    >>> dtype = np.dtype({'names':['monty', 'pithon'],
    ...                   'formats':[bool, bool]})
    >>> dtype
    dtype([('monty', '|b1'), ('pithon', '|b1')])
    >>> m = np.array([(True, False), (False, True), (True, False)],
    ...              dtype=dtype)
    >>> m
    array([( True, False), (False,  True), ( True, False)],
          dtype=[('monty', '?'), ('pithon', '?')])
    >>> ma.is_mask(m)
    False
    
# numpy.ma.is_masked
ma.is_masked(x)[source]
    
Determine whether input has masked values.
Accepts any object as input, but always returns False unless the input is a MaskedArray containing masked values.
Parameters:
    
xarray_like
    
Array to check for masked values.
Returns:
    
resultbool
    
True if `x` is a MaskedArray with masked values, False otherwise.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = ma.masked_equal([0, 1, 0, 2, 3], 0)
    >>> x
    masked_array(data=[--, 1, --, 2, 3],
                 mask=[ True, False,  True, False, False],
           fill_value=0)
    >>> ma.is_masked(x)
    True
    >>> x = ma.masked_equal([0, 1, 0, 2, 3], 42)
    >>> x
    masked_array(data=[0, 1, 0, 2, 3],
                 mask=False,
           fill_value=42)
    >>> ma.is_masked(x)
    False
    
Always returns False if `x` isn’t a MaskedArray.
    
    >>> x = [False, True, False]
    >>> ma.is_masked(x)
    False
    >>> x = 'a string'
    >>> ma.is_masked(x)
    False
    
# numpy.ma.isarray
ma.isarray(x)[source]
    
Test whether input is an instance of MaskedArray.
This function returns True if `x` is an instance of MaskedArray and returns False otherwise. Any object is accepted as input.
Parameters:
    
xobject
    
Object to test.
Returns:
    
resultbool
    
True if `x` is a MaskedArray.
See also
`isMA`
    
Alias to isMaskedArray.
`isarray`
    
Alias to isMaskedArray.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.eye(3, 3)
    >>> a
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    >>> m = ma.masked_values(a, 0)
    >>> m
    masked_array(
      data=[[1.0, --, --],
            [--, 1.0, --],
            [--, --, 1.0]],
      mask=[[False,  True,  True],
            [ True, False,  True],
            [ True,  True, False]],
      fill_value=0.0)
    >>> ma.isMaskedArray(a)
    False
    >>> ma.isMaskedArray(m)
    True
    >>> ma.isMaskedArray([0, 1, 2])
    False
    
# numpy.ma.isin
ma.isin(element, test_elements, assume_unique=False, invert=False)[source]
    
Calculates `element in test_elements`, broadcasting over `element` only.
The output is always a masked array of the same shape as `element`. See `numpy.isin` for more details.
See also
`in1d`
    
Flattened version of this function.
`numpy.isin`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> element = np.ma.array([1, 2, 3, 4, 5, 6])
    >>> test_elements = [0, 2]
    >>> np.ma.isin(element, test_elements)
    masked_array(data=[False,  True, False, False, False, False],
                 mask=False,
           fill_value=True)
    
# numpy.ma.isMA
ma.isMA(x)[source]
    
Test whether input is an instance of MaskedArray.
This function returns True if `x` is an instance of MaskedArray and returns False otherwise. Any object is accepted as input.
Parameters:
    
xobject
    
Object to test.
Returns:
    
resultbool
    
True if `x` is a MaskedArray.
See also
`isMA`
    
Alias to isMaskedArray.
`isarray`
    
Alias to isMaskedArray.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.eye(3, 3)
    >>> a
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    >>> m = ma.masked_values(a, 0)
    >>> m
    masked_array(
      data=[[1.0, --, --],
            [--, 1.0, --],
            [--, --, 1.0]],
      mask=[[False,  True,  True],
            [ True, False,  True],
            [ True,  True, False]],
      fill_value=0.0)
    >>> ma.isMaskedArray(a)
    False
    >>> ma.isMaskedArray(m)
    True
    >>> ma.isMaskedArray([0, 1, 2])
    False
    
# numpy.ma.isMaskedArray
ma.isMaskedArray(x)[source]
    
Test whether input is an instance of MaskedArray.
This function returns True if `x` is an instance of MaskedArray and returns False otherwise. Any object is accepted as input.
Parameters:
    
xobject
    
Object to test.
Returns:
    
resultbool
    
True if `x` is a MaskedArray.
See also
`isMA`
    
Alias to isMaskedArray.
`isarray`
    
Alias to isMaskedArray.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.eye(3, 3)
    >>> a
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    >>> m = ma.masked_values(a, 0)
    >>> m
    masked_array(
      data=[[1.0, --, --],
            [--, 1.0, --],
            [--, --, 1.0]],
      mask=[[False,  True,  True],
            [ True, False,  True],
            [ True,  True, False]],
      fill_value=0.0)
    >>> ma.isMaskedArray(a)
    False
    >>> ma.isMaskedArray(m)
    True
    >>> ma.isMaskedArray([0, 1, 2])
    False
    
# numpy.ma.left_shift
ma.left_shift(a, n)[source]
    
Shift the bits of an integer to the left.
This is the masked array version of `numpy.left_shift`, for details see that function.
See also
`numpy.left_shift`
#### Examples
Shift with a masked array:
    
    >>> arr = np.ma.array([10, 20, 30], mask=[False, True, False])
    >>> np.ma.left_shift(arr, 1)
    masked_array(data=[20, --, 60],
                 mask=[False,  True, False],
           fill_value=999999)
    
Large shift:
    
    >>> np.ma.left_shift(10, 10)
    masked_array(data=10240,
                 mask=False,
           fill_value=999999)
    
Shift with a scalar and an array:
    
    >>> scalar = 10
    >>> arr = np.ma.array([1, 2, 3], mask=[False, True, False])
    >>> np.ma.left_shift(scalar, arr)
    masked_array(data=[20, --, 80],
                 mask=[False,  True, False],
           fill_value=999999)
    
# numpy.ma.make_mask
ma.make_mask(m, copy=False, shrink=True, dtype=<class 'numpy.bool'>)[source]
    
Create a boolean mask from an array.
Return `m` as a boolean mask, creating a copy if necessary or requested. The function can accept any sequence that is convertible to integers, or `nomask`. Does not require that contents must be 0s and 1s, values of 0 are interpreted as False, everything else as True.
Parameters:
    
marray_like
    
Potential mask.
copybool, optional
    
Whether to return a copy of `m` (True) or `m` itself (False).
shrinkbool, optional
    
Whether to shrink `m` to `nomask` if all its values are False.
dtypedtype, optional
    
Data-type of the output mask. By default, the output mask has a dtype of MaskType (bool). If the dtype is flexible, each field has a boolean dtype. This is ignored when `m` is `nomask`, in which case `nomask` is always returned.
Returns:
    
resultndarray
    
A boolean mask derived from `m`.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> m = [True, False, True, True]
    >>> ma.make_mask(m)
    array([ True, False,  True,  True])
    >>> m = [1, 0, 1, 1]
    >>> ma.make_mask(m)
    array([ True, False,  True,  True])
    >>> m = [1, 0, 2, -3]
    >>> ma.make_mask(m)
    array([ True, False,  True,  True])
    
Effect of the `shrink` parameter.
    
    >>> m = np.zeros(4)
    >>> m
    array([0., 0., 0., 0.])
    >>> ma.make_mask(m)
    False
    >>> ma.make_mask(m, shrink=False)
    array([False, False, False, False])
    
Using a flexible `dtype`.
    
    >>> m = [1, 0, 1, 1]
    >>> n = [0, 1, 0, 0]
    >>> arr = []
    >>> for man, mouse in zip(m, n):
    ...     arr.append((man, mouse))
    >>> arr
    [(1, 0), (0, 1), (1, 0), (1, 0)]
    >>> dtype = np.dtype({'names':['man', 'mouse'],
    ...                   'formats':[np.int64, np.int64]})
    >>> arr = np.array(arr, dtype=dtype)
    >>> arr
    array([(1, 0), (0, 1), (1, 0), (1, 0)],
          dtype=[('man', '<i8'), ('mouse', '<i8')])
    >>> ma.make_mask(arr, dtype=dtype)
    array([(True, False), (False, True), (True, False), (True, False)],
          dtype=[('man', '|b1'), ('mouse', '|b1')])
    
# numpy.ma.make_mask_descr
ma.make_mask_descr(ndtype)[source]
    
Construct a dtype description list from a given dtype.
Returns a new dtype object, with the type of all fields in `ndtype` to a boolean type. Field names are not altered.
Parameters:
    
ndtypedtype
    
The dtype to convert.
Returns:
    
resultdtype
    
A dtype that looks like `ndtype`, the type of all fields is boolean.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> dtype = np.dtype({'names':['foo', 'bar'],
    ...                   'formats':[np.float32, np.int64]})
    >>> dtype
    dtype([('foo', '<f4'), ('bar', '<i8')])
    >>> ma.make_mask_descr(dtype)
    dtype([('foo', '|b1'), ('bar', '|b1')])
    >>> ma.make_mask_descr(np.float32)
    dtype('bool')
    
# numpy.ma.make_mask_none
ma.make_mask_none(newshape, dtype=None)[source]
    
Return a boolean mask of the given shape, filled with False.
This function returns a boolean ndarray with all entries False, that can be used in common mask manipulations. If a complex dtype is specified, the type of each field is converted to a boolean type.
Parameters:
    
newshapetuple
    
A tuple indicating the shape of the mask.
dtype{None, dtype}, optional
    
If None, use a MaskType instance. Otherwise, use a new datatype with the same fields as `dtype`, converted to boolean types.
Returns:
    
resultndarray
    
An ndarray of appropriate shape and dtype, filled with False.
See also
`make_mask`
    
Create a boolean mask from an array.
`make_mask_descr`
    
Construct a dtype description list from a given dtype.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> ma.make_mask_none((3,))
    array([False, False, False])
    
Defining a more complex dtype.
    
    >>> dtype = np.dtype({'names':['foo', 'bar'],
    ...                   'formats':[np.float32, np.int64]})
    >>> dtype
    dtype([('foo', '<f4'), ('bar', '<i8')])
    >>> ma.make_mask_none((3,), dtype=dtype)
    array([(False, False), (False, False), (False, False)],
          dtype=[('foo', '|b1'), ('bar', '|b1')])
    
# numpy.ma.mask_cols
ma.mask_cols(a, axis=<no value>)[source]
    
Mask columns of a 2D array that contain masked values.
This function is a shortcut to `mask_rowcols` with `axis` equal to 1.
See also
`mask_rowcols`
    
Mask rows and/or columns of a 2D array.
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> a = np.zeros((3, 3), dtype=int)
    >>> a[1, 1] = 1
    >>> a
    array([[0, 0, 0],
           [0, 1, 0],
           [0, 0, 0]])
    >>> a = np.ma.masked_equal(a, 1)
    >>> a
    masked_array(
      data=[[0, 0, 0],
            [0, --, 0],
            [0, 0, 0]],
      mask=[[False, False, False],
            [False,  True, False],
            [False, False, False]],
      fill_value=1)
    >>> np.ma.mask_cols(a)
    masked_array(
      data=[[0, --, 0],
            [0, --, 0],
            [0, --, 0]],
      mask=[[False,  True, False],
            [False,  True, False],
            [False,  True, False]],
      fill_value=1)
    
# numpy.ma.mask_or
ma.mask_or(m1, m2, copy=False, shrink=True)[source]
    
Combine two masks with the `logical_or` operator.
The result may be a view on `m1` or `m2` if the other is `nomask` (i.e. False).
Parameters:
    
m1, m2array_like
    
Input masks.
copybool, optional
    
If copy is False and one of the inputs is `nomask`, return a view of the other input mask. Defaults to False.
shrinkbool, optional
    
Whether to shrink the output to `nomask` if all its values are False. Defaults to True.
Returns:
    
maskoutput mask
    
The result masks values that are masked in either `m1` or `m2`.
Raises:
    
ValueError
    
If `m1` and `m2` have different flexible dtypes.
#### Examples
    
    >>> import numpy as np
    >>> m1 = np.ma.make_mask([0, 1, 1, 0])
    >>> m2 = np.ma.make_mask([1, 0, 0, 0])
    >>> np.ma.mask_or(m1, m2)
    array([ True,  True,  True, False])
    
# numpy.ma.mask_rowcols
ma.mask_rowcols(a, axis=None)[source]
    
Mask rows and/or columns of a 2D array that contain masked values.
Mask whole rows and/or columns of a 2D array that contain masked values. The masking behavior is selected using the `axis` parameter.
  * If `axis` is None, rows and columns are masked.
  * If `axis` is 0, only rows are masked.
  * If `axis` is 1 or -1, only columns are masked.


Parameters:
    
aarray_like, MaskedArray
    
The array to mask. If not a MaskedArray instance (or if no array elements are masked), the result is a MaskedArray with `mask` set to `nomask` (False). Must be a 2D array.
axisint, optional
    
Axis along which to perform the operation. If None, applies to a flattened version of the array.
Returns:
    
aMaskedArray
    
A modified version of the input array, masked depending on the value of the `axis` parameter.
Raises:
    
NotImplementedError
    
If input array `a` is not 2D.
See also
`mask_rows`
    
Mask rows of a 2D array that contain masked values.
`mask_cols`
    
Mask cols of a 2D array that contain masked values.
`masked_where`
    
Mask where a condition is met.
#### Notes
The input array’s mask is modified by this function.
#### Examples
    
    >>> import numpy as np
    >>> a = np.zeros((3, 3), dtype=int)
    >>> a[1, 1] = 1
    >>> a
    array([[0, 0, 0],
           [0, 1, 0],
           [0, 0, 0]])
    >>> a = np.ma.masked_equal(a, 1)
    >>> a
    masked_array(
      data=[[0, 0, 0],
            [0, --, 0],
            [0, 0, 0]],
      mask=[[False, False, False],
            [False,  True, False],
            [False, False, False]],
      fill_value=1)
    >>> np.ma.mask_rowcols(a)
    masked_array(
      data=[[0, --, 0],
            [--, --, --],
            [0, --, 0]],
      mask=[[False,  True, False],
            [ True,  True,  True],
            [False,  True, False]],
      fill_value=1)
    
# numpy.ma.mask_rows
ma.mask_rows(a, axis=<no value>)[source]
    
Mask rows of a 2D array that contain masked values.
This function is a shortcut to `mask_rowcols` with `axis` equal to 0.
See also
`mask_rowcols`
    
Mask rows and/or columns of a 2D array.
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> a = np.zeros((3, 3), dtype=int)
    >>> a[1, 1] = 1
    >>> a
    array([[0, 0, 0],
           [0, 1, 0],
           [0, 0, 0]])
    >>> a = np.ma.masked_equal(a, 1)
    >>> a
    masked_array(
      data=[[0, 0, 0],
            [0, --, 0],
            [0, 0, 0]],
      mask=[[False, False, False],
            [False,  True, False],
            [False, False, False]],
      fill_value=1)
    
    
    >>> np.ma.mask_rows(a)
    masked_array(
      data=[[0, 0, 0],
            [--, --, --],
            [0, 0, 0]],
      mask=[[False, False, False],
            [ True,  True,  True],
            [False, False, False]],
      fill_value=1)
    
# numpy.ma.masked_all
ma.masked_all(shape, dtype=<class 'float'>)[source]
    
Empty masked array with all elements masked.
Return an empty masked array of the given shape and dtype, where all the data are masked.
Parameters:
    
shapeint or tuple of ints
    
Shape of the required MaskedArray, e.g., `(2, 3)` or `2`.
dtypedtype, optional
    
Data type of the output.
Returns:
    
aMaskedArray
    
A masked array with all data masked.
See also
`masked_all_like`
    
Empty masked array modelled on an existing array.
#### Notes
Unlike other masked array creation functions (e.g. `numpy.ma.zeros`, `numpy.ma.ones`, `numpy.ma.full`), `masked_all` does not initialize the values of the array, and may therefore be marginally faster. However, the values stored in the newly allocated array are arbitrary. For reproducible behavior, be sure to set each element of the array before reading.
#### Examples
    
    >>> import numpy as np
    >>> np.ma.masked_all((3, 3))
    masked_array(
      data=[[--, --, --],
            [--, --, --],
            [--, --, --]],
      mask=[[ True,  True,  True],
            [ True,  True,  True],
            [ True,  True,  True]],
      fill_value=1e+20,
      dtype=float64)
    
The `dtype` parameter defines the underlying data type.
    
    >>> a = np.ma.masked_all((3, 3))
    >>> a.dtype
    dtype('float64')
    >>> a = np.ma.masked_all((3, 3), dtype=np.int32)
    >>> a.dtype
    dtype('int32')
    
# numpy.ma.masked_all_like
ma.masked_all_like(arr)[source]
    
Empty masked array with the properties of an existing array.
Return an empty masked array of the same shape and dtype as the array `arr`, where all the data are masked.
Parameters:
    
arrndarray
    
An array describing the shape and dtype of the required MaskedArray.
Returns:
    
aMaskedArray
    
A masked array with all data masked.
Raises:
    
AttributeError
    
If `arr` doesn’t have a shape attribute (i.e. not an ndarray)
See also
`masked_all`
    
Empty masked array with all elements masked.
#### Notes
Unlike other masked array creation functions (e.g. `numpy.ma.zeros_like`, `numpy.ma.ones_like`, `numpy.ma.full_like`), `masked_all_like` does not initialize the values of the array, and may therefore be marginally faster. However, the values stored in the newly allocated array are arbitrary. For reproducible behavior, be sure to set each element of the array before reading.
#### Examples
    
    >>> import numpy as np
    >>> arr = np.zeros((2, 3), dtype=np.float32)
    >>> arr
    array([[0., 0., 0.],
           [0., 0., 0.]], dtype=float32)
    >>> np.ma.masked_all_like(arr)
    masked_array(
      data=[[--, --, --],
            [--, --, --]],
      mask=[[ True,  True,  True],
            [ True,  True,  True]],
      fill_value=np.float64(1e+20),
      dtype=float32)
    
The dtype of the masked array matches the dtype of `arr`.
    
    >>> arr.dtype
    dtype('float32')
    >>> np.ma.masked_all_like(arr).dtype
    dtype('float32')
    
# numpy.ma.masked_array
numpy.ma.masked_array[source]
    
alias of `MaskedArray`
# numpy.ma.masked_array.mask
property
propertyma.masked_array.mask
    
Current mask.
# numpy.ma.masked_equal
ma.masked_equal(x, value, copy=True)[source]
    
Mask an array where equal to a given value.
Return a MaskedArray, masked where the data in array `x` are equal to `value`. The fill_value of the returned MaskedArray is set to `value`.
For floating point arrays, consider using `masked_values(x, value)`.
See also
`masked_where`
    
Mask where a condition is met.
`masked_values`
    
Mask using floating point equality.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_equal(a, 2)
    masked_array(data=[0, 1, --, 3],
                 mask=[False, False,  True, False],
           fill_value=2)
    
# numpy.ma.masked_greater
ma.masked_greater(x, value, copy=True)[source]
    
Mask an array where greater than a given value.
This function is a shortcut to `masked_where`, with `condition` = (x > value).
See also
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_greater(a, 2)
    masked_array(data=[0, 1, 2, --],
                 mask=[False, False, False,  True],
           fill_value=999999)
    
# numpy.ma.masked_greater_equal
ma.masked_greater_equal(x, value, copy=True)[source]
    
Mask an array where greater than or equal to a given value.
This function is a shortcut to `masked_where`, with `condition` = (x >= value).
See also
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_greater_equal(a, 2)
    masked_array(data=[0, 1, --, --],
                 mask=[False, False,  True,  True],
           fill_value=999999)
    
# numpy.ma.masked_inside
ma.masked_inside(x, v1, v2, copy=True)[source]
    
Mask an array inside a given interval.
Shortcut to `masked_where`, where `condition` is True for `x` inside the interval [v1,v2] (v1 <= x <= v2). The boundaries `v1` and `v2` can be given in either order.
See also
`masked_where`
    
Mask where a condition is met.
#### Notes
The array `x` is prefilled with its filling value.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [0.31, 1.2, 0.01, 0.2, -0.4, -1.1]
    >>> ma.masked_inside(x, -0.3, 0.3)
    masked_array(data=[0.31, 1.2, --, --, -0.4, -1.1],
                 mask=[False, False,  True,  True, False, False],
           fill_value=1e+20)
    
The order of `v1` and `v2` doesn’t matter.
    
    >>> ma.masked_inside(x, 0.3, -0.3)
    masked_array(data=[0.31, 1.2, --, --, -0.4, -1.1],
                 mask=[False, False,  True,  True, False, False],
           fill_value=1e+20)
    
# numpy.ma.masked_invalid
ma.masked_invalid(a, copy=True)[source]
    
Mask an array where invalid values occur (NaNs or infs).
This function is a shortcut to `masked_where`, with `condition` = ~(np.isfinite(a)). Any pre-existing mask is conserved. Only applies to arrays with a dtype where NaNs or infs make sense (i.e. floating point types), but accepts any array_like object.
See also
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(5, dtype=float)
    >>> a[2] = np.nan
    >>> a[3] = np.inf
    >>> a
    array([ 0.,  1., nan, inf,  4.])
    >>> ma.masked_invalid(a)
    masked_array(data=[0.0, 1.0, --, --, 4.0],
                 mask=[False, False,  True,  True, False],
           fill_value=1e+20)
    
# numpy.ma.masked_less
ma.masked_less(x, value, copy=True)[source]
    
Mask an array where less than a given value.
This function is a shortcut to `masked_where`, with `condition` = (x < value).
See also
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_less(a, 2)
    masked_array(data=[--, --, 2, 3],
                 mask=[ True,  True, False, False],
           fill_value=999999)
    
# numpy.ma.masked_less_equal
ma.masked_less_equal(x, value, copy=True)[source]
    
Mask an array where less than or equal to a given value.
This function is a shortcut to `masked_where`, with `condition` = (x <= value).
See also
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_less_equal(a, 2)
    masked_array(data=[--, --, --, 3],
                 mask=[ True,  True,  True, False],
           fill_value=999999)
    
# numpy.ma.masked_not_equal
ma.masked_not_equal(x, value, copy=True)[source]
    
Mask an array where not equal to a given value.
This function is a shortcut to `masked_where`, with `condition` = (x != value).
See also
`masked_where`
    
Mask where a condition is met.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_not_equal(a, 2)
    masked_array(data=[--, --, 2, --],
                 mask=[ True,  True, False,  True],
           fill_value=999999)
    
# numpy.ma.masked_object
ma.masked_object(x, value, copy=True, shrink=True)[source]
    
Mask the array `x` where the data are exactly equal to value.
This function is similar to `masked_values`, but only suitable for object arrays: for floating point, use `masked_values` instead.
Parameters:
    
xarray_like
    
Array to mask
valueobject
    
Comparison value
copy{True, False}, optional
    
Whether to return a copy of `x`.
shrink{True, False}, optional
    
Whether to collapse a mask full of False to nomask
Returns:
    
resultMaskedArray
    
The result of masking `x` where equal to `value`.
See also
`masked_where`
    
Mask where a condition is met.
`masked_equal`
    
Mask where equal to a given value (integers).
`masked_values`
    
Mask using floating point equality.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> food = np.array(['green_eggs', 'ham'], dtype=object)
    >>> # don't eat spoiled food
    >>> eat = ma.masked_object(food, 'green_eggs')
    >>> eat
    masked_array(data=[--, 'ham'],
                 mask=[ True, False],
           fill_value='green_eggs',
                dtype=object)
    >>> # plain ol` ham is boring
    >>> fresh_food = np.array(['cheese', 'ham', 'pineapple'], dtype=object)
    >>> eat = ma.masked_object(fresh_food, 'green_eggs')
    >>> eat
    masked_array(data=['cheese', 'ham', 'pineapple'],
                 mask=False,
           fill_value='green_eggs',
                dtype=object)
    
Note that `mask` is set to `nomask` if possible.
    
    >>> eat
    masked_array(data=['cheese', 'ham', 'pineapple'],
                 mask=False,
           fill_value='green_eggs',
                dtype=object)
    
# numpy.ma.masked_outside
ma.masked_outside(x, v1, v2, copy=True)[source]
    
Mask an array outside a given interval.
Shortcut to `masked_where`, where `condition` is True for `x` outside the interval [v1,v2] (x < v1)|(x > v2). The boundaries `v1` and `v2` can be given in either order.
See also
`masked_where`
    
Mask where a condition is met.
#### Notes
The array `x` is prefilled with its filling value.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [0.31, 1.2, 0.01, 0.2, -0.4, -1.1]
    >>> ma.masked_outside(x, -0.3, 0.3)
    masked_array(data=[--, --, 0.01, 0.2, --, --],
                 mask=[ True,  True, False, False,  True,  True],
           fill_value=1e+20)
    
The order of `v1` and `v2` doesn’t matter.
    
    >>> ma.masked_outside(x, 0.3, -0.3)
    masked_array(data=[--, --, 0.01, 0.2, --, --],
                 mask=[ True,  True, False, False,  True,  True],
           fill_value=1e+20)
    
# numpy.ma.masked_values
ma.masked_values(x, value, rtol=1e-05, atol=1e-08, copy=True, shrink=True)[source]
    
Mask using floating point equality.
Return a MaskedArray, masked where the data in array `x` are approximately equal to `value`, determined using `isclose`. The default tolerances for `masked_values` are the same as those for `isclose`.
For integer types, exact equality is used, in the same way as `masked_equal`.
The fill_value is set to `value` and the mask is set to `nomask` if possible.
Parameters:
    
xarray_like
    
Array to mask.
valuefloat
    
Masking value.
rtol, atolfloat, optional
    
Tolerance parameters passed on to `isclose`
copybool, optional
    
Whether to return a copy of `x`.
shrinkbool, optional
    
Whether to collapse a mask full of False to `nomask`.
Returns:
    
resultMaskedArray
    
The result of masking `x` where approximately equal to `value`.
See also
`masked_where`
    
Mask where a condition is met.
`masked_equal`
    
Mask where equal to a given value (integers).
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = np.array([1, 1.1, 2, 1.1, 3])
    >>> ma.masked_values(x, 1.1)
    masked_array(data=[1.0, --, 2.0, --, 3.0],
                 mask=[False,  True, False,  True, False],
           fill_value=1.1)
    
Note that `mask` is set to `nomask` if possible.
    
    >>> ma.masked_values(x, 2.1)
    masked_array(data=[1. , 1.1, 2. , 1.1, 3. ],
                 mask=False,
           fill_value=2.1)
    
Unlike `masked_equal`, `masked_values` can perform approximate equalities.
    
    >>> ma.masked_values(x, 2.1, atol=1e-1)
    masked_array(data=[1.0, 1.1, --, 1.1, 3.0],
                 mask=[False, False,  True, False, False],
           fill_value=2.1)
    
# numpy.ma.masked_where
ma.masked_where(condition, a, copy=True)[source]
    
Mask an array where a condition is met.
Return `a` as an array masked where `condition` is True. Any masked values of `a` or `condition` are also masked in the output.
Parameters:
    
conditionarray_like
    
Masking condition. When `condition` tests floating point values for equality, consider using `masked_values` instead.
aarray_like
    
Array to mask.
copybool
    
If True (default) make a copy of `a` in the result. If False modify `a` in place and return a view.
Returns:
    
resultMaskedArray
    
The result of masking `a` where `condition` is True.
See also
`masked_values`
    
Mask using floating point equality.
`masked_equal`
    
Mask where equal to a given value.
`masked_not_equal`
    
Mask where not equal to a given value.
`masked_less_equal`
    
Mask where less than or equal to a given value.
`masked_greater_equal`
    
Mask where greater than or equal to a given value.
`masked_less`
    
Mask where less than a given value.
`masked_greater`
    
Mask where greater than a given value.
`masked_inside`
    
Mask inside a given interval.
`masked_outside`
    
Mask outside a given interval.
`masked_invalid`
    
Mask invalid values (NaNs or infs).
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> ma.masked_where(a <= 2, a)
    masked_array(data=[--, --, --, 3],
                 mask=[ True,  True,  True, False],
           fill_value=999999)
    
Mask array `b` conditional on `a`.
    
    >>> b = ['a', 'b', 'c', 'd']
    >>> ma.masked_where(a == 2, b)
    masked_array(data=['a', 'b', --, 'd'],
                 mask=[False, False,  True, False],
           fill_value='N/A',
                dtype='<U1')
    
Effect of the `copy` argument.
    
    >>> c = ma.masked_where(a <= 2, a)
    >>> c
    masked_array(data=[--, --, --, 3],
                 mask=[ True,  True,  True, False],
           fill_value=999999)
    >>> c[0] = 99
    >>> c
    masked_array(data=[99, --, --, 3],
                 mask=[False,  True,  True, False],
           fill_value=999999)
    >>> a
    array([0, 1, 2, 3])
    >>> c = ma.masked_where(a <= 2, a, copy=False)
    >>> c[0] = 99
    >>> c
    masked_array(data=[99, --, --, 3],
                 mask=[False,  True,  True, False],
           fill_value=999999)
    >>> a
    array([99,  1,  2,  3])
    
When `condition` or `a` contain masked values.
    
    >>> a = np.arange(4)
    >>> a = ma.masked_where(a == 2, a)
    >>> a
    masked_array(data=[0, 1, --, 3],
                 mask=[False, False,  True, False],
           fill_value=999999)
    >>> b = np.arange(4)
    >>> b = ma.masked_where(b == 0, b)
    >>> b
    masked_array(data=[--, 1, 2, 3],
                 mask=[ True, False, False, False],
           fill_value=999999)
    >>> ma.masked_where(a == 3, b)
    masked_array(data=[--, 1, --, --],
                 mask=[ True, False,  True,  True],
           fill_value=999999)
    
# numpy.ma.MaskedArray.__abs__
method
ma.MaskedArray.__abs__(self)
# numpy.ma.MaskedArray.__add__
method
ma.MaskedArray.__add__(other)[source]
    
Add self to other, and return a new masked array.
# numpy.ma.MaskedArray.__and__
method
ma.MaskedArray.__and__(value, /)
    
Return self&value.
# numpy.ma.MaskedArray.__array__
method
ma.MaskedArray.__array__([dtype, ]*, copy=None)
    
For `dtype` parameter it returns a new reference to self if `dtype` is not given or it matches array’s data type. A new array of provided data type is returned if `dtype` is different from the current data type of the array. For `copy` parameter it returns a new reference to self if `copy=False` or `copy=None` and copying isn’t enforced by `dtype` parameter. The method returns a new array for `copy=True`, regardless of `dtype` parameter.
A more detailed explanation of the `__array__` interface can be found in The __array__() method.
# numpy.ma.MaskedArray.__array_priority__
attribute
ma.MaskedArray.__array_priority__=15 
# numpy.ma.MaskedArray.__array_wrap__
method
ma.MaskedArray.__array_wrap__(obj, context=None, return_scalar=False)[source]
    
Special hook for ufuncs.
Wraps the numpy array and sets the mask according to context.
# numpy.ma.MaskedArray.__bool__
method
ma.MaskedArray.__bool__(/)
    
True if self else False
# numpy.ma.MaskedArray.__contains__
method
ma.MaskedArray.__contains__(key, /)
    
Return key in self.
# numpy.ma.MaskedArray.__copy__
method
ma.MaskedArray.__copy__()
    
Used if `copy.copy` is called on an array. Returns a copy of the array.
Equivalent to `a.copy(order='K')`.
# numpy.ma.MaskedArray.__deepcopy__
method
ma.MaskedArray.__deepcopy__(memo, /)[source]
    
Used if `copy.deepcopy` is called on an array.
# numpy.ma.MaskedArray.__delitem__
method
ma.MaskedArray.__delitem__(key, /)
    
Delete self[key].
# numpy.ma.MaskedArray.__div__
method
ma.MaskedArray.__div__(other)[source]
    
Divide other into self, and return a new masked array.
# numpy.ma.MaskedArray.__divmod__
method
ma.MaskedArray.__divmod__(value, /)
    
Return divmod(self, value).
# numpy.ma.MaskedArray.__eq__
method
ma.MaskedArray.__eq__(other)[source]
    
Check whether other equals self elementwise.
When either of the elements is masked, the result is masked as well, but the underlying boolean data are still set, with self and other considered equal if both are masked, and unequal otherwise.
For structured arrays, all fields are combined, with masked values ignored. The result is masked if all fields were masked, with self and other considered equal only if both were fully masked.
# numpy.ma.MaskedArray.__float__
method
ma.MaskedArray.__float__()[source]
    
Convert to float.
# numpy.ma.MaskedArray.__floordiv__
method
ma.MaskedArray.__floordiv__(other)[source]
    
Divide other into self, and return a new masked array.
# numpy.ma.MaskedArray.__ge__
method
ma.MaskedArray.__ge__(other)[source]
    
Return self>=value.
# numpy.ma.MaskedArray.__getitem__
method
ma.MaskedArray.__getitem__(indx)[source]
    
x.__getitem__(y) <==> x[y]
Return the item described by i, as a masked array.
# numpy.ma.MaskedArray.__getstate__
method
ma.MaskedArray.__getstate__()[source]
    
Return the internal state of the masked array, for pickling purposes.
# numpy.ma.MaskedArray.__gt__
method
ma.MaskedArray.__gt__(other)[source]
    
Return self>value.
# numpy.ma.MaskedArray.__iadd__
method
ma.MaskedArray.__iadd__(other)[source]
    
Add other to self in-place.
# numpy.ma.MaskedArray.__iand__
method
ma.MaskedArray.__iand__(value, /)
    
Return self&=value.
# numpy.ma.MaskedArray.__idiv__
method
ma.MaskedArray.__idiv__(other)[source]
    
Divide self by other in-place.
# numpy.ma.MaskedArray.__ifloordiv__
method
ma.MaskedArray.__ifloordiv__(other)[source]
    
Floor divide self by other in-place.
# numpy.ma.MaskedArray.__ilshift__
method
ma.MaskedArray.__ilshift__(value, /)
    
Return self<<=value.
# numpy.ma.MaskedArray.__imod__
method
ma.MaskedArray.__imod__(value, /)
    
Return self%=value.
# numpy.ma.MaskedArray.__imul__
method
ma.MaskedArray.__imul__(other)[source]
    
Multiply self by other in-place.
# numpy.ma.MaskedArray.__int__
method
ma.MaskedArray.__int__()[source]
    
Convert to int.
# numpy.ma.MaskedArray.__ior__
method
ma.MaskedArray.__ior__(value, /)
    
Return self|=value.
# numpy.ma.MaskedArray.__ipow__
method
ma.MaskedArray.__ipow__(other)[source]
    
Raise self to the power other, in place.
# numpy.ma.MaskedArray.__irshift__
method
ma.MaskedArray.__irshift__(value, /)
    
Return self>>=value.
# numpy.ma.MaskedArray.__isub__
method
ma.MaskedArray.__isub__(other)[source]
    
Subtract other from self in-place.
# numpy.ma.MaskedArray.__itruediv__
method
ma.MaskedArray.__itruediv__(other)[source]
    
True divide self by other in-place.
# numpy.ma.MaskedArray.__ixor__
method
ma.MaskedArray.__ixor__(value, /)
    
Return self^=value.
# numpy.ma.MaskedArray.__le__
method
ma.MaskedArray.__le__(other)[source]
    
Return self<=value.
# numpy.ma.MaskedArray.__len__
method
ma.MaskedArray.__len__(/)
    
Return len(self).
# numpy.ma.MaskedArray.__lshift__
method
ma.MaskedArray.__lshift__(value, /)
    
Return self<<value.
# numpy.ma.MaskedArray.__lt__
method
ma.MaskedArray.__lt__(other)[source]
    
Return self<value.
# numpy.ma.MaskedArray.__mod__
method
ma.MaskedArray.__mod__(value, /)
    
Return self%value.
# numpy.ma.MaskedArray.__mul__
method
ma.MaskedArray.__mul__(other)[source]
    
Multiply self by other, and return a new masked array.
# numpy.ma.MaskedArray.__ne__
method
ma.MaskedArray.__ne__(other)[source]
    
Check whether other does not equal self elementwise.
When either of the elements is masked, the result is masked as well, but the underlying boolean data are still set, with self and other considered equal if both are masked, and unequal otherwise.
For structured arrays, all fields are combined, with masked values ignored. The result is masked if all fields were masked, with self and other considered equal only if both were fully masked.
# numpy.ma.MaskedArray.__new__
method
staticma.MaskedArray.__new__(cls, data=None, mask=np.False_, dtype=None, copy=False, subok=True, ndmin=0, fill_value=None, keep_mask=True, hard_mask=None, shrink=True, order=None)[source]
    
Create a new masked array from scratch.
#### Notes
A masked array can also be created by taking a .view(MaskedArray).
# numpy.ma.MaskedArray.__or__
method
ma.MaskedArray.__or__(value, /)
    
Return self|value.
# numpy.ma.MaskedArray.__pow__
method
ma.MaskedArray.__pow__(other)[source]
    
Raise self to the power other, masking the potential NaNs/Infs
# numpy.ma.MaskedArray.__radd__
method
ma.MaskedArray.__radd__(other)[source]
    
Add other to self, and return a new masked array.
# numpy.ma.MaskedArray.__rand__
method
ma.MaskedArray.__rand__(value, /)
    
Return value&self.
# numpy.ma.MaskedArray.__rdivmod__
method
ma.MaskedArray.__rdivmod__(value, /)
    
Return divmod(value, self).
# numpy.ma.MaskedArray.__reduce__
method
ma.MaskedArray.__reduce__()[source]
    
Return a 3-tuple for pickling a MaskedArray.
# numpy.ma.MaskedArray.__repr__
method
ma.MaskedArray.__repr__()[source]
    
Literal string representation.
# numpy.ma.MaskedArray.__rfloordiv__
method
ma.MaskedArray.__rfloordiv__(other)[source]
    
Divide self into other, and return a new masked array.
# numpy.ma.MaskedArray.__rlshift__
method
ma.MaskedArray.__rlshift__(value, /)
    
Return value<<self.
# numpy.ma.MaskedArray.__rmod__
method
ma.MaskedArray.__rmod__(value, /)
    
Return value%self.
# numpy.ma.MaskedArray.__rmul__
method
ma.MaskedArray.__rmul__(other)[source]
    
Multiply other by self, and return a new masked array.
# numpy.ma.MaskedArray.__ror__
method
ma.MaskedArray.__ror__(value, /)
    
Return value|self.
# numpy.ma.MaskedArray.__rpow__
method
ma.MaskedArray.__rpow__(other)[source]
    
Raise other to the power self, masking the potential NaNs/Infs
# numpy.ma.MaskedArray.__rrshift__
method
ma.MaskedArray.__rrshift__(value, /)
    
Return value>>self.
# numpy.ma.MaskedArray.__rshift__
method
ma.MaskedArray.__rshift__(value, /)
    
Return self>>value.
# numpy.ma.MaskedArray.__rsub__
method
ma.MaskedArray.__rsub__(other)[source]
    
Subtract self from other, and return a new masked array.
# numpy.ma.MaskedArray.__rtruediv__
method
ma.MaskedArray.__rtruediv__(other)[source]
    
Divide self into other, and return a new masked array.
# numpy.ma.MaskedArray.__rxor__
method
ma.MaskedArray.__rxor__(value, /)
    
Return value^self.
# numpy.ma.MaskedArray.__setitem__
method
ma.MaskedArray.__setitem__(indx, value)[source]
    
x.__setitem__(i, y) <==> x[i]=y
Set item described by index. If value is masked, masks those locations.
# numpy.ma.MaskedArray.__setmask__
method
ma.MaskedArray.__setmask__(mask, copy=False)[source]
    
Set the mask.
# numpy.ma.MaskedArray.__setstate__
method
ma.MaskedArray.__setstate__(state)[source]
    
Restore the internal state of the masked array, for pickling purposes. `state` is typically the output of the `__getstate__` output, and is a 5-tuple:
  * class name
  * a tuple giving the shape of the data
  * a typecode for the data
  * a binary string for the data
  * a binary string for the mask.


# numpy.ma.MaskedArray.__str__
method
ma.MaskedArray.__str__()[source]
    
Return str(self).
# numpy.ma.MaskedArray.__sub__
method
ma.MaskedArray.__sub__(other)[source]
    
Subtract other from self, and return a new masked array.
# numpy.ma.MaskedArray.__truediv__
method
ma.MaskedArray.__truediv__(other)[source]
    
Divide other into self, and return a new masked array.
# numpy.ma.MaskedArray.__xor__
method
ma.MaskedArray.__xor__(value, /)
    
Return self^value.
# numpy.ma.MaskedArray.all
method
ma.MaskedArray.all(axis=None, out=None, keepdims=<no value>)[source]
    
Returns True if all elements evaluate to True.
The output array is masked where all the values along the given axis are masked: if the output would have been a scalar and that all the values are masked, then the output is `masked`.
Refer to `numpy.all` for full documentation.
See also
`numpy.ndarray.all`
    
corresponding function for ndarrays
`numpy.all`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> np.ma.array([1,2,3]).all()
    True
    >>> a = np.ma.array([1,2,3], mask=True)
    >>> (a.all() is np.ma.masked)
    True
    
# numpy.ma.MaskedArray.anom
method
ma.MaskedArray.anom(axis=None, dtype=None)[source]
    
Compute the anomalies (deviations from the arithmetic mean) along the given axis.
Returns an array of anomalies, with the same shape as the input and where the arithmetic mean is computed along the given axis.
Parameters:
    
axisint, optional
    
Axis over which the anomalies are taken. The default is to use the mean of the flattened array as reference.
dtypedtype, optional
    
Type to use in computing the variance. For arrays of integer type
    
the default is float32; for arrays of float types it is the same as the array type.
See also
`mean`
    
Compute the mean of the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1,2,3])
    >>> a.anom()
    masked_array(data=[-1.,  0.,  1.],
                 mask=False,
           fill_value=1e+20)
    
# numpy.ma.MaskedArray.any
method
ma.MaskedArray.any(axis=None, out=None, keepdims=<no value>)[source]
    
Returns True if any of the elements of `a` evaluate to True.
Masked values are considered as False during computation.
Refer to `numpy.any` for full documentation.
See also
`numpy.ndarray.any`
    
corresponding function for ndarrays
`numpy.any`
    
equivalent function
# numpy.ma.MaskedArray.argmax
method
ma.MaskedArray.argmax(axis=None, fill_value=None, out=None, *, keepdims=<no value>)[source]
    
Returns array of indices of the maximum values along the given axis. Masked values are treated as if they had the value fill_value.
Parameters:
    
axis{None, integer}
    
If None, the index is into the flattened array, otherwise along the specified axis
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, the output of maximum_fill_value(self._data) is used instead.
out{None, array}, optional
    
Array into which the result can be placed. Its type is preserved and it must be of the right shape to hold the output.
Returns:
    
index_array{integer_array}
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(6).reshape(2,3)
    >>> a.argmax()
    5
    >>> a.argmax(0)
    array([1, 1, 1])
    >>> a.argmax(1)
    array([2, 2])
    
# numpy.ma.MaskedArray.argmin
method
ma.MaskedArray.argmin(axis=None, fill_value=None, out=None, *, keepdims=<no value>)[source]
    
Return array of indices to the minimum values along the given axis.
Parameters:
    
axis{None, integer}
    
If None, the index is into the flattened array, otherwise along the specified axis
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, the output of minimum_fill_value(self._data) is used instead.
out{None, array}, optional
    
Array into which the result can be placed. Its type is preserved and it must be of the right shape to hold the output.
Returns:
    
ndarray or scalar
    
If multi-dimension input, returns a new ndarray of indices to the minimum values along the given axis. Otherwise, returns a scalar of index to the minimum values along the given axis.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(4), mask=[1,1,0,0])
    >>> x.shape = (2,2)
    >>> x
    masked_array(
      data=[[--, --],
            [2, 3]],
      mask=[[ True,  True],
            [False, False]],
      fill_value=999999)
    >>> x.argmin(axis=0, fill_value=-1)
    array([0, 0])
    >>> x.argmin(axis=0, fill_value=9)
    array([1, 1])
    
# numpy.ma.MaskedArray.argsort
method
ma.MaskedArray.argsort(axis=<no value>, kind=None, order=None, endwith=True, fill_value=None, *, stable=False)[source]
    
Return an ndarray of indices that sort the array along the specified axis. Masked values are filled beforehand to `fill_value`.
Parameters:
    
axisint, optional
    
Axis along which to sort. If None, the default, the flattened array is used.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
The sorting algorithm used.
orderlist, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. Not all fields need be specified.
endwith{True, False}, optional
    
Whether missing values (if any) should be treated as the largest values (True) or the smallest values (False) When the array contains unmasked values at the same extremes of the datatype, the ordering of these values and the masked values is undefined.
fill_valuescalar or None, optional
    
Value used internally for the masked values. If `fill_value` is not None, it supersedes `endwith`.
stablebool, optional
    
Only for compatibility with `np.argsort`. Ignored.
Returns:
    
index_arrayndarray, int
    
Array of indices that sort `a` along the specified axis. In other words, `a[index_array]` yields a sorted `a`.
See also
`ma.MaskedArray.sort`
    
Describes sorting algorithms used.
`lexsort`
    
Indirect stable sort with multiple keys.
`numpy.ndarray.sort`
    
Inplace sort.
#### Notes
See `sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([3,2,1], mask=[False, False, True])
    >>> a
    masked_array(data=[3, 2, --],
                 mask=[False, False,  True],
           fill_value=999999)
    >>> a.argsort()
    array([1, 0, 2])
    
# numpy.ma.MaskedArray.astype
method
ma.MaskedArray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
    
Copy of the array, cast to a specified type.
Parameters:
    
dtypestr or dtype
    
Typecode or data-type to which the array is cast.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout order of the result. ‘C’ means C order, ‘F’ means Fortran order, ‘A’ means ‘F’ order if all the arrays are Fortran contiguous, ‘C’ order otherwise, and ‘K’ means as close to the order the array elements appear in memory as possible. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘unsafe’ for backwards compatibility.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


subokbool, optional
    
If True, then sub-classes will be passed-through (default), otherwise the returned array will be forced to be a base-class array.
copybool, optional
    
By default, astype always returns a newly allocated array. If this is set to false, and the `dtype`, `order`, and `subok` requirements are satisfied, the input array is returned instead of a copy.
Returns:
    
arr_tndarray
    
Unless `copy` is False and the other conditions for returning the input array are satisfied (see description for `copy` input parameter), `arr_t` is a new array of the same shape as the input array, with dtype, order given by `dtype`, `order`.
Raises:
    
ComplexWarning
    
When casting from complex to float or int. To avoid this, one should use `a.real.astype(t)`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 2.5])
    >>> x
    array([1. ,  2. ,  2.5])
    
    
    >>> x.astype(int)
    array([1, 2, 2])
    
# numpy.ma.MaskedArray.base
attribute
ma.MaskedArray.base
    
Base object if memory is from some other object.
#### Examples
The base of an array that owns its memory is None:
    
    >>> import numpy as np
    >>> x = np.array([1,2,3,4])
    >>> x.base is None
    True
    
Slicing creates a view, whose memory is shared with x:
    
    >>> y = x[2:]
    >>> y.base is x
    True
    
# numpy.ma.MaskedArray.byteswap
method
ma.MaskedArray.byteswap(inplace=False)
    
Swap the bytes of the array elements
Toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Arrays of byte-strings are not swapped. The real and imaginary parts of a complex number are swapped individually.
Parameters:
    
inplacebool, optional
    
If `True`, swap bytes in-place, default is `False`.
Returns:
    
outndarray
    
The byteswapped array. If `inplace` is `True`, this is a view to self.
#### Examples
    
    >>> import numpy as np
    >>> A = np.array([1, 256, 8755], dtype=np.int16)
    >>> list(map(hex, A))
    ['0x1', '0x100', '0x2233']
    >>> A.byteswap(inplace=True)
    array([  256,     1, 13090], dtype=int16)
    >>> list(map(hex, A))
    ['0x100', '0x1', '0x3322']
    
Arrays of byte-strings are not swapped
    
    >>> A = np.array([b'ceg', b'fac'])
    >>> A.byteswap()
    array([b'ceg', b'fac'], dtype='|S3')
    
`A.view(A.dtype.newbyteorder()).byteswap()` produces an array with the same values but different representation in memory
    
    >>> A = np.array([1, 2, 3],dtype=np.int64)
    >>> A.view(np.uint8)
    array([1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
           0, 0], dtype=uint8)
    >>> A.view(A.dtype.newbyteorder()).byteswap(inplace=True)
    array([1, 2, 3], dtype='>i8')
    >>> A.view(np.uint8)
    array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
           0, 3], dtype=uint8)
    
# numpy.ma.MaskedArray.choose
method
ma.MaskedArray.choose(choices, out=None, mode='raise')
    
Use an index array to construct a new array from a set of choices.
Refer to `numpy.choose` for full documentation.
See also
`numpy.choose`
    
equivalent function
# numpy.ma.MaskedArray.clip
method
ma.MaskedArray.clip(min=None, max=None, out=None, **kwargs)
    
Return an array whose values are limited to `[min, max]`. One of max or min must be given.
Refer to `numpy.clip` for full documentation.
See also
`numpy.clip`
    
equivalent function
# numpy.ma.MaskedArray.compress
method
ma.MaskedArray.compress(condition, axis=None, out=None)[source]
    
Return `a` where condition is `True`.
If condition is a `MaskedArray`, missing values are considered as `False`.
Parameters:
    
conditionvar
    
Boolean 1-d array selecting which entries to return. If len(condition) is less than the size of a along the axis, then output is truncated to length of condition array.
axis{None, int}, optional
    
Axis along which the operation must be performed.
out{None, ndarray}, optional
    
Alternative output array in which to place the result. It must have the same shape as the expected output but the type will be cast if necessary.
Returns:
    
resultMaskedArray
    
A `MaskedArray` object.
#### Notes
Please note the difference with `compressed` ! The output of `compress` has a mask, the output of `compressed` does not.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.compress([1, 0, 1])
    masked_array(data=[1, 3],
                 mask=[False, False],
           fill_value=999999)
    
    
    >>> x.compress([1, 0, 1], axis=1)
    masked_array(
      data=[[1, 3],
            [--, --],
            [7, 9]],
      mask=[[False, False],
            [ True,  True],
            [False, False]],
      fill_value=999999)
    
# numpy.ma.MaskedArray.compressed
method
ma.MaskedArray.compressed()[source]
    
Return all the non-masked data as a 1-D array.
Returns:
    
datandarray
    
A new `ndarray` holding the non-masked data is returned.
#### Notes
The result is not a MaskedArray!
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(5), mask=[0]*2 + [1]*3)
    >>> x.compressed()
    array([0, 1])
    >>> type(x.compressed())
    <class 'numpy.ndarray'>
    
N-D arrays are compressed to 1-D.
    
    >>> arr = [[1, 2], [3, 4]]
    >>> mask = [[1, 0], [0, 1]]
    >>> x = np.ma.array(arr, mask=mask)
    >>> x.compressed()
    array([2, 3])
    
# numpy.ma.MaskedArray.conj
method
ma.MaskedArray.conj()
    
Complex-conjugate all elements.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.ma.MaskedArray.conjugate
method
ma.MaskedArray.conjugate()
    
Return the complex conjugate, element-wise.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.ma.MaskedArray.copy
method
ma.MaskedArray.copy(order='C')[source]
    
Return a copy of the array.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `numpy.copy` are very similar but have different default values for their order= arguments, and this function always passes sub-classes through.)
See also
`numpy.copy`
    
Similar function with different default behavior
`numpy.copyto`
#### Notes
This function is the preferred method for creating an array copy. The function `numpy.copy` is similar, but it defaults to using order ‘K’, and will not pass sub-classes through by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3],[4,5,6]], order='F')
    
    
    >>> y = x.copy()
    
    
    >>> x.fill(0)
    
    
    >>> x
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> y.flags['C_CONTIGUOUS']
    True
    
For arrays containing Python objects (e.g. dtype=object), the copy is a shallow one. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):
    
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> b = a.copy()
    >>> b[2][0] = 10
    >>> a
    array([1, 'm', list([10, 3, 4])], dtype=object)
    
To ensure all elements within an `object` array are copied, use `copy.deepcopy`:
    
    >>> import copy
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> c = copy.deepcopy(a)
    >>> c[2][0] = 10
    >>> c
    array([1, 'm', list([10, 3, 4])], dtype=object)
    >>> a
    array([1, 'm', list([2, 3, 4])], dtype=object)
    
# numpy.ma.MaskedArray.count
method
ma.MaskedArray.count(axis=None, keepdims=<no value>)[source]
    
Count the non-masked elements of the array along the given axis.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Axis or axes along which the count is performed. The default, None, performs the count over all the dimensions of the input array. `axis` may be negative, in which case it counts from the last to the first axis. If this is a tuple of ints, the count is performed on multiple axes, instead of a single axis or all the axes as before.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
resultndarray or scalar
    
An array with the same shape as the input array, with the specified axis removed. If the array is a 0-d array, or if `axis` is None, a scalar is returned.
See also
`ma.count_masked`
    
Count masked elements in array or along a given axis.
#### Examples
    
    >>> import numpy.ma as ma
    >>> a = ma.arange(6).reshape((2, 3))
    >>> a[1, :] = ma.masked
    >>> a
    masked_array(
      data=[[0, 1, 2],
            [--, --, --]],
      mask=[[False, False, False],
            [ True,  True,  True]],
      fill_value=999999)
    >>> a.count()
    3
    
When the `axis` keyword is specified an array of appropriate size is returned.
    
    >>> a.count(axis=0)
    array([1, 1, 1])
    >>> a.count(axis=1)
    array([3, 0])
    
# numpy.ma.MaskedArray.ctypes
attribute
ma.MaskedArray.ctypes
    
An object to simplify the interaction of the array with the ctypes module.
This attribute creates an object that makes it easier to use arrays when calling shared libraries with the ctypes module. The returned object has, among others, data, shape, and strides attributes (see Notes below) which themselves return ctypes objects that can be used as arguments to a shared library.
Parameters:
    
None
Returns:
    
cPython object
    
Possessing attributes data, shape, strides, etc.
See also
`numpy.ctypeslib`
#### Notes
Below are the public attributes of this object which were documented in “Guide to NumPy” (we have omitted undocumented public attributes, as well as documented private attributes):
_ctypes.data
    
A pointer to the memory area of the array as a Python integer. This memory area may contain data that is not aligned, or not in correct byte-order. The memory area may not even be writeable. The array flags and data-type of this array should be respected when passing this attribute to arbitrary C-code to avoid trouble that can include Python crashing. User Beware! The value of this attribute is exactly the same as: `self._array_interface_['data'][0]`.
Note that unlike `data_as`, a reference won’t be kept to the array: code like `ctypes.c_void_p((a + b).ctypes.data)` will result in a pointer to a deallocated array, and should be spelt `(a + b).ctypes.data_as(ctypes.c_void_p)`
_ctypes.shape
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the C-integer corresponding to `dtype('p')` on this platform (see `c_intp`). This base-type could be `ctypes.c_int`, `ctypes.c_long`, or `ctypes.c_longlong` depending on the platform. The ctypes array contains the shape of the underlying array.
_ctypes.strides
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the same as for the shape attribute. This ctypes array contains the strides information from the underlying array. This strides information is important for showing how many bytes must be jumped to get to the next element in the array.
_ctypes.data_as(obj)[source]
    
Return the data pointer cast to a particular c-types object. For example, calling `self._as_parameter_` is equivalent to `self.data_as(ctypes.c_void_p)`. Perhaps you want to use the data as a pointer to a ctypes array of floating-point data: `self.data_as(ctypes.POINTER(ctypes.c_double))`.
The returned pointer will keep a reference to the array.
_ctypes.shape_as(obj)[source]
    
Return the shape tuple as an array of some other c-types type. For example: `self.shape_as(ctypes.c_short)`.
_ctypes.strides_as(obj)[source]
    
Return the strides tuple as an array of some other c-types type. For example: `self.strides_as(ctypes.c_longlong)`.
If the ctypes module is not available, then the ctypes attribute of array objects still returns something useful, but ctypes objects are not returned and errors may be raised instead. In particular, the object will still have the `as_parameter` attribute which will return an integer equal to the data attribute.
#### Examples
    
    >>> import numpy as np
    >>> import ctypes
    >>> x = np.array([[0, 1], [2, 3]], dtype=np.int32)
    >>> x
    array([[0, 1],
           [2, 3]], dtype=int32)
    >>> x.ctypes.data
    31962608 # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32))
    <__main__.LP_c_uint object at 0x7ff2fc1fc200> # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32)).contents
    c_uint(0)
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint64)).contents
    c_ulong(4294967296)
    >>> x.ctypes.shape
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1fce60> # may vary
    >>> x.ctypes.strides
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1ff320> # may vary
    
# numpy.ma.MaskedArray.cumprod
method
ma.MaskedArray.cumprod(axis=None, dtype=None, out=None)[source]
    
Return the cumulative product of the array elements over the given axis.
Masked values are set to 1 internally during the computation. However, their position is saved, and the result will be masked at the same locations.
Refer to `numpy.cumprod` for full documentation.
See also
`numpy.ndarray.cumprod`
    
corresponding function for ndarrays
`numpy.cumprod`
    
equivalent function
#### Notes
The mask is lost if `out` is not a valid MaskedArray !
Arithmetic is modular when using integer types, and no error is raised on overflow.
# numpy.ma.MaskedArray.cumsum
method
ma.MaskedArray.cumsum(axis=None, dtype=None, out=None)[source]
    
Return the cumulative sum of the array elements over the given axis.
Masked values are set to 0 internally during the computation. However, their position is saved, and the result will be masked at the same locations.
Refer to `numpy.cumsum` for full documentation.
See also
`numpy.ndarray.cumsum`
    
corresponding function for ndarrays
`numpy.cumsum`
    
equivalent function
#### Notes
The mask is lost if `out` is not a valid `ma.MaskedArray` !
Arithmetic is modular when using integer types, and no error is raised on overflow.
#### Examples
    
    >>> import numpy as np
    >>> marr = np.ma.array(np.arange(10), mask=[0,0,0,1,1,1,0,0,0,0])
    >>> marr.cumsum()
    masked_array(data=[0, 1, 3, --, --, --, 9, 16, 24, 33],
                 mask=[False, False, False,  True,  True,  True, False, False,
                       False, False],
           fill_value=999999)
    
# numpy.ma.MaskedArray.diagonal
method
ma.MaskedArray.diagonal(offset=0, axis1=0, axis2=1)[source]
    
Return specified diagonals. In NumPy 1.9 the returned array is a read-only view instead of a copy as in previous NumPy versions. In a future version the read-only restriction will be removed.
Refer to `numpy.diagonal` for full documentation.
See also
`numpy.diagonal`
    
equivalent function
# numpy.ma.MaskedArray.dtype
property
propertyma.MaskedArray.dtype
    
Data-type of the array’s elements.
Warning
Setting `arr.dtype` is discouraged and may be deprecated in the future. Setting will replace the `dtype` without modifying the memory (see also `ndarray.view` and `ndarray.astype`).
Parameters:
    
None
Returns:
    
dnumpy dtype object
See also
`ndarray.astype`
    
Cast the values contained in the array to a new data-type.
`ndarray.view`
    
Create a view of the same data but a different data-type.
`numpy.dtype`
#### Examples
    
    >>> x
    array([[0, 1],
           [2, 3]])
    >>> x.dtype
    dtype('int32')
    >>> type(x.dtype)
    <type 'numpy.dtype'>
    
# numpy.ma.MaskedArray.dump
method
ma.MaskedArray.dump(file)
    
Dump a pickle of the array to the specified file. The array can be read back with pickle.load or numpy.load.
Parameters:
    
filestr or Path
    
A string naming the dump file.
# numpy.ma.MaskedArray.dumps
method
ma.MaskedArray.dumps()
    
Returns the pickle of the array as a string. pickle.loads will convert the string back to an array.
Parameters:
    
None
# numpy.ma.MaskedArray.fill
method
ma.MaskedArray.fill(value)
    
Fill the array with a scalar value.
Parameters:
    
valuescalar
    
All elements of `a` will be assigned this value.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2])
    >>> a.fill(0)
    >>> a
    array([0, 0])
    >>> a = np.empty(2)
    >>> a.fill(1)
    >>> a
    array([1.,  1.])
    
Fill expects a scalar value and always behaves the same as assigning to a single array element. The following is a rare example where this distinction is important:
    
    >>> a = np.array([None, None], dtype=object)
    >>> a[0] = np.array(3)
    >>> a
    array([array(3), None], dtype=object)
    >>> a.fill(np.array(3))
    >>> a
    array([array(3), array(3)], dtype=object)
    
Where other forms of assignments will unpack the array being assigned:
    
    >>> a[...] = np.array(3)
    >>> a
    array([3, 3], dtype=object)
    
# numpy.ma.MaskedArray.filled
method
ma.MaskedArray.filled(fill_value=None)[source]
    
Return a copy of self, with masked values filled with a given value. However, if there are no masked values to fill, self will be returned instead as an ndarray.
Parameters:
    
fill_valuearray_like, optional
    
The value to use for invalid entries. Can be scalar or non-scalar. If non-scalar, the resulting ndarray must be broadcastable over input array. Default is None, in which case, the `fill_value` attribute of the array is used instead.
Returns:
    
filled_arrayndarray
    
A copy of `self` with invalid entries replaced by fill_value (be it the function argument or the attribute of `self`), or `self` itself as an ndarray if there are no invalid entries to be replaced.
#### Notes
The result is not a MaskedArray!
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1,2,3,4,5], mask=[0,0,1,0,1], fill_value=-999)
    >>> x.filled()
    array([   1,    2, -999,    4, -999])
    >>> x.filled(fill_value=1000)
    array([   1,    2, 1000,    4, 1000])
    >>> type(x.filled())
    <class 'numpy.ndarray'>
    
Subclassing is preserved. This means that if, e.g., the data part of the masked array is a recarray, `filled` returns a recarray:
    
    >>> x = np.array([(-1, 2), (-3, 4)], dtype='i8,i8').view(np.recarray)
    >>> m = np.ma.array(x, mask=[(True, False), (False, True)])
    >>> m.filled()
    rec.array([(999999,      2), (    -3, 999999)],
              dtype=[('f0', '<i8'), ('f1', '<i8')])
    
# numpy.ma.MaskedArray.flags
attribute
ma.MaskedArray.flags
    
Information about the memory layout of the array.
#### Notes
The `flags` object can be accessed dictionary-like (as in `a.flags['WRITEABLE']`), or by using lowercased attribute names (as in `a.flags.writeable`). Short flag names are only supported in dictionary access.
Only the WRITEBACKIFCOPY, WRITEABLE, and ALIGNED flags can be changed by the user, via direct assignment to the attribute or dictionary entry, or by calling `ndarray.setflags`.
The array flags cannot be set arbitrarily:
  * WRITEBACKIFCOPY can only be set `False`.
  * ALIGNED can only be set `True` if the data is truly aligned.
  * WRITEABLE can only be set `True` if the array owns its own memory or the ultimate owner of the memory exposes a writeable buffer interface or is a string.


Arrays can be both C-style and Fortran-style contiguous simultaneously. This is clear for 1-dimensional arrays, but can also be true for higher dimensional arrays.
Even for contiguous arrays a stride for a given dimension `arr.strides[dim]` may be arbitrary if `arr.shape[dim] == 1` or the array has no elements. It does not generally hold that `self.strides[-1] == self.itemsize` for C-style contiguous arrays or `self.strides[0] == self.itemsize` for Fortran-style contiguous arrays is true.
Attributes:
    
C_CONTIGUOUS (C)
    
The data is in a single, C-style contiguous segment.
F_CONTIGUOUS (F)
    
The data is in a single, Fortran-style contiguous segment.
OWNDATA (O)
    
The array owns the memory it uses or borrows it from another object.
WRITEABLE (W)
    
The data area can be written to. Setting this to False locks the data, making it read-only. A view (slice, etc.) inherits WRITEABLE from its base array at creation time, but a view of a writeable array may be subsequently locked while the base array remains writeable. (The opposite is not true, in that a view of a locked array may not be made writeable. However, currently, locking a base object does not lock any views that already reference it, so under that circumstance it is possible to alter the contents of a locked array via a previously created writeable view onto it.) Attempting to change a non-writeable array raises a RuntimeError exception.
ALIGNED (A)
    
The data and all elements are aligned appropriately for the hardware.
WRITEBACKIFCOPY (X)
    
This array is a copy of some other array. The C-API function PyArray_ResolveWritebackIfCopy must be called before deallocating to the base array will be updated with the contents of this array.
FNC
    
F_CONTIGUOUS and not C_CONTIGUOUS.
FORC
    
F_CONTIGUOUS or C_CONTIGUOUS (one-segment test).
BEHAVED (B)
    
ALIGNED and WRITEABLE.
CARRAY (CA)
    
BEHAVED and C_CONTIGUOUS.
FARRAY (FA)
    
BEHAVED and F_CONTIGUOUS and not C_CONTIGUOUS.
# numpy.ma.MaskedArray.flat
property
propertyma.MaskedArray.flat
    
Return a flat iterator, or set a flattened version of self to value.
# numpy.ma.MaskedArray.flatten
method
ma.MaskedArray.flatten(order='C')[source]
    
Return a copy of the array collapsed into one dimension.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran- style) order. ‘A’ means to flatten in column-major order if `a` is Fortran contiguous in memory, row-major order otherwise. ‘K’ means to flatten `a` in the order the elements occur in memory. The default is ‘C’.
Returns:
    
yndarray
    
A copy of the input array, flattened to one dimension.
See also
`ravel`
    
Return a flattened array.
`flat`
    
A 1-D flat iterator over the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2], [3,4]])
    >>> a.flatten()
    array([1, 2, 3, 4])
    >>> a.flatten('F')
    array([1, 3, 2, 4])
    
# numpy.ma.MaskedArray.get_fill_value
method
ma.MaskedArray.get_fill_value()[source]
    
The filling value of the masked array is a scalar. When setting, None will set to a default based on the data type.
#### Examples
    
    >>> import numpy as np
    >>> for dt in [np.int32, np.int64, np.float64, np.complex128]:
    ...     np.ma.array([0, 1], dtype=dt).get_fill_value()
    ...
    np.int64(999999)
    np.int64(999999)
    np.float64(1e+20)
    np.complex128(1e+20+0j)
    
    
    >>> x = np.ma.array([0, 1.], fill_value=-np.inf)
    >>> x.fill_value
    np.float64(-inf)
    >>> x.fill_value = np.pi
    >>> x.fill_value
    np.float64(3.1415926535897931)
    
Reset to default:
    
    >>> x.fill_value = None
    >>> x.fill_value
    np.float64(1e+20)
    
# numpy.ma.MaskedArray.harden_mask
method
ma.MaskedArray.harden_mask()[source]
    
Force the mask to hard, preventing unmasking by assignment.
Whether the mask of a masked array is hard or soft is determined by its `hardmask` property. `harden_mask` sets `hardmask` to `True` (and returns the modified self).
See also
`ma.MaskedArray.hardmask`
`ma.MaskedArray.soften_mask`
# numpy.ma.MaskedArray.ids
method
ma.MaskedArray.ids()[source]
    
Return the addresses of the data and mask areas.
Parameters:
    
None
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1, 2, 3], mask=[0, 1, 1])
    >>> x.ids()
    (166670640, 166659832) # may vary
    
If the array has no mask, the address of `nomask` is returned. This address is typically not close to the data in memory:
    
    >>> x = np.ma.array([1, 2, 3])
    >>> x.ids()
    (166691080, 3083169284) # may vary
    
# numpy.ma.MaskedArray.imag
property
propertyma.MaskedArray.imag
    
The imaginary part of the masked array.
This property is a view on the imaginary part of this `MaskedArray`.
See also
`real`
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1+1.j, -2j, 3.45+1.6j], mask=[False, True, False])
    >>> x.imag
    masked_array(data=[1.0, --, 1.6],
                 mask=[False,  True, False],
           fill_value=1e+20)
    
# numpy.ma.MaskedArray.iscontiguous
method
ma.MaskedArray.iscontiguous()[source]
    
Return a boolean indicating whether the data is contiguous.
Parameters:
    
None
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1, 2, 3])
    >>> x.iscontiguous()
    True
    
`iscontiguous` returns one of the flags of the masked array:
    
    >>> x.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : True
      OWNDATA : False
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
    
# numpy.ma.MaskedArray.item
method
ma.MaskedArray.item(*args)
    
Copy an element of an array to a standard Python scalar and return it.
Parameters:
    
*argsArguments (variable number and type)
    
  * none: in this case, the method only works for arrays with one element (`a.size == 1`), which element is copied into a standard Python scalar object and returned.
  * int_type: this argument is interpreted as a flat index into the array, specifying which element to copy and return.
  * tuple of int_types: functions as does a single int_type argument, except that the argument is interpreted as an nd-index into the array.


Returns:
    
zStandard Python scalar object
    
A copy of the specified element of the array as a suitable Python scalar
#### Notes
When the data type of `a` is longdouble or clongdouble, item() returns a scalar array object because there is no available Python scalar that would not lose information. Void arrays return a buffer object for item(), unless fields are defined, in which case a tuple is returned.
`item` is very similar to a[args], except, instead of an array scalar, a standard Python scalar is returned. This can be useful for speeding up access to elements of the array and doing arithmetic on elements of the array using Python’s optimized math.
#### Examples
    
    >>> import numpy as np
    >>> np.random.seed(123)
    >>> x = np.random.randint(9, size=(3, 3))
    >>> x
    array([[2, 2, 6],
           [1, 3, 6],
           [1, 0, 1]])
    >>> x.item(3)
    1
    >>> x.item(7)
    0
    >>> x.item((0, 1))
    2
    >>> x.item((2, 2))
    1
    
For an array with object dtype, elements are returned as-is.
    
    >>> a = np.array([np.int64(1)], dtype=object)
    >>> a.item() #return np.int64
    np.int64(1)
    
# numpy.ma.MaskedArray.itemsize
attribute
ma.MaskedArray.itemsize
    
Length of one array element in bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1,2,3], dtype=np.float64)
    >>> x.itemsize
    8
    >>> x = np.array([1,2,3], dtype=np.complex128)
    >>> x.itemsize
    16
    
# numpy.ma.MaskedArray.max
method
ma.MaskedArray.max(axis=None, out=None, fill_value=None, keepdims=<no value>)[source]
    
Return the maximum along a given axis.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Axis along which to operate. By default, `axis` is None and the flattened input is used. If this is a tuple of ints, the maximum is selected over multiple axes, instead of a single axis or all the axes as before.
outarray_like, optional
    
Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output.
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, use the output of maximum_fill_value().
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
amaxarray_like
    
New array holding the result. If `out` was specified, `out` is returned.
See also
`ma.maximum_fill_value`
    
Returns the maximum filling value for a given datatype.
#### Examples
    
    >>> import numpy.ma as ma
    >>> x = [[-1., 2.5], [4., -2.], [3., 0.]]
    >>> mask = [[0, 0], [1, 0], [1, 0]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(
      data=[[-1.0, 2.5],
            [--, -2.0],
            [--, 0.0]],
      mask=[[False, False],
            [ True, False],
            [ True, False]],
      fill_value=1e+20)
    >>> ma.max(masked_x)
    2.5
    >>> ma.max(masked_x, axis=0)
    masked_array(data=[-1.0, 2.5],
                 mask=[False, False],
           fill_value=1e+20)
    >>> ma.max(masked_x, axis=1, keepdims=True)
    masked_array(
      data=[[2.5],
            [-2.0],
            [0.0]],
      mask=[[False],
            [False],
            [False]],
      fill_value=1e+20)
    >>> mask = [[1, 1], [1, 1], [1, 1]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> ma.max(masked_x, axis=1)
    masked_array(data=[--, --, --],
                 mask=[ True,  True,  True],
           fill_value=1e+20,
                dtype=float64)
    
# numpy.ma.MaskedArray.mean
method
ma.MaskedArray.mean(axis=None, dtype=None, out=None, keepdims=<no value>)[source]
    
Returns the average of the array elements along given axis.
Masked entries are ignored, and result elements which are not finite will be masked.
Refer to `numpy.mean` for full documentation.
See also
`numpy.ndarray.mean`
    
corresponding function for ndarrays
`numpy.mean`
    
Equivalent function
`numpy.ma.average`
    
Weighted average.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1,2,3], mask=[False, False, True])
    >>> a
    masked_array(data=[1, 2, --],
                 mask=[False, False,  True],
           fill_value=999999)
    >>> a.mean()
    1.5
    
# numpy.ma.MaskedArray.min
method
ma.MaskedArray.min(axis=None, out=None, fill_value=None, keepdims=<no value>)[source]
    
Return the minimum along a given axis.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Axis along which to operate. By default, `axis` is None and the flattened input is used. If this is a tuple of ints, the minimum is selected over multiple axes, instead of a single axis or all the axes as before.
outarray_like, optional
    
Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output.
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, use the output of `minimum_fill_value`.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
aminarray_like
    
New array holding the result. If `out` was specified, `out` is returned.
See also
`ma.minimum_fill_value`
    
Returns the minimum filling value for a given datatype.
#### Examples
    
    >>> import numpy.ma as ma
    >>> x = [[1., -2., 3.], [0.2, -0.7, 0.1]]
    >>> mask = [[1, 1, 0], [0, 0, 1]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(
      data=[[--, --, 3.0],
            [0.2, -0.7, --]],
      mask=[[ True,  True, False],
            [False, False,  True]],
      fill_value=1e+20)
    >>> ma.min(masked_x)
    -0.7
    >>> ma.min(masked_x, axis=-1)
    masked_array(data=[3.0, -0.7],
                 mask=[False, False],
            fill_value=1e+20)
    >>> ma.min(masked_x, axis=0, keepdims=True)
    masked_array(data=[[0.2, -0.7, 3.0]],
                 mask=[[False, False, False]],
            fill_value=1e+20)
    >>> mask = [[1, 1, 1,], [1, 1, 1]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> ma.min(masked_x, axis=0)
    masked_array(data=[--, --, --],
                 mask=[ True,  True,  True],
            fill_value=1e+20,
                dtype=float64)
    
# numpy.ma.MaskedArray.nbytes
attribute
ma.MaskedArray.nbytes
    
Total bytes consumed by the elements of the array.
See also
`sys.getsizeof`
    
Memory consumed by the object itself without parents in case view. This does include memory consumed by non-element attributes.
#### Notes
Does not include memory consumed by non-element attributes of the array object.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3,5,2), dtype=np.complex128)
    >>> x.nbytes
    480
    >>> np.prod(x.shape) * x.itemsize
    480
    
# numpy.ma.MaskedArray.ndim
attribute
ma.MaskedArray.ndim
    
Number of array dimensions.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> x.ndim
    1
    >>> y = np.zeros((2, 3, 4))
    >>> y.ndim
    3
    
# numpy.ma.MaskedArray.nonzero
method
ma.MaskedArray.nonzero()[source]
    
Return the indices of unmasked elements that are not zero.
Returns a tuple of arrays, one for each dimension, containing the indices of the non-zero elements in that dimension. The corresponding non-zero values can be obtained with:
    
    a[a.nonzero()]
    
To group the indices by element, rather than dimension, use instead:
    
    np.transpose(a.nonzero())
    
The result of this is always a 2d array, with a row for each non-zero element.
Parameters:
    
None
Returns:
    
tuple_of_arraystuple
    
Indices of elements that are non-zero.
See also
`numpy.nonzero`
    
Function operating on ndarrays.
`flatnonzero`
    
Return indices that are non-zero in the flattened version of the input array.
`numpy.ndarray.nonzero`
    
Equivalent ndarray method.
`count_nonzero`
    
Counts the number of non-zero elements in the input array.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = ma.array(np.eye(3))
    >>> x
    masked_array(
      data=[[1., 0., 0.],
            [0., 1., 0.],
            [0., 0., 1.]],
      mask=False,
      fill_value=1e+20)
    >>> x.nonzero()
    (array([0, 1, 2]), array([0, 1, 2]))
    
Masked elements are ignored.
    
    >>> x[1, 1] = ma.masked
    >>> x
    masked_array(
      data=[[1.0, 0.0, 0.0],
            [0.0, --, 0.0],
            [0.0, 0.0, 1.0]],
      mask=[[False, False, False],
            [False,  True, False],
            [False, False, False]],
      fill_value=1e+20)
    >>> x.nonzero()
    (array([0, 2]), array([0, 2]))
    
Indices can also be grouped by element.
    
    >>> np.transpose(x.nonzero())
    array([[0, 0],
           [2, 2]])
    
A common use for `nonzero` is to find the indices of an array, where a condition is True. Given an array `a`, the condition `a` > 3 is a boolean array and since False is interpreted as 0, ma.nonzero(a > 3) yields the indices of the `a` where the condition is true.
    
    >>> a = ma.array([[1,2,3],[4,5,6],[7,8,9]])
    >>> a > 3
    masked_array(
      data=[[False, False, False],
            [ True,  True,  True],
            [ True,  True,  True]],
      mask=False,
      fill_value=True)
    >>> ma.nonzero(a > 3)
    (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
    
The `nonzero` method of the condition array can also be called.
    
    >>> (a > 3).nonzero()
    (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
    
# numpy.ma.MaskedArray.prod
method
ma.MaskedArray.prod(axis=None, dtype=None, out=None, keepdims=<no value>)[source]
    
Return the product of the array elements over the given axis.
Masked elements are set to 1 internally for computation.
Refer to `numpy.prod` for full documentation.
See also
`numpy.ndarray.prod`
    
corresponding function for ndarrays
`numpy.prod`
    
equivalent function
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
# numpy.ma.MaskedArray.product
method
ma.MaskedArray.product(axis=None, dtype=None, out=None, keepdims=<no value>)[source]
    
Return the product of the array elements over the given axis.
Masked elements are set to 1 internally for computation.
Refer to `numpy.prod` for full documentation.
See also
`numpy.ndarray.prod`
    
corresponding function for ndarrays
`numpy.prod`
    
equivalent function
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
# numpy.ma.MaskedArray.ptp
method
ma.MaskedArray.ptp(axis=None, out=None, fill_value=None, keepdims=False)[source]
    
Return (maximum - minimum) along the given dimension (i.e. peak-to-peak value).
Warning
`ptp` preserves the data type of the array. This means the return value for an input of signed integers with n bits (e.g. `np.int8`, `np.int16`, etc) is also a signed integer with n bits. In that case, peak-to-peak values greater than `2**(n-1)-1` will be returned as negative values. An example with a work-around is shown below.
Parameters:
    
axis{None, int}, optional
    
Axis along which to find the peaks. If None (default) the flattened array is used.
out{None, array_like}, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary.
fill_valuescalar or None, optional
    
Value used to fill in the masked values.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
ptpndarray.
    
A new array holding the result, unless `out` was specified, in which case a reference to `out` is returned.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.MaskedArray([[4, 9, 2, 10],
    ...                        [6, 9, 7, 12]])
    
    
    >>> x.ptp(axis=1)
    masked_array(data=[8, 6],
                 mask=False,
           fill_value=999999)
    
    
    >>> x.ptp(axis=0)
    masked_array(data=[2, 0, 5, 2],
                 mask=False,
           fill_value=999999)
    
    
    >>> x.ptp()
    10
    
This example shows that a negative value can be returned when the input is an array of signed integers.
    
    >>> y = np.ma.MaskedArray([[1, 127],
    ...                        [0, 127],
    ...                        [-1, 127],
    ...                        [-2, 127]], dtype=np.int8)
    >>> y.ptp(axis=1)
    masked_array(data=[ 126,  127, -128, -127],
                 mask=False,
           fill_value=np.int64(999999),
                dtype=int8)
    
A work-around is to use the `view()` method to view the result as unsigned integers with the same bit width:
    
    >>> y.ptp(axis=1).view(np.uint8)
    masked_array(data=[126, 127, 128, 129],
                 mask=False,
           fill_value=np.uint64(999999),
                dtype=uint8)
    
# numpy.ma.MaskedArray.put
method
ma.MaskedArray.put(indices, values, mode='raise')[source]
    
Set storage-indexed locations to corresponding values.
Sets self._data.flat[n] = values[n] for each n in indices. If `values` is shorter than `indices` then it will repeat. If `values` has some masked values, the initial mask is updated in consequence, else the corresponding values are unmasked.
Parameters:
    
indices1-D array_like
    
Target indices, interpreted as integers.
valuesarray_like
    
Values to place in self._data copy at target indices.
mode{‘raise’, ‘wrap’, ‘clip’}, optional
    
Specifies how out-of-bounds indices will behave. ‘raise’ : raise an error. ‘wrap’ : wrap around. ‘clip’ : clip to the range.
#### Notes
`values` can be a scalar or length 1 array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.put([0,4,8],[10,20,30])
    >>> x
    masked_array(
      data=[[10, --, 3],
            [--, 20, --],
            [7, --, 30]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    
    
    >>> x.put(4,999)
    >>> x
    masked_array(
      data=[[10, --, 3],
            [--, 999, --],
            [7, --, 30]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    
# numpy.ma.MaskedArray.ravel
method
ma.MaskedArray.ravel(order='C')[source]
    
Returns a 1D version of self, as a view.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
The elements of `a` are read using this index order. ‘C’ means to index the elements in C-like order, with the last axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to index the elements in Fortran-like index order, with the first index changing fastest, and the last index changing slowest. Note that the ‘C’ and ‘F’ options take no account of the memory layout of the underlying array, and only refer to the order of axis indexing. ‘A’ means to read the elements in Fortran-like index order if `m` is Fortran contiguous in memory, C-like order otherwise. ‘K’ means to read the elements in the order they occur in memory, except for reversing the data when strides are negative. By default, ‘C’ index order is used. (Masked arrays currently use ‘A’ on the data when ‘K’ is passed.)
Returns:
    
MaskedArray
    
Output view is of shape `(self.size,)` (or `(np.ma.product(self.shape),)`).
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.ravel()
    masked_array(data=[1, --, 3, --, 5, --, 7, --, 9],
                 mask=[False,  True, False,  True, False,  True, False,  True,
                       False],
           fill_value=999999)
    
# numpy.ma.MaskedArray.real
property
propertyma.MaskedArray.real
    
The real part of the masked array.
This property is a view on the real part of this `MaskedArray`.
See also
`imag`
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1+1.j, -2j, 3.45+1.6j], mask=[False, True, False])
    >>> x.real
    masked_array(data=[1.0, --, 3.45],
                 mask=[False,  True, False],
           fill_value=1e+20)
    
# numpy.ma.MaskedArray.repeat
method
ma.MaskedArray.repeat(repeats, axis=None)[source]
    
Repeat elements of an array.
Refer to `numpy.repeat` for full documentation.
See also
`numpy.repeat`
    
equivalent function
# numpy.ma.MaskedArray.reshape
method
ma.MaskedArray.reshape(*s, **kwargs)[source]
    
Give a new shape to the array without changing its data.
Returns a masked array containing the same data, but with a new shape. The result is a view on the original array; if this is not possible, a ValueError is raised.
Parameters:
    
shapeint or tuple of ints
    
The new shape should be compatible with the original shape. If an integer is supplied, then the result will be a 1-D array of that length.
order{‘C’, ‘F’}, optional
    
Determines whether the array data should be viewed as in C (row-major) or FORTRAN (column-major) order.
Returns:
    
reshaped_arrayarray
    
A new view on the array.
See also
`reshape`
    
Equivalent function in the masked array module.
`numpy.ndarray.reshape`
    
Equivalent method on ndarray object.
`numpy.reshape`
    
Equivalent function in the NumPy module.
#### Notes
The reshaping operation cannot guarantee that a copy will not be made, to modify the shape in place, use `a.shape = s`
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2],[3,4]], mask=[1,0,0,1])
    >>> x
    masked_array(
      data=[[--, 2],
            [3, --]],
      mask=[[ True, False],
            [False,  True]],
      fill_value=999999)
    >>> x = x.reshape((4,1))
    >>> x
    masked_array(
      data=[[--],
            [2],
            [3],
            [--]],
      mask=[[ True],
            [False],
            [False],
            [ True]],
      fill_value=999999)
    
# numpy.ma.MaskedArray.resize
method
ma.MaskedArray.resize(newshape, refcheck=True, order=False)[source]
    
Warning
This method does nothing, except raise a ValueError exception. A masked array does not own its data and therefore cannot safely be resized in place. Use the `numpy.ma.resize` function instead.
This method is difficult to implement safely and may be deprecated in future releases of NumPy.
# numpy.ma.MaskedArray.round
method
ma.MaskedArray.round(decimals=0, out=None)[source]
    
Return each element rounded to the given number of decimals.
Refer to `numpy.around` for full documentation.
See also
`numpy.ndarray.round`
    
corresponding function for ndarrays
`numpy.around`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = ma.array([1.35, 2.5, 1.5, 1.75, 2.25, 2.75],
    ...              mask=[0, 0, 0, 1, 0, 0])
    >>> ma.round(x)
    masked_array(data=[1.0, 2.0, 2.0, --, 2.0, 3.0],
                 mask=[False, False, False,  True, False, False],
            fill_value=1e+20)
    
# numpy.ma.MaskedArray.searchsorted
method
ma.MaskedArray.searchsorted(v, side='left', sorter=None)
    
Find indices where elements of v should be inserted in a to maintain order.
For full documentation, see `numpy.searchsorted`
See also
`numpy.searchsorted`
    
equivalent function
# numpy.ma.MaskedArray.set_fill_value
method
ma.MaskedArray.set_fill_value(value=None)[source]
# numpy.ma.MaskedArray.shape
property
propertyma.MaskedArray.shape
    
Tuple of array dimensions.
The shape property is usually used to get the current shape of an array, but may also be used to reshape the array in-place by assigning a tuple of array dimensions to it. As with `numpy.reshape`, one of the new shape dimensions can be -1, in which case its value is inferred from the size of the array and the remaining dimensions. Reshaping an array in-place will fail if a copy is required.
Warning
Setting `arr.shape` is discouraged and may be deprecated in the future. Using `ndarray.reshape` is the preferred approach.
See also
`numpy.shape`
    
Equivalent getter function.
`numpy.reshape`
    
Function similar to setting `shape`.
`ndarray.reshape`
    
Method similar to setting `shape`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3, 4])
    >>> x.shape
    (4,)
    >>> y = np.zeros((2, 3, 4))
    >>> y.shape
    (2, 3, 4)
    >>> y.shape = (3, 8)
    >>> y
    array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
    >>> y.shape = (3, 6)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: total size of new array must be unchanged
    >>> np.zeros((4,2))[::2].shape = (-1,)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: Incompatible shape for in-place modification. Use
    `.reshape()` to make a copy with the desired shape.
    
# numpy.ma.MaskedArray.shrink_mask
method
ma.MaskedArray.shrink_mask()[source]
    
Reduce a mask to nomask when possible.
Parameters:
    
None
Returns:
    
None
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2 ], [3, 4]], mask=[0]*4)
    >>> x.mask
    array([[False, False],
           [False, False]])
    >>> x.shrink_mask()
    masked_array(
      data=[[1, 2],
            [3, 4]],
      mask=False,
      fill_value=999999)
    >>> x.mask
    False
    
# numpy.ma.MaskedArray.size
attribute
ma.MaskedArray.size
    
Number of elements in the array.
Equal to `np.prod(a.shape)`, i.e., the product of the array’s dimensions.
#### Notes
`a.size` returns a standard arbitrary precision Python integer. This may not be the case with other methods of obtaining the same value (like the suggested `np.prod(a.shape)`, which returns an instance of `np.int_`), and may be relevant if the value is used further in calculations that may overflow a fixed size integer type.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3, 5, 2), dtype=np.complex128)
    >>> x.size
    30
    >>> np.prod(x.shape)
    30
    
# numpy.ma.MaskedArray.soften_mask
method
ma.MaskedArray.soften_mask()[source]
    
Force the mask to soft (default), allowing unmasking by assignment.
Whether the mask of a masked array is hard or soft is determined by its `hardmask` property. `soften_mask` sets `hardmask` to `False` (and returns the modified self).
See also
`ma.MaskedArray.hardmask`
`ma.MaskedArray.harden_mask`
# numpy.ma.MaskedArray.sort
method
ma.MaskedArray.sort(axis=-1, kind=None, order=None, endwith=True, fill_value=None, *, stable=False)[source]
    
Sort the array, in-place
Parameters:
    
aarray_like
    
Array to be sorted.
axisint, optional
    
Axis along which to sort. If None, the array is flattened before sorting. The default is -1, which sorts along the last axis.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
The sorting algorithm used.
orderlist, optional
    
When `a` is a structured array, this argument specifies which fields to compare first, second, and so on. This list does not need to include all of the fields.
endwith{True, False}, optional
    
Whether missing values (if any) should be treated as the largest values (True) or the smallest values (False) When the array contains unmasked values sorting at the same extremes of the datatype, the ordering of these values and the masked values is undefined.
fill_valuescalar or None, optional
    
Value used internally for the masked values. If `fill_value` is not None, it supersedes `endwith`.
stablebool, optional
    
Only for compatibility with `np.sort`. Ignored.
Returns:
    
sorted_arrayndarray
    
Array of the same type and shape as `a`.
See also
`numpy.ndarray.sort`
    
Method to sort an array in-place.
`argsort`
    
Indirect sort.
`lexsort`
    
Indirect stable sort on multiple keys.
`searchsorted`
    
Find elements in a sorted array.
#### Notes
See `sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1, 2, 5, 4, 3],mask=[0, 1, 0, 1, 0])
    >>> # Default
    >>> a.sort()
    >>> a
    masked_array(data=[1, 3, 5, --, --],
                 mask=[False, False, False,  True,  True],
           fill_value=999999)
    
    
    >>> a = np.ma.array([1, 2, 5, 4, 3],mask=[0, 1, 0, 1, 0])
    >>> # Put missing values in the front
    >>> a.sort(endwith=False)
    >>> a
    masked_array(data=[--, --, 1, 3, 5],
                 mask=[ True,  True, False, False, False],
           fill_value=999999)
    
    
    >>> a = np.ma.array([1, 2, 5, 4, 3],mask=[0, 1, 0, 1, 0])
    >>> # fill_value takes over endwith
    >>> a.sort(endwith=False, fill_value=3)
    >>> a
    masked_array(data=[1, --, --, 3, 5],
                 mask=[False,  True,  True, False, False],
           fill_value=999999)
    
# numpy.ma.MaskedArray.squeeze
method
ma.MaskedArray.squeeze(axis=None)[source]
    
Remove axes of length one from `a`.
Refer to `numpy.squeeze` for full documentation.
See also
`numpy.squeeze`
    
equivalent function
# numpy.ma.MaskedArray.std
method
ma.MaskedArray.std(axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, mean=<no value>)[source]
    
Returns the standard deviation of the array elements along given axis.
Masked entries are ignored.
Refer to `numpy.std` for full documentation.
See also
`numpy.ndarray.std`
    
corresponding function for ndarrays
`numpy.std`
    
Equivalent function
# numpy.ma.MaskedArray.strides
attribute
ma.MaskedArray.strides
    
Tuple of bytes to step in each dimension when traversing an array.
The byte offset of element `(i[0], i[1], ..., i[n])` in an array `a` is:
    
    offset = sum(np.array(i) * a.strides)
    
A more detailed explanation of strides can be found in The N-dimensional array (ndarray).
Warning
Setting `arr.strides` is discouraged and may be deprecated in the future. `numpy.lib.stride_tricks.as_strided` should be preferred to create a new view of the same data in a safer way.
See also
`numpy.lib.stride_tricks.as_strided`
#### Notes
Imagine an array of 32-bit integers (each 4 bytes):
    
    x = np.array([[0, 1, 2, 3, 4],
                  [5, 6, 7, 8, 9]], dtype=np.int32)
    
This array is stored in memory as 40 bytes, one after the other (known as a contiguous block of memory). The strides of an array tell us how many bytes we have to skip in memory to move to the next position along a certain axis. For example, we have to skip 4 bytes (1 value) to move to the next column, but 20 bytes (5 values) to get to the same position in the next row. As such, the strides for the array `x` will be `(20, 4)`.
#### Examples
    
    >>> import numpy as np
    >>> y = np.reshape(np.arange(2*3*4), (2,3,4))
    >>> y
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>> y.strides
    (48, 16, 4)
    >>> y[1,1,1]
    17
    >>> offset=sum(y.strides * np.array((1,1,1)))
    >>> offset/y.itemsize
    17
    
    
    >>> x = np.reshape(np.arange(5*6*7*8), (5,6,7,8)).transpose(2,3,1,0)
    >>> x.strides
    (32, 4, 224, 1344)
    >>> i = np.array([3,5,2,2])
    >>> offset = sum(i * x.strides)
    >>> x[3,5,2,2]
    813
    >>> offset / x.itemsize
    813
    
# numpy.ma.MaskedArray.sum
method
ma.MaskedArray.sum(axis=None, dtype=None, out=None, keepdims=<no value>)[source]
    
Return the sum of the array elements over the given axis.
Masked elements are set to 0 internally.
Refer to `numpy.sum` for full documentation.
See also
`numpy.ndarray.sum`
    
corresponding function for ndarrays
`numpy.sum`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.sum()
    25
    >>> x.sum(axis=1)
    masked_array(data=[4, 5, 16],
                 mask=[False, False, False],
           fill_value=999999)
    >>> x.sum(axis=0)
    masked_array(data=[8, 5, 12],
                 mask=[False, False, False],
           fill_value=999999)
    >>> print(type(x.sum(axis=0, dtype=np.int64)[0]))
    <class 'numpy.int64'>
    
# numpy.ma.MaskedArray.swapaxes
method
ma.MaskedArray.swapaxes(axis1, axis2)[source]
    
Return a view of the array with `axis1` and `axis2` interchanged.
Refer to `numpy.swapaxes` for full documentation.
See also
`numpy.swapaxes`
    
equivalent function
# numpy.ma.MaskedArray.T
property
propertyma.MaskedArray.T
    
View of the transposed array.
Same as `self.transpose()`.
See also
`transpose`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.T
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.T
    array([1, 2, 3, 4])
    
# numpy.ma.MaskedArray.take
method
ma.MaskedArray.take(indices, axis=None, out=None, mode='raise')[source]
    
Take elements from a masked array along an axis.
This function does the same thing as “fancy” indexing (indexing arrays using arrays) for masked arrays. It can be easier to use if you need elements along a given axis.
Parameters:
    
amasked_array
    
The source masked array.
indicesarray_like
    
The indices of the values to extract. Also allow scalars for indices.
axisint, optional
    
The axis over which to select values. By default, the flattened input array is used.
outMaskedArray, optional
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype. Note that `out` is always buffered if `mode=’raise’`; use other modes for better performance.
mode{‘raise’, ‘wrap’, ‘clip’}, optional
    
Specifies how out-of-bounds indices will behave.
  * ‘raise’ – raise an error (default)
  * ‘wrap’ – wrap around
  * ‘clip’ – clip to the range


‘clip’ mode means that all indices that are too large are replaced by the index that addresses the last element along that axis. Note that this disables indexing with negative numbers.
Returns:
    
outMaskedArray
    
The returned array has the same type as `a`.
See also
`numpy.take`
    
Equivalent function for ndarrays.
`compress`
    
Take elements using a boolean mask.
`take_along_axis`
    
Take elements by matching the array and the index arrays.
#### Notes
This function behaves similarly to `numpy.take`, but it handles masked values. The mask is retained in the output array, and masked values in the input array remain masked in the output.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([4, 3, 5, 7, 6, 8], mask=[0, 0, 1, 0, 1, 0])
    >>> indices = [0, 1, 4]
    >>> np.ma.take(a, indices)
    masked_array(data=[4, 3, --],
                mask=[False, False,  True],
        fill_value=999999)
    
When `indices` is not one-dimensional, the output also has these dimensions:
    
    >>> np.ma.take(a, [[0, 1], [2, 3]])
    masked_array(data=[[4, 3],
                    [--, 7]],
                mask=[[False, False],
                    [ True, False]],
        fill_value=999999)
    
# numpy.ma.MaskedArray.tobytes
method
ma.MaskedArray.tobytes(fill_value=None, order='C')[source]
    
Return the array data as a string containing the raw bytes in the array.
The array is filled with a fill value before the string conversion.
Parameters:
    
fill_valuescalar, optional
    
Value used to fill in the masked values. Default is None, in which case `MaskedArray.fill_value` is used.
order{‘C’,’F’,’A’}, optional
    
Order of the data item in the copy. Default is ‘C’.
  * ‘C’ – C order (row major).
  * ‘F’ – Fortran order (column major).
  * ‘A’ – Any, current order of array.
  * None – Same as ‘A’.


See also
`numpy.ndarray.tobytes`
`tolist`, `tofile`
#### Notes
As for `ndarray.tobytes`, information about the shape, dtype, etc., but also about `fill_value`, will be lost.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.array([[1, 2], [3, 4]]), mask=[[0, 1], [1, 0]])
    >>> x.tobytes()
    b'\x01\x00\x00\x00\x00\x00\x00\x00?B\x0f\x00\x00\x00\x00\x00?B\x0f\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
    
# numpy.ma.MaskedArray.tofile
method
ma.MaskedArray.tofile(fid, sep='', format='%s')[source]
    
Save a masked array to a file in binary format.
Warning
This function is not implemented yet.
Raises:
    
NotImplementedError
    
When `tofile` is called.
# numpy.ma.MaskedArray.toflex
method
ma.MaskedArray.toflex()[source]
    
Transforms a masked array into a flexible-type array.
The flexible type array that is returned will have two fields:
  * the `_data` field stores the `_data` part of the array.
  * the `_mask` field stores the `_mask` part of the array.


Parameters:
    
None
Returns:
    
recordndarray
    
A new flexible-type `ndarray` with two fields: the first element containing a value, the second element containing the corresponding mask boolean. The returned record shape matches self.shape.
#### Notes
A side-effect of transforming a masked array into a flexible `ndarray` is that meta information (`fill_value`, …) will be lost.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.toflex()
    array([[(1, False), (2,  True), (3, False)],
           [(4,  True), (5, False), (6,  True)],
           [(7, False), (8,  True), (9, False)]],
          dtype=[('_data', '<i8'), ('_mask', '?')])
    
# numpy.ma.MaskedArray.tolist
method
ma.MaskedArray.tolist(fill_value=None)[source]
    
Return the data portion of the masked array as a hierarchical Python list.
Data items are converted to the nearest compatible Python type. Masked values are converted to `fill_value`. If `fill_value` is None, the corresponding entries in the output list will be `None`.
Parameters:
    
fill_valuescalar, optional
    
The value to use for invalid entries. Default is None.
Returns:
    
resultlist
    
The Python list representation of the masked array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3], [4,5,6], [7,8,9]], mask=[0] + [1,0]*4)
    >>> x.tolist()
    [[1, None, 3], [None, 5, None], [7, None, 9]]
    >>> x.tolist(-999)
    [[1, -999, 3], [-999, 5, -999], [7, -999, 9]]
    
# numpy.ma.MaskedArray.torecords
method
ma.MaskedArray.torecords()[source]
    
Transforms a masked array into a flexible-type array.
The flexible type array that is returned will have two fields:
  * the `_data` field stores the `_data` part of the array.
  * the `_mask` field stores the `_mask` part of the array.


Parameters:
    
None
Returns:
    
recordndarray
    
A new flexible-type `ndarray` with two fields: the first element containing a value, the second element containing the corresponding mask boolean. The returned record shape matches self.shape.
#### Notes
A side-effect of transforming a masked array into a flexible `ndarray` is that meta information (`fill_value`, …) will be lost.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.toflex()
    array([[(1, False), (2,  True), (3, False)],
           [(4,  True), (5, False), (6,  True)],
           [(7, False), (8,  True), (9, False)]],
          dtype=[('_data', '<i8'), ('_mask', '?')])
    
# numpy.ma.MaskedArray.tostring
method
ma.MaskedArray.tostring(fill_value=None, order='C')[source]
    
A compatibility alias for `tobytes`, with exactly the same behavior.
Despite its name, it returns `bytes` not `str`s.
Deprecated since version 1.19.0.
# numpy.ma.MaskedArray.trace
method
ma.MaskedArray.trace(offset=0, axis1=0, axis2=1, dtype=None, out=None)[source]
    
Return the sum along diagonals of the array.
Refer to `numpy.trace` for full documentation.
See also
`numpy.trace`
    
equivalent function
# numpy.ma.MaskedArray.transpose
method
ma.MaskedArray.transpose(*axes)[source]
    
Returns a view of the array with axes transposed.
Refer to `numpy.transpose` for full documentation.
Parameters:
    
axesNone, tuple of ints, or `n` ints
    
  * None or no argument: reverses the order of the axes.
  * tuple of ints: `i` in the `j`-th place in the tuple means that the array’s `i`-th axis becomes the transposed array’s `j`-th axis.
  * `n` ints: same as an n-tuple of the same ints (this form is intended simply as a “convenience” alternative to the tuple form).


Returns:
    
pndarray
    
View of the array with its axes suitably permuted.
See also
`transpose`
    
Equivalent function.
`ndarray.T`
    
Array property returning the array transposed.
`ndarray.reshape`
    
Give a new shape to an array without changing its data.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.transpose()
    array([[1, 3],
           [2, 4]])
    >>> a.transpose((1, 0))
    array([[1, 3],
           [2, 4]])
    >>> a.transpose(1, 0)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.transpose()
    array([1, 2, 3, 4])
    
# numpy.ma.MaskedArray.unshare_mask
method
ma.MaskedArray.unshare_mask()[source]
    
Copy the mask and set the `sharedmask` flag to `False`.
Whether the mask is shared between masked arrays can be seen from the `sharedmask` property. `unshare_mask` ensures the mask is not shared. A copy of the mask is only made if it was shared.
See also
`sharedmask`
# numpy.ma.MaskedArray.var
method
ma.MaskedArray.var(axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, mean=<no value>)[source]
    
Compute the variance along the specified axis.
Returns the variance of the array elements, a measure of the spread of a distribution. The variance is computed for the flattened array by default, otherwise over the specified axis.
Parameters:
    
aarray_like
    
Array containing numbers whose variance is desired. If `a` is not an array, a conversion is attempted.
axisNone or int or tuple of ints, optional
    
Axis or axes along which the variance is computed. The default is to compute the variance of the flattened array. If this is a tuple of ints, a variance is performed over multiple axes, instead of a single axis or all the axes as before.
dtypedata-type, optional
    
Type to use in computing the variance. For arrays of integer type the default is `float64`; for arrays of float types it is the same as the array type.
outndarray, optional
    
Alternate output array in which to place the result. It must have the same shape as the expected output, but the type is cast if necessary.
ddof{int, float}, optional
    
“Delta Degrees of Freedom”: the divisor used in the calculation is `N - ddof`, where `N` represents the number of elements. By default `ddof` is zero. See notes for details about use of `ddof`.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `var` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in the variance. See `reduce` for details.
New in version 1.20.0.
meanarray like, optional
    
Provide the mean to prevent its recalculation. The mean should have a shape as if it was calculated with `keepdims=True`. The axis for the calculation of the mean should be the same as used in the call to this var function.
New in version 2.0.0.
correction{int, float}, optional
    
Array API compatible name for the `ddof` parameter. Only one of them can be provided at the same time.
New in version 2.0.0.
Returns:
    
variancendarray, see dtype parameter above
    
If `out=None`, returns a new array containing the variance; otherwise, a reference to the output array is returned.
See also
`std`, `mean`, `nanmean`, `nanstd`, `nanvar`
Output type determination
#### Notes
There are several common variants of the array variance calculation. Assuming the input `a` is a one-dimensional NumPy array and `mean` is either provided as an argument or computed as `a.mean()`, NumPy computes the variance of an array as:
    
    N = len(a)
    d2 = abs(a - mean)**2  # abs is for complex `a`
    var = d2.sum() / (N - ddof)  # note use of `ddof`
    
Different values of the argument `ddof` are useful in different contexts. NumPy’s default `ddof=0` corresponds with the expression:
\\[\frac{\sum_i{|a_i - \bar{a}|^2 }}{N}\\]
which is sometimes called the “population variance” in the field of statistics because it applies the definition of variance to `a` as if `a` were a complete population of possible observations.
Many other libraries define the variance of an array differently, e.g.:
\\[\frac{\sum_i{|a_i - \bar{a}|^2}}{N - 1}\\]
In statistics, the resulting quantity is sometimes called the “sample variance” because if `a` is a random sample from a larger population, this calculation provides an unbiased estimate of the variance of the population. The use of \\(N-1\\) in the denominator is often called “Bessel’s correction” because it corrects for bias (toward lower values) in the variance estimate introduced when the sample mean of `a` is used in place of the true mean of the population. For this quantity, use `ddof=1`.
Note that for complex numbers, the absolute value is taken before squaring, so that the result is always real and nonnegative.
For floating-point input, the variance is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.var(a)
    1.25
    >>> np.var(a, axis=0)
    array([1.,  1.])
    >>> np.var(a, axis=1)
    array([0.25,  0.25])
    
In single precision, var() can be inaccurate:
    
    >>> a = np.zeros((2, 512*512), dtype=np.float32)
    >>> a[0, :] = 1.0
    >>> a[1, :] = 0.1
    >>> np.var(a)
    np.float32(0.20250003)
    
Computing the variance in float64 is more accurate:
    
    >>> np.var(a, dtype=np.float64)
    0.20249999932944759 # may vary
    >>> ((1-0.55)**2 + (0.1-0.55)**2)/2
    0.2025
    
Specifying a where argument:
    
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> np.var(a)
    6.833333333333333 # may vary
    >>> np.var(a, where=[[True], [True], [False]])
    4.0
    
Using the mean keyword to save computation time:
    
    >>> import numpy as np
    >>> from timeit import timeit
    >>>
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> mean = np.mean(a, axis=1, keepdims=True)
    >>>
    >>> g = globals()
    >>> n = 10000
    >>> t1 = timeit("var = np.var(a, axis=1, mean=mean)", globals=g, number=n)
    >>> t2 = timeit("var = np.var(a, axis=1)", globals=g, number=n)
    >>> print(f'Percentage execution time saved {100*(t2-t1)/t2:.0f}%')
    
    Percentage execution time saved 32%
    
# numpy.ma.MaskedArray.view
method
ma.MaskedArray.view(dtype=None, type=None, fill_value=None)[source]
    
Return a view of the MaskedArray data.
Parameters:
    
dtypedata-type or ndarray sub-class, optional
    
Data-type descriptor of the returned view, e.g., float32 or int16. The default, None, results in the view having the same data-type as `a`. As with `ndarray.view`, dtype can also be specified as an ndarray sub-class, which then specifies the type of the returned object (this is equivalent to setting the `type` parameter).
typePython type, optional
    
Type of the returned view, either ndarray or a subclass. The default None results in type preservation.
fill_valuescalar, optional
    
The value to use for invalid entries (None by default). If None, then this argument is inferred from the passed `dtype`, or in its absence the original array, as discussed in the notes below.
See also
`numpy.ndarray.view`
    
Equivalent method on ndarray object.
#### Notes
`a.view()` is used two different ways:
`a.view(some_dtype)` or `a.view(dtype=some_dtype)` constructs a view of the array’s memory with a different data-type. This can cause a reinterpretation of the bytes of memory.
`a.view(ndarray_subclass)` or `a.view(type=ndarray_subclass)` just returns an instance of `ndarray_subclass` that looks at the same array (same shape, dtype, etc.) This does not cause a reinterpretation of the memory.
If `fill_value` is not specified, but `dtype` is specified (and is not an ndarray sub-class), the `fill_value` of the MaskedArray will be reset. If neither `fill_value` nor `dtype` are specified (or if `dtype` is an ndarray sub-class), then the fill value is preserved. Finally, if `fill_value` is specified, but `dtype` is not, the fill value is set to the specified value.
For `a.view(some_dtype)`, if `some_dtype` has a different number of bytes per entry than the previous dtype (for example, converting a regular array to a structured array), then the behavior of the view cannot be predicted just from the superficial appearance of `a` (shown by `print(a)`). It also depends on exactly how `a` is stored in memory. Therefore if `a` is C-ordered versus fortran-ordered, versus defined as a slice or transpose, etc., the view may give different results.
# numpy.ma.MaskType
numpy.ma.MaskType[source]
    
alias of `bool`
# numpy.ma.max
ma.max(obj, axis=None, out=None, fill_value=None, keepdims=<no value>)[source]
    
Return the maximum along a given axis.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Axis along which to operate. By default, `axis` is None and the flattened input is used. If this is a tuple of ints, the maximum is selected over multiple axes, instead of a single axis or all the axes as before.
outarray_like, optional
    
Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output.
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, use the output of maximum_fill_value().
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
amaxarray_like
    
New array holding the result. If `out` was specified, `out` is returned.
See also
`ma.maximum_fill_value`
    
Returns the maximum filling value for a given datatype.
#### Examples
    
    >>> import numpy.ma as ma
    >>> x = [[-1., 2.5], [4., -2.], [3., 0.]]
    >>> mask = [[0, 0], [1, 0], [1, 0]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(
      data=[[-1.0, 2.5],
            [--, -2.0],
            [--, 0.0]],
      mask=[[False, False],
            [ True, False],
            [ True, False]],
      fill_value=1e+20)
    >>> ma.max(masked_x)
    2.5
    >>> ma.max(masked_x, axis=0)
    masked_array(data=[-1.0, 2.5],
                 mask=[False, False],
           fill_value=1e+20)
    >>> ma.max(masked_x, axis=1, keepdims=True)
    masked_array(
      data=[[2.5],
            [-2.0],
            [0.0]],
      mask=[[False],
            [False],
            [False]],
      fill_value=1e+20)
    >>> mask = [[1, 1], [1, 1], [1, 1]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> ma.max(masked_x, axis=1)
    masked_array(data=[--, --, --],
                 mask=[ True,  True,  True],
           fill_value=1e+20,
                dtype=float64)
    
# numpy.ma.maximum_fill_value
ma.maximum_fill_value(obj)[source]
    
Return the minimum value that can be represented by the dtype of an object.
This function is useful for calculating a fill value suitable for taking the maximum of an array with a given dtype.
Parameters:
    
objndarray, dtype or scalar
    
An object that can be queried for it’s numeric type.
Returns:
    
valscalar
    
The minimum representable value.
Raises:
    
TypeError
    
If `obj` isn’t a suitable numeric type.
See also
`minimum_fill_value`
    
The inverse function.
`set_fill_value`
    
Set the filling value of a masked array.
`MaskedArray.fill_value`
    
Return current fill value.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.int8()
    >>> ma.maximum_fill_value(a)
    -128
    >>> a = np.int32()
    >>> ma.maximum_fill_value(a)
    -2147483648
    
An array of numeric data can also be passed.
    
    >>> a = np.array([1, 2, 3], dtype=np.int8)
    >>> ma.maximum_fill_value(a)
    -128
    >>> a = np.array([1, 2, 3], dtype=np.float32)
    >>> ma.maximum_fill_value(a)
    -inf
    
# numpy.ma.mean
ma.mean(self, axis=None, dtype=None, out=None, keepdims=<no value>)=<numpy.ma.core._frommethod object>
    
Returns the average of the array elements along given axis.
Masked entries are ignored, and result elements which are not finite will be masked.
Refer to `numpy.mean` for full documentation.
See also
`numpy.ndarray.mean`
    
corresponding function for ndarrays
`numpy.mean`
    
Equivalent function
`numpy.ma.average`
    
Weighted average.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.array([1,2,3], mask=[False, False, True])
    >>> a
    masked_array(data=[1, 2, --],
                 mask=[False, False,  True],
           fill_value=999999)
    >>> a.mean()
    1.5
    
# numpy.ma.median
ma.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)[source]
    
Compute the median along the specified axis.
Returns the median of the array elements.
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array.
axisint, optional
    
Axis along which the medians are computed. The default (None) is to compute the median along a flattened version of the array.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow use of memory of input array (a) for calculations. The input array will be modified by the call to median. This will save memory when you do not need to preserve the contents of the input array. Treat the input as undefined, but it will probably be fully or partially sorted. Default is False. Note that, if `overwrite_input` is True, and the input is not already an `ndarray`, an error will be raised.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
Returns:
    
medianndarray
    
A new array holding the result is returned unless out is specified, in which case a reference to out is returned. Return data-type is `float64` for integers and floats smaller than `float64`, or the input data-type, otherwise.
See also
`mean`
#### Notes
Given a vector `V` with `N` non masked values, the median of `V` is the middle value of a sorted copy of `V` (`Vs`) - i.e. `Vs[(N-1)/2]`, when `N` is odd, or `{Vs[N/2 - 1] + Vs[N/2]}/2` when `N` is even.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(8), mask=[0]*4 + [1]*4)
    >>> np.ma.median(x)
    1.5
    
    
    >>> x = np.ma.array(np.arange(10).reshape(2, 5), mask=[0]*6 + [1]*4)
    >>> np.ma.median(x)
    2.5
    >>> np.ma.median(x, axis=-1, overwrite_input=True)
    masked_array(data=[2.0, 5.0],
                 mask=[False, False],
           fill_value=1e+20)
    
# numpy.ma.min
ma.min(obj, axis=None, out=None, fill_value=None, keepdims=<no value>)[source]
    
Return the minimum along a given axis.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Axis along which to operate. By default, `axis` is None and the flattened input is used. If this is a tuple of ints, the minimum is selected over multiple axes, instead of a single axis or all the axes as before.
outarray_like, optional
    
Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output.
fill_valuescalar or None, optional
    
Value used to fill in the masked values. If None, use the output of `minimum_fill_value`.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
aminarray_like
    
New array holding the result. If `out` was specified, `out` is returned.
See also
`ma.minimum_fill_value`
    
Returns the minimum filling value for a given datatype.
#### Examples
    
    >>> import numpy.ma as ma
    >>> x = [[1., -2., 3.], [0.2, -0.7, 0.1]]
    >>> mask = [[1, 1, 0], [0, 0, 1]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(
      data=[[--, --, 3.0],
            [0.2, -0.7, --]],
      mask=[[ True,  True, False],
            [False, False,  True]],
      fill_value=1e+20)
    >>> ma.min(masked_x)
    -0.7
    >>> ma.min(masked_x, axis=-1)
    masked_array(data=[3.0, -0.7],
                 mask=[False, False],
            fill_value=1e+20)
    >>> ma.min(masked_x, axis=0, keepdims=True)
    masked_array(data=[[0.2, -0.7, 3.0]],
                 mask=[[False, False, False]],
            fill_value=1e+20)
    >>> mask = [[1, 1, 1,], [1, 1, 1]]
    >>> masked_x = ma.masked_array(x, mask)
    >>> ma.min(masked_x, axis=0)
    masked_array(data=[--, --, --],
                 mask=[ True,  True,  True],
            fill_value=1e+20,
                dtype=float64)
    
# numpy.ma.minimum_fill_value
ma.minimum_fill_value(obj)[source]
    
Return the maximum value that can be represented by the dtype of an object.
This function is useful for calculating a fill value suitable for taking the minimum of an array with a given dtype.
Parameters:
    
objndarray, dtype or scalar
    
An object that can be queried for it’s numeric type.
Returns:
    
valscalar
    
The maximum representable value.
Raises:
    
TypeError
    
If `obj` isn’t a suitable numeric type.
See also
`maximum_fill_value`
    
The inverse function.
`set_fill_value`
    
Set the filling value of a masked array.
`MaskedArray.fill_value`
    
Return current fill value.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.int8()
    >>> ma.minimum_fill_value(a)
    127
    >>> a = np.int32()
    >>> ma.minimum_fill_value(a)
    2147483647
    
An array of numeric data can also be passed.
    
    >>> a = np.array([1, 2, 3], dtype=np.int8)
    >>> ma.minimum_fill_value(a)
    127
    >>> a = np.array([1, 2, 3], dtype=np.float32)
    >>> ma.minimum_fill_value(a)
    inf
    
# numpy.ma.mr_
ma.mr_=<numpy.ma.extras.mr_class object>
    
Translate slice objects to concatenation along the first axis.
This is the masked array version of `r_`.
See also
`r_`
#### Examples
    
    >>> import numpy as np
    >>> np.ma.mr_[np.ma.array([1,2,3]), 0, 0, np.ma.array([4,5,6])]
    masked_array(data=[1, 2, 3, ..., 4, 5, 6],
                 mask=False,
           fill_value=999999)
    
# numpy.ma.ndenumerate
ma.ndenumerate(a, compressed=True)[source]
    
Multidimensional index iterator.
Return an iterator yielding pairs of array coordinates and values, skipping elements that are masked. With `compressed=False`, `ma.masked` is yielded as the value of masked elements. This behavior differs from that of `numpy.ndenumerate`, which yields the value of the underlying data array.
Parameters:
    
aarray_like
    
An array with (possibly) masked elements.
compressedbool, optional
    
If True (default), masked elements are skipped.
See also
`numpy.ndenumerate`
    
Equivalent function ignoring any mask.
#### Notes
New in version 1.23.0.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ma.arange(9).reshape((3, 3))
    >>> a[1, 0] = np.ma.masked
    >>> a[1, 2] = np.ma.masked
    >>> a[2, 1] = np.ma.masked
    >>> a
    masked_array(
      data=[[0, 1, 2],
            [--, 4, --],
            [6, --, 8]],
      mask=[[False, False, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> for index, x in np.ma.ndenumerate(a):
    ...     print(index, x)
    (0, 0) 0
    (0, 1) 1
    (0, 2) 2
    (1, 1) 4
    (2, 0) 6
    (2, 2) 8
    
    
    >>> for index, x in np.ma.ndenumerate(a, compressed=False):
    ...     print(index, x)
    (0, 0) 0
    (0, 1) 1
    (0, 2) 2
    (1, 0) --
    (1, 1) 4
    (1, 2) --
    (2, 0) 6
    (2, 1) --
    (2, 2) 8
    
# numpy.ma.ndim
ma.ndim(obj)[source]
    
Return the number of dimensions of an array.
Parameters:
    
aarray_like
    
Input array. If it is not already an ndarray, a conversion is attempted.
Returns:
    
number_of_dimensionsint
    
The number of dimensions in `a`. Scalars are zero-dimensional.
See also
`ndarray.ndim`
    
equivalent method
`shape`
    
dimensions of array
`ndarray.shape`
    
dimensions of array
#### Examples
    
    >>> import numpy as np
    >>> np.ndim([[1,2,3],[4,5,6]])
    2
    >>> np.ndim(np.array([[1,2,3],[4,5,6]]))
    2
    >>> np.ndim(1)
    0
    
# numpy.ma.nonzero
ma.nonzero(self)=<numpy.ma.core._frommethod object>
    
Return the indices of unmasked elements that are not zero.
Returns a tuple of arrays, one for each dimension, containing the indices of the non-zero elements in that dimension. The corresponding non-zero values can be obtained with:
    
    a[a.nonzero()]
    
To group the indices by element, rather than dimension, use instead:
    
    np.transpose(a.nonzero())
    
The result of this is always a 2d array, with a row for each non-zero element.
Parameters:
    
None
Returns:
    
tuple_of_arraystuple
    
Indices of elements that are non-zero.
See also
`numpy.nonzero`
    
Function operating on ndarrays.
`flatnonzero`
    
Return indices that are non-zero in the flattened version of the input array.
`numpy.ndarray.nonzero`
    
Equivalent ndarray method.
`count_nonzero`
    
Counts the number of non-zero elements in the input array.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = ma.array(np.eye(3))
    >>> x
    masked_array(
      data=[[1., 0., 0.],
            [0., 1., 0.],
            [0., 0., 1.]],
      mask=False,
      fill_value=1e+20)
    >>> x.nonzero()
    (array([0, 1, 2]), array([0, 1, 2]))
    
Masked elements are ignored.
    
    >>> x[1, 1] = ma.masked
    >>> x
    masked_array(
      data=[[1.0, 0.0, 0.0],
            [0.0, --, 0.0],
            [0.0, 0.0, 1.0]],
      mask=[[False, False, False],
            [False,  True, False],
            [False, False, False]],
      fill_value=1e+20)
    >>> x.nonzero()
    (array([0, 2]), array([0, 2]))
    
Indices can also be grouped by element.
    
    >>> np.transpose(x.nonzero())
    array([[0, 0],
           [2, 2]])
    
A common use for `nonzero` is to find the indices of an array, where a condition is True. Given an array `a`, the condition `a` > 3 is a boolean array and since False is interpreted as 0, ma.nonzero(a > 3) yields the indices of the `a` where the condition is true.
    
    >>> a = ma.array([[1,2,3],[4,5,6],[7,8,9]])
    >>> a > 3
    masked_array(
      data=[[False, False, False],
            [ True,  True,  True],
            [ True,  True,  True]],
      mask=False,
      fill_value=True)
    >>> ma.nonzero(a > 3)
    (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
    
The `nonzero` method of the condition array can also be called.
    
    >>> (a > 3).nonzero()
    (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
    
# numpy.ma.notmasked_contiguous
ma.notmasked_contiguous(a, axis=None)[source]
    
Find contiguous unmasked data in a masked array along the given axis.
Parameters:
    
aarray_like
    
The input array.
axisint, optional
    
Axis along which to perform the operation. If None (default), applies to a flattened version of the array, and this is the same as `flatnotmasked_contiguous`.
Returns:
    
endpointslist
    
A list of slices (start and end indexes) of unmasked indexes in the array.
If the input is 2d and axis is specified, the result is a list of lists.
See also
`flatnotmasked_edges`, `flatnotmasked_contiguous`, `notmasked_edges`
`clump_masked`, `clump_unmasked`
#### Notes
Only accepts 2-D arrays at most.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(12).reshape((3, 4))
    >>> mask = np.zeros_like(a)
    >>> mask[1:, :-1] = 1; mask[0, 1] = 1; mask[-1, 0] = 0
    >>> ma = np.ma.array(a, mask=mask)
    >>> ma
    masked_array(
      data=[[0, --, 2, 3],
            [--, --, --, 7],
            [8, --, --, 11]],
      mask=[[False,  True, False, False],
            [ True,  True,  True, False],
            [False,  True,  True, False]],
      fill_value=999999)
    >>> np.array(ma[~ma.mask])
    array([ 0,  2,  3,  7, 8, 11])
    
    
    >>> np.ma.notmasked_contiguous(ma)
    [slice(0, 1, None), slice(2, 4, None), slice(7, 9, None), slice(11, 12, None)]
    
    
    >>> np.ma.notmasked_contiguous(ma, axis=0)
    [[slice(0, 1, None), slice(2, 3, None)], [], [slice(0, 1, None)], [slice(0, 3, None)]]
    
    
    >>> np.ma.notmasked_contiguous(ma, axis=1)
    [[slice(0, 1, None), slice(2, 4, None)], [slice(3, 4, None)], [slice(0, 1, None), slice(3, 4, None)]]
    
# numpy.ma.notmasked_edges
ma.notmasked_edges(a, axis=None)[source]
    
Find the indices of the first and last unmasked values along an axis.
If all values are masked, return None. Otherwise, return a list of two tuples, corresponding to the indices of the first and last unmasked values respectively.
Parameters:
    
aarray_like
    
The input array.
axisint, optional
    
Axis along which to perform the operation. If None (default), applies to a flattened version of the array.
Returns:
    
edgesndarray or list
    
An array of start and end indexes if there are any masked data in the array. If there are no masked data in the array, `edges` is a list of the first and last index.
See also
`flatnotmasked_contiguous`, `flatnotmasked_edges`, `notmasked_contiguous`
`clump_masked`, `clump_unmasked`
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(9).reshape((3, 3))
    >>> m = np.zeros_like(a)
    >>> m[1:, 1:] = 1
    
    
    >>> am = np.ma.array(a, mask=m)
    >>> np.array(am[~am.mask])
    array([0, 1, 2, 3, 6])
    
    
    >>> np.ma.notmasked_edges(am)
    array([0, 6])
    
# numpy.ma.ones
ma.ones(shape, dtype=None, order='C')=<numpy.ma.core._convert2ma object>
    
Return a new array of given shape and type, filled with ones.
Parameters:
    
shapeint or sequence of ints
    
Shape of the new array, e.g., `(2, 3)` or `2`.
dtypedata-type, optional
    
The desired data-type for the array, e.g., `numpy.int8`. Default is `numpy.float64`.
order{‘C’, ‘F’}, optional, default: C
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outMaskedArray
    
Array of ones with the given shape, dtype, and order.
See also
`ones_like`
    
Return an array of ones with shape and type of input.
`empty`
    
Return a new uninitialized array.
`zeros`
    
Return a new array setting values to zero.
`full`
    
Return a new array of given shape filled with value.
#### Examples
    
    >>> import numpy as np
    >>> np.ones(5)
    array([1., 1., 1., 1., 1.])
    
    
    >>> np.ones((5,), dtype=int)
    array([1, 1, 1, 1, 1])
    
    
    >>> np.ones((2, 1))
    array([[1.],
           [1.]])
    
    
    >>> s = (2,2)
    >>> np.ones(s)
    array([[1.,  1.],
           [1.,  1.]])
    
# numpy.ma.ones_like
ma.ones_like=<numpy.ma.core._convert2ma object>
    
Return an array of ones with the same shape and type as a given array.
Parameters:
    
aarray_like
    
The shape and data-type of `a` define these same attributes of the returned array.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `a`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outMaskedArray
    
Array of ones with the same shape and type as `a`.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`zeros_like`
    
Return an array of zeros with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`ones`
    
Return a new array setting values to one.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6)
    >>> x = x.reshape((2, 3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.ones_like(x)
    array([[1, 1, 1],
           [1, 1, 1]])
    
    
    >>> y = np.arange(3, dtype=float)
    >>> y
    array([0., 1., 2.])
    >>> np.ones_like(y)
    array([1.,  1.,  1.])
    
# numpy.ma.outer
ma.outer(a, b)[source]
    
Compute the outer product of two vectors.
Given two vectors `a` and `b` of length `M` and `N`, respectively, the outer product [1] is:
    
    [[a_0*b_0  a_0*b_1 ... a_0*b_{N-1} ]
     [a_1*b_0    .
     [ ...          .
     [a_{M-1}*b_0            a_{M-1}*b_{N-1} ]]
    
Parameters:
    
a(M,) array_like
    
First input vector. Input is flattened if not already 1-dimensional.
b(N,) array_like
    
Second input vector. Input is flattened if not already 1-dimensional.
out(M, N) ndarray, optional
    
A location where the result is stored
Returns:
    
out(M, N) ndarray
    
`out[i, j] = a[i] * b[j]`
See also
`inner`
`einsum`
    
`einsum('i,j->ij', a.ravel(), b.ravel())` is the equivalent.
`ufunc.outer`
    
A generalization to dimensions other than 1D and other operations. `np.multiply.outer(a.ravel(), b.ravel())` is the equivalent.
`linalg.outer`
    
An Array API compatible variation of `np.outer`, which accepts 1-dimensional inputs only.
`tensordot`
    
`np.tensordot(a.ravel(), b.ravel(), axes=((), ()))` is the equivalent.
#### Notes
Masked values are replaced by 0.
#### References
[1]
G. H. Golub and C. F. Van Loan, Matrix Computations, 3rd ed., Baltimore, MD, Johns Hopkins University Press, 1996, pg. 8.
#### Examples
Make a (very coarse) grid for computing a Mandelbrot set:
    
    >>> import numpy as np
    >>> rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
    >>> rl
    array([[-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.]])
    >>> im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
    >>> im
    array([[0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j],
           [0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j],
           [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
           [0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j],
           [0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]])
    >>> grid = rl + im
    >>> grid
    array([[-2.+2.j, -1.+2.j,  0.+2.j,  1.+2.j,  2.+2.j],
           [-2.+1.j, -1.+1.j,  0.+1.j,  1.+1.j,  2.+1.j],
           [-2.+0.j, -1.+0.j,  0.+0.j,  1.+0.j,  2.+0.j],
           [-2.-1.j, -1.-1.j,  0.-1.j,  1.-1.j,  2.-1.j],
           [-2.-2.j, -1.-2.j,  0.-2.j,  1.-2.j,  2.-2.j]])
    
An example using a “vector” of letters:
    
    >>> x = np.array(['a', 'b', 'c'], dtype=object)
    >>> np.outer(x, [1, 2, 3])
    array([['a', 'aa', 'aaa'],
           ['b', 'bb', 'bbb'],
           ['c', 'cc', 'ccc']], dtype=object)
    
# numpy.ma.outerproduct
ma.outerproduct(a, b)[source]
    
Compute the outer product of two vectors.
Given two vectors `a` and `b` of length `M` and `N`, respectively, the outer product [1] is:
    
    [[a_0*b_0  a_0*b_1 ... a_0*b_{N-1} ]
     [a_1*b_0    .
     [ ...          .
     [a_{M-1}*b_0            a_{M-1}*b_{N-1} ]]
    
Parameters:
    
a(M,) array_like
    
First input vector. Input is flattened if not already 1-dimensional.
b(N,) array_like
    
Second input vector. Input is flattened if not already 1-dimensional.
out(M, N) ndarray, optional
    
A location where the result is stored
Returns:
    
out(M, N) ndarray
    
`out[i, j] = a[i] * b[j]`
See also
`inner`
`einsum`
    
`einsum('i,j->ij', a.ravel(), b.ravel())` is the equivalent.
`ufunc.outer`
    
A generalization to dimensions other than 1D and other operations. `np.multiply.outer(a.ravel(), b.ravel())` is the equivalent.
`linalg.outer`
    
An Array API compatible variation of `np.outer`, which accepts 1-dimensional inputs only.
`tensordot`
    
`np.tensordot(a.ravel(), b.ravel(), axes=((), ()))` is the equivalent.
#### Notes
Masked values are replaced by 0.
#### References
[1]
G. H. Golub and C. F. Van Loan, Matrix Computations, 3rd ed., Baltimore, MD, Johns Hopkins University Press, 1996, pg. 8.
#### Examples
Make a (very coarse) grid for computing a Mandelbrot set:
    
    >>> import numpy as np
    >>> rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
    >>> rl
    array([[-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.]])
    >>> im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
    >>> im
    array([[0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j],
           [0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j],
           [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
           [0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j],
           [0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]])
    >>> grid = rl + im
    >>> grid
    array([[-2.+2.j, -1.+2.j,  0.+2.j,  1.+2.j,  2.+2.j],
           [-2.+1.j, -1.+1.j,  0.+1.j,  1.+1.j,  2.+1.j],
           [-2.+0.j, -1.+0.j,  0.+0.j,  1.+0.j,  2.+0.j],
           [-2.-1.j, -1.-1.j,  0.-1.j,  1.-1.j,  2.-1.j],
           [-2.-2.j, -1.-2.j,  0.-2.j,  1.-2.j,  2.-2.j]])
    
An example using a “vector” of letters:
    
    >>> x = np.array(['a', 'b', 'c'], dtype=object)
    >>> np.outer(x, [1, 2, 3])
    array([['a', 'aa', 'aaa'],
           ['b', 'bb', 'bbb'],
           ['c', 'cc', 'ccc']], dtype=object)
    
# numpy.ma.polyfit
ma.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)[source]
    
Least squares polynomial fit.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Fit a polynomial `p(x) = p[0] * x**deg + ... + p[deg]` of degree `deg` to points `(x, y)`. Returns a vector of coefficients `p` that minimises the squared error in the order `deg`, `deg-1`, … `0`.
The `Polynomial.fit` class method is recommended for new code as it is more stable numerically. See the documentation of the method for more information.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint
    
Degree of the fitting polynomial
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
covbool or str, optional
    
If given and not `False`, return not just the estimate but also its covariance matrix. By default, the covariance are scaled by chi2/dof, where dof = M - (deg + 1), i.e., the weights are presumed to be unreliable except in a relative sense and everything is scaled such that the reduced chi2 is unity. This scaling is omitted if `cov='unscaled'`, as is relevant for the case that the weights are w = 1/sigma, with sigma known to be a reliable estimate of the uncertainty.
Returns:
    
pndarray, shape (deg + 1,) or (deg + 1, K)
    
Polynomial coefficients, highest power first. If `y` was 2-D, the coefficients for `k`-th data set are in `p[:,k]`.
residuals, rank, singular_values, rcond
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the effective rank of the scaled Vandermonde
    
coefficient matrix
  * singular_values – singular values of the scaled Vandermonde
    
coefficient matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Vndarray, shape (deg + 1, deg + 1) or (deg + 1, deg + 1, K)
    
Present only if `full == False` and `cov == True`. The covariance matrix of the polynomial coefficient estimates. The diagonal of this matrix are the variance estimates for each coefficient. If y is a 2-D array, then the covariance matrix for the `k`-th data set are in `V[:,:,k]`
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full == False`.
The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`polyval`
    
Compute polynomial values.
`linalg.lstsq`
    
Computes a least-squares fit.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
Any masked values in x is propagated in y, and vice-versa.
The solution minimizes the squared error
\\[E = \sum_{j=0}^k |p(x_j) - y_j|^2\\]
in the equations:
    
    x[0]**n * p[0] + ... + x[0] * p[n-1] + p[n] = y[0]
    x[1]**n * p[0] + ... + x[1] * p[n-1] + p[n] = y[1]
    ...
    x[k]**n * p[0] + ... + x[k] * p[n-1] + p[n] = y[k]
    
The coefficient matrix of the coefficients `p` is a Vandermonde matrix.
`polyfit` issues a `RankWarning` when the least-squares fit is badly conditioned. This implies that the best fit is not well-defined due to numerical error. The results may be improved by lowering the polynomial degree or by replacing `x` by `x` \- `x`.mean(). The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious: including contributions from the small singular values can add numerical noise to the result.
Note that fitting polynomial coefficients is inherently badly conditioned when the degree of the polynomial is large or the interval of sample points is badly centered. The quality of the fit should always be checked in these cases. When polynomial fits are not satisfactory, splines may be a good alternative.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
[2]
Wikipedia, “Polynomial interpolation”, https://en.wikipedia.org/wiki/Polynomial_interpolation
#### Examples
    
    >>> import numpy as np
    >>> import warnings
    >>> x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
    >>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
    >>> z = np.polyfit(x, y, 3)
    >>> z
    array([ 0.08703704, -0.81349206,  1.69312169, -0.03968254]) # may vary
    
It is convenient to use `poly1d` objects for dealing with polynomials:
    
    >>> p = np.poly1d(z)
    >>> p(0.5)
    0.6143849206349179 # may vary
    >>> p(3.5)
    -0.34732142857143039 # may vary
    >>> p(10)
    22.579365079365115 # may vary
    
High-order polynomials may oscillate wildly:
    
    >>> with warnings.catch_warnings():
    ...     warnings.simplefilter('ignore', np.exceptions.RankWarning)
    ...     p30 = np.poly1d(np.polyfit(x, y, 30))
    ...
    >>> p30(4)
    -0.80000000000000204 # may vary
    >>> p30(5)
    -0.99999999999999445 # may vary
    >>> p30(4.5)
    -0.10547061179440398 # may vary
    
Illustration:
    
    >>> import matplotlib.pyplot as plt
    >>> xp = np.linspace(-2, 6, 100)
    >>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--')
    >>> plt.ylim(-2,2)
    (-2, 2)
    >>> plt.show()
    
# numpy.ma.power
ma.power(a, b, third=None)[source]
    
Returns element-wise base array raised to power from second array.
This is the masked array version of `numpy.power`. For details see `numpy.power`.
See also
`numpy.power`
#### Notes
The out argument to `numpy.power` is not supported, `third` has to be None.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [11.2, -3.973, 0.801, -1.41]
    >>> mask = [0, 0, 0, 1]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(data=[11.2, -3.973, 0.801, --],
             mask=[False, False, False,  True],
       fill_value=1e+20)
    >>> ma.power(masked_x, 2)
    masked_array(data=[125.43999999999998, 15.784728999999999,
                   0.6416010000000001, --],
             mask=[False, False, False,  True],
       fill_value=1e+20)
    >>> y = [-0.5, 2, 0, 17]
    >>> masked_y = ma.masked_array(y, mask)
    >>> masked_y
    masked_array(data=[-0.5, 2.0, 0.0, --],
             mask=[False, False, False,  True],
       fill_value=1e+20)
    >>> ma.power(masked_x, masked_y)
    masked_array(data=[0.2988071523335984, 15.784728999999999, 1.0, --],
             mask=[False, False, False,  True],
       fill_value=1e+20)
    
# numpy.ma.prod
ma.prod(self, axis=None, dtype=None, out=None, keepdims=<no value>)=<numpy.ma.core._frommethod object>
    
Return the product of the array elements over the given axis.
Masked elements are set to 1 internally for computation.
Refer to `numpy.prod` for full documentation.
See also
`numpy.ndarray.prod`
    
corresponding function for ndarrays
`numpy.prod`
    
equivalent function
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
# numpy.ma.ptp
ma.ptp(obj, axis=None, out=None, fill_value=None, keepdims=<no value>)[source]
    
Return (maximum - minimum) along the given dimension (i.e. peak-to-peak value).
Warning
`ptp` preserves the data type of the array. This means the return value for an input of signed integers with n bits (e.g. `np.int8`, `np.int16`, etc) is also a signed integer with n bits. In that case, peak-to-peak values greater than `2**(n-1)-1` will be returned as negative values. An example with a work-around is shown below.
Parameters:
    
axis{None, int}, optional
    
Axis along which to find the peaks. If None (default) the flattened array is used.
out{None, array_like}, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary.
fill_valuescalar or None, optional
    
Value used to fill in the masked values.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
Returns:
    
ptpndarray.
    
A new array holding the result, unless `out` was specified, in which case a reference to `out` is returned.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.MaskedArray([[4, 9, 2, 10],
    ...                        [6, 9, 7, 12]])
    
    
    >>> x.ptp(axis=1)
    masked_array(data=[8, 6],
                 mask=False,
           fill_value=999999)
    
    
    >>> x.ptp(axis=0)
    masked_array(data=[2, 0, 5, 2],
                 mask=False,
           fill_value=999999)
    
    
    >>> x.ptp()
    10
    
This example shows that a negative value can be returned when the input is an array of signed integers.
    
    >>> y = np.ma.MaskedArray([[1, 127],
    ...                        [0, 127],
    ...                        [-1, 127],
    ...                        [-2, 127]], dtype=np.int8)
    >>> y.ptp(axis=1)
    masked_array(data=[ 126,  127, -128, -127],
                 mask=False,
           fill_value=np.int64(999999),
                dtype=int8)
    
A work-around is to use the `view()` method to view the result as unsigned integers with the same bit width:
    
    >>> y.ptp(axis=1).view(np.uint8)
    masked_array(data=[126, 127, 128, 129],
                 mask=False,
           fill_value=np.uint64(999999),
                dtype=uint8)
    
# numpy.ma.put
ma.put(a, indices, values, mode='raise')[source]
    
Set storage-indexed locations to corresponding values.
This function is equivalent to `MaskedArray.put`, see that method for details.
See also
`MaskedArray.put`
#### Examples
Putting values in a masked array:
    
    >>> a = np.ma.array([1, 2, 3, 4], mask=[False, True, False, False])
    >>> np.ma.put(a, [1, 3], [10, 30])
    >>> a
    masked_array(data=[ 1, 10,  3, 30],
                 mask=False,
           fill_value=999999)
    
Using put with a 2D array:
    
    >>> b = np.ma.array([[1, 2], [3, 4]], mask=[[False, True], [False, False]])
    >>> np.ma.put(b, [[0, 1], [1, 0]], [[10, 20], [30, 40]])
    >>> b
    masked_array(
      data=[[40, 30],
            [ 3,  4]],
      mask=False,
      fill_value=999999)
    
# numpy.ma.putmask
ma.putmask(a, mask, values)[source]
    
Changes elements of an array based on conditional and input values.
This is the masked array version of `numpy.putmask`, for details see `numpy.putmask`.
See also
`numpy.putmask`
#### Notes
Using a masked array as `values` will not transform a `ndarray` into a `MaskedArray`.
#### Examples
    
    >>> import numpy as np
    >>> arr = [[1, 2], [3, 4]]
    >>> mask = [[1, 0], [0, 0]]
    >>> x = np.ma.array(arr, mask=mask)
    >>> np.ma.putmask(x, x < 4, 10*x)
    >>> x
    masked_array(
      data=[[--, 20],
            [30, 4]],
      mask=[[ True, False],
            [False, False]],
      fill_value=999999)
    >>> x.data
    array([[10, 20],
           [30,  4]])
    
# numpy.ma.ravel
ma.ravel(self, order='C')=<numpy.ma.core._frommethod object>
    
Returns a 1D version of self, as a view.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
The elements of `a` are read using this index order. ‘C’ means to index the elements in C-like order, with the last axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to index the elements in Fortran-like index order, with the first index changing fastest, and the last index changing slowest. Note that the ‘C’ and ‘F’ options take no account of the memory layout of the underlying array, and only refer to the order of axis indexing. ‘A’ means to read the elements in Fortran-like index order if `m` is Fortran contiguous in memory, C-like order otherwise. ‘K’ means to read the elements in the order they occur in memory, except for reversing the data when strides are negative. By default, ‘C’ index order is used. (Masked arrays currently use ‘A’ on the data when ‘K’ is passed.)
Returns:
    
MaskedArray
    
Output view is of shape `(self.size,)` (or `(np.ma.product(self.shape),)`).
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.ravel()
    masked_array(data=[1, --, 3, --, 5, --, 7, --, 9],
                 mask=[False,  True, False,  True, False,  True, False,  True,
                       False],
           fill_value=999999)
    
# numpy.ma.reshape
ma.reshape(a, new_shape, order='C')[source]
    
Returns an array containing the same data with a new shape.
Refer to `MaskedArray.reshape` for full documentation.
See also
`MaskedArray.reshape`
    
equivalent function
#### Examples
Reshaping a 1-D array:
    
    >>> a = np.ma.array([1, 2, 3, 4])
    >>> np.ma.reshape(a, (2, 2))
    masked_array(
      data=[[1, 2],
            [3, 4]],
      mask=False,
      fill_value=999999)
    
Reshaping a 2-D array:
    
    >>> b = np.ma.array([[1, 2], [3, 4]])
    >>> np.ma.reshape(b, (1, 4))
    masked_array(data=[[1, 2, 3, 4]],
                 mask=False,
           fill_value=999999)
    
Reshaping a 1-D array with a mask:
    
    >>> c = np.ma.array([1, 2, 3, 4], mask=[False, True, False, False])
    >>> np.ma.reshape(c, (2, 2))
    masked_array(
      data=[[1, --],
            [3, 4]],
      mask=[[False,  True],
            [False, False]],
      fill_value=999999)
    
# numpy.ma.resize
ma.resize(x, new_shape)[source]
    
Return a new masked array with the specified size and shape.
This is the masked equivalent of the `numpy.resize` function. The new array is filled with repeated copies of `x` (in the order that the data are stored in memory). If `x` is masked, the new array will be masked, and the new mask will be a repetition of the old one.
See also
`numpy.resize`
    
Equivalent function in the top level NumPy module.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = ma.array([[1, 2] ,[3, 4]])
    >>> a[0, 1] = ma.masked
    >>> a
    masked_array(
      data=[[1, --],
            [3, 4]],
      mask=[[False,  True],
            [False, False]],
      fill_value=999999)
    >>> np.resize(a, (3, 3))
    masked_array(
      data=[[1, 2, 3],
            [4, 1, 2],
            [3, 4, 1]],
      mask=False,
      fill_value=999999)
    >>> ma.resize(a, (3, 3))
    masked_array(
      data=[[1, --, 3],
            [4, 1, --],
            [3, 4, 1]],
      mask=[[False,  True, False],
            [False, False,  True],
            [False, False, False]],
      fill_value=999999)
    
A MaskedArray is always returned, regardless of the input type.
    
    >>> a = np.array([[1, 2] ,[3, 4]])
    >>> ma.resize(a, (3, 3))
    masked_array(
      data=[[1, 2, 3],
            [4, 1, 2],
            [3, 4, 1]],
      mask=False,
      fill_value=999999)
    
# numpy.ma.right_shift
ma.right_shift(a, n)[source]
    
Shift the bits of an integer to the right.
This is the masked array version of `numpy.right_shift`, for details see that function.
See also
`numpy.right_shift`
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [11, 3, 8, 1]
    >>> mask = [0, 0, 0, 1]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(data=[11, 3, 8, --],
                 mask=[False, False, False,  True],
           fill_value=999999)
    >>> ma.right_shift(masked_x,1)
    masked_array(data=[5, 1, 4, --],
                 mask=[False, False, False,  True],
           fill_value=999999)
    
# numpy.ma.round
ma.round(a, decimals=0, out=None)[source]
    
Return a copy of a, rounded to ‘decimals’ places.
When ‘decimals’ is negative, it specifies the number of positions to the left of the decimal point. The real and imaginary parts of complex numbers are rounded separately. Nothing is done if the array is not of float type and ‘decimals’ is greater than or equal to 0.
Parameters:
    
decimalsint
    
Number of decimals to round to. May be negative.
outarray_like
    
Existing array to use for output. If not given, returns a default copy of a.
#### Notes
If out is given and does not have a mask attribute, the mask of a is lost!
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [11.2, -3.973, 0.801, -1.41]
    >>> mask = [0, 0, 0, 1]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(data=[11.2, -3.973, 0.801, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    >>> ma.round_(masked_x)
    masked_array(data=[11.0, -4.0, 1.0, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    >>> ma.round(masked_x, decimals=1)
    masked_array(data=[11.2, -4.0, 0.8, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    >>> ma.round_(masked_x, decimals=-1)
    masked_array(data=[10.0, -0.0, 0.0, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    
# numpy.ma.round_
ma.round_(a, decimals=0, out=None)[source]
    
Return a copy of a, rounded to ‘decimals’ places.
When ‘decimals’ is negative, it specifies the number of positions to the left of the decimal point. The real and imaginary parts of complex numbers are rounded separately. Nothing is done if the array is not of float type and ‘decimals’ is greater than or equal to 0.
Parameters:
    
decimalsint
    
Number of decimals to round to. May be negative.
outarray_like
    
Existing array to use for output. If not given, returns a default copy of a.
#### Notes
If out is given and does not have a mask attribute, the mask of a is lost!
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [11.2, -3.973, 0.801, -1.41]
    >>> mask = [0, 0, 0, 1]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(data=[11.2, -3.973, 0.801, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    >>> ma.round_(masked_x)
    masked_array(data=[11.0, -4.0, 1.0, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    >>> ma.round(masked_x, decimals=1)
    masked_array(data=[11.2, -4.0, 0.8, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    >>> ma.round_(masked_x, decimals=-1)
    masked_array(data=[10.0, -0.0, 0.0, --],
                 mask=[False, False, False, True],
        fill_value=1e+20)
    
# numpy.ma.set_fill_value
ma.set_fill_value(a, fill_value)[source]
    
Set the filling value of a, if a is a masked array.
This function changes the fill value of the masked array `a` in place. If `a` is not a masked array, the function returns silently, without doing anything.
Parameters:
    
aarray_like
    
Input array.
fill_valuedtype
    
Filling value. A consistency test is performed to make sure the value is compatible with the dtype of `a`.
Returns:
    
None
    
Nothing returned by this function.
See also
`maximum_fill_value`
    
Return the default fill value for a dtype.
`MaskedArray.fill_value`
    
Return current fill value.
`MaskedArray.set_fill_value`
    
Equivalent method.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> a = np.arange(5)
    >>> a
    array([0, 1, 2, 3, 4])
    >>> a = ma.masked_where(a < 3, a)
    >>> a
    masked_array(data=[--, --, --, 3, 4],
                 mask=[ True,  True,  True, False, False],
           fill_value=999999)
    >>> ma.set_fill_value(a, -999)
    >>> a
    masked_array(data=[--, --, --, 3, 4],
                 mask=[ True,  True,  True, False, False],
           fill_value=-999)
    
Nothing happens if `a` is not a masked array.
    
    >>> a = list(range(5))
    >>> a
    [0, 1, 2, 3, 4]
    >>> ma.set_fill_value(a, 100)
    >>> a
    [0, 1, 2, 3, 4]
    >>> a = np.arange(5)
    >>> a
    array([0, 1, 2, 3, 4])
    >>> ma.set_fill_value(a, 100)
    >>> a
    array([0, 1, 2, 3, 4])
    
# numpy.ma.setdiff1d
ma.setdiff1d(ar1, ar2, assume_unique=False)[source]
    
Set difference of 1D arrays with unique elements.
The output is always a masked array. See `numpy.setdiff1d` for more details.
See also
`numpy.setdiff1d`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([1, 2, 3, 4], mask=[0, 1, 0, 1])
    >>> np.ma.setdiff1d(x, [1, 2])
    masked_array(data=[3, --],
                 mask=[False,  True],
           fill_value=999999)
    
# numpy.ma.setxor1d
ma.setxor1d(ar1, ar2, assume_unique=False)[source]
    
Set exclusive-or of 1-D arrays with unique elements.
The output is always a masked array. See `numpy.setxor1d` for more details.
See also
`numpy.setxor1d`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> ar1 = np.ma.array([1, 2, 3, 2, 4])
    >>> ar2 = np.ma.array([2, 3, 5, 7, 5])
    >>> np.ma.setxor1d(ar1, ar2)
    masked_array(data=[1, 4, 5, 7],
                 mask=False,
           fill_value=999999)
    
# numpy.ma.shape
ma.shape(obj)[source]
    
Return the shape of an array.
Parameters:
    
aarray_like
    
Input array.
Returns:
    
shapetuple of ints
    
The elements of the shape tuple give the lengths of the corresponding array dimensions.
See also
`len`
    
`len(a)` is equivalent to `np.shape(a)[0]` for N-D arrays with `N>=1`.
`ndarray.shape`
    
Equivalent array method.
#### Examples
    
    >>> import numpy as np
    >>> np.shape(np.eye(3))
    (3, 3)
    >>> np.shape([[1, 3]])
    (1, 2)
    >>> np.shape([0])
    (1,)
    >>> np.shape(0)
    ()
    
    
    >>> a = np.array([(1, 2), (3, 4), (5, 6)],
    ...              dtype=[('x', 'i4'), ('y', 'i4')])
    >>> np.shape(a)
    (3,)
    >>> a.shape
    (3,)
    
# numpy.ma.size
ma.size(obj, axis=None)[source]
    
Return the number of elements along a given axis.
Parameters:
    
aarray_like
    
Input data.
axisint, optional
    
Axis along which the elements are counted. By default, give the total number of elements.
Returns:
    
element_countint
    
Number of elements along the specified axis.
See also
`shape`
    
dimensions of array
`ndarray.shape`
    
dimensions of array
`ndarray.size`
    
number of elements in array
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2,3],[4,5,6]])
    >>> np.size(a)
    6
    >>> np.size(a,1)
    3
    >>> np.size(a,0)
    2
    
# numpy.ma.soften_mask
ma.soften_mask(self)=<numpy.ma.core._frommethod object>
    
Force the mask to soft (default), allowing unmasking by assignment.
Whether the mask of a masked array is hard or soft is determined by its `hardmask` property. `soften_mask` sets `hardmask` to `False` (and returns the modified self).
See also
`ma.MaskedArray.hardmask`
`ma.MaskedArray.harden_mask`
# numpy.ma.sort
ma.sort(a, axis=-1, kind=None, order=None, endwith=True, fill_value=None, *, stable=None)[source]
    
Return a sorted copy of the masked array.
Equivalent to creating a copy of the array and applying the MaskedArray `sort()` method.
Refer to `MaskedArray.sort` for the full documentation
See also
`MaskedArray.sort`
    
equivalent method
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = [11.2, -3.973, 0.801, -1.41]
    >>> mask = [0, 0, 0, 1]
    >>> masked_x = ma.masked_array(x, mask)
    >>> masked_x
    masked_array(data=[11.2, -3.973, 0.801, --],
                 mask=[False, False, False,  True],
           fill_value=1e+20)
    >>> ma.sort(masked_x)
    masked_array(data=[-3.973, 0.801, 11.2, --],
                 mask=[False, False, False,  True],
           fill_value=1e+20)
    
# numpy.ma.squeeze
ma.squeeze=<numpy.ma.core._convert2ma object>
    
Remove axes of length one from `a`.
Parameters:
    
aarray_like
    
Input data.
axisNone or int or tuple of ints, optional
    
Selects a subset of the entries of length one in the shape. If an axis is selected with shape entry greater than one, an error is raised.
Returns:
    
squeezedMaskedArray
    
The input array, but with all or a subset of the dimensions of length 1 removed. This is always `a` itself or a view into `a`. Note that if all axes are squeezed, the result is a 0d array and not a scalar.
Raises:
    
ValueError
    
If `axis` is not None, and an axis being squeezed is not of length 1
See also
`expand_dims`
    
The inverse operation, adding entries of length one
`reshape`
    
Insert, remove, and combine dimensions, and resize existing ones
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[[0], [1], [2]]])
    >>> x.shape
    (1, 3, 1)
    >>> np.squeeze(x).shape
    (3,)
    >>> np.squeeze(x, axis=0).shape
    (3, 1)
    >>> np.squeeze(x, axis=1).shape
    Traceback (most recent call last):
    ...
    ValueError: cannot select an axis to squeeze out which has size
    not equal to one
    >>> np.squeeze(x, axis=2).shape
    (1, 3)
    >>> x = np.array([[1234]])
    >>> x.shape
    (1, 1)
    >>> np.squeeze(x)
    array(1234)  # 0d array
    >>> np.squeeze(x).shape
    ()
    >>> np.squeeze(x)[()]
    1234
    
# numpy.ma.stack
ma.stack=<numpy.ma.extras._fromnxfunction_seq object>
    
Join a sequence of arrays along a new axis.
The `axis` parameter specifies the index of the new axis in the dimensions of the result. For example, if `axis=0` it will be the first dimension and if `axis=-1` it will be the last dimension.
Parameters:
    
arrayssequence of ndarrays
    
Each array must have the same shape. In the case of a single ndarray array_like input, it will be treated as a sequence of arrays; i.e., each element along the zeroth axis is treated as a separate array.
axisint, optional
    
The axis in the result array along which the input arrays are stacked.
outndarray, optional
    
If provided, the destination to place the result. The shape must be correct, matching that of what stack would have returned if no out argument were specified.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.24.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’.
New in version 1.24.
Returns:
    
stackedndarray
    
The stacked array has one more dimension than the input arrays.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`split`
    
Split array into a list of multiple sub-arrays of equal size.
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> arrays = [rng.normal(size=(3,4)) for _ in range(10)]
    >>> np.stack(arrays, axis=0).shape
    (10, 3, 4)
    
    
    >>> np.stack(arrays, axis=1).shape
    (3, 10, 4)
    
    
    >>> np.stack(arrays, axis=2).shape
    (3, 4, 10)
    
    
    >>> a = np.array([1, 2, 3])
    >>> b = np.array([4, 5, 6])
    >>> np.stack((a, b))
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> np.stack((a, b), axis=-1)
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
# numpy.ma.std
ma.std(self, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, mean=<no value>)=<numpy.ma.core._frommethod object>
    
Returns the standard deviation of the array elements along given axis.
Masked entries are ignored.
Refer to `numpy.std` for full documentation.
See also
`numpy.ndarray.std`
    
corresponding function for ndarrays
`numpy.std`
    
Equivalent function
# numpy.ma.sum
ma.sum(self, axis=None, dtype=None, out=None, keepdims=<no value>)=<numpy.ma.core._frommethod object>
    
Return the sum of the array elements over the given axis.
Masked elements are set to 0 internally.
Refer to `numpy.sum` for full documentation.
See also
`numpy.ndarray.sum`
    
corresponding function for ndarrays
`numpy.sum`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask=[0] + [1,0]*4)
    >>> x
    masked_array(
      data=[[1, --, 3],
            [--, 5, --],
            [7, --, 9]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=999999)
    >>> x.sum()
    25
    >>> x.sum(axis=1)
    masked_array(data=[4, 5, 16],
                 mask=[False, False, False],
           fill_value=999999)
    >>> x.sum(axis=0)
    masked_array(data=[8, 5, 12],
                 mask=[False, False, False],
           fill_value=999999)
    >>> print(type(x.sum(axis=0, dtype=np.int64)[0]))
    <class 'numpy.int64'>
    
# numpy.ma.swapaxes
ma.swapaxes(self, *args, **params) a.swapaxes(axis1, axis2)=<numpy.ma.core._frommethod object>
    
Return a view of the array with `axis1` and `axis2` interchanged.
Refer to `numpy.swapaxes` for full documentation.
See also
`numpy.swapaxes`
    
equivalent function
# numpy.ma.take
ma.take(a, indices, axis=None, out=None, mode='raise')[source]
# numpy.ma.trace
ma.trace(self, offset=0, axis1=0, axis2=1, dtype=None, out=None) a.trace(offset=0, axis1=0, axis2=1, dtype=None, out=None)=<numpy.ma.core._frommethod object>
    
Return the sum along diagonals of the array.
Refer to `numpy.trace` for full documentation.
See also
`numpy.trace`
    
equivalent function
# numpy.ma.transpose
ma.transpose(a, axes=None)[source]
    
Permute the dimensions of an array.
This function is exactly equivalent to `numpy.transpose`.
See also
`numpy.transpose`
    
Equivalent function in top-level NumPy module.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = ma.arange(4).reshape((2,2))
    >>> x[1, 1] = ma.masked
    >>> x
    masked_array(
      data=[[0, 1],
            [2, --]],
      mask=[[False, False],
            [False,  True]],
      fill_value=999999)
    
    
    >>> ma.transpose(x)
    masked_array(
      data=[[0, 2],
            [1, --]],
      mask=[[False, False],
            [False,  True]],
      fill_value=999999)
    
# numpy.ma.union1d
ma.union1d(ar1, ar2)[source]
    
Union of two arrays.
The output is always a masked array. See `numpy.union1d` for more details.
See also
`numpy.union1d`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> ar1 = np.ma.array([1, 2, 3, 4])
    >>> ar2 = np.ma.array([3, 4, 5, 6])
    >>> np.ma.union1d(ar1, ar2)
    masked_array(data=[1, 2, 3, 4, 5, 6],
             mask=False,
       fill_value=999999)
    
# numpy.ma.unique
ma.unique(ar1, return_index=False, return_inverse=False)[source]
    
Finds the unique elements of an array.
Masked values are considered the same element (masked). The output array is always a masked array. See `numpy.unique` for more details.
See also
`numpy.unique`
    
Equivalent function for ndarrays.
#### Examples
    
    >>> import numpy as np
    >>> a = [1, 2, 1000, 2, 3]
    >>> mask = [0, 0, 1, 0, 0]
    >>> masked_a = np.ma.masked_array(a, mask)
    >>> masked_a
    masked_array(data=[1, 2, --, 2, 3],
                mask=[False, False,  True, False, False],
        fill_value=999999)
    >>> np.ma.unique(masked_a)
    masked_array(data=[1, 2, 3, --],
                mask=[False, False, False,  True],
        fill_value=999999)
    >>> np.ma.unique(masked_a, return_index=True)
    (masked_array(data=[1, 2, 3, --],
                mask=[False, False, False,  True],
        fill_value=999999), array([0, 1, 4, 2]))
    >>> np.ma.unique(masked_a, return_inverse=True)
    (masked_array(data=[1, 2, 3, --],
                mask=[False, False, False,  True],
        fill_value=999999), array([0, 1, 3, 1, 2]))
    >>> np.ma.unique(masked_a, return_index=True, return_inverse=True)
    (masked_array(data=[1, 2, 3, --],
                mask=[False, False, False,  True],
        fill_value=999999), array([0, 1, 4, 2]), array([0, 1, 3, 1, 2]))
    
# numpy.ma.vander
ma.vander(x, n=None)[source]
    
Generate a Vandermonde matrix.
The columns of the output matrix are powers of the input vector. The order of the powers is determined by the `increasing` boolean argument. Specifically, when `increasing` is False, the `i`-th output column is the input vector raised element-wise to the power of `N - i - 1`. Such a matrix with a geometric progression in each row is named for Alexandre- Theophile Vandermonde.
Parameters:
    
xarray_like
    
1-D input array.
Nint, optional
    
Number of columns in the output. If `N` is not specified, a square array is returned (`N = len(x)`).
increasingbool, optional
    
Order of the powers of the columns. If True, the powers increase from left to right, if False (the default) they are reversed.
Returns:
    
outndarray
    
Vandermonde matrix. If `increasing` is False, the first column is `x^(N-1)`, the second `x^(N-2)` and so forth. If `increasing` is True, the columns are `x^0, x^1, ..., x^(N-1)`.
See also
`polynomial.polynomial.polyvander`
#### Notes
Masked values in the input array result in rows of zeros.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3, 5])
    >>> N = 3
    >>> np.vander(x, N)
    array([[ 1,  1,  1],
           [ 4,  2,  1],
           [ 9,  3,  1],
           [25,  5,  1]])
    
    
    >>> np.column_stack([x**(N-1-i) for i in range(N)])
    array([[ 1,  1,  1],
           [ 4,  2,  1],
           [ 9,  3,  1],
           [25,  5,  1]])
    
    
    >>> x = np.array([1, 2, 3, 5])
    >>> np.vander(x)
    array([[  1,   1,   1,   1],
           [  8,   4,   2,   1],
           [ 27,   9,   3,   1],
           [125,  25,   5,   1]])
    >>> np.vander(x, increasing=True)
    array([[  1,   1,   1,   1],
           [  1,   2,   4,   8],
           [  1,   3,   9,  27],
           [  1,   5,  25, 125]])
    
The determinant of a square Vandermonde matrix is the product of the differences between the values of the input vector:
    
    >>> np.linalg.det(np.vander(x))
    48.000000000000043 # may vary
    >>> (5-3)*(5-2)*(5-1)*(3-2)*(3-1)*(2-1)
    48
    
# numpy.ma.var
ma.var(self, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, mean=<no value>)=<numpy.ma.core._frommethod object>
    
Compute the variance along the specified axis.
Returns the variance of the array elements, a measure of the spread of a distribution. The variance is computed for the flattened array by default, otherwise over the specified axis.
Parameters:
    
aarray_like
    
Array containing numbers whose variance is desired. If `a` is not an array, a conversion is attempted.
axisNone or int or tuple of ints, optional
    
Axis or axes along which the variance is computed. The default is to compute the variance of the flattened array. If this is a tuple of ints, a variance is performed over multiple axes, instead of a single axis or all the axes as before.
dtypedata-type, optional
    
Type to use in computing the variance. For arrays of integer type the default is `float64`; for arrays of float types it is the same as the array type.
outndarray, optional
    
Alternate output array in which to place the result. It must have the same shape as the expected output, but the type is cast if necessary.
ddof{int, float}, optional
    
“Delta Degrees of Freedom”: the divisor used in the calculation is `N - ddof`, where `N` represents the number of elements. By default `ddof` is zero. See notes for details about use of `ddof`.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `var` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in the variance. See `reduce` for details.
New in version 1.20.0.
meanarray like, optional
    
Provide the mean to prevent its recalculation. The mean should have a shape as if it was calculated with `keepdims=True`. The axis for the calculation of the mean should be the same as used in the call to this var function.
New in version 2.0.0.
correction{int, float}, optional
    
Array API compatible name for the `ddof` parameter. Only one of them can be provided at the same time.
New in version 2.0.0.
Returns:
    
variancendarray, see dtype parameter above
    
If `out=None`, returns a new array containing the variance; otherwise, a reference to the output array is returned.
See also
`std`, `mean`, `nanmean`, `nanstd`, `nanvar`
Output type determination
#### Notes
There are several common variants of the array variance calculation. Assuming the input `a` is a one-dimensional NumPy array and `mean` is either provided as an argument or computed as `a.mean()`, NumPy computes the variance of an array as:
    
    N = len(a)
    d2 = abs(a - mean)**2  # abs is for complex `a`
    var = d2.sum() / (N - ddof)  # note use of `ddof`
    
Different values of the argument `ddof` are useful in different contexts. NumPy’s default `ddof=0` corresponds with the expression:
\\[\frac{\sum_i{|a_i - \bar{a}|^2 }}{N}\\]
which is sometimes called the “population variance” in the field of statistics because it applies the definition of variance to `a` as if `a` were a complete population of possible observations.
Many other libraries define the variance of an array differently, e.g.:
\\[\frac{\sum_i{|a_i - \bar{a}|^2}}{N - 1}\\]
In statistics, the resulting quantity is sometimes called the “sample variance” because if `a` is a random sample from a larger population, this calculation provides an unbiased estimate of the variance of the population. The use of \\(N-1\\) in the denominator is often called “Bessel’s correction” because it corrects for bias (toward lower values) in the variance estimate introduced when the sample mean of `a` is used in place of the true mean of the population. For this quantity, use `ddof=1`.
Note that for complex numbers, the absolute value is taken before squaring, so that the result is always real and nonnegative.
For floating-point input, the variance is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.var(a)
    1.25
    >>> np.var(a, axis=0)
    array([1.,  1.])
    >>> np.var(a, axis=1)
    array([0.25,  0.25])
    
In single precision, var() can be inaccurate:
    
    >>> a = np.zeros((2, 512*512), dtype=np.float32)
    >>> a[0, :] = 1.0
    >>> a[1, :] = 0.1
    >>> np.var(a)
    np.float32(0.20250003)
    
Computing the variance in float64 is more accurate:
    
    >>> np.var(a, dtype=np.float64)
    0.20249999932944759 # may vary
    >>> ((1-0.55)**2 + (0.1-0.55)**2)/2
    0.2025
    
Specifying a where argument:
    
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> np.var(a)
    6.833333333333333 # may vary
    >>> np.var(a, where=[[True], [True], [False]])
    4.0
    
Using the mean keyword to save computation time:
    
    >>> import numpy as np
    >>> from timeit import timeit
    >>>
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> mean = np.mean(a, axis=1, keepdims=True)
    >>>
    >>> g = globals()
    >>> n = 10000
    >>> t1 = timeit("var = np.var(a, axis=1, mean=mean)", globals=g, number=n)
    >>> t2 = timeit("var = np.var(a, axis=1)", globals=g, number=n)
    >>> print(f'Percentage execution time saved {100*(t2-t1)/t2:.0f}%')
    
    Percentage execution time saved 32%
    
# numpy.ma.vstack
ma.vstack=<numpy.ma.extras._fromnxfunction_seq object>
    
Stack arrays in sequence vertically (row wise).
This is equivalent to concatenation along the first axis after 1-D arrays of shape `(N,)` have been reshaped to `(1,N)`. Rebuilds arrays divided by `vsplit`.
This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations.
Parameters:
    
tupsequence of ndarrays
    
The arrays must have the same shape along all but the first axis. 1-D arrays must have the same length. In the case of a single array_like input, it will be treated as a sequence of arrays; i.e., each element along the zeroth axis is treated as a separate array.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.24.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’.
New in version 1.24.
Returns:
    
stackedndarray
    
The array formed by stacking the given arrays, will be at least 2-D.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`dstack`
    
Stack arrays in sequence depth wise (along third axis).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`vsplit`
    
Split an array into multiple sub-arrays vertically (row-wise).
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Notes
The function is applied to both the _data and the _mask, if any.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3])
    >>> b = np.array([4, 5, 6])
    >>> np.vstack((a,b))
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> a = np.array([[1], [2], [3]])
    >>> b = np.array([[4], [5], [6]])
    >>> np.vstack((a,b))
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6]])
    
# numpy.ma.where
ma.where(condition, x=<no value>, y=<no value>)[source]
    
Return a masked array with elements from `x` or `y`, depending on condition.
Note
When only `condition` is provided, this function is identical to `nonzero`. The rest of this documentation covers only the case where all three arguments are provided.
Parameters:
    
conditionarray_like, bool
    
Where True, yield `x`, otherwise yield `y`.
x, yarray_like, optional
    
Values from which to choose. `x`, `y` and `condition` need to be broadcastable to some shape.
Returns:
    
outMaskedArray
    
An masked array with `masked` elements where the condition is masked, elements from `x` where `condition` is True, and elements from `y` elsewhere.
See also
`numpy.where`
    
Equivalent function in the top-level NumPy module.
`nonzero`
    
The function that is called when x and y are omitted
#### Examples
    
    >>> import numpy as np
    >>> x = np.ma.array(np.arange(9.).reshape(3, 3), mask=[[0, 1, 0],
    ...                                                    [1, 0, 1],
    ...                                                    [0, 1, 0]])
    >>> x
    masked_array(
      data=[[0.0, --, 2.0],
            [--, 4.0, --],
            [6.0, --, 8.0]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=1e+20)
    >>> np.ma.where(x > 5, x, -3.1416)
    masked_array(
      data=[[-3.1416, --, -3.1416],
            [--, -3.1416, --],
            [6.0, --, 8.0]],
      mask=[[False,  True, False],
            [ True, False,  True],
            [False,  True, False]],
      fill_value=1e+20)
    
# numpy.ma.zeros
ma.zeros(shape, dtype=float, order='C', *, like=None)=<numpy.ma.core._convert2ma object>
    
Return a new array of given shape and type, filled with zeros.
Parameters:
    
shapeint or tuple of ints
    
Shape of the new array, e.g., `(2, 3)` or `2`.
dtypedata-type, optional
    
The desired data-type for the array, e.g., `numpy.int8`. Default is `numpy.float64`.
order{‘C’, ‘F’}, optional, default: ‘C’
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outMaskedArray
    
Array of zeros with the given shape, dtype, and order.
See also
`zeros_like`
    
Return an array of zeros with shape and type of input.
`empty`
    
Return a new uninitialized array.
`ones`
    
Return a new array setting values to one.
`full`
    
Return a new array of given shape filled with value.
#### Examples
    
    >>> import numpy as np
    >>> np.zeros(5)
    array([ 0.,  0.,  0.,  0.,  0.])
    
    
    >>> np.zeros((5,), dtype=int)
    array([0, 0, 0, 0, 0])
    
    
    >>> np.zeros((2, 1))
    array([[ 0.],
           [ 0.]])
    
    
    >>> s = (2,2)
    >>> np.zeros(s)
    array([[ 0.,  0.],
           [ 0.,  0.]])
    
    
    >>> np.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')]) # custom dtype
    array([(0, 0), (0, 0)],
          dtype=[('x', '<i4'), ('y', '<i4')])
    
# numpy.ma.zeros_like
ma.zeros_like=<numpy.ma.core._convert2ma object>
    
Return an array of zeros with the same shape and type as a given array.
Parameters:
    
aarray_like
    
The shape and data-type of `a` define these same attributes of the returned array.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `a`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outMaskedArray
    
Array of zeros with the same shape and type as `a`.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`ones_like`
    
Return an array of ones with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`zeros`
    
Return a new array setting values to zero.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6)
    >>> x = x.reshape((2, 3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.zeros_like(x)
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y = np.arange(3, dtype=float)
    >>> y
    array([0., 1., 2.])
    >>> np.zeros_like(y)
    array([0.,  0.,  0.])
    
# numpy.mask_indices
numpy.mask_indices(n, mask_func, k=0)[source]
    
Return the indices to access (n, n) arrays, given a masking function.
Assume `mask_func` is a function that, for a square array a of size `(n, n)` with a possible offset argument `k`, when called as `mask_func(a, k)` returns a new array with zeros in certain locations (functions like `triu` or `tril` do precisely this). Then this function returns the indices where the non-zero values would be located.
Parameters:
    
nint
    
The returned indices will be valid to access arrays of shape (n, n).
mask_funccallable
    
A function whose call signature is similar to that of `triu`, `tril`. That is, `mask_func(x, k)` returns a boolean array, shaped like `x`. `k` is an optional argument to the function.
kscalar
    
An optional argument which is passed through to `mask_func`. Functions like `triu`, `tril` take a second argument that is interpreted as an offset.
Returns:
    
indicestuple of arrays.
    
The `n` arrays of indices corresponding to the locations where `mask_func(np.ones((n, n)), k)` is True.
See also
`triu`, `tril`, `triu_indices`, `tril_indices`
#### Examples
    
    >>> import numpy as np
    
These are the indices that would allow you to access the upper triangular part of any 3x3 array:
    
    >>> iu = np.mask_indices(3, np.triu)
    
For example, if `a` is a 3x3 array:
    
    >>> a = np.arange(9).reshape(3, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> a[iu]
    array([0, 1, 2, 4, 5, 8])
    
An offset can be passed also to the masking function. This gets us the indices starting on the first diagonal right of the main one:
    
    >>> iu1 = np.mask_indices(3, np.triu, 1)
    
with which we now extract only three elements:
    
    >>> a[iu1]
    array([1, 2, 5])
    
# numpy.matlib.empty
matlib.empty(shape, dtype=None, order='C')[source]
    
Return a new matrix of given shape and type, without initializing entries.
Parameters:
    
shapeint or tuple of int
    
Shape of the empty matrix.
dtypedata-type, optional
    
Desired output data-type.
order{‘C’, ‘F’}, optional
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
See also
`numpy.empty`
    
Equivalent array function.
`matlib.zeros`
    
Return a matrix of zeros.
`matlib.ones`
    
Return a matrix of ones.
#### Notes
Unlike other matrix creation functions (e.g. `matlib.zeros`, `matlib.ones`), `matlib.empty` does not initialize the values of the matrix, and may therefore be marginally faster. However, the values stored in the newly allocated matrix are arbitrary. For reproducible behavior, be sure to set each element of the matrix before reading.
#### Examples
    
    >>> import numpy.matlib
    >>> np.matlib.empty((2, 2))    # filled with random data
    matrix([[  6.76425276e-320,   9.79033856e-307], # random
            [  7.39337286e-309,   3.22135945e-309]])
    >>> np.matlib.empty((2, 2), dtype=int)
    matrix([[ 6600475,        0], # random
            [ 6586976, 22740995]])
    
# numpy.matlib.eye
matlib.eye(n, M=None, k=0, dtype=<class 'float'>, order='C')[source]
    
Return a matrix with ones on the diagonal and zeros elsewhere.
Parameters:
    
nint
    
Number of rows in the output.
Mint, optional
    
Number of columns in the output, defaults to `n`.
kint, optional
    
Index of the diagonal: 0 refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal.
dtypedtype, optional
    
Data-type of the returned matrix.
order{‘C’, ‘F’}, optional
    
Whether the output should be stored in row-major (C-style) or column-major (Fortran-style) order in memory.
Returns:
    
Imatrix
    
A `n` x `M` matrix where all elements are equal to zero, except for the `k`-th diagonal, whose values are equal to one.
See also
`numpy.eye`
    
Equivalent array function.
`identity`
    
Square identity matrix.
#### Examples
    
    >>> import numpy.matlib
    >>> np.matlib.eye(3, k=1, dtype=float)
    matrix([[0.,  1.,  0.],
            [0.,  0.,  1.],
            [0.,  0.,  0.]])
    
# numpy.matlib.identity
matlib.identity(n, dtype=None)[source]
    
Returns the square identity matrix of given size.
Parameters:
    
nint
    
Size of the returned identity matrix.
dtypedata-type, optional
    
Data-type of the output. Defaults to `float`.
Returns:
    
outmatrix
    
`n` x `n` matrix with its main diagonal set to one, and all other elements zero.
See also
`numpy.identity`
    
Equivalent array function.
`matlib.eye`
    
More general matrix identity function.
#### Examples
    
    >>> import numpy.matlib
    >>> np.matlib.identity(3, dtype=int)
    matrix([[1, 0, 0],
            [0, 1, 0],
            [0, 0, 1]])
    
# numpy.matlib.ones
matlib.ones(shape, dtype=None, order='C')[source]
    
Matrix of ones.
Return a matrix of given shape and type, filled with ones.
Parameters:
    
shape{sequence of ints, int}
    
Shape of the matrix
dtypedata-type, optional
    
The desired data-type for the matrix, default is np.float64.
order{‘C’, ‘F’}, optional
    
Whether to store matrix in C- or Fortran-contiguous order, default is ‘C’.
Returns:
    
outmatrix
    
Matrix of ones of given shape, dtype, and order.
See also
`ones`
    
Array of ones.
`matlib.zeros`
    
Zero matrix.
#### Notes
If `shape` has length one i.e. `(N,)`, or is a scalar `N`, `out` becomes a single row matrix of shape `(1,N)`.
#### Examples
    
    >>> np.matlib.ones((2,3))
    matrix([[1.,  1.,  1.],
            [1.,  1.,  1.]])
    
    
    >>> np.matlib.ones(2)
    matrix([[1.,  1.]])
    
# numpy.matlib.rand
matlib.rand(*args)[source]
    
Return a matrix of random values with given shape.
Create a matrix of the given shape and propagate it with random samples from a uniform distribution over `[0, 1)`.
Parameters:
    
*argsArguments
    
Shape of the output. If given as N integers, each integer specifies the size of one dimension. If given as a tuple, this tuple gives the complete shape.
Returns:
    
outndarray
    
The matrix of random values with shape given by `*args`.
See also
`randn`, `numpy.random.RandomState.rand`
#### Examples
    
    >>> np.random.seed(123)
    >>> import numpy.matlib
    >>> np.matlib.rand(2, 3)
    matrix([[0.69646919, 0.28613933, 0.22685145],
            [0.55131477, 0.71946897, 0.42310646]])
    >>> np.matlib.rand((2, 3))
    matrix([[0.9807642 , 0.68482974, 0.4809319 ],
            [0.39211752, 0.34317802, 0.72904971]])
    
If the first argument is a tuple, other arguments are ignored:
    
    >>> np.matlib.rand((2, 3), 4)
    matrix([[0.43857224, 0.0596779 , 0.39804426],
            [0.73799541, 0.18249173, 0.17545176]])
    
# numpy.matlib.randn
matlib.randn(*args)[source]
    
Return a random matrix with data from the “standard normal” distribution.
`randn` generates a matrix filled with random floats sampled from a univariate “normal” (Gaussian) distribution of mean 0 and variance 1.
Parameters:
    
*argsArguments
    
Shape of the output. If given as N integers, each integer specifies the size of one dimension. If given as a tuple, this tuple gives the complete shape.
Returns:
    
Zmatrix of floats
    
A matrix of floating-point samples drawn from the standard normal distribution.
See also
`rand`, `numpy.random.RandomState.randn`
#### Notes
For random samples from the normal distribution with mean `mu` and standard deviation `sigma`, use:
    
    sigma * np.matlib.randn(...) + mu
    
#### Examples
    
    >>> np.random.seed(123)
    >>> import numpy.matlib
    >>> np.matlib.randn(1)
    matrix([[-1.0856306]])
    >>> np.matlib.randn(1, 2, 3)
    matrix([[ 0.99734545,  0.2829785 , -1.50629471],
            [-0.57860025,  1.65143654, -2.42667924]])
    
Two-by-four matrix of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> 2.5 * np.matlib.randn((2, 4)) + 3
    matrix([[1.92771843, 6.16484065, 0.83314899, 1.30278462],
            [2.76322758, 6.72847407, 1.40274501, 1.8900451 ]])
    
# numpy.matlib.repmat
matlib.repmat(a, m, n)[source]
    
Repeat a 0-D to 2-D array or matrix MxN times.
Parameters:
    
aarray_like
    
The array or matrix to be repeated.
m, nint
    
The number of times `a` is repeated along the first and second axes.
Returns:
    
outndarray
    
The result of repeating `a`.
#### Examples
    
    >>> import numpy.matlib
    >>> a0 = np.array(1)
    >>> np.matlib.repmat(a0, 2, 3)
    array([[1, 1, 1],
           [1, 1, 1]])
    
    
    >>> a1 = np.arange(4)
    >>> np.matlib.repmat(a1, 2, 2)
    array([[0, 1, 2, 3, 0, 1, 2, 3],
           [0, 1, 2, 3, 0, 1, 2, 3]])
    
    
    >>> a2 = np.asmatrix(np.arange(6).reshape(2, 3))
    >>> np.matlib.repmat(a2, 2, 3)
    matrix([[0, 1, 2, 0, 1, 2, 0, 1, 2],
            [3, 4, 5, 3, 4, 5, 3, 4, 5],
            [0, 1, 2, 0, 1, 2, 0, 1, 2],
            [3, 4, 5, 3, 4, 5, 3, 4, 5]])
    
# numpy.matlib.zeros
matlib.zeros(shape, dtype=None, order='C')[source]
    
Return a matrix of given shape and type, filled with zeros.
Parameters:
    
shapeint or sequence of ints
    
Shape of the matrix
dtypedata-type, optional
    
The desired data-type for the matrix, default is float.
order{‘C’, ‘F’}, optional
    
Whether to store the result in C- or Fortran-contiguous order, default is ‘C’.
Returns:
    
outmatrix
    
Zero matrix of given shape, dtype, and order.
See also
`numpy.zeros`
    
Equivalent array function.
`matlib.ones`
    
Return a matrix of ones.
#### Notes
If `shape` has length one i.e. `(N,)`, or is a scalar `N`, `out` becomes a single row matrix of shape `(1,N)`.
#### Examples
    
    >>> import numpy.matlib
    >>> np.matlib.zeros((2, 3))
    matrix([[0.,  0.,  0.],
            [0.,  0.,  0.]])
    
    
    >>> np.matlib.zeros(2)
    matrix([[0.,  0.]])
    
# numpy.matmul
numpy.matmul(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, signature, axes, axis])=<ufunc 'matmul'>
    
Matrix product of two arrays.
Parameters:
    
x1, x2array_like
    
Input arrays, scalars not allowed.
outndarray, optional
    
A location into which the result is stored. If provided, it must have a shape that matches the signature `(n,k),(k,m)->(n,m)`. If not provided or None, a freshly-allocated array is returned.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The matrix product of the inputs. This is a scalar only when both x1, x2 are 1-d vectors.
Raises:
    
ValueError
    
If the last dimension of `x1` is not the same size as the second-to-last dimension of `x2`.
If a scalar value is passed in.
See also
`vecdot`
    
Complex-conjugating dot product for stacks of vectors.
`matvec`
    
Matrix-vector product for stacks of matrices and vectors.
`vecmat`
    
Vector-matrix product for stacks of vectors and matrices.
`tensordot`
    
Sum products over arbitrary axes.
`einsum`
    
Einstein summation convention.
`dot`
    
alternative matrix product with different broadcasting rules.
#### Notes
The behavior depends on the arguments in the following way.
  * If both arguments are 2-D they are multiplied like conventional matrices.
  * If either argument is N-D, N > 2, it is treated as a stack of matrices residing in the last two indexes and broadcast accordingly.
  * If the first argument is 1-D, it is promoted to a matrix by prepending a 1 to its dimensions. After matrix multiplication the prepended 1 is removed. (For stacks of vectors, use `vecmat`.)
  * If the second argument is 1-D, it is promoted to a matrix by appending a 1 to its dimensions. After matrix multiplication the appended 1 is removed. (For stacks of vectors, use `matvec`.)


`matmul` differs from `dot` in two important ways:
  * Multiplication by scalars is not allowed, use `*` instead.
  * Stacks of matrices are broadcast together as if the matrices were elements, respecting the signature `(n,k),(k,m)->(n,m)`:
        >>> a = np.ones([9, 5, 7, 4])
        >>> c = np.ones([9, 5, 4, 3])
        >>> np.dot(a, c).shape
        (9, 5, 7, 9, 5, 3)
        >>> np.matmul(a, c).shape
        (9, 5, 7, 3)
        >>> # n is 7, k is 4, m is 3
        


The matmul function implements the semantics of the `@` operator introduced in Python 3.5 following PEP 465.
It uses an optimized BLAS library when possible (see `numpy.linalg`).
#### Examples
For 2-D arrays it is the matrix product:
    
    >>> import numpy as np
    
    
    >>> a = np.array([[1, 0],
    ...               [0, 1]])
    >>> b = np.array([[4, 1],
    ...               [2, 2]])
    >>> np.matmul(a, b)
    array([[4, 1],
           [2, 2]])
    
For 2-D mixed with 1-D, the result is the usual.
    
    >>> a = np.array([[1, 0],
    ...               [0, 1]])
    >>> b = np.array([1, 2])
    >>> np.matmul(a, b)
    array([1, 2])
    >>> np.matmul(b, a)
    array([1, 2])
    
Broadcasting is conventional for stacks of arrays
    
    >>> a = np.arange(2 * 2 * 4).reshape((2, 2, 4))
    >>> b = np.arange(2 * 2 * 4).reshape((2, 4, 2))
    >>> np.matmul(a,b).shape
    (2, 2, 2)
    >>> np.matmul(a, b)[0, 1, 1]
    98
    >>> sum(a[0, 1, :] * b[0 , :, 1])
    98
    
Vector, vector returns the scalar inner product, but neither argument is complex-conjugated:
    
    >>> np.matmul([2j, 3j], [2j, 3j])
    (-13+0j)
    
Scalar multiplication raises an error.
    
    >>> np.matmul([1,2], 3)
    Traceback (most recent call last):
    ...
    ValueError: matmul: Input operand 1 does not have enough dimensions ...
    
The `@` operator can be used as a shorthand for `np.matmul` on ndarrays.
    
    >>> x1 = np.array([2j, 3j])
    >>> x2 = np.array([2j, 3j])
    >>> x1 @ x2
    (-13+0j)
    
# numpy.matrix.A
property
propertymatrix.A
    
Return `self` as an `ndarray` object.
Equivalent to `np.asarray(self)`.
Parameters:
    
None
Returns:
    
retndarray
    
`self` as an `ndarray`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.getA()
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
# numpy.matrix.A1
property
propertymatrix.A1
    
Return `self` as a flattened `ndarray`.
Equivalent to `np.asarray(x).ravel()`
Parameters:
    
None
Returns:
    
retndarray
    
`self`, 1-D, as an `ndarray`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.getA1()
    array([ 0,  1,  2, ...,  9, 10, 11])
    
# numpy.matrix.all
method
matrix.all(axis=None, out=None)[source]
    
Test whether all matrix elements along a given axis evaluate to True.
Parameters:
    
See `numpy.all` for complete descriptions
See also
`numpy.all`
#### Notes
This is the same as `ndarray.all`, but it returns a `matrix` object.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> y = x[0]; y
    matrix([[0, 1, 2, 3]])
    >>> (x == y)
    matrix([[ True,  True,  True,  True],
            [False, False, False, False],
            [False, False, False, False]])
    >>> (x == y).all()
    False
    >>> (x == y).all(0)
    matrix([[False, False, False, False]])
    >>> (x == y).all(1)
    matrix([[ True],
            [False],
            [False]])
    
# numpy.matrix.any
method
matrix.any(axis=None, out=None)[source]
    
Test whether any array element along a given axis evaluates to True.
Refer to `numpy.any` for full documentation.
Parameters:
    
axisint, optional
    
Axis along which logical OR is performed
outndarray, optional
    
Output to existing array instead of creating new one, must have same shape as expected output
Returns:
    
anybool, ndarray
    
Returns a single bool if `axis` is `None`; otherwise, returns `ndarray`
# numpy.matrix.argmax
method
matrix.argmax(axis=None, out=None)[source]
    
Indexes of the maximum values along an axis.
Return the indexes of the first occurrences of the maximum values along the specified axis. If axis is None, the index is for the flattened matrix.
Parameters:
    
See `numpy.argmax` for complete descriptions
See also
`numpy.argmax`
#### Notes
This is the same as `ndarray.argmax`, but returns a `matrix` object where `ndarray.argmax` would return an `ndarray`.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.argmax()
    11
    >>> x.argmax(0)
    matrix([[2, 2, 2, 2]])
    >>> x.argmax(1)
    matrix([[3],
            [3],
            [3]])
    
# numpy.matrix.argmin
method
matrix.argmin(axis=None, out=None)[source]
    
Indexes of the minimum values along an axis.
Return the indexes of the first occurrences of the minimum values along the specified axis. If axis is None, the index is for the flattened matrix.
Parameters:
    
See `numpy.argmin` for complete descriptions.
See also
`numpy.argmin`
#### Notes
This is the same as `ndarray.argmin`, but returns a `matrix` object where `ndarray.argmin` would return an `ndarray`.
#### Examples
    
    >>> x = -np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[  0,  -1,  -2,  -3],
            [ -4,  -5,  -6,  -7],
            [ -8,  -9, -10, -11]])
    >>> x.argmin()
    11
    >>> x.argmin(0)
    matrix([[2, 2, 2, 2]])
    >>> x.argmin(1)
    matrix([[3],
            [3],
            [3]])
    
# numpy.matrix.argpartition
method
matrix.argpartition(kth, axis=-1, kind='introselect', order=None)
    
Returns the indices that would partition this array.
Refer to `numpy.argpartition` for full documentation.
See also
`numpy.argpartition`
    
equivalent function
# numpy.matrix.argsort
method
matrix.argsort(axis=-1, kind=None, order=None)
    
Returns the indices that would sort this array.
Refer to `numpy.argsort` for full documentation.
See also
`numpy.argsort`
    
equivalent function
# numpy.matrix.astype
method
matrix.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
    
Copy of the array, cast to a specified type.
Parameters:
    
dtypestr or dtype
    
Typecode or data-type to which the array is cast.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout order of the result. ‘C’ means C order, ‘F’ means Fortran order, ‘A’ means ‘F’ order if all the arrays are Fortran contiguous, ‘C’ order otherwise, and ‘K’ means as close to the order the array elements appear in memory as possible. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘unsafe’ for backwards compatibility.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


subokbool, optional
    
If True, then sub-classes will be passed-through (default), otherwise the returned array will be forced to be a base-class array.
copybool, optional
    
By default, astype always returns a newly allocated array. If this is set to false, and the `dtype`, `order`, and `subok` requirements are satisfied, the input array is returned instead of a copy.
Returns:
    
arr_tndarray
    
Unless `copy` is False and the other conditions for returning the input array are satisfied (see description for `copy` input parameter), `arr_t` is a new array of the same shape as the input array, with dtype, order given by `dtype`, `order`.
Raises:
    
ComplexWarning
    
When casting from complex to float or int. To avoid this, one should use `a.real.astype(t)`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 2.5])
    >>> x
    array([1. ,  2. ,  2.5])
    
    
    >>> x.astype(int)
    array([1, 2, 2])
    
# numpy.matrix.base
attribute
matrix.base
    
Base object if memory is from some other object.
#### Examples
The base of an array that owns its memory is None:
    
    >>> import numpy as np
    >>> x = np.array([1,2,3,4])
    >>> x.base is None
    True
    
Slicing creates a view, whose memory is shared with x:
    
    >>> y = x[2:]
    >>> y.base is x
    True
    
# numpy.matrix.byteswap
method
matrix.byteswap(inplace=False)
    
Swap the bytes of the array elements
Toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Arrays of byte-strings are not swapped. The real and imaginary parts of a complex number are swapped individually.
Parameters:
    
inplacebool, optional
    
If `True`, swap bytes in-place, default is `False`.
Returns:
    
outndarray
    
The byteswapped array. If `inplace` is `True`, this is a view to self.
#### Examples
    
    >>> import numpy as np
    >>> A = np.array([1, 256, 8755], dtype=np.int16)
    >>> list(map(hex, A))
    ['0x1', '0x100', '0x2233']
    >>> A.byteswap(inplace=True)
    array([  256,     1, 13090], dtype=int16)
    >>> list(map(hex, A))
    ['0x100', '0x1', '0x3322']
    
Arrays of byte-strings are not swapped
    
    >>> A = np.array([b'ceg', b'fac'])
    >>> A.byteswap()
    array([b'ceg', b'fac'], dtype='|S3')
    
`A.view(A.dtype.newbyteorder()).byteswap()` produces an array with the same values but different representation in memory
    
    >>> A = np.array([1, 2, 3],dtype=np.int64)
    >>> A.view(np.uint8)
    array([1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
           0, 0], dtype=uint8)
    >>> A.view(A.dtype.newbyteorder()).byteswap(inplace=True)
    array([1, 2, 3], dtype='>i8')
    >>> A.view(np.uint8)
    array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
           0, 3], dtype=uint8)
    
# numpy.matrix.choose
method
matrix.choose(choices, out=None, mode='raise')
    
Use an index array to construct a new array from a set of choices.
Refer to `numpy.choose` for full documentation.
See also
`numpy.choose`
    
equivalent function
# numpy.matrix.clip
method
matrix.clip(min=None, max=None, out=None, **kwargs)
    
Return an array whose values are limited to `[min, max]`. One of max or min must be given.
Refer to `numpy.clip` for full documentation.
See also
`numpy.clip`
    
equivalent function
# numpy.matrix.compress
method
matrix.compress(condition, axis=None, out=None)
    
Return selected slices of this array along given axis.
Refer to `numpy.compress` for full documentation.
See also
`numpy.compress`
    
equivalent function
# numpy.matrix.conj
method
matrix.conj()
    
Complex-conjugate all elements.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.matrix.conjugate
method
matrix.conjugate()
    
Return the complex conjugate, element-wise.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.matrix.copy
method
matrix.copy(order='C')
    
Return a copy of the array.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `numpy.copy` are very similar but have different default values for their order= arguments, and this function always passes sub-classes through.)
See also
`numpy.copy`
    
Similar function with different default behavior
`numpy.copyto`
#### Notes
This function is the preferred method for creating an array copy. The function `numpy.copy` is similar, but it defaults to using order ‘K’, and will not pass sub-classes through by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3],[4,5,6]], order='F')
    
    
    >>> y = x.copy()
    
    
    >>> x.fill(0)
    
    
    >>> x
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> y.flags['C_CONTIGUOUS']
    True
    
For arrays containing Python objects (e.g. dtype=object), the copy is a shallow one. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):
    
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> b = a.copy()
    >>> b[2][0] = 10
    >>> a
    array([1, 'm', list([10, 3, 4])], dtype=object)
    
To ensure all elements within an `object` array are copied, use `copy.deepcopy`:
    
    >>> import copy
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> c = copy.deepcopy(a)
    >>> c[2][0] = 10
    >>> c
    array([1, 'm', list([10, 3, 4])], dtype=object)
    >>> a
    array([1, 'm', list([2, 3, 4])], dtype=object)
    
# numpy.matrix.ctypes
attribute
matrix.ctypes
    
An object to simplify the interaction of the array with the ctypes module.
This attribute creates an object that makes it easier to use arrays when calling shared libraries with the ctypes module. The returned object has, among others, data, shape, and strides attributes (see Notes below) which themselves return ctypes objects that can be used as arguments to a shared library.
Parameters:
    
None
Returns:
    
cPython object
    
Possessing attributes data, shape, strides, etc.
See also
`numpy.ctypeslib`
#### Notes
Below are the public attributes of this object which were documented in “Guide to NumPy” (we have omitted undocumented public attributes, as well as documented private attributes):
_ctypes.data
    
A pointer to the memory area of the array as a Python integer. This memory area may contain data that is not aligned, or not in correct byte-order. The memory area may not even be writeable. The array flags and data-type of this array should be respected when passing this attribute to arbitrary C-code to avoid trouble that can include Python crashing. User Beware! The value of this attribute is exactly the same as: `self._array_interface_['data'][0]`.
Note that unlike `data_as`, a reference won’t be kept to the array: code like `ctypes.c_void_p((a + b).ctypes.data)` will result in a pointer to a deallocated array, and should be spelt `(a + b).ctypes.data_as(ctypes.c_void_p)`
_ctypes.shape
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the C-integer corresponding to `dtype('p')` on this platform (see `c_intp`). This base-type could be `ctypes.c_int`, `ctypes.c_long`, or `ctypes.c_longlong` depending on the platform. The ctypes array contains the shape of the underlying array.
_ctypes.strides
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the same as for the shape attribute. This ctypes array contains the strides information from the underlying array. This strides information is important for showing how many bytes must be jumped to get to the next element in the array.
_ctypes.data_as(obj)[source]
    
Return the data pointer cast to a particular c-types object. For example, calling `self._as_parameter_` is equivalent to `self.data_as(ctypes.c_void_p)`. Perhaps you want to use the data as a pointer to a ctypes array of floating-point data: `self.data_as(ctypes.POINTER(ctypes.c_double))`.
The returned pointer will keep a reference to the array.
_ctypes.shape_as(obj)[source]
    
Return the shape tuple as an array of some other c-types type. For example: `self.shape_as(ctypes.c_short)`.
_ctypes.strides_as(obj)[source]
    
Return the strides tuple as an array of some other c-types type. For example: `self.strides_as(ctypes.c_longlong)`.
If the ctypes module is not available, then the ctypes attribute of array objects still returns something useful, but ctypes objects are not returned and errors may be raised instead. In particular, the object will still have the `as_parameter` attribute which will return an integer equal to the data attribute.
#### Examples
    
    >>> import numpy as np
    >>> import ctypes
    >>> x = np.array([[0, 1], [2, 3]], dtype=np.int32)
    >>> x
    array([[0, 1],
           [2, 3]], dtype=int32)
    >>> x.ctypes.data
    31962608 # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32))
    <__main__.LP_c_uint object at 0x7ff2fc1fc200> # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32)).contents
    c_uint(0)
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint64)).contents
    c_ulong(4294967296)
    >>> x.ctypes.shape
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1fce60> # may vary
    >>> x.ctypes.strides
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1ff320> # may vary
    
# numpy.matrix.cumprod
method
matrix.cumprod(axis=None, dtype=None, out=None)
    
Return the cumulative product of the elements along the given axis.
Refer to `numpy.cumprod` for full documentation.
See also
`numpy.cumprod`
    
equivalent function
# numpy.matrix.cumsum
method
matrix.cumsum(axis=None, dtype=None, out=None)
    
Return the cumulative sum of the elements along the given axis.
Refer to `numpy.cumsum` for full documentation.
See also
`numpy.cumsum`
    
equivalent function
# numpy.matrix.data
attribute
matrix.data
    
Python buffer object pointing to the start of the array’s data.
# numpy.matrix.diagonal
method
matrix.diagonal(offset=0, axis1=0, axis2=1)
    
Return specified diagonals. In NumPy 1.9 the returned array is a read-only view instead of a copy as in previous NumPy versions. In a future version the read-only restriction will be removed.
Refer to `numpy.diagonal` for full documentation.
See also
`numpy.diagonal`
    
equivalent function
# numpy.matrix.dump
method
matrix.dump(file)
    
Dump a pickle of the array to the specified file. The array can be read back with pickle.load or numpy.load.
Parameters:
    
filestr or Path
    
A string naming the dump file.
# numpy.matrix.dumps
method
matrix.dumps()
    
Returns the pickle of the array as a string. pickle.loads will convert the string back to an array.
Parameters:
    
None
# numpy.matrix.fill
method
matrix.fill(value)
    
Fill the array with a scalar value.
Parameters:
    
valuescalar
    
All elements of `a` will be assigned this value.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2])
    >>> a.fill(0)
    >>> a
    array([0, 0])
    >>> a = np.empty(2)
    >>> a.fill(1)
    >>> a
    array([1.,  1.])
    
Fill expects a scalar value and always behaves the same as assigning to a single array element. The following is a rare example where this distinction is important:
    
    >>> a = np.array([None, None], dtype=object)
    >>> a[0] = np.array(3)
    >>> a
    array([array(3), None], dtype=object)
    >>> a.fill(np.array(3))
    >>> a
    array([array(3), array(3)], dtype=object)
    
Where other forms of assignments will unpack the array being assigned:
    
    >>> a[...] = np.array(3)
    >>> a
    array([3, 3], dtype=object)
    
# numpy.matrix.flags
attribute
matrix.flags
    
Information about the memory layout of the array.
#### Notes
The `flags` object can be accessed dictionary-like (as in `a.flags['WRITEABLE']`), or by using lowercased attribute names (as in `a.flags.writeable`). Short flag names are only supported in dictionary access.
Only the WRITEBACKIFCOPY, WRITEABLE, and ALIGNED flags can be changed by the user, via direct assignment to the attribute or dictionary entry, or by calling `ndarray.setflags`.
The array flags cannot be set arbitrarily:
  * WRITEBACKIFCOPY can only be set `False`.
  * ALIGNED can only be set `True` if the data is truly aligned.
  * WRITEABLE can only be set `True` if the array owns its own memory or the ultimate owner of the memory exposes a writeable buffer interface or is a string.


Arrays can be both C-style and Fortran-style contiguous simultaneously. This is clear for 1-dimensional arrays, but can also be true for higher dimensional arrays.
Even for contiguous arrays a stride for a given dimension `arr.strides[dim]` may be arbitrary if `arr.shape[dim] == 1` or the array has no elements. It does not generally hold that `self.strides[-1] == self.itemsize` for C-style contiguous arrays or `self.strides[0] == self.itemsize` for Fortran-style contiguous arrays is true.
Attributes:
    
C_CONTIGUOUS (C)
    
The data is in a single, C-style contiguous segment.
F_CONTIGUOUS (F)
    
The data is in a single, Fortran-style contiguous segment.
OWNDATA (O)
    
The array owns the memory it uses or borrows it from another object.
WRITEABLE (W)
    
The data area can be written to. Setting this to False locks the data, making it read-only. A view (slice, etc.) inherits WRITEABLE from its base array at creation time, but a view of a writeable array may be subsequently locked while the base array remains writeable. (The opposite is not true, in that a view of a locked array may not be made writeable. However, currently, locking a base object does not lock any views that already reference it, so under that circumstance it is possible to alter the contents of a locked array via a previously created writeable view onto it.) Attempting to change a non-writeable array raises a RuntimeError exception.
ALIGNED (A)
    
The data and all elements are aligned appropriately for the hardware.
WRITEBACKIFCOPY (X)
    
This array is a copy of some other array. The C-API function PyArray_ResolveWritebackIfCopy must be called before deallocating to the base array will be updated with the contents of this array.
FNC
    
F_CONTIGUOUS and not C_CONTIGUOUS.
FORC
    
F_CONTIGUOUS or C_CONTIGUOUS (one-segment test).
BEHAVED (B)
    
ALIGNED and WRITEABLE.
CARRAY (CA)
    
BEHAVED and C_CONTIGUOUS.
FARRAY (FA)
    
BEHAVED and F_CONTIGUOUS and not C_CONTIGUOUS.
# numpy.matrix.flat
attribute
matrix.flat
    
A 1-D iterator over the array.
This is a `numpy.flatiter` instance, which acts similarly to, but is not a subclass of, Python’s built-in iterator object.
See also
`flatten`
    
Return a copy of the array collapsed into one dimension.
`flatiter`
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(1, 7).reshape(2, 3)
    >>> x
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> x.flat[3]
    4
    >>> x.T
    array([[1, 4],
           [2, 5],
           [3, 6]])
    >>> x.T.flat[3]
    5
    >>> type(x.flat)
    <class 'numpy.flatiter'>
    
An assignment example:
    
    >>> x.flat = 3; x
    array([[3, 3, 3],
           [3, 3, 3]])
    >>> x.flat[[1,4]] = 1; x
    array([[3, 1, 3],
           [3, 1, 3]])
    
# numpy.matrix.flatten
method
matrix.flatten(order='C')[source]
    
Return a flattened copy of the matrix.
All `N` elements of the matrix are placed into a single row.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran-style) order. ‘A’ means to flatten in column-major order if `m` is Fortran contiguous in memory, row-major order otherwise. ‘K’ means to flatten `m` in the order the elements occur in memory. The default is ‘C’.
Returns:
    
ymatrix
    
A copy of the matrix, flattened to a `(1, N)` matrix where `N` is the number of elements in the original matrix.
See also
`ravel`
    
Return a flattened array.
`flat`
    
A 1-D flat iterator over the matrix.
#### Examples
    
    >>> m = np.matrix([[1,2], [3,4]])
    >>> m.flatten()
    matrix([[1, 2, 3, 4]])
    >>> m.flatten('F')
    matrix([[1, 3, 2, 4]])
    
# numpy.matrix.getA
method
matrix.getA()[source]
    
Return `self` as an `ndarray` object.
Equivalent to `np.asarray(self)`.
Parameters:
    
None
Returns:
    
retndarray
    
`self` as an `ndarray`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.getA()
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
# numpy.matrix.getA1
method
matrix.getA1()[source]
    
Return `self` as a flattened `ndarray`.
Equivalent to `np.asarray(x).ravel()`
Parameters:
    
None
Returns:
    
retndarray
    
`self`, 1-D, as an `ndarray`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.getA1()
    array([ 0,  1,  2, ...,  9, 10, 11])
    
# numpy.matrix.getfield
method
matrix.getfield(dtype, offset=0)
    
Returns a field of the given array as a certain type.
A field is a view of the array data with a given data-type. The values in the view are determined by the given type and the offset into the current array in bytes. The offset needs to be such that the view dtype fits in the array dtype; for example an array of dtype complex128 has 16-byte elements. If taking a view with a 32-bit integer (4 bytes), the offset needs to be between 0 and 12 bytes.
Parameters:
    
dtypestr or dtype
    
The data type of the view. The dtype size of the view can not be larger than that of the array itself.
offsetint
    
Number of bytes to skip before beginning the element view.
#### Examples
    
    >>> import numpy as np
    >>> x = np.diag([1.+1.j]*2)
    >>> x[1, 1] = 2 + 4.j
    >>> x
    array([[1.+1.j,  0.+0.j],
           [0.+0.j,  2.+4.j]])
    >>> x.getfield(np.float64)
    array([[1.,  0.],
           [0.,  2.]])
    
By choosing an offset of 8 bytes we can select the complex part of the array for our view:
    
    >>> x.getfield(np.float64, offset=8)
    array([[1.,  0.],
           [0.,  4.]])
    
# numpy.matrix.getH
method
matrix.getH()[source]
    
Returns the (complex) conjugate transpose of `self`.
Equivalent to `np.transpose(self)` if `self` is real-valued.
Parameters:
    
None
Returns:
    
retmatrix object
    
complex conjugate transpose of `self`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4)))
    >>> z = x - 1j*x; z
    matrix([[  0. +0.j,   1. -1.j,   2. -2.j,   3. -3.j],
            [  4. -4.j,   5. -5.j,   6. -6.j,   7. -7.j],
            [  8. -8.j,   9. -9.j,  10.-10.j,  11.-11.j]])
    >>> z.getH()
    matrix([[ 0. -0.j,  4. +4.j,  8. +8.j],
            [ 1. +1.j,  5. +5.j,  9. +9.j],
            [ 2. +2.j,  6. +6.j, 10.+10.j],
            [ 3. +3.j,  7. +7.j, 11.+11.j]])
    
# numpy.matrix.getI
method
matrix.getI()[source]
    
Returns the (multiplicative) inverse of invertible `self`.
Parameters:
    
None
Returns:
    
retmatrix object
    
If `self` is non-singular, `ret` is such that `ret * self` == `self * ret` == `np.matrix(np.eye(self[0,:].size))` all return `True`.
Raises:
    
numpy.linalg.LinAlgError: Singular matrix
    
If `self` is singular.
See also
`linalg.inv`
#### Examples
    
    >>> m = np.matrix('[1, 2; 3, 4]'); m
    matrix([[1, 2],
            [3, 4]])
    >>> m.getI()
    matrix([[-2. ,  1. ],
            [ 1.5, -0.5]])
    >>> m.getI() * m
    matrix([[ 1.,  0.], # may vary
            [ 0.,  1.]])
    
# numpy.matrix.getT
method
matrix.getT()[source]
    
Returns the transpose of the matrix.
Does not conjugate! For the complex conjugate transpose, use `.H`.
Parameters:
    
None
Returns:
    
retmatrix object
    
The (non-conjugated) transpose of the matrix.
See also
`transpose`, `getH`
#### Examples
    
    >>> m = np.matrix('[1, 2; 3, 4]')
    >>> m
    matrix([[1, 2],
            [3, 4]])
    >>> m.getT()
    matrix([[1, 3],
            [2, 4]])
    
# numpy.matrix.H
property
propertymatrix.H
    
Returns the (complex) conjugate transpose of `self`.
Equivalent to `np.transpose(self)` if `self` is real-valued.
Parameters:
    
None
Returns:
    
retmatrix object
    
complex conjugate transpose of `self`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4)))
    >>> z = x - 1j*x; z
    matrix([[  0. +0.j,   1. -1.j,   2. -2.j,   3. -3.j],
            [  4. -4.j,   5. -5.j,   6. -6.j,   7. -7.j],
            [  8. -8.j,   9. -9.j,  10.-10.j,  11.-11.j]])
    >>> z.getH()
    matrix([[ 0. -0.j,  4. +4.j,  8. +8.j],
            [ 1. +1.j,  5. +5.j,  9. +9.j],
            [ 2. +2.j,  6. +6.j, 10.+10.j],
            [ 3. +3.j,  7. +7.j, 11.+11.j]])
    
# numpy.matrix
classnumpy.matrix(data, dtype=None, copy=True)[source]
    
Returns a matrix from an array-like object, or from a string of data.
A matrix is a specialized 2-D array that retains its 2-D nature through operations. It has certain special operators, such as `*` (matrix multiplication) and `**` (matrix power).
Note
It is no longer recommended to use this class, even for linear algebra. Instead use regular arrays. The class may be removed in the future.
Parameters:
    
dataarray_like or string
    
If `data` is a string, it is interpreted as a matrix with commas or spaces separating columns, and semicolons separating rows.
dtypedata-type
    
Data-type of the output matrix.
copybool
    
If `data` is already an `ndarray`, then this flag determines whether the data is copied (the default), or whether a view is constructed.
See also
`array`
#### Examples
    
    >>> import numpy as np
    >>> a = np.matrix('1 2; 3 4')
    >>> a
    matrix([[1, 2],
            [3, 4]])
    
    
    >>> np.matrix([[1, 2], [3, 4]])
    matrix([[1, 2],
            [3, 4]])
    
Attributes:
    
`A`
    
Return `self` as an `ndarray` object.
`A1`
    
Return `self` as a flattened `ndarray`.
`H`
    
Returns the (complex) conjugate transpose of `self`.
`I`
    
Returns the (multiplicative) inverse of invertible `self`.
`T`
    
Returns the transpose of the matrix.
`base`
    
Base object if memory is from some other object.
`ctypes`
    
An object to simplify the interaction of the array with the ctypes module.
`data`
    
Python buffer object pointing to the start of the array’s data.
device
`dtype`
    
Data-type of the array’s elements.
`flags`
    
Information about the memory layout of the array.
`flat`
    
A 1-D iterator over the array.
`imag`
    
The imaginary part of the array.
itemset
`itemsize`
    
Length of one array element in bytes.
`mT`
    
View of the matrix transposed array.
`nbytes`
    
Total bytes consumed by the elements of the array.
`ndim`
    
Number of array dimensions.
newbyteorder
`real`
    
The real part of the array.
`shape`
    
Tuple of array dimensions.
`size`
    
Number of elements in the array.
`strides`
    
Tuple of bytes to step in each dimension when traversing an array.
#### Methods
`all`([axis, out])
Test whether all matrix elements along a given axis evaluate to True.  
`any`([axis, out])
Test whether any array element along a given axis evaluates to True.  
`argmax`([axis, out])
Indexes of the maximum values along an axis.  
`argmin`([axis, out])
Indexes of the minimum values along an axis.  
`argpartition`(kth[, axis, kind, order])
Returns the indices that would partition this array.  
`argsort`([axis, kind, order])
Returns the indices that would sort this array.  
`astype`(dtype[, order, casting, subok, copy])
Copy of the array, cast to a specified type.  
`byteswap`([inplace])
Swap the bytes of the array elements  
`choose`(choices[, out, mode])
Use an index array to construct a new array from a set of choices.  
`clip`([min, max, out])
Return an array whose values are limited to `[min, max]`.  
`compress`(condition[, axis, out])
Return selected slices of this array along given axis.  
`conj`()
Complex-conjugate all elements.  
`conjugate`()
Return the complex conjugate, element-wise.  
`copy`([order])
Return a copy of the array.  
`cumprod`([axis, dtype, out])
Return the cumulative product of the elements along the given axis.  
`cumsum`([axis, dtype, out])
Return the cumulative sum of the elements along the given axis.  
`diagonal`([offset, axis1, axis2])
Return specified diagonals.  
`dump`(file)
Dump a pickle of the array to the specified file.  
`dumps`()
Returns the pickle of the array as a string.  
`fill`(value)
Fill the array with a scalar value.  
`flatten`([order])
Return a flattened copy of the matrix.  
`getA`()
Return `self` as an `ndarray` object.  
`getA1`()
Return `self` as a flattened `ndarray`.  
`getH`()
Returns the (complex) conjugate transpose of `self`.  
`getI`()
Returns the (multiplicative) inverse of invertible `self`.  
`getT`()
Returns the transpose of the matrix.  
`getfield`(dtype[, offset])
Returns a field of the given array as a certain type.  
`item`(*args)
Copy an element of an array to a standard Python scalar and return it.  
`max`([axis, out])
Return the maximum value along an axis.  
`mean`([axis, dtype, out])
Returns the average of the matrix elements along the given axis.  
`min`([axis, out])
Return the minimum value along an axis.  
`nonzero`()
Return the indices of the elements that are non-zero.  
`partition`(kth[, axis, kind, order])
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array.  
`prod`([axis, dtype, out])
Return the product of the array elements over the given axis.  
`ptp`([axis, out])
Peak-to-peak (maximum - minimum) value along the given axis.  
`put`(indices, values[, mode])
Set `a.flat[n] = values[n]` for all `n` in indices.  
`ravel`([order])
Return a flattened matrix.  
`repeat`(repeats[, axis])
Repeat elements of an array.  
`reshape`(shape, /, *[, order, copy])
Returns an array containing the same data with a new shape.  
`resize`(new_shape[, refcheck])
Change shape and size of array in-place.  
`round`([decimals, out])
Return `a` with each element rounded to the given number of decimals.  
`searchsorted`(v[, side, sorter])
Find indices where elements of v should be inserted in a to maintain order.  
`setfield`(val, dtype[, offset])
Put a value into a specified place in a field defined by a data-type.  
`setflags`([write, align, uic])
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.  
`sort`([axis, kind, order])
Sort an array in-place.  
`squeeze`([axis])
Return a possibly reshaped matrix.  
`std`([axis, dtype, out, ddof])
Return the standard deviation of the array elements along the given axis.  
`sum`([axis, dtype, out])
Returns the sum of the matrix elements, along the given axis.  
`swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`take`(indices[, axis, out, mode])
Return an array formed from the elements of `a` at the given indices.  
`tobytes`([order])
Construct Python bytes containing the raw data bytes in the array.  
`tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
`tolist`()
Return the matrix as a (possibly nested) list.  
`tostring`([order])
A compatibility alias for `tobytes`, with exactly the same behavior.  
`trace`([offset, axis1, axis2, dtype, out])
Return the sum along diagonals of the array.  
`transpose`(*axes)
Returns a view of the array with axes transposed.  
`var`([axis, dtype, out, ddof])
Returns the variance of the matrix elements, along the given axis.  
`view`([dtype][, type])
New view of array with the same data.  
dot  
to_device  
# numpy.matrix.I
property
propertymatrix.I
    
Returns the (multiplicative) inverse of invertible `self`.
Parameters:
    
None
Returns:
    
retmatrix object
    
If `self` is non-singular, `ret` is such that `ret * self` == `self * ret` == `np.matrix(np.eye(self[0,:].size))` all return `True`.
Raises:
    
numpy.linalg.LinAlgError: Singular matrix
    
If `self` is singular.
See also
`linalg.inv`
#### Examples
    
    >>> m = np.matrix('[1, 2; 3, 4]'); m
    matrix([[1, 2],
            [3, 4]])
    >>> m.getI()
    matrix([[-2. ,  1. ],
            [ 1.5, -0.5]])
    >>> m.getI() * m
    matrix([[ 1.,  0.], # may vary
            [ 0.,  1.]])
    
# numpy.matrix.item
method
matrix.item(*args)
    
Copy an element of an array to a standard Python scalar and return it.
Parameters:
    
*argsArguments (variable number and type)
    
  * none: in this case, the method only works for arrays with one element (`a.size == 1`), which element is copied into a standard Python scalar object and returned.
  * int_type: this argument is interpreted as a flat index into the array, specifying which element to copy and return.
  * tuple of int_types: functions as does a single int_type argument, except that the argument is interpreted as an nd-index into the array.


Returns:
    
zStandard Python scalar object
    
A copy of the specified element of the array as a suitable Python scalar
#### Notes
When the data type of `a` is longdouble or clongdouble, item() returns a scalar array object because there is no available Python scalar that would not lose information. Void arrays return a buffer object for item(), unless fields are defined, in which case a tuple is returned.
`item` is very similar to a[args], except, instead of an array scalar, a standard Python scalar is returned. This can be useful for speeding up access to elements of the array and doing arithmetic on elements of the array using Python’s optimized math.
#### Examples
    
    >>> import numpy as np
    >>> np.random.seed(123)
    >>> x = np.random.randint(9, size=(3, 3))
    >>> x
    array([[2, 2, 6],
           [1, 3, 6],
           [1, 0, 1]])
    >>> x.item(3)
    1
    >>> x.item(7)
    0
    >>> x.item((0, 1))
    2
    >>> x.item((2, 2))
    1
    
For an array with object dtype, elements are returned as-is.
    
    >>> a = np.array([np.int64(1)], dtype=object)
    >>> a.item() #return np.int64
    np.int64(1)
    
# numpy.matrix.itemsize
attribute
matrix.itemsize
    
Length of one array element in bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1,2,3], dtype=np.float64)
    >>> x.itemsize
    8
    >>> x = np.array([1,2,3], dtype=np.complex128)
    >>> x.itemsize
    16
    
# numpy.matrix.max
method
matrix.max(axis=None, out=None)[source]
    
Return the maximum value along an axis.
Parameters:
    
See `amax` for complete descriptions
See also
`amax`, `ndarray.max`
#### Notes
This is the same as `ndarray.max`, but returns a `matrix` object where `ndarray.max` would return an ndarray.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.max()
    11
    >>> x.max(0)
    matrix([[ 8,  9, 10, 11]])
    >>> x.max(1)
    matrix([[ 3],
            [ 7],
            [11]])
    
# numpy.matrix.mean
method
matrix.mean(axis=None, dtype=None, out=None)[source]
    
Returns the average of the matrix elements along the given axis.
Refer to `numpy.mean` for full documentation.
See also
`numpy.mean`
#### Notes
Same as `ndarray.mean` except that, where that returns an `ndarray`, this returns a `matrix` object.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3, 4)))
    >>> x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.mean()
    5.5
    >>> x.mean(0)
    matrix([[4., 5., 6., 7.]])
    >>> x.mean(1)
    matrix([[ 1.5],
            [ 5.5],
            [ 9.5]])
    
# numpy.matrix.min
method
matrix.min(axis=None, out=None)[source]
    
Return the minimum value along an axis.
Parameters:
    
See `amin` for complete descriptions.
See also
`amin`, `ndarray.min`
#### Notes
This is the same as `ndarray.min`, but returns a `matrix` object where `ndarray.min` would return an ndarray.
#### Examples
    
    >>> x = -np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[  0,  -1,  -2,  -3],
            [ -4,  -5,  -6,  -7],
            [ -8,  -9, -10, -11]])
    >>> x.min()
    -11
    >>> x.min(0)
    matrix([[ -8,  -9, -10, -11]])
    >>> x.min(1)
    matrix([[ -3],
            [ -7],
            [-11]])
    
# numpy.matrix.mT
attribute
matrix.mT
    
View of the matrix transposed array.
The matrix transpose is the transpose of the last two dimensions, even if the array is of higher dimension.
New in version 2.0.
Raises:
    
ValueError
    
If the array is of dimension less than 2.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.mT
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.arange(8).reshape((2, 2, 2))
    >>> a
    array([[[0, 1],
            [2, 3]],
    
           [[4, 5],
            [6, 7]]])
    >>> a.mT
    array([[[0, 2],
            [1, 3]],
    
           [[4, 6],
            [5, 7]]])
    
# numpy.matrix.nbytes
attribute
matrix.nbytes
    
Total bytes consumed by the elements of the array.
See also
`sys.getsizeof`
    
Memory consumed by the object itself without parents in case view. This does include memory consumed by non-element attributes.
#### Notes
Does not include memory consumed by non-element attributes of the array object.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3,5,2), dtype=np.complex128)
    >>> x.nbytes
    480
    >>> np.prod(x.shape) * x.itemsize
    480
    
# numpy.matrix.nonzero
method
matrix.nonzero()
    
Return the indices of the elements that are non-zero.
Refer to `numpy.nonzero` for full documentation.
See also
`numpy.nonzero`
    
equivalent function
# numpy.matrix.partition
method
matrix.partition(kth, axis=-1, kind='introselect', order=None)
    
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array. In the output array, all elements smaller than the k-th element are located to the left of this element and all equal or greater are located to its right. The ordering of the elements in the two partitions on the either side of the k-th element in the output array is undefined.
Parameters:
    
kthint or sequence of ints
    
Element index to partition by. The kth element value will be in its final sorted position and all smaller elements will be moved before it and all equal or greater elements behind it. The order of all elements in the partitions is undefined. If provided with a sequence of kth it will partition all elements indexed by kth of them into their sorted position at once.
Deprecated since version 1.22.0: Passing booleans as index is deprecated.
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘introselect’}, optional
    
Selection algorithm. Default is ‘introselect’.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need to be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.partition`
    
Return a partitioned copy of an array.
`argpartition`
    
Indirect partition.
`sort`
    
Full sort.
#### Notes
See `np.partition` for notes on the different algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([3, 4, 2, 1])
    >>> a.partition(3)
    >>> a
    array([2, 1, 3, 4]) # may vary
    
    
    >>> a.partition((1, 3))
    >>> a
    array([1, 2, 3, 4])
    
# numpy.matrix.prod
method
matrix.prod(axis=None, dtype=None, out=None)[source]
    
Return the product of the array elements over the given axis.
Refer to `prod` for full documentation.
See also
`prod`, `ndarray.prod`
#### Notes
Same as `ndarray.prod`, except, where that returns an `ndarray`, this returns a `matrix` object instead.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.prod()
    0
    >>> x.prod(0)
    matrix([[  0,  45, 120, 231]])
    >>> x.prod(1)
    matrix([[   0],
            [ 840],
            [7920]])
    
# numpy.matrix.ptp
method
matrix.ptp(axis=None, out=None)[source]
    
Peak-to-peak (maximum - minimum) value along the given axis.
Refer to `numpy.ptp` for full documentation.
See also
`numpy.ptp`
#### Notes
Same as `ndarray.ptp`, except, where that would return an `ndarray` object, this returns a `matrix` object.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.ptp()
    11
    >>> x.ptp(0)
    matrix([[8, 8, 8, 8]])
    >>> x.ptp(1)
    matrix([[3],
            [3],
            [3]])
    
# numpy.matrix.put
method
matrix.put(indices, values, mode='raise')
    
Set `a.flat[n] = values[n]` for all `n` in indices.
Refer to `numpy.put` for full documentation.
See also
`numpy.put`
    
equivalent function
# numpy.matrix.ravel
method
matrix.ravel(order='C')[source]
    
Return a flattened matrix.
Refer to `numpy.ravel` for more documentation.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
The elements of `m` are read using this index order. ‘C’ means to index the elements in C-like order, with the last axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to index the elements in Fortran-like index order, with the first index changing fastest, and the last index changing slowest. Note that the ‘C’ and ‘F’ options take no account of the memory layout of the underlying array, and only refer to the order of axis indexing. ‘A’ means to read the elements in Fortran-like index order if `m` is Fortran contiguous in memory, C-like order otherwise. ‘K’ means to read the elements in the order they occur in memory, except for reversing the data when strides are negative. By default, ‘C’ index order is used.
Returns:
    
retmatrix
    
Return the matrix flattened to shape `(1, N)` where `N` is the number of elements in the original matrix. A copy is made only if necessary.
See also
`matrix.flatten`
    
returns a similar output matrix but always a copy
`matrix.flat`
    
a flat iterator on the array.
`numpy.ravel`
    
related function which returns an ndarray
# numpy.matrix.repeat
method
matrix.repeat(repeats, axis=None)
    
Repeat elements of an array.
Refer to `numpy.repeat` for full documentation.
See also
`numpy.repeat`
    
equivalent function
# numpy.matrix.reshape
method
matrix.reshape(shape, /, *, order='C', copy=None)
    
Returns an array containing the same data with a new shape.
Refer to `numpy.reshape` for full documentation.
See also
`numpy.reshape`
    
equivalent function
#### Notes
Unlike the free function `numpy.reshape`, this method on `ndarray` allows the elements of the shape parameter to be passed in as separate arguments. For example, `a.reshape(10, 11)` is equivalent to `a.reshape((10, 11))`.
# numpy.matrix.resize
method
matrix.resize(new_shape, refcheck=True)
    
Change shape and size of array in-place.
Parameters:
    
new_shapetuple of ints, or `n` ints
    
Shape of resized array.
refcheckbool, optional
    
If False, reference count will not be checked. Default is True.
Returns:
    
None
Raises:
    
ValueError
    
If `a` does not own its own data or references or views to it exist, and the data memory must be changed. PyPy only: will always raise if the data memory must be changed, since there is no reliable way to determine if references or views to it exist.
SystemError
    
If the `order` keyword argument is specified. This behaviour is a bug in NumPy.
See also
`resize`
    
Return a new array with the specified shape.
#### Notes
This reallocates space for the data area if necessary.
Only contiguous arrays (data elements consecutive in memory) can be resized.
The purpose of the reference count check is to make sure you do not use this array as a buffer for another Python object and then reallocate the memory. However, reference counts can increase in other ways so if you are sure that you have not shared the memory for this array with another Python object, then you may safely set `refcheck` to False.
#### Examples
Shrinking an array: array is flattened (in the order that the data are stored in memory), resized, and reshaped:
    
    >>> import numpy as np
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='C')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [1]])
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='F')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [2]])
    
Enlarging an array: as above, but missing entries are filled with zeros:
    
    >>> b = np.array([[0, 1], [2, 3]])
    >>> b.resize(2, 3) # new_shape parameter doesn't have to be a tuple
    >>> b
    array([[0, 1, 2],
           [3, 0, 0]])
    
Referencing an array prevents resizing…
    
    >>> c = a
    >>> a.resize((1, 1))
    Traceback (most recent call last):
    ...
    ValueError: cannot resize an array that references or is referenced ...
    
Unless `refcheck` is False:
    
    >>> a.resize((1, 1), refcheck=False)
    >>> a
    array([[0]])
    >>> c
    array([[0]])
    
# numpy.matrix.round
method
matrix.round(decimals=0, out=None)
    
Return `a` with each element rounded to the given number of decimals.
Refer to `numpy.around` for full documentation.
See also
`numpy.around`
    
equivalent function
# numpy.matrix.searchsorted
method
matrix.searchsorted(v, side='left', sorter=None)
    
Find indices where elements of v should be inserted in a to maintain order.
For full documentation, see `numpy.searchsorted`
See also
`numpy.searchsorted`
    
equivalent function
# numpy.matrix.setfield
method
matrix.setfield(val, dtype, offset=0)
    
Put a value into a specified place in a field defined by a data-type.
Place `val` into `a`’s field defined by `dtype` and beginning `offset` bytes into the field.
Parameters:
    
valobject
    
Value to be placed in field.
dtypedtype object
    
Data-type of the field in which to place `val`.
offsetint, optional
    
The number of bytes into the field at which to place `val`.
Returns:
    
None
See also
`getfield`
#### Examples
    
    >>> import numpy as np
    >>> x = np.eye(3)
    >>> x.getfield(np.float64)
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    >>> x.setfield(3, np.int32)
    >>> x.getfield(np.int32)
    array([[3, 3, 3],
           [3, 3, 3],
           [3, 3, 3]], dtype=int32)
    >>> x
    array([[1.0e+000, 1.5e-323, 1.5e-323],
           [1.5e-323, 1.0e+000, 1.5e-323],
           [1.5e-323, 1.5e-323, 1.0e+000]])
    >>> x.setfield(np.eye(3), np.int32)
    >>> x
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    
# numpy.matrix.setflags
method
matrix.setflags(write=None, align=None, uic=None)
    
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.
These Boolean-valued flags affect how numpy interprets the memory area used by `a` (see Notes below). The ALIGNED flag can only be set to True if the data is actually aligned according to the type. The WRITEBACKIFCOPY flag can never be set to True. The flag WRITEABLE can only be set to True if the array owns its own memory, or the ultimate owner of the memory exposes a writeable buffer interface, or is a string. (The exception for string is made so that unpickling can be done without copying memory.)
Parameters:
    
writebool, optional
    
Describes whether or not `a` can be written to.
alignbool, optional
    
Describes whether or not `a` is aligned properly for its type.
uicbool, optional
    
Describes whether or not `a` is a copy of another “base” array.
#### Notes
Array flags provide information about how the memory area used for the array is to be interpreted. There are 7 Boolean flags in use, only three of which can be changed by the user: WRITEBACKIFCOPY, WRITEABLE, and ALIGNED.
WRITEABLE (W) the data area can be written to;
ALIGNED (A) the data and strides are aligned appropriately for the hardware (as determined by the compiler);
WRITEBACKIFCOPY (X) this array is a copy of some other array (referenced by .base). When the C-API function PyArray_ResolveWritebackIfCopy is called, the base array will be updated with the contents of this array.
All flags can be accessed using the single (upper case) letter as well as the full name.
#### Examples
    
    >>> import numpy as np
    >>> y = np.array([[3, 1, 7],
    ...               [2, 0, 0],
    ...               [8, 5, 9]])
    >>> y
    array([[3, 1, 7],
           [2, 0, 0],
           [8, 5, 9]])
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
    >>> y.setflags(write=0, align=0)
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : False
      ALIGNED : False
      WRITEBACKIFCOPY : False
    >>> y.setflags(uic=1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: cannot set WRITEBACKIFCOPY flag to True
    
# numpy.matrix.sort
method
matrix.sort(axis=-1, kind=None, order=None)
    
Sort an array in-place. Refer to `numpy.sort` for full documentation.
Parameters:
    
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort under the covers and, in general, the actual implementation will vary with datatype. The ‘mergesort’ option is retained for backwards compatibility.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.sort`
    
Return a sorted copy of an array.
`numpy.argsort`
    
Indirect sort.
`numpy.lexsort`
    
Indirect stable sort on multiple keys.
`numpy.searchsorted`
    
Find elements in sorted array.
`numpy.partition`
    
Partial sort.
#### Notes
See `numpy.sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,4], [3,1]])
    >>> a.sort(axis=1)
    >>> a
    array([[1, 4],
           [1, 3]])
    >>> a.sort(axis=0)
    >>> a
    array([[1, 3],
           [1, 4]])
    
Use the `order` keyword to specify a field to use when sorting a structured array:
    
    >>> a = np.array([('a', 2), ('c', 1)], dtype=[('x', 'S1'), ('y', int)])
    >>> a.sort(order='y')
    >>> a
    array([(b'c', 1), (b'a', 2)],
          dtype=[('x', 'S1'), ('y', '<i8')])
    
# numpy.matrix.squeeze
method
matrix.squeeze(axis=None)[source]
    
Return a possibly reshaped matrix.
Refer to `numpy.squeeze` for more documentation.
Parameters:
    
axisNone or int or tuple of ints, optional
    
Selects a subset of the axes of length one in the shape. If an axis is selected with shape entry greater than one, an error is raised.
Returns:
    
squeezedmatrix
    
The matrix, but as a (1, N) matrix if it had shape (N, 1).
See also
`numpy.squeeze`
    
related function
#### Notes
If `m` has a single column then that column is returned as the single row of a matrix. Otherwise `m` is returned. The returned matrix is always either `m` itself or a view into `m`. Supplying an axis keyword argument will not affect the returned matrix but it may cause an error to be raised.
#### Examples
    
    >>> c = np.matrix([[1], [2]])
    >>> c
    matrix([[1],
            [2]])
    >>> c.squeeze()
    matrix([[1, 2]])
    >>> r = c.T
    >>> r
    matrix([[1, 2]])
    >>> r.squeeze()
    matrix([[1, 2]])
    >>> m = np.matrix([[1, 2], [3, 4]])
    >>> m.squeeze()
    matrix([[1, 2],
            [3, 4]])
    
# numpy.matrix.std
method
matrix.std(axis=None, dtype=None, out=None, ddof=0)[source]
    
Return the standard deviation of the array elements along the given axis.
Refer to `numpy.std` for full documentation.
See also
`numpy.std`
#### Notes
This is the same as `ndarray.std`, except that where an `ndarray` would be returned, a `matrix` object is returned instead.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3, 4)))
    >>> x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.std()
    3.4520525295346629 # may vary
    >>> x.std(0)
    matrix([[ 3.26598632,  3.26598632,  3.26598632,  3.26598632]]) # may vary
    >>> x.std(1)
    matrix([[ 1.11803399],
            [ 1.11803399],
            [ 1.11803399]])
    
# numpy.matrix.strides
attribute
matrix.strides
    
Tuple of bytes to step in each dimension when traversing an array.
The byte offset of element `(i[0], i[1], ..., i[n])` in an array `a` is:
    
    offset = sum(np.array(i) * a.strides)
    
A more detailed explanation of strides can be found in The N-dimensional array (ndarray).
Warning
Setting `arr.strides` is discouraged and may be deprecated in the future. `numpy.lib.stride_tricks.as_strided` should be preferred to create a new view of the same data in a safer way.
See also
`numpy.lib.stride_tricks.as_strided`
#### Notes
Imagine an array of 32-bit integers (each 4 bytes):
    
    x = np.array([[0, 1, 2, 3, 4],
                  [5, 6, 7, 8, 9]], dtype=np.int32)
    
This array is stored in memory as 40 bytes, one after the other (known as a contiguous block of memory). The strides of an array tell us how many bytes we have to skip in memory to move to the next position along a certain axis. For example, we have to skip 4 bytes (1 value) to move to the next column, but 20 bytes (5 values) to get to the same position in the next row. As such, the strides for the array `x` will be `(20, 4)`.
#### Examples
    
    >>> import numpy as np
    >>> y = np.reshape(np.arange(2*3*4), (2,3,4))
    >>> y
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>> y.strides
    (48, 16, 4)
    >>> y[1,1,1]
    17
    >>> offset=sum(y.strides * np.array((1,1,1)))
    >>> offset/y.itemsize
    17
    
    
    >>> x = np.reshape(np.arange(5*6*7*8), (5,6,7,8)).transpose(2,3,1,0)
    >>> x.strides
    (32, 4, 224, 1344)
    >>> i = np.array([3,5,2,2])
    >>> offset = sum(i * x.strides)
    >>> x[3,5,2,2]
    813
    >>> offset / x.itemsize
    813
    
# numpy.matrix.sum
method
matrix.sum(axis=None, dtype=None, out=None)[source]
    
Returns the sum of the matrix elements, along the given axis.
Refer to `numpy.sum` for full documentation.
See also
`numpy.sum`
#### Notes
This is the same as `ndarray.sum`, except that where an `ndarray` would be returned, a `matrix` object is returned instead.
#### Examples
    
    >>> x = np.matrix([[1, 2], [4, 3]])
    >>> x.sum()
    10
    >>> x.sum(axis=1)
    matrix([[3],
            [7]])
    >>> x.sum(axis=1, dtype='float')
    matrix([[3.],
            [7.]])
    >>> out = np.zeros((2, 1), dtype='float')
    >>> x.sum(axis=1, dtype='float', out=np.asmatrix(out))
    matrix([[3.],
            [7.]])
    
# numpy.matrix.swapaxes
method
matrix.swapaxes(axis1, axis2)
    
Return a view of the array with `axis1` and `axis2` interchanged.
Refer to `numpy.swapaxes` for full documentation.
See also
`numpy.swapaxes`
    
equivalent function
# numpy.matrix.T
property
propertymatrix.T
    
Returns the transpose of the matrix.
Does not conjugate! For the complex conjugate transpose, use `.H`.
Parameters:
    
None
Returns:
    
retmatrix object
    
The (non-conjugated) transpose of the matrix.
See also
`transpose`, `getH`
#### Examples
    
    >>> m = np.matrix('[1, 2; 3, 4]')
    >>> m
    matrix([[1, 2],
            [3, 4]])
    >>> m.getT()
    matrix([[1, 3],
            [2, 4]])
    
# numpy.matrix.take
method
matrix.take(indices, axis=None, out=None, mode='raise')
    
Return an array formed from the elements of `a` at the given indices.
Refer to `numpy.take` for full documentation.
See also
`numpy.take`
    
equivalent function
# numpy.matrix.tobytes
method
matrix.tobytes(order='C')
    
Construct Python bytes containing the raw data bytes in the array.
Constructs Python bytes showing a copy of the raw contents of data memory. The bytes object is produced in C-order by default. This behavior is controlled by the `order` parameter.
Parameters:
    
order{‘C’, ‘F’, ‘A’}, optional
    
Controls the memory layout of the bytes object. ‘C’ means C-order, ‘F’ means F-order, ‘A’ (short for Any) means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. Default is ‘C’.
Returns:
    
sbytes
    
Python bytes exhibiting a copy of `a`’s raw data.
See also
`frombuffer`
    
Inverse of this operation, construct a 1-dimensional array from Python bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[0, 1], [2, 3]], dtype='<u2')
    >>> x.tobytes()
    b'\x00\x00\x01\x00\x02\x00\x03\x00'
    >>> x.tobytes('C') == x.tobytes()
    True
    >>> x.tobytes('F')
    b'\x00\x00\x02\x00\x01\x00\x03\x00'
    
# numpy.matrix.tofile
method
matrix.tofile(fid, sep='', format='%s')
    
Write array to a file as text or binary (default).
Data is always written in ‘C’ order, independent of the order of `a`. The data produced by this method can be recovered using the function fromfile().
Parameters:
    
fidfile or str or Path
    
An open file object, or a string containing a filename.
sepstr
    
Separator between array items for text output. If “” (empty), a binary file is written, equivalent to `file.write(a.tobytes())`.
formatstr
    
Format string for text file output. Each entry in the array is formatted to text by first converting it to the closest Python type, and then using “format” % item.
#### Notes
This is a convenience function for quick storage of array data. Information on endianness and precision is lost, so this method is not a good choice for files intended to archive data or transport data between machines with different endianness. Some of these problems can be overcome by outputting the data as text files, at the expense of speed and file size.
When fid is a file object, array contents are directly written to the file, bypassing the file object’s `write` method. As a result, tofile cannot be used with files objects supporting compression (e.g., GzipFile) or file-like objects that do not support `fileno()` (e.g., BytesIO).
# numpy.matrix.tolist
method
matrix.tolist()[source]
    
Return the matrix as a (possibly nested) list.
See `ndarray.tolist` for full documentation.
See also
`ndarray.tolist`
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3,4))); x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.tolist()
    [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
    
# numpy.matrix.tostring
method
matrix.tostring(order='C')
    
A compatibility alias for `tobytes`, with exactly the same behavior.
Despite its name, it returns `bytes` not `str`s.
Deprecated since version 1.19.0.
# numpy.matrix.trace
method
matrix.trace(offset=0, axis1=0, axis2=1, dtype=None, out=None)
    
Return the sum along diagonals of the array.
Refer to `numpy.trace` for full documentation.
See also
`numpy.trace`
    
equivalent function
# numpy.matrix.transpose
method
matrix.transpose(*axes)
    
Returns a view of the array with axes transposed.
Refer to `numpy.transpose` for full documentation.
Parameters:
    
axesNone, tuple of ints, or `n` ints
    
  * None or no argument: reverses the order of the axes.
  * tuple of ints: `i` in the `j`-th place in the tuple means that the array’s `i`-th axis becomes the transposed array’s `j`-th axis.
  * `n` ints: same as an n-tuple of the same ints (this form is intended simply as a “convenience” alternative to the tuple form).


Returns:
    
pndarray
    
View of the array with its axes suitably permuted.
See also
`transpose`
    
Equivalent function.
`ndarray.T`
    
Array property returning the array transposed.
`ndarray.reshape`
    
Give a new shape to an array without changing its data.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.transpose()
    array([[1, 3],
           [2, 4]])
    >>> a.transpose((1, 0))
    array([[1, 3],
           [2, 4]])
    >>> a.transpose(1, 0)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.transpose()
    array([1, 2, 3, 4])
    
# numpy.matrix.var
method
matrix.var(axis=None, dtype=None, out=None, ddof=0)[source]
    
Returns the variance of the matrix elements, along the given axis.
Refer to `numpy.var` for full documentation.
See also
`numpy.var`
#### Notes
This is the same as `ndarray.var`, except that where an `ndarray` would be returned, a `matrix` object is returned instead.
#### Examples
    
    >>> x = np.matrix(np.arange(12).reshape((3, 4)))
    >>> x
    matrix([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
    >>> x.var()
    11.916666666666666
    >>> x.var(0)
    matrix([[ 10.66666667,  10.66666667,  10.66666667,  10.66666667]]) # may vary
    >>> x.var(1)
    matrix([[1.25],
            [1.25],
            [1.25]])
    
# numpy.matrix.view
method
matrix.view([dtype][, type])
    
New view of array with the same data.
Note
Passing None for `dtype` is different from omitting the parameter, since the former invokes `dtype(None)` which is an alias for `dtype('float64')`.
Parameters:
    
dtypedata-type or ndarray sub-class, optional
    
Data-type descriptor of the returned view, e.g., float32 or int16. Omitting it results in the view having the same data-type as `a`. This argument can also be specified as an ndarray sub-class, which then specifies the type of the returned object (this is equivalent to setting the `type` parameter).
typePython type, optional
    
Type of the returned view, e.g., ndarray or matrix. Again, omission of the parameter results in type preservation.
#### Notes
`a.view()` is used two different ways:
`a.view(some_dtype)` or `a.view(dtype=some_dtype)` constructs a view of the array’s memory with a different data-type. This can cause a reinterpretation of the bytes of memory.
`a.view(ndarray_subclass)` or `a.view(type=ndarray_subclass)` just returns an instance of `ndarray_subclass` that looks at the same array (same shape, dtype, etc.) This does not cause a reinterpretation of the memory.
For `a.view(some_dtype)`, if `some_dtype` has a different number of bytes per entry than the previous dtype (for example, converting a regular array to a structured array), then the last axis of `a` must be contiguous. This axis will be resized in the result.
Changed in version 1.23.0: Only the last axis needs to be contiguous. Previously, the entire array had to be C-contiguous.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([(-1, 2)], dtype=[('a', np.int8), ('b', np.int8)])
    
Viewing array data using a different type and dtype:
    
    >>> nonneg = np.dtype([("a", np.uint8), ("b", np.uint8)])
    >>> y = x.view(dtype=nonneg, type=np.recarray)
    >>> x["a"]
    array([-1], dtype=int8)
    >>> y.a
    array([255], dtype=uint8)
    
Creating a view on a structured array so it can be used in calculations
    
    >>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)])
    >>> xv = x.view(dtype=np.int8).reshape(-1,2)
    >>> xv
    array([[1, 2],
           [3, 4]], dtype=int8)
    >>> xv.mean(0)
    array([2.,  3.])
    
Making changes to the view changes the underlying array
    
    >>> xv[0,1] = 20
    >>> x
    array([(1, 20), (3,  4)], dtype=[('a', 'i1'), ('b', 'i1')])
    
Using a view to convert an array to a recarray:
    
    >>> z = x.view(np.recarray)
    >>> z.a
    array([1, 3], dtype=int8)
    
Views share data:
    
    >>> x[0] = (9, 10)
    >>> z[0]
    np.record((9, 10), dtype=[('a', 'i1'), ('b', 'i1')])
    
Views that change the dtype size (bytes per entry) should normally be avoided on arrays defined by slices, transposes, fortran-ordering, etc.:
    
    >>> x = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int16)
    >>> y = x[:, ::2]
    >>> y
    array([[1, 3],
           [4, 6]], dtype=int16)
    >>> y.view(dtype=[('width', np.int16), ('length', np.int16)])
    Traceback (most recent call last):
        ...
    ValueError: To change to a dtype of a different size, the last axis must be contiguous
    >>> z = y.copy()
    >>> z.view(dtype=[('width', np.int16), ('length', np.int16)])
    array([[(1, 3)],
           [(4, 6)]], dtype=[('width', '<i2'), ('length', '<i2')])
    
However, views that change dtype are totally fine for arrays with a contiguous last axis, even if the rest of the axes are not C-contiguous:
    
    >>> x = np.arange(2 * 3 * 4, dtype=np.int8).reshape(2, 3, 4)
    >>> x.transpose(1, 0, 2).view(np.int16)
    array([[[ 256,  770],
            [3340, 3854]],
    
           [[1284, 1798],
            [4368, 4882]],
    
           [[2312, 2826],
            [5396, 5910]]], dtype=int16)
    
# numpy.matrix_transpose
numpy.matrix_transpose(x, /)[source]
    
Transposes a matrix (or a stack of matrices) `x`.
This function is Array API compatible.
Parameters:
    
xarray_like
    
Input array having shape (…, M, N) and whose two innermost dimensions form `MxN` matrices.
Returns:
    
outndarray
    
An array containing the transpose for each matrix and having shape (…, N, M).
See also
`transpose`
    
Generic transpose method.
#### Examples
    
    >>> import numpy as np
    >>> np.matrix_transpose([[1, 2], [3, 4]])
    array([[1, 3],
           [2, 4]])
    
    
    >>> np.matrix_transpose([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    array([[[1, 3],
            [2, 4]],
           [[5, 7],
            [6, 8]]])
    
# numpy.matvec
numpy.matvec(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, signature, axes, axis])=<ufunc 'matvec'>
    
Matrix-vector dot product of two arrays.
Given a matrix (or stack of matrices) \\(\mathbf{A}\\) in `x1` and a vector (or stack of vectors) \\(\mathbf{v}\\) in `x2`, the matrix-vector product is defined as:
\\[\mathbf{A} \cdot \mathbf{b} = \sum_{j=0}^{n-1} A_{ij} v_j\\]
where the sum is over the last dimensions in `x1` and `x2` (unless `axes` is specified). (For a matrix-vector product with the vector conjugated, use `np.vecmat(x2, x1.mT)`.)
New in version 2.2.0.
Parameters:
    
x1, x2array_like
    
Input arrays, scalars not allowed.
outndarray, optional
    
A location into which the result is stored. If provided, it must have the broadcasted shape of `x1` and `x2` with the summation axis removed. If not provided or None, a freshly-allocated array is used.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The matrix-vector product of the inputs.
Raises:
    
ValueError
    
If the last dimensions of `x1` and `x2` are not the same size.
If a scalar value is passed in.
See also
`vecdot`
    
Vector-vector product.
`vecmat`
    
Vector-matrix product.
`matmul`
    
Matrix-matrix product.
`einsum`
    
Einstein summation convention.
#### Examples
Rotate a set of vectors from Y to X along Z.
    
    >>> a = np.array([[0., 1., 0.],
    ...               [-1., 0., 0.],
    ...               [0., 0., 1.]])
    >>> v = np.array([[1., 0., 0.],
    ...               [0., 1., 0.],
    ...               [0., 0., 1.],
    ...               [0., 6., 8.]])
    >>> np.matvec(a, v)
    array([[ 0., -1.,  0.],
           [ 1.,  0.,  0.],
           [ 0.,  0.,  1.],
           [ 6.,  0.,  8.]])
    
# numpy.max
numpy.max(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the maximum of an array or maximum along an axis.
Parameters:
    
aarray_like
    
Input data.
axisNone or int or tuple of ints, optional
    
Axis or axes along which to operate. By default, flattened input is used. If this is a tuple of ints, the maximum is selected over multiple axes, instead of a single axis or all the axes as before.
outndarray, optional
    
Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output. See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `max` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
The minimum value of an output element. Must be present to allow computation on empty slice. See `reduce` for details.
wherearray_like of bool, optional
    
Elements to compare for the maximum. See `reduce` for details.
Returns:
    
maxndarray or scalar
    
Maximum of `a`. If `axis` is None, the result is a scalar value. If `axis` is an int, the result is an array of dimension `a.ndim - 1`. If `axis` is a tuple, the result is an array of dimension `a.ndim - len(axis)`.
See also
`amin`
    
The minimum value of an array along a given axis, propagating any NaNs.
`nanmax`
    
The maximum value of an array along a given axis, ignoring any NaNs.
`maximum`
    
Element-wise maximum of two arrays, propagating any NaNs.
`fmax`
    
Element-wise maximum of two arrays, ignoring any NaNs.
`argmax`
    
Return the indices of the maximum values.
`nanmin`, `minimum`, `fmin`
#### Notes
NaN values are propagated, that is if at least one item is NaN, the corresponding max value will be NaN as well. To ignore NaN values (MATLAB behavior), please use nanmax.
Don’t use `max` for element-wise comparison of 2 arrays; when `a.shape[0]` is 2, `maximum(a[0], a[1])` is faster than `max(a, axis=0)`.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(4).reshape((2,2))
    >>> a
    array([[0, 1],
           [2, 3]])
    >>> np.max(a)           # Maximum of the flattened array
    3
    >>> np.max(a, axis=0)   # Maxima along the first axis
    array([2, 3])
    >>> np.max(a, axis=1)   # Maxima along the second axis
    array([1, 3])
    >>> np.max(a, where=[False, True], initial=-1, axis=0)
    array([-1,  3])
    >>> b = np.arange(5, dtype=float)
    >>> b[2] = np.nan
    >>> np.max(b)
    np.float64(nan)
    >>> np.max(b, where=~np.isnan(b), initial=-1)
    4.0
    >>> np.nanmax(b)
    4.0
    
You can use an initial value to compute the maximum of an empty slice, or to initialize it to a different value:
    
    >>> np.max([[-50], [10]], axis=-1, initial=0)
    array([ 0, 10])
    
Notice that the initial value is used as one of the elements for which the maximum is determined, unlike for the default argument Python’s max function, which is only used for empty iterables.
    
    >>> np.max([5], initial=6)
    6
    >>> max([5], default=6)
    5
    
# numpy.maximum
numpy.maximum(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'maximum'>
    
Element-wise maximum of array elements.
Compare two arrays and return a new array containing the element-wise maxima. If one of the elements being compared is a NaN, then that element is returned. If both elements are NaNs then the first is returned. The latter distinction is important for complex NaNs, which are defined as at least one of the real or imaginary parts being a NaN. The net effect is that NaNs are propagated.
Parameters:
    
x1, x2array_like
    
The arrays holding the elements to be compared. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The maximum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
See also
`minimum`
    
Element-wise minimum of two arrays, propagates NaNs.
`fmax`
    
Element-wise maximum of two arrays, ignores NaNs.
`amax`
    
The maximum value of an array along a given axis, propagates NaNs.
`nanmax`
    
The maximum value of an array along a given axis, ignores NaNs.
`fmin`, `amin`, `nanmin`
#### Notes
The maximum is equivalent to `np.where(x1 >= x2, x1, x2)` when neither x1 nor x2 are nans, but it is faster and does proper broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.maximum([2, 3, 4], [1, 5, 2])
    array([2, 5, 4])
    
    
    >>> np.maximum(np.eye(2), [0.5, 2]) # broadcasting
    array([[ 1. ,  2. ],
           [ 0.5,  2. ]])
    
    
    >>> np.maximum([np.nan, 0, np.nan], [0, np.nan, np.nan])
    array([nan, nan, nan])
    >>> np.maximum(np.inf, 1)
    inf
    
# numpy.may_share_memory
numpy.may_share_memory(a, b, /, max_work=None)
    
Determine if two arrays might share memory
A return of True does not necessarily mean that the two arrays share any element. It just means that they might.
Only the memory bounds of a and b are checked by default.
Parameters:
    
a, bndarray
    
Input arrays
max_workint, optional
    
Effort to spend on solving the overlap problem. See `shares_memory` for details. Default for `may_share_memory` is to do a bounds check.
Returns:
    
outbool
See also
`shares_memory`
#### Examples
    
    >>> import numpy as np
    >>> np.may_share_memory(np.array([1,2]), np.array([5,8,9]))
    False
    >>> x = np.zeros([3, 4])
    >>> np.may_share_memory(x[:,0], x[:,1])
    True
    
# numpy.mean
numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>, *, where=<no value>)[source]
    
Compute the arithmetic mean along the specified axis.
Returns the average of the array elements. The average is taken over the flattened array by default, otherwise over the specified axis. `float64` intermediate and return values are used for integer inputs.
Parameters:
    
aarray_like
    
Array containing numbers whose mean is desired. If `a` is not an array, a conversion is attempted.
axisNone or int or tuple of ints, optional
    
Axis or axes along which the means are computed. The default is to compute the mean of the flattened array.
If this is a tuple of ints, a mean is performed over multiple axes, instead of a single axis or all the axes as before.
dtypedata-type, optional
    
Type to use in computing the mean. For integer inputs, the default is `float64`; for floating point inputs, it is the same as the input dtype.
outndarray, optional
    
Alternate output array in which to place the result. The default is `None`; if provided, it must have the same shape as the expected output, but the type will be cast if necessary. See Output type determination for more details. See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `mean` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in the mean. See `reduce` for details.
New in version 1.20.0.
Returns:
    
mndarray, see dtype parameter above
    
If `out=None`, returns a new array containing the mean values, otherwise a reference to the output array is returned.
See also
`average`
    
Weighted average
`std`, `var`, `nanmean`, `nanstd`, `nanvar`
#### Notes
The arithmetic mean is the sum of the elements along the axis divided by the number of elements.
Note that for floating-point input, the mean is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-precision accumulator using the `dtype` keyword can alleviate this issue.
By default, `float16` results are computed using `float32` intermediates for extra precision.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.mean(a)
    2.5
    >>> np.mean(a, axis=0)
    array([2., 3.])
    >>> np.mean(a, axis=1)
    array([1.5, 3.5])
    
In single precision, `mean` can be inaccurate:
    
    >>> a = np.zeros((2, 512*512), dtype=np.float32)
    >>> a[0, :] = 1.0
    >>> a[1, :] = 0.1
    >>> np.mean(a)
    np.float32(0.54999924)
    
Computing the mean in float64 is more accurate:
    
    >>> np.mean(a, dtype=np.float64)
    0.55000000074505806 # may vary
    
Computing the mean in timedelta64 is available:
    
    >>> b = np.array([1, 3], dtype="timedelta64[D]")
    >>> np.mean(b)
    np.timedelta64(2,'D')
    
Specifying a where argument:
    
    >>> a = np.array([[5, 9, 13], [14, 10, 12], [11, 15, 19]])
    >>> np.mean(a)
    12.0
    >>> np.mean(a, where=[[True], [False], [False]])
    9.0
    
# numpy.median
numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)[source]
    
Compute the median along the specified axis.
Returns the median of the array elements.
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array.
axis{int, sequence of int, None}, optional
    
Axis or axes along which the medians are computed. The default, axis=None, will compute the median along a flattened version of the array. If a sequence of axes, the array is first flattened along the given axes, then the median is computed along the resulting flattened axis.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow use of memory of input array `a` for calculations. The input array will be modified by the call to `median`. This will save memory when you do not need to preserve the contents of the input array. Treat the input as undefined, but it will probably be fully or partially sorted. Default is False. If `overwrite_input` is `True` and `a` is not already an `ndarray`, an error will be raised.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `arr`.
Returns:
    
medianndarray
    
A new array holding the result. If the input contains integers or floats smaller than `float64`, then the output data-type is `np.float64`. Otherwise, the data-type of the output is the same as that of the input. If `out` is specified, that array is returned instead.
See also
`mean`, `percentile`
#### Notes
Given a vector `V` of length `N`, the median of `V` is the middle value of a sorted copy of `V`, `V_sorted` \- i e., `V_sorted[(N-1)/2]`, when `N` is odd, and the average of the two middle values of `V_sorted` when `N` is even.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[10, 7, 4], [3, 2, 1]])
    >>> a
    array([[10,  7,  4],
           [ 3,  2,  1]])
    >>> np.median(a)
    np.float64(3.5)
    >>> np.median(a, axis=0)
    array([6.5, 4.5, 2.5])
    >>> np.median(a, axis=1)
    array([7.,  2.])
    >>> np.median(a, axis=(0, 1))
    np.float64(3.5)
    >>> m = np.median(a, axis=0)
    >>> out = np.zeros_like(m)
    >>> np.median(a, axis=0, out=m)
    array([6.5,  4.5,  2.5])
    >>> m
    array([6.5,  4.5,  2.5])
    >>> b = a.copy()
    >>> np.median(b, axis=1, overwrite_input=True)
    array([7.,  2.])
    >>> assert not np.all(a==b)
    >>> b = a.copy()
    >>> np.median(b, axis=None, overwrite_input=True)
    np.float64(3.5)
    >>> assert not np.all(a==b)
    
# numpy.memmap.flush
method
memmap.flush()[source]
    
Write any changes in the array to the file on disk.
For further information, see `memmap`.
Parameters:
    
None
See also
`memmap`
# numpy.memmap
classnumpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[source]
    
Create a memory-map to an array stored in a binary file on disk.
Memory-mapped files are used for accessing small segments of large files on disk, without reading the entire file into memory. NumPy’s memmap’s are array-like objects. This differs from Python’s `mmap` module, which uses file-like objects.
This subclass of ndarray has some unpleasant interactions with some operations, because it doesn’t quite fit properly as a subclass. An alternative to using this subclass is to create the `mmap` object yourself, then create an ndarray with ndarray.__new__ directly, passing the object created in its ‘buffer=’ parameter.
This class may at some point be turned into a factory function which returns a view into an mmap buffer.
Flush the memmap instance to write the changes to the file. Currently there is no API to close the underlying `mmap`. It is tricky to ensure the resource is actually closed, since it may be shared between different memmap instances.
Parameters:
    
filenamestr, file-like object, or pathlib.Path instance
    
The file name or file object to be used as the array data buffer.
dtypedata-type, optional
    
The data-type used to interpret the file contents. Default is `uint8`.
mode{‘r+’, ‘r’, ‘w+’, ‘c’}, optional
    
The file is opened in this mode:
‘r’
Open existing file for reading only.  
‘r+’
Open existing file for reading and writing.  
‘w+’
Create or overwrite existing file for reading and writing. If `mode == 'w+'` then `shape` must also be specified.  
‘c’
Copy-on-write: assignments affect data in memory, but changes are not saved to disk. The file on disk is read-only.  
Default is ‘r+’.
offsetint, optional
    
In the file, array data starts at this offset. Since `offset` is measured in bytes, it should normally be a multiple of the byte-size of `dtype`. When `mode != 'r'`, even positive offsets beyond end of file are valid; The file will be extended to accommodate the additional data. By default, `memmap` will start at the beginning of the file, even if `filename` is a file pointer `fp` and `fp.tell() != 0`.
shapeint or sequence of ints, optional
    
The desired shape of the array. If `mode == 'r'` and the number of remaining bytes after `offset` is not a multiple of the byte-size of `dtype`, you must specify `shape`. By default, the returned array will be 1-D with the number of elements determined by file size and data-type.
Changed in version 2.0: The shape parameter can now be any integer sequence type, previously types were limited to tuple and int.
order{‘C’, ‘F’}, optional
    
Specify the order of the ndarray memory layout: row-major, C-style or column-major, Fortran-style. This only has an effect if the shape is greater than 1-D. The default order is ‘C’.
See also
`lib.format.open_memmap`
    
Create or load a memory-mapped `.npy` file.
#### Notes
The memmap object can be used anywhere an ndarray is accepted. Given a memmap `fp`, `isinstance(fp, numpy.ndarray)` returns `True`.
Memory-mapped files cannot be larger than 2GB on 32-bit systems.
When a memmap causes a file to be created or extended beyond its current size in the filesystem, the contents of the new part are unspecified. On systems with POSIX filesystem semantics, the extended part will be filled with zero bytes.
#### Examples
    
    >>> import numpy as np
    >>> data = np.arange(12, dtype='float32')
    >>> data.resize((3,4))
    
This example uses a temporary file so that doctest doesn’t write files to your directory. You would use a ‘normal’ filename.
    
    >>> from tempfile import mkdtemp
    >>> import os.path as path
    >>> filename = path.join(mkdtemp(), 'newfile.dat')
    
Create a memmap with dtype and shape that matches our data:
    
    >>> fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
    >>> fp
    memmap([[0., 0., 0., 0.],
            [0., 0., 0., 0.],
            [0., 0., 0., 0.]], dtype=float32)
    
Write data to memmap array:
    
    >>> fp[:] = data[:]
    >>> fp
    memmap([[  0.,   1.,   2.,   3.],
            [  4.,   5.,   6.,   7.],
            [  8.,   9.,  10.,  11.]], dtype=float32)
    
    
    >>> fp.filename == path.abspath(filename)
    True
    
Flushes memory changes to disk in order to read them back
    
    >>> fp.flush()
    
Load the memmap and verify data was stored:
    
    >>> newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
    >>> newfp
    memmap([[  0.,   1.,   2.,   3.],
            [  4.,   5.,   6.,   7.],
            [  8.,   9.,  10.,  11.]], dtype=float32)
    
Read-only memmap:
    
    >>> fpr = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
    >>> fpr.flags.writeable
    False
    
Copy-on-write memmap:
    
    >>> fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4))
    >>> fpc.flags.writeable
    True
    
It’s possible to assign to copy-on-write array, but values are only written into the memory copy of the array, and not written to disk:
    
    >>> fpc
    memmap([[  0.,   1.,   2.,   3.],
            [  4.,   5.,   6.,   7.],
            [  8.,   9.,  10.,  11.]], dtype=float32)
    >>> fpc[0,:] = 0
    >>> fpc
    memmap([[  0.,   0.,   0.,   0.],
            [  4.,   5.,   6.,   7.],
            [  8.,   9.,  10.,  11.]], dtype=float32)
    
File on disk is unchanged:
    
    >>> fpr
    memmap([[  0.,   1.,   2.,   3.],
            [  4.,   5.,   6.,   7.],
            [  8.,   9.,  10.,  11.]], dtype=float32)
    
Offset into a memmap:
    
    >>> fpo = np.memmap(filename, dtype='float32', mode='r', offset=16)
    >>> fpo
    memmap([  4.,   5.,   6.,   7.,   8.,   9.,  10.,  11.], dtype=float32)
    
Attributes:
    
filenamestr or pathlib.Path instance
    
Path to the mapped file.
offsetint
    
Offset position in the file.
modestr
    
File mode.
#### Methods
`flush`()
Write any changes in the array to the file on disk.  
# numpy.meshgrid
numpy.meshgrid(*xi, copy=True, sparse=False, indexing='xy')[source]
    
Return a tuple of coordinate matrices from coordinate vectors.
Make N-D coordinate arrays for vectorized evaluations of N-D scalar/vector fields over N-D grids, given one-dimensional coordinate arrays x1, x2,…, xn.
Parameters:
    
x1, x2,…, xnarray_like
    
1-D arrays representing the coordinates of a grid.
indexing{‘xy’, ‘ij’}, optional
    
Cartesian (‘xy’, default) or matrix (‘ij’) indexing of output. See Notes for more details.
sparsebool, optional
    
If True the shape of the returned coordinate array for dimension i is reduced from `(N1, ..., Ni, ... Nn)` to `(1, ..., 1, Ni, 1, ..., 1)`. These sparse coordinate grids are intended to be use with Broadcasting. When all coordinates are used in an expression, broadcasting still leads to a fully-dimensonal result array.
Default is False.
copybool, optional
    
If False, a view into the original arrays are returned in order to conserve memory. Default is True. Please note that `sparse=False, copy=False` will likely return non-contiguous arrays. Furthermore, more than one element of a broadcast array may refer to a single memory location. If you need to write to the arrays, make copies first.
Returns:
    
X1, X2,…, XNtuple of ndarrays
    
For vectors `x1`, `x2`,…, `xn` with lengths `Ni=len(xi)`, returns `(N1, N2, N3,..., Nn)` shaped arrays if indexing=’ij’ or `(N2, N1, N3,..., Nn)` shaped arrays if indexing=’xy’ with the elements of `xi` repeated to fill the matrix along the first dimension for `x1`, the second for `x2` and so on.
See also
`mgrid`
    
Construct a multi-dimensional “meshgrid” using indexing notation.
`ogrid`
    
Construct an open multi-dimensional “meshgrid” using indexing notation.
How to index ndarrays
#### Notes
This function supports both indexing conventions through the indexing keyword argument. Giving the string ‘ij’ returns a meshgrid with matrix indexing, while ‘xy’ returns a meshgrid with Cartesian indexing. In the 2-D case with inputs of length M and N, the outputs are of shape (N, M) for ‘xy’ indexing and (M, N) for ‘ij’ indexing. In the 3-D case with inputs of length M, N and P, outputs are of shape (N, M, P) for ‘xy’ indexing and (M, N, P) for ‘ij’ indexing. The difference is illustrated by the following code snippet:
    
    xv, yv = np.meshgrid(x, y, indexing='ij')
    for i in range(nx):
        for j in range(ny):
            # treat xv[i,j], yv[i,j]
    
    xv, yv = np.meshgrid(x, y, indexing='xy')
    for i in range(nx):
        for j in range(ny):
            # treat xv[j,i], yv[j,i]
    
In the 1-D and 0-D case, the indexing and sparse keywords have no effect.
#### Examples
    
    >>> import numpy as np
    >>> nx, ny = (3, 2)
    >>> x = np.linspace(0, 1, nx)
    >>> y = np.linspace(0, 1, ny)
    >>> xv, yv = np.meshgrid(x, y)
    >>> xv
    array([[0. , 0.5, 1. ],
           [0. , 0.5, 1. ]])
    >>> yv
    array([[0.,  0.,  0.],
           [1.,  1.,  1.]])
    
The result of `meshgrid` is a coordinate grid:
    
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(xv, yv, marker='o', color='k', linestyle='none')
    >>> plt.show()
    
You can create sparse output arrays to save memory and computation time.
    
    >>> xv, yv = np.meshgrid(x, y, sparse=True)
    >>> xv
    array([[0. ,  0.5,  1. ]])
    >>> yv
    array([[0.],
           [1.]])
    
`meshgrid` is very useful to evaluate functions on a grid. If the function depends on all coordinates, both dense and sparse outputs can be used.
    
    >>> x = np.linspace(-5, 5, 101)
    >>> y = np.linspace(-5, 5, 101)
    >>> # full coordinate arrays
    >>> xx, yy = np.meshgrid(x, y)
    >>> zz = np.sqrt(xx**2 + yy**2)
    >>> xx.shape, yy.shape, zz.shape
    ((101, 101), (101, 101), (101, 101))
    >>> # sparse coordinate arrays
    >>> xs, ys = np.meshgrid(x, y, sparse=True)
    >>> zs = np.sqrt(xs**2 + ys**2)
    >>> xs.shape, ys.shape, zs.shape
    ((1, 101), (101, 1), (101, 101))
    >>> np.array_equal(zz, zs)
    True
    
    
    >>> h = plt.contourf(x, y, zs)
    >>> plt.axis('scaled')
    >>> plt.colorbar()
    >>> plt.show()
    
# numpy.mgrid
numpy.mgrid=<numpy.lib._index_tricks_impl.MGridClass object>
    
An instance which returns a dense multi-dimensional “meshgrid”.
An instance which returns a dense (or fleshed out) mesh-grid when indexed, so that each returned argument has the same shape. The dimensions and number of the output arrays are equal to the number of indexing dimensions. If the step length is not a complex number, then the stop is not inclusive.
However, if the step length is a complex number (e.g. 5j), then the integer part of its magnitude is interpreted as specifying the number of points to create between the start and stop values, where the stop value is inclusive.
Returns:
    
mesh-gridndarray
    
A single array, containing a set of `ndarray`s all of the same dimensions. stacked along the first axis.
See also
`ogrid`
    
like `mgrid` but returns open (not fleshed out) mesh grids
`meshgrid`
    
return coordinate matrices from coordinate vectors
`r_`
    
array concatenator
How to create arrays with regularly-spaced values
#### Examples
    
    >>> import numpy as np
    >>> np.mgrid[0:5, 0:5]
    array([[[0, 0, 0, 0, 0],
            [1, 1, 1, 1, 1],
            [2, 2, 2, 2, 2],
            [3, 3, 3, 3, 3],
            [4, 4, 4, 4, 4]],
           [[0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4]]])
    >>> np.mgrid[-1:1:5j]
    array([-1. , -0.5,  0. ,  0.5,  1. ])
    
    
    >>> np.mgrid[0:4].shape
    (4,)
    >>> np.mgrid[0:4, 0:5].shape
    (2, 4, 5)
    >>> np.mgrid[0:4, 0:5, 0:6].shape
    (3, 4, 5, 6)
    
# numpy.min
numpy.min(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the minimum of an array or minimum along an axis.
Parameters:
    
aarray_like
    
Input data.
axisNone or int or tuple of ints, optional
    
Axis or axes along which to operate. By default, flattened input is used.
If this is a tuple of ints, the minimum is selected over multiple axes, instead of a single axis or all the axes as before.
outndarray, optional
    
Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output. See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `min` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
The maximum value of an output element. Must be present to allow computation on empty slice. See `reduce` for details.
wherearray_like of bool, optional
    
Elements to compare for the minimum. See `reduce` for details.
Returns:
    
minndarray or scalar
    
Minimum of `a`. If `axis` is None, the result is a scalar value. If `axis` is an int, the result is an array of dimension `a.ndim - 1`. If `axis` is a tuple, the result is an array of dimension `a.ndim - len(axis)`.
See also
`amax`
    
The maximum value of an array along a given axis, propagating any NaNs.
`nanmin`
    
The minimum value of an array along a given axis, ignoring any NaNs.
`minimum`
    
Element-wise minimum of two arrays, propagating any NaNs.
`fmin`
    
Element-wise minimum of two arrays, ignoring any NaNs.
`argmin`
    
Return the indices of the minimum values.
`nanmax`, `maximum`, `fmax`
#### Notes
NaN values are propagated, that is if at least one item is NaN, the corresponding min value will be NaN as well. To ignore NaN values (MATLAB behavior), please use nanmin.
Don’t use `min` for element-wise comparison of 2 arrays; when `a.shape[0]` is 2, `minimum(a[0], a[1])` is faster than `min(a, axis=0)`.
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(4).reshape((2,2))
    >>> a
    array([[0, 1],
           [2, 3]])
    >>> np.min(a)           # Minimum of the flattened array
    0
    >>> np.min(a, axis=0)   # Minima along the first axis
    array([0, 1])
    >>> np.min(a, axis=1)   # Minima along the second axis
    array([0, 2])
    >>> np.min(a, where=[False, True], initial=10, axis=0)
    array([10,  1])
    
    
    >>> b = np.arange(5, dtype=float)
    >>> b[2] = np.nan
    >>> np.min(b)
    np.float64(nan)
    >>> np.min(b, where=~np.isnan(b), initial=10)
    0.0
    >>> np.nanmin(b)
    0.0
    
    
    >>> np.min([[-50], [10]], axis=-1, initial=0)
    array([-50,   0])
    
Notice that the initial value is used as one of the elements for which the minimum is determined, unlike for the default argument Python’s max function, which is only used for empty iterables.
Notice that this isn’t the same as Python’s `default` argument.
    
    >>> np.min([6], initial=5)
    5
    >>> min([6], default=5)
    6
    
# numpy.min_scalar_type
numpy.min_scalar_type(a, /)
    
For scalar `a`, returns the data type with the smallest size and smallest scalar kind which can hold its value. For non-scalar array `a`, returns the vector’s dtype unmodified.
Floating point values are not demoted to integers, and complex values are not demoted to floats.
Parameters:
    
ascalar or array_like
    
The value whose minimal data type is to be found.
Returns:
    
outdtype
    
The minimal data type.
See also
`result_type`, `promote_types`, `dtype`, `can_cast`
#### Examples
    
    >>> import numpy as np
    >>> np.min_scalar_type(10)
    dtype('uint8')
    
    
    >>> np.min_scalar_type(-260)
    dtype('int16')
    
    
    >>> np.min_scalar_type(3.1)
    dtype('float16')
    
    
    >>> np.min_scalar_type(1e50)
    dtype('float64')
    
    
    >>> np.min_scalar_type(np.arange(4,dtype='f8'))
    dtype('float64')
    
# numpy.minimum
numpy.minimum(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'minimum'>
    
Element-wise minimum of array elements.
Compare two arrays and return a new array containing the element-wise minima. If one of the elements being compared is a NaN, then that element is returned. If both elements are NaNs then the first is returned. The latter distinction is important for complex NaNs, which are defined as at least one of the real or imaginary parts being a NaN. The net effect is that NaNs are propagated.
Parameters:
    
x1, x2array_like
    
The arrays holding the elements to be compared. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The minimum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
See also
`maximum`
    
Element-wise maximum of two arrays, propagates NaNs.
`fmin`
    
Element-wise minimum of two arrays, ignores NaNs.
`amin`
    
The minimum value of an array along a given axis, propagates NaNs.
`nanmin`
    
The minimum value of an array along a given axis, ignores NaNs.
`fmax`, `amax`, `nanmax`
#### Notes
The minimum is equivalent to `np.where(x1 <= x2, x1, x2)` when neither x1 nor x2 are NaNs, but it is faster and does proper broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.minimum([2, 3, 4], [1, 5, 2])
    array([1, 3, 2])
    
    
    >>> np.minimum(np.eye(2), [0.5, 2]) # broadcasting
    array([[ 0.5,  0. ],
           [ 0. ,  1. ]])
    
    
    >>> np.minimum([np.nan, 0, np.nan],[0, np.nan, np.nan])
    array([nan, nan, nan])
    >>> np.minimum(-np.inf, 1)
    -inf
    
# numpy.mintypecode
numpy.mintypecode(typechars, typeset='GDFgdf', default='d')[source]
    
Return the character for the minimum-size type to which given types can be safely cast.
The returned type character must represent the smallest size dtype such that an array of the returned type can handle the data from an array of all types in `typechars` (or if `typechars` is an array, then its dtype.char).
Parameters:
    
typecharslist of str or array_like
    
If a list of strings, each string should represent a dtype. If array_like, the character representation of the array dtype is used.
typesetstr or list of str, optional
    
The set of characters that the returned character is chosen from. The default set is ‘GDFgdf’.
defaultstr, optional
    
The default character, this is returned if none of the characters in `typechars` matches a character in `typeset`.
Returns:
    
typecharstr
    
The character representing the minimum-size type that was found.
See also
`dtype`
#### Examples
    
    >>> import numpy as np
    >>> np.mintypecode(['d', 'f', 'S'])
    'd'
    >>> x = np.array([1.1, 2-3.j])
    >>> np.mintypecode(x)
    'D'
    
    
    >>> np.mintypecode('abceh', default='G')
    'G'
    
# numpy.mod
numpy.mod(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'remainder'>
    
Returns the element-wise remainder of division.
Computes the remainder complementary to the `floor_divide` function. It is equivalent to the Python modulus operator `x1 % x2` and has the same sign as the divisor `x2`. The MATLAB function equivalent to `np.remainder` is `mod`.
Warning
This should not be confused with:
  * Python 3.7’s `math.remainder` and C’s `remainder`, which computes the IEEE remainder, which are the complement to `round(x1 / x2)`.
  * The MATLAB `rem` function and or the C `%` operator which is the complement to `int(x1 / x2)`.


Parameters:
    
x1array_like
    
Dividend array.
x2array_like
    
Divisor array. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The element-wise remainder of the quotient `floor_divide(x1, x2)`. This is a scalar if both `x1` and `x2` are scalars.
See also
`floor_divide`
    
Equivalent of Python `//` operator.
`divmod`
    
Simultaneous floor division and remainder.
`fmod`
    
Equivalent of the MATLAB `rem` function.
`divide`, `floor`
#### Notes
Returns 0 when `x2` is 0 and both `x1` and `x2` are (arrays of) integers. `mod` is an alias of `remainder`.
#### Examples
    
    >>> import numpy as np
    >>> np.remainder([4, 7], [2, 3])
    array([0, 1])
    >>> np.remainder(np.arange(7), 5)
    array([0, 1, 2, 3, 4, 0, 1])
    
The `%` operator can be used as a shorthand for `np.remainder` on ndarrays.
    
    >>> x1 = np.arange(7)
    >>> x1 % 5
    array([0, 1, 2, 3, 4, 0, 1])
    
# numpy.modf
numpy.modf(x, [out1, out2, ]/, [out=(None, None), ]*, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'modf'>
    
Return the fractional and integral parts of an array, element-wise.
The fractional and integral parts are negative if the given number is negative.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
y1ndarray
    
Fractional part of `x`. This is a scalar if `x` is a scalar.
y2ndarray
    
Integral part of `x`. This is a scalar if `x` is a scalar.
See also
`divmod`
    
`divmod(x, 1)` is equivalent to `modf` with the return values switched, except it always has a positive remainder.
#### Notes
For integer input the return values are floats.
#### Examples
    
    >>> import numpy as np
    >>> np.modf([0, 3.5])
    (array([ 0. ,  0.5]), array([ 0.,  3.]))
    >>> np.modf(-0.5)
    (-0.5, -0)
    
# numpy.moveaxis
numpy.moveaxis(a, source, destination)[source]
    
Move axes of an array to new positions.
Other axes remain in their original order.
Parameters:
    
anp.ndarray
    
The array whose axes should be reordered.
sourceint or sequence of int
    
Original positions of the axes to move. These must be unique.
destinationint or sequence of int
    
Destination positions for each of the original axes. These must also be unique.
Returns:
    
resultnp.ndarray
    
Array with moved axes. This array is a view of the input array.
See also
`transpose`
    
Permute the dimensions of an array.
`swapaxes`
    
Interchange two axes of an array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3, 4, 5))
    >>> np.moveaxis(x, 0, -1).shape
    (4, 5, 3)
    >>> np.moveaxis(x, -1, 0).shape
    (5, 3, 4)
    
These all achieve the same result:
    
    >>> np.transpose(x).shape
    (5, 4, 3)
    >>> np.swapaxes(x, 0, -1).shape
    (5, 4, 3)
    >>> np.moveaxis(x, [0, 1], [-1, -2]).shape
    (5, 4, 3)
    >>> np.moveaxis(x, [0, 1, 2], [-1, -2, -3]).shape
    (5, 4, 3)
    
# numpy.multiply
numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'multiply'>
    
Multiply arguments element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays to be multiplied. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The product of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
#### Notes
Equivalent to `x1` * `x2` in terms of array broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.multiply(2.0, 4.0)
    8.0
    
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.multiply(x1, x2)
    array([[  0.,   1.,   4.],
           [  0.,   4.,  10.],
           [  0.,   7.,  16.]])
    
The `*` operator can be used as a shorthand for `np.multiply` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> x1 * x2
    array([[  0.,   1.,   4.],
           [  0.,   4.,  10.],
           [  0.,   7.,  16.]])
    
# numpy.nan_to_num
numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)[source]
    
Replace NaN with zero and infinity with large finite numbers (default behaviour) or with the numbers defined by the user using the `nan`, `posinf` and/or `neginf` keywords.
If `x` is inexact, NaN is replaced by zero or by the user defined value in `nan` keyword, infinity is replaced by the largest finite floating point values representable by `x.dtype` or by the user defined value in `posinf` keyword and -infinity is replaced by the most negative finite floating point values representable by `x.dtype` or by the user defined value in `neginf` keyword.
For complex dtypes, the above is applied to each of the real and imaginary components of `x` separately.
If `x` is not inexact, then no replacements are made.
Parameters:
    
xscalar or array_like
    
Input data.
copybool, optional
    
Whether to create a copy of `x` (True) or to replace values in-place (False). The in-place operation only occurs if casting to an array does not require a copy. Default is True.
nanint, float, optional
    
Value to be used to fill NaN values. If no value is passed then NaN values will be replaced with 0.0.
posinfint, float, optional
    
Value to be used to fill positive infinity values. If no value is passed then positive infinity values will be replaced with a very large number.
neginfint, float, optional
    
Value to be used to fill negative infinity values. If no value is passed then negative infinity values will be replaced with a very small (or negative) number.
Returns:
    
outndarray
    
`x`, with the non-finite values replaced. If `copy` is False, this may be `x` itself.
See also
`isinf`
    
Shows which elements are positive or negative infinity.
`isneginf`
    
Shows which elements are negative infinity.
`isposinf`
    
Shows which elements are positive infinity.
`isnan`
    
Shows which elements are Not a Number (NaN).
`isfinite`
    
Shows which elements are finite (not NaN, not infinity)
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity.
#### Examples
    
    >>> import numpy as np
    >>> np.nan_to_num(np.inf)
    1.7976931348623157e+308
    >>> np.nan_to_num(-np.inf)
    -1.7976931348623157e+308
    >>> np.nan_to_num(np.nan)
    0.0
    >>> x = np.array([np.inf, -np.inf, np.nan, -128, 128])
    >>> np.nan_to_num(x)
    array([ 1.79769313e+308, -1.79769313e+308,  0.00000000e+000, # may vary
           -1.28000000e+002,  1.28000000e+002])
    >>> np.nan_to_num(x, nan=-9999, posinf=33333333, neginf=33333333)
    array([ 3.3333333e+07,  3.3333333e+07, -9.9990000e+03,
           -1.2800000e+02,  1.2800000e+02])
    >>> y = np.array([complex(np.inf, np.nan), np.nan, complex(np.nan, np.inf)])
    array([  1.79769313e+308,  -1.79769313e+308,   0.00000000e+000, # may vary
         -1.28000000e+002,   1.28000000e+002])
    >>> np.nan_to_num(y)
    array([  1.79769313e+308 +0.00000000e+000j, # may vary
             0.00000000e+000 +0.00000000e+000j,
             0.00000000e+000 +1.79769313e+308j])
    >>> np.nan_to_num(y, nan=111111, posinf=222222)
    array([222222.+111111.j, 111111.     +0.j, 111111.+222222.j])
    
# numpy.nanargmax
numpy.nanargmax(a, axis=None, out=None, *, keepdims=<no value>)[source]
    
Return the indices of the maximum values in the specified axis ignoring NaNs. For all-NaN slices `ValueError` is raised. Warning: the results cannot be trusted if a slice contains only NaNs and -Infs.
Parameters:
    
aarray_like
    
Input data.
axisint, optional
    
Axis along which to operate. By default flattened input is used.
outarray, optional
    
If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype.
New in version 1.22.0.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
New in version 1.22.0.
Returns:
    
index_arrayndarray
    
An array of indices or a single index value.
See also
`argmax`, `nanargmin`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[np.nan, 4], [2, 3]])
    >>> np.argmax(a)
    0
    >>> np.nanargmax(a)
    1
    >>> np.nanargmax(a, axis=0)
    array([1, 0])
    >>> np.nanargmax(a, axis=1)
    array([1, 1])
    
# numpy.nanargmin
numpy.nanargmin(a, axis=None, out=None, *, keepdims=<no value>)[source]
    
Return the indices of the minimum values in the specified axis ignoring NaNs. For all-NaN slices `ValueError` is raised. Warning: the results cannot be trusted if a slice contains only NaNs and Infs.
Parameters:
    
aarray_like
    
Input data.
axisint, optional
    
Axis along which to operate. By default flattened input is used.
outarray, optional
    
If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype.
New in version 1.22.0.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the array.
New in version 1.22.0.
Returns:
    
index_arrayndarray
    
An array of indices or a single index value.
See also
`argmin`, `nanargmax`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[np.nan, 4], [2, 3]])
    >>> np.argmin(a)
    0
    >>> np.nanargmin(a)
    2
    >>> np.nanargmin(a, axis=0)
    array([1, 1])
    >>> np.nanargmin(a, axis=1)
    array([1, 0])
    
# numpy.nancumprod
numpy.nancumprod(a, axis=None, dtype=None, out=None)[source]
    
Return the cumulative product of array elements over a given axis treating Not a Numbers (NaNs) as one. The cumulative product does not change when NaNs are encountered and leading NaNs are replaced by ones.
Ones are returned for slices that are all-NaN or empty.
Parameters:
    
aarray_like
    
Input array.
axisint, optional
    
Axis along which the cumulative product is computed. By default the input is flattened.
dtypedtype, optional
    
Type of the returned array, as well as of the accumulator in which the elements are multiplied. If dtype is not specified, it defaults to the dtype of `a`, unless `a` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used instead.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type of the resulting values will be cast if necessary.
Returns:
    
nancumprodndarray
    
A new array holding the result is returned unless `out` is specified, in which case it is returned.
See also
`numpy.cumprod`
    
Cumulative product across array propagating NaNs.
`isnan`
    
Show which elements are NaN.
#### Examples
    
    >>> import numpy as np
    >>> np.nancumprod(1)
    array([1])
    >>> np.nancumprod([1])
    array([1])
    >>> np.nancumprod([1, np.nan])
    array([1.,  1.])
    >>> a = np.array([[1, 2], [3, np.nan]])
    >>> np.nancumprod(a)
    array([1.,  2.,  6.,  6.])
    >>> np.nancumprod(a, axis=0)
    array([[1.,  2.],
           [3.,  2.]])
    >>> np.nancumprod(a, axis=1)
    array([[1.,  2.],
           [3.,  3.]])
    
# numpy.nancumsum
numpy.nancumsum(a, axis=None, dtype=None, out=None)[source]
    
Return the cumulative sum of array elements over a given axis treating Not a Numbers (NaNs) as zero. The cumulative sum does not change when NaNs are encountered and leading NaNs are replaced by zeros.
Zeros are returned for slices that are all-NaN or empty.
Parameters:
    
aarray_like
    
Input array.
axisint, optional
    
Axis along which the cumulative sum is computed. The default (None) is to compute the cumsum over the flattened array.
dtypedtype, optional
    
Type of the returned array and of the accumulator in which the elements are summed. If `dtype` is not specified, it defaults to the dtype of `a`, unless `a` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary. See Output type determination for more details.
Returns:
    
nancumsumndarray.
    
A new array holding the result is returned unless `out` is specified, in which it is returned. The result has the same size as `a`, and the same shape as `a` if `axis` is not None or `a` is a 1-d array.
See also
`numpy.cumsum`
    
Cumulative sum across array propagating NaNs.
`isnan`
    
Show which elements are NaN.
#### Examples
    
    >>> import numpy as np
    >>> np.nancumsum(1)
    array([1])
    >>> np.nancumsum([1])
    array([1])
    >>> np.nancumsum([1, np.nan])
    array([1.,  1.])
    >>> a = np.array([[1, 2], [3, np.nan]])
    >>> np.nancumsum(a)
    array([1.,  3.,  6.,  6.])
    >>> np.nancumsum(a, axis=0)
    array([[1.,  2.],
           [4.,  2.]])
    >>> np.nancumsum(a, axis=1)
    array([[1.,  3.],
           [3.,  3.]])
    
# numpy.nanmax
numpy.nanmax(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the maximum of an array or maximum along an axis, ignoring any NaNs. When all-NaN slices are encountered a `RuntimeWarning` is raised and NaN is returned for that slice.
Parameters:
    
aarray_like
    
Array containing numbers whose maximum is desired. If `a` is not an array, a conversion is attempted.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the maximum is computed. The default is to compute the maximum of the flattened array.
outndarray, optional
    
Alternate output array in which to place the result. The default is `None`; if provided, it must have the same shape as the expected output, but the type will be cast if necessary. See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`. If the value is anything but the default, then `keepdims` will be passed through to the `max` method of sub-classes of `ndarray`. If the sub-classes methods does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
The minimum value of an output element. Must be present to allow computation on empty slice. See `reduce` for details.
New in version 1.22.0.
wherearray_like of bool, optional
    
Elements to compare for the maximum. See `reduce` for details.
New in version 1.22.0.
Returns:
    
nanmaxndarray
    
An array with the same shape as `a`, with the specified axis removed. If `a` is a 0-d array, or if axis is None, an ndarray scalar is returned. The same dtype as `a` is returned.
See also
`nanmin`
    
The minimum value of an array along a given axis, ignoring any NaNs.
`amax`
    
The maximum value of an array along a given axis, propagating any NaNs.
`fmax`
    
Element-wise maximum of two arrays, ignoring any NaNs.
`maximum`
    
Element-wise maximum of two arrays, propagating any NaNs.
`isnan`
    
Shows which elements are Not a Number (NaN).
`isfinite`
    
Shows which elements are neither NaN nor infinity.
`amin`, `fmin`, `minimum`
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Positive infinity is treated as a very large number and negative infinity is treated as a very small (i.e. negative) number.
If the input has a integer type the function is equivalent to np.max.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, np.nan]])
    >>> np.nanmax(a)
    3.0
    >>> np.nanmax(a, axis=0)
    array([3.,  2.])
    >>> np.nanmax(a, axis=1)
    array([2.,  3.])
    
When positive infinity and negative infinity are present:
    
    >>> np.nanmax([1, 2, np.nan, -np.inf])
    2.0
    >>> np.nanmax([1, 2, np.nan, np.inf])
    inf
    
# numpy.nanmean
numpy.nanmean(a, axis=None, dtype=None, out=None, keepdims=<no value>, *, where=<no value>)[source]
    
Compute the arithmetic mean along the specified axis, ignoring NaNs.
Returns the average of the array elements. The average is taken over the flattened array by default, otherwise over the specified axis. `float64` intermediate and return values are used for integer inputs.
For all-NaN slices, NaN is returned and a `RuntimeWarning` is raised.
Parameters:
    
aarray_like
    
Array containing numbers whose mean is desired. If `a` is not an array, a conversion is attempted.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the means are computed. The default is to compute the mean of the flattened array.
dtypedata-type, optional
    
Type to use in computing the mean. For integer inputs, the default is `float64`; for inexact inputs, it is the same as the input dtype.
outndarray, optional
    
Alternate output array in which to place the result. The default is `None`; if provided, it must have the same shape as the expected output, but the type will be cast if necessary. See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`.
If the value is anything but the default, then `keepdims` will be passed through to the `mean` or `sum` methods of sub-classes of `ndarray`. If the sub-classes methods does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in the mean. See `reduce` for details.
New in version 1.22.0.
Returns:
    
mndarray, see dtype parameter above
    
If `out=None`, returns a new array containing the mean values, otherwise a reference to the output array is returned. Nan is returned for slices that contain only NaNs.
See also
`average`
    
Weighted average
`mean`
    
Arithmetic mean taken while not ignoring NaNs
`var`, `nanvar`
#### Notes
The arithmetic mean is the sum of the non-NaN elements along the axis divided by the number of non-NaN elements.
Note that for floating-point input, the mean is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32`. Specifying a higher-precision accumulator using the `dtype` keyword can alleviate this issue.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, np.nan], [3, 4]])
    >>> np.nanmean(a)
    2.6666666666666665
    >>> np.nanmean(a, axis=0)
    array([2.,  4.])
    >>> np.nanmean(a, axis=1)
    array([1.,  3.5]) # may vary
    
# numpy.nanmedian
numpy.nanmedian(a, axis=None, out=None, overwrite_input=False, keepdims=<no value>)[source]
    
Compute the median along the specified axis, while ignoring NaNs.
Returns the median of the array elements.
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array.
axis{int, sequence of int, None}, optional
    
Axis or axes along which the medians are computed. The default is to compute the median along a flattened version of the array. A sequence of axes is supported since version 1.9.0.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow use of memory of input array `a` for calculations. The input array will be modified by the call to `median`. This will save memory when you do not need to preserve the contents of the input array. Treat the input as undefined, but it will probably be fully or partially sorted. Default is False. If `overwrite_input` is `True` and `a` is not already an `ndarray`, an error will be raised.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`.
If this is anything but the default value it will be passed through (in the special case of an empty array) to the `mean` function of the underlying array. If the array is a sub-class and `mean` does not have the kwarg `keepdims` this will raise a RuntimeError.
Returns:
    
medianndarray
    
A new array holding the result. If the input contains integers or floats smaller than `float64`, then the output data-type is `np.float64`. Otherwise, the data-type of the output is the same as that of the input. If `out` is specified, that array is returned instead.
See also
`mean`, `median`, `percentile`
#### Notes
Given a vector `V` of length `N`, the median of `V` is the middle value of a sorted copy of `V`, `V_sorted` \- i.e., `V_sorted[(N-1)/2]`, when `N` is odd and the average of the two middle values of `V_sorted` when `N` is even.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[10.0, 7, 4], [3, 2, 1]])
    >>> a[0, 1] = np.nan
    >>> a
    array([[10., nan,  4.],
           [ 3.,  2.,  1.]])
    >>> np.median(a)
    np.float64(nan)
    >>> np.nanmedian(a)
    3.0
    >>> np.nanmedian(a, axis=0)
    array([6.5, 2. , 2.5])
    >>> np.median(a, axis=1)
    array([nan,  2.])
    >>> b = a.copy()
    >>> np.nanmedian(b, axis=1, overwrite_input=True)
    array([7.,  2.])
    >>> assert not np.all(a==b)
    >>> b = a.copy()
    >>> np.nanmedian(b, axis=None, overwrite_input=True)
    3.0
    >>> assert not np.all(a==b)
    
# numpy.nanmin
numpy.nanmin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return minimum of an array or minimum along an axis, ignoring any NaNs. When all-NaN slices are encountered a `RuntimeWarning` is raised and Nan is returned for that slice.
Parameters:
    
aarray_like
    
Array containing numbers whose minimum is desired. If `a` is not an array, a conversion is attempted.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the minimum is computed. The default is to compute the minimum of the flattened array.
outndarray, optional
    
Alternate output array in which to place the result. The default is `None`; if provided, it must have the same shape as the expected output, but the type will be cast if necessary. See Output type determination for more details.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`.
If the value is anything but the default, then `keepdims` will be passed through to the `min` method of sub-classes of `ndarray`. If the sub-classes methods does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
The maximum value of an output element. Must be present to allow computation on empty slice. See `reduce` for details.
New in version 1.22.0.
wherearray_like of bool, optional
    
Elements to compare for the minimum. See `reduce` for details.
New in version 1.22.0.
Returns:
    
nanminndarray
    
An array with the same shape as `a`, with the specified axis removed. If `a` is a 0-d array, or if axis is None, an ndarray scalar is returned. The same dtype as `a` is returned.
See also
`nanmax`
    
The maximum value of an array along a given axis, ignoring any NaNs.
`amin`
    
The minimum value of an array along a given axis, propagating any NaNs.
`fmin`
    
Element-wise minimum of two arrays, ignoring any NaNs.
`minimum`
    
Element-wise minimum of two arrays, propagating any NaNs.
`isnan`
    
Shows which elements are Not a Number (NaN).
`isfinite`
    
Shows which elements are neither NaN nor infinity.
`amax`, `fmax`, `maximum`
#### Notes
NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Positive infinity is treated as a very large number and negative infinity is treated as a very small (i.e. negative) number.
If the input has a integer type the function is equivalent to np.min.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, np.nan]])
    >>> np.nanmin(a)
    1.0
    >>> np.nanmin(a, axis=0)
    array([1.,  2.])
    >>> np.nanmin(a, axis=1)
    array([1.,  3.])
    
When positive infinity and negative infinity are present:
    
    >>> np.nanmin([1, 2, np.nan, np.inf])
    1.0
    >>> np.nanmin([1, 2, np.nan, -np.inf])
    -inf
    
# numpy.nanpercentile
numpy.nanpercentile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=<no value>, *, weights=None, interpolation=None)[source]
    
Compute the qth percentile of the data along the specified axis, while ignoring nan values.
Returns the qth percentile(s) of the array elements.
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array, containing nan values to be ignored.
qarray_like of float
    
Percentile or sequence of percentiles to compute, which must be between 0 and 100 inclusive.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the percentiles are computed. The default is to compute the percentile(s) along a flattened version of the array.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow the input array `a` to be modified by intermediate calculations, to save memory. In this case, the contents of the input `a` after this function completes is undefined.
methodstr, optional
    
This parameter specifies the method to use for estimating the percentile. There are many different methods, some unique to NumPy. See the notes for explanation. The options sorted by their R type as summarized in the H&F paper [1] are:
  1. ‘inverted_cdf’
  2. ‘averaged_inverted_cdf’
  3. ‘closest_observation’
  4. ‘interpolated_inverted_cdf’
  5. ‘hazen’
  6. ‘weibull’
  7. ‘linear’ (default)
  8. ‘median_unbiased’
  9. ‘normal_unbiased’


The first three methods are discontinuous. NumPy further defines the following discontinuous variations of the default ‘linear’ (7.) option:
  * ‘lower’
  * ‘higher’,
  * ‘midpoint’
  * ‘nearest’


Changed in version 1.22.0: This argument was previously called “interpolation” and only offered the “linear” default and last four options.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original array `a`.
If this is anything but the default value it will be passed through (in the special case of an empty array) to the `mean` function of the underlying array. If the array is a sub-class and `mean` does not have the kwarg `keepdims` this will raise a RuntimeError.
weightsarray_like, optional
    
An array of weights associated with the values in `a`. Each value in `a` contributes to the percentile according to its associated weight. The weights array can either be 1-D (in which case its length must be the size of `a` along the given axis) or of the same shape as `a`. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. Only `method=”inverted_cdf”` supports weights.
New in version 2.0.0.
interpolationstr, optional
    
Deprecated name for the method keyword argument.
Deprecated since version 1.22.0.
Returns:
    
percentilescalar or ndarray
    
If `q` is a single percentile and `axis=None`, then the result is a scalar. If multiple percentiles are given, first axis of the result corresponds to the percentiles. The other axes are the axes that remain after the reduction of `a`. If the input contains integers or floats smaller than `float64`, the output data-type is `float64`. Otherwise, the output data-type is the same as that of the input. If `out` is specified, that array is returned instead.
See also
`nanmean`
`nanmedian`
    
equivalent to `nanpercentile(..., 50)`
`percentile`, `median`, `mean`
`nanquantile`
    
equivalent to nanpercentile, except q in range [0, 1].
#### Notes
The behavior of `numpy.nanpercentile` with percentage `q` is that of `numpy.quantile` with argument `q/100` (ignoring nan values). For more information, please see `numpy.quantile`.
#### References
[1]
R. J. Hyndman and Y. Fan, “Sample quantiles in statistical packages,” The American Statistician, 50(4), pp. 361-365, 1996
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[10., 7., 4.], [3., 2., 1.]])
    >>> a[0][1] = np.nan
    >>> a
    array([[10.,  nan,   4.],
          [ 3.,   2.,   1.]])
    >>> np.percentile(a, 50)
    np.float64(nan)
    >>> np.nanpercentile(a, 50)
    3.0
    >>> np.nanpercentile(a, 50, axis=0)
    array([6.5, 2. , 2.5])
    >>> np.nanpercentile(a, 50, axis=1, keepdims=True)
    array([[7.],
           [2.]])
    >>> m = np.nanpercentile(a, 50, axis=0)
    >>> out = np.zeros_like(m)
    >>> np.nanpercentile(a, 50, axis=0, out=out)
    array([6.5, 2. , 2.5])
    >>> m
    array([6.5,  2. ,  2.5])
    
    
    >>> b = a.copy()
    >>> np.nanpercentile(b, 50, axis=1, overwrite_input=True)
    array([7., 2.])
    >>> assert not np.all(a==b)
    
# numpy.nanprod
numpy.nanprod(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the product of array elements over a given axis treating Not a Numbers (NaNs) as ones.
One is returned for slices that are all-NaN or empty.
Parameters:
    
aarray_like
    
Array containing numbers whose product is desired. If `a` is not an array, a conversion is attempted.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the product is computed. The default is to compute the product of the flattened array.
dtypedata-type, optional
    
The type of the returned array and of the accumulator in which the elements are summed. By default, the dtype of `a` is used. An exception is when `a` has an integer type with less precision than the platform (u)intp. In that case, the default will be either (u)int32 or (u)int64 depending on whether the platform is 32 or 64 bits. For inexact inputs, dtype must be inexact.
outndarray, optional
    
Alternate output array in which to place the result. The default is `None`. If provided, it must have the same shape as the expected output, but the type will be cast if necessary. See Output type determination for more details. The casting of NaN to integer can yield unexpected results.
keepdimsbool, optional
    
If True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `arr`.
initialscalar, optional
    
The starting value for this product. See `reduce` for details.
New in version 1.22.0.
wherearray_like of bool, optional
    
Elements to include in the product. See `reduce` for details.
New in version 1.22.0.
Returns:
    
nanprodndarray
    
A new array holding the result is returned unless `out` is specified, in which case it is returned.
See also
`numpy.prod`
    
Product across array propagating NaNs.
`isnan`
    
Show which elements are NaN.
#### Examples
    
    >>> import numpy as np
    >>> np.nanprod(1)
    1
    >>> np.nanprod([1])
    1
    >>> np.nanprod([1, np.nan])
    1.0
    >>> a = np.array([[1, 2], [3, np.nan]])
    >>> np.nanprod(a)
    6.0
    >>> np.nanprod(a, axis=0)
    array([3., 2.])
    
# numpy.nanquantile
numpy.nanquantile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=<no value>, *, weights=None, interpolation=None)[source]
    
Compute the qth quantile of the data along the specified axis, while ignoring nan values. Returns the qth quantile(s) of the array elements.
Parameters:
    
aarray_like
    
Input array or object that can be converted to an array, containing nan values to be ignored
qarray_like of float
    
Probability or sequence of probabilities for the quantiles to compute. Values must be between 0 and 1 inclusive.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the quantiles are computed. The default is to compute the quantile(s) along a flattened version of the array.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow the input array `a` to be modified by intermediate calculations, to save memory. In this case, the contents of the input `a` after this function completes is undefined.
methodstr, optional
    
This parameter specifies the method to use for estimating the quantile. There are many different methods, some unique to NumPy. See the notes for explanation. The options sorted by their R type as summarized in the H&F paper [1] are:
  1. ‘inverted_cdf’
  2. ‘averaged_inverted_cdf’
  3. ‘closest_observation’
  4. ‘interpolated_inverted_cdf’
  5. ‘hazen’
  6. ‘weibull’
  7. ‘linear’ (default)
  8. ‘median_unbiased’
  9. ‘normal_unbiased’


The first three methods are discontinuous. NumPy further defines the following discontinuous variations of the default ‘linear’ (7.) option:
  * ‘lower’
  * ‘higher’,
  * ‘midpoint’
  * ‘nearest’


Changed in version 1.22.0: This argument was previously called “interpolation” and only offered the “linear” default and last four options.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original array `a`.
If this is anything but the default value it will be passed through (in the special case of an empty array) to the `mean` function of the underlying array. If the array is a sub-class and `mean` does not have the kwarg `keepdims` this will raise a RuntimeError.
weightsarray_like, optional
    
An array of weights associated with the values in `a`. Each value in `a` contributes to the quantile according to its associated weight. The weights array can either be 1-D (in which case its length must be the size of `a` along the given axis) or of the same shape as `a`. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. Only `method=”inverted_cdf”` supports weights.
New in version 2.0.0.
interpolationstr, optional
    
Deprecated name for the method keyword argument.
Deprecated since version 1.22.0.
Returns:
    
quantilescalar or ndarray
    
If `q` is a single probability and `axis=None`, then the result is a scalar. If multiple probability levels are given, first axis of the result corresponds to the quantiles. The other axes are the axes that remain after the reduction of `a`. If the input contains integers or floats smaller than `float64`, the output data-type is `float64`. Otherwise, the output data-type is the same as that of the input. If `out` is specified, that array is returned instead.
See also
`quantile`
`nanmean`, `nanmedian`
`nanmedian`
    
equivalent to `nanquantile(..., 0.5)`
`nanpercentile`
    
same as nanquantile, but with q in the range [0, 100].
#### Notes
The behavior of `numpy.nanquantile` is the same as that of `numpy.quantile` (ignoring nan values). For more information, please see `numpy.quantile`.
#### References
[1]
R. J. Hyndman and Y. Fan, “Sample quantiles in statistical packages,” The American Statistician, 50(4), pp. 361-365, 1996
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[10., 7., 4.], [3., 2., 1.]])
    >>> a[0][1] = np.nan
    >>> a
    array([[10.,  nan,   4.],
          [ 3.,   2.,   1.]])
    >>> np.quantile(a, 0.5)
    np.float64(nan)
    >>> np.nanquantile(a, 0.5)
    3.0
    >>> np.nanquantile(a, 0.5, axis=0)
    array([6.5, 2. , 2.5])
    >>> np.nanquantile(a, 0.5, axis=1, keepdims=True)
    array([[7.],
           [2.]])
    >>> m = np.nanquantile(a, 0.5, axis=0)
    >>> out = np.zeros_like(m)
    >>> np.nanquantile(a, 0.5, axis=0, out=out)
    array([6.5, 2. , 2.5])
    >>> m
    array([6.5,  2. ,  2.5])
    >>> b = a.copy()
    >>> np.nanquantile(b, 0.5, axis=1, overwrite_input=True)
    array([7., 2.])
    >>> assert not np.all(a==b)
    
# numpy.nanstd
numpy.nanstd(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>, mean=<no value>, correction=<no value>)[source]
    
Compute the standard deviation along the specified axis, while ignoring NaNs.
Returns the standard deviation, a measure of the spread of a distribution, of the non-NaN array elements. The standard deviation is computed for the flattened array by default, otherwise over the specified axis.
For all-NaN slices or slices with zero degrees of freedom, NaN is returned and a `RuntimeWarning` is raised.
Parameters:
    
aarray_like
    
Calculate the standard deviation of the non-NaN values.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the standard deviation is computed. The default is to compute the standard deviation of the flattened array.
dtypedtype, optional
    
Type to use in computing the standard deviation. For arrays of integer type the default is float64, for arrays of float types it is the same as the array type.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape as the expected output but the type (of the calculated values) will be cast if necessary.
ddof{int, float}, optional
    
Means Delta Degrees of Freedom. The divisor used in calculations is `N - ddof`, where `N` represents the number of non-NaN elements. By default `ddof` is zero.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`.
If this value is anything but the default it is passed through as-is to the relevant functions of the sub-classes. If these functions do not have a `keepdims` kwarg, a RuntimeError will be raised.
wherearray_like of bool, optional
    
Elements to include in the standard deviation. See `reduce` for details.
New in version 1.22.0.
meanarray_like, optional
    
Provide the mean to prevent its recalculation. The mean should have a shape as if it was calculated with `keepdims=True`. The axis for the calculation of the mean should be the same as used in the call to this std function.
New in version 2.0.0.
correction{int, float}, optional
    
Array API compatible name for the `ddof` parameter. Only one of them can be provided at the same time.
New in version 2.0.0.
Returns:
    
standard_deviationndarray, see dtype parameter above.
    
If `out` is None, return a new array containing the standard deviation, otherwise return a reference to the output array. If ddof is >= the number of non-NaN elements in a slice or the slice contains only NaNs, then the result for that slice is NaN.
See also
`var`, `mean`, `std`
`nanvar`, `nanmean`
Output type determination
#### Notes
The standard deviation is the square root of the average of the squared deviations from the mean: `std = sqrt(mean(abs(x - x.mean())**2))`.
The average squared deviation is normally calculated as `x.sum() / N`, where `N = len(x)`. If, however, `ddof` is specified, the divisor `N - ddof` is used instead. In standard statistical practice, `ddof=1` provides an unbiased estimator of the variance of the infinite population. `ddof=0` provides a maximum likelihood estimate of the variance for normally distributed variables. The standard deviation computed in this function is the square root of the estimated variance, so even with `ddof=1`, it will not be an unbiased estimate of the standard deviation per se.
Note that, for complex numbers, `std` takes the absolute value before squaring, so that the result is always real and nonnegative.
For floating-point input, the std is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for float32 (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, np.nan], [3, 4]])
    >>> np.nanstd(a)
    1.247219128924647
    >>> np.nanstd(a, axis=0)
    array([1., 0.])
    >>> np.nanstd(a, axis=1)
    array([0.,  0.5]) # may vary
    
# numpy.nansum
numpy.nansum(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the sum of array elements over a given axis treating Not a Numbers (NaNs) as zero.
In NumPy versions <= 1.9.0 Nan is returned for slices that are all-NaN or empty. In later versions zero is returned.
Parameters:
    
aarray_like
    
Array containing numbers whose sum is desired. If `a` is not an array, a conversion is attempted.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the sum is computed. The default is to compute the sum of the flattened array.
dtypedata-type, optional
    
The type of the returned array and of the accumulator in which the elements are summed. By default, the dtype of `a` is used. An exception is when `a` has an integer type with less precision than the platform (u)intp. In that case, the default will be either (u)int32 or (u)int64 depending on whether the platform is 32 or 64 bits. For inexact inputs, dtype must be inexact.
outndarray, optional
    
Alternate output array in which to place the result. The default is `None`. If provided, it must have the same shape as the expected output, but the type will be cast if necessary. See Output type determination for more details. The casting of NaN to integer can yield unexpected results.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`.
If the value is anything but the default, then `keepdims` will be passed through to the `mean` or `sum` methods of sub-classes of `ndarray`. If the sub-classes methods does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
Starting value for the sum. See `reduce` for details.
New in version 1.22.0.
wherearray_like of bool, optional
    
Elements to include in the sum. See `reduce` for details.
New in version 1.22.0.
Returns:
    
nansumndarray.
    
A new array holding the result is returned unless `out` is specified, in which it is returned. The result has the same size as `a`, and the same shape as `a` if `axis` is not None or `a` is a 1-d array.
See also
`numpy.sum`
    
Sum across array propagating NaNs.
`isnan`
    
Show which elements are NaN.
`isfinite`
    
Show which elements are not NaN or +/-inf.
#### Notes
If both positive and negative infinity are present, the sum will be Not A Number (NaN).
#### Examples
    
    >>> import numpy as np
    >>> np.nansum(1)
    1
    >>> np.nansum([1])
    1
    >>> np.nansum([1, np.nan])
    1.0
    >>> a = np.array([[1, 1], [1, np.nan]])
    >>> np.nansum(a)
    3.0
    >>> np.nansum(a, axis=0)
    array([2.,  1.])
    >>> np.nansum([1, np.nan, np.inf])
    inf
    >>> np.nansum([1, np.nan, -np.inf])
    -inf
    >>> from numpy.testing import suppress_warnings
    >>> with np.errstate(invalid="ignore"):
    ...     np.nansum([1, np.nan, np.inf, -np.inf]) # both +/- infinity present
    np.float64(nan)
    
# numpy.nanvar
numpy.nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>, mean=<no value>, correction=<no value>)[source]
    
Compute the variance along the specified axis, while ignoring NaNs.
Returns the variance of the array elements, a measure of the spread of a distribution. The variance is computed for the flattened array by default, otherwise over the specified axis.
For all-NaN slices or slices with zero degrees of freedom, NaN is returned and a `RuntimeWarning` is raised.
Parameters:
    
aarray_like
    
Array containing numbers whose variance is desired. If `a` is not an array, a conversion is attempted.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the variance is computed. The default is to compute the variance of the flattened array.
dtypedata-type, optional
    
Type to use in computing the variance. For arrays of integer type the default is `float64`; for arrays of float types it is the same as the array type.
outndarray, optional
    
Alternate output array in which to place the result. It must have the same shape as the expected output, but the type is cast if necessary.
ddof{int, float}, optional
    
“Delta Degrees of Freedom”: the divisor used in the calculation is `N - ddof`, where `N` represents the number of non-NaN elements. By default `ddof` is zero.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `a`.
wherearray_like of bool, optional
    
Elements to include in the variance. See `reduce` for details.
New in version 1.22.0.
meanarray_like, optional
    
Provide the mean to prevent its recalculation. The mean should have a shape as if it was calculated with `keepdims=True`. The axis for the calculation of the mean should be the same as used in the call to this var function.
New in version 2.0.0.
correction{int, float}, optional
    
Array API compatible name for the `ddof` parameter. Only one of them can be provided at the same time.
New in version 2.0.0.
Returns:
    
variancendarray, see dtype parameter above
    
If `out` is None, return a new array containing the variance, otherwise return a reference to the output array. If ddof is >= the number of non-NaN elements in a slice or the slice contains only NaNs, then the result for that slice is NaN.
See also
`std`
    
Standard deviation
`mean`
    
Average
`var`
    
Variance while not ignoring NaNs
`nanstd`, `nanmean`
Output type determination
#### Notes
The variance is the average of the squared deviations from the mean, i.e., `var = mean(abs(x - x.mean())**2)`.
The mean is normally calculated as `x.sum() / N`, where `N = len(x)`. If, however, `ddof` is specified, the divisor `N - ddof` is used instead. In standard statistical practice, `ddof=1` provides an unbiased estimator of the variance of a hypothetical infinite population. `ddof=0` provides a maximum likelihood estimate of the variance for normally distributed variables.
Note that for complex numbers, the absolute value is taken before squaring, so that the result is always real and nonnegative.
For floating-point input, the variance is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue.
For this function to work on sub-classes of ndarray, they must define `sum` with the kwarg `keepdims`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, np.nan], [3, 4]])
    >>> np.nanvar(a)
    1.5555555555555554
    >>> np.nanvar(a, axis=0)
    array([1.,  0.])
    >>> np.nanvar(a, axis=1)
    array([0.,  0.25])  # may vary
    
# numpy.ndarray.__abs__
method
ndarray.__abs__(self)
# numpy.ndarray.__add__
method
ndarray.__add__(value, /)
    
Return self+value.
# numpy.ndarray.__and__
method
ndarray.__and__(value, /)
    
Return self&value.
# numpy.ndarray.__array__
method
ndarray.__array__([dtype, ]*, copy=None)
    
For `dtype` parameter it returns a new reference to self if `dtype` is not given or it matches array’s data type. A new array of provided data type is returned if `dtype` is different from the current data type of the array. For `copy` parameter it returns a new reference to self if `copy=False` or `copy=None` and copying isn’t enforced by `dtype` parameter. The method returns a new array for `copy=True`, regardless of `dtype` parameter.
A more detailed explanation of the `__array__` interface can be found in The __array__() method.
# numpy.ndarray.__array_wrap__
method
ndarray.__array_wrap__(array, [context, ]/)
    
Returns a view of `array` with the same type as self.
# numpy.ndarray.__bool__
method
ndarray.__bool__(/)
    
True if self else False
# numpy.ndarray.__class_getitem__
method
ndarray.__class_getitem__(item, /)
    
Return a parametrized wrapper around the `ndarray` type.
New in version 1.22.
Returns:
    
aliastypes.GenericAlias
    
A parametrized `ndarray` type.
See also
PEP 585
    
Type hinting generics in standard collections.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Examples
    
    >>> from typing import Any
    >>> import numpy as np
    
    
    >>> np.ndarray[Any, np.dtype[Any]]
    numpy.ndarray[typing.Any, numpy.dtype[typing.Any]]
    
# numpy.ndarray.__complex__
method
ndarray.__complex__()
# numpy.ndarray.__contains__
method
ndarray.__contains__(key, /)
    
Return key in self.
# numpy.ndarray.__copy__
method
ndarray.__copy__()
    
Used if `copy.copy` is called on an array. Returns a copy of the array.
Equivalent to `a.copy(order='K')`.
# numpy.ndarray.__deepcopy__
method
ndarray.__deepcopy__(memo, /)
    
Used if `copy.deepcopy` is called on an array.
# numpy.ndarray.__divmod__
method
ndarray.__divmod__(value, /)
    
Return divmod(self, value).
# numpy.ndarray.__eq__
method
ndarray.__eq__(value, /)
    
Return self==value.
# numpy.ndarray.__float__
method
ndarray.__float__(self)
# numpy.ndarray.__floordiv__
method
ndarray.__floordiv__(value, /)
    
Return self//value.
# numpy.ndarray.__ge__
method
ndarray.__ge__(value, /)
    
Return self>=value.
# numpy.ndarray.__getitem__
method
ndarray.__getitem__(key, /)
    
Return self[key].
# numpy.ndarray.__gt__
method
ndarray.__gt__(value, /)
    
Return self>value.
# numpy.ndarray.__iadd__
method
ndarray.__iadd__(value, /)
    
Return self+=value.
# numpy.ndarray.__iand__
method
ndarray.__iand__(value, /)
    
Return self&=value.
# numpy.ndarray.__ifloordiv__
method
ndarray.__ifloordiv__(value, /)
    
Return self//=value.
# numpy.ndarray.__ilshift__
method
ndarray.__ilshift__(value, /)
    
Return self<<=value.
# numpy.ndarray.__imod__
method
ndarray.__imod__(value, /)
    
Return self%=value.
# numpy.ndarray.__imul__
method
ndarray.__imul__(value, /)
    
Return self*=value.
# numpy.ndarray.__int__
method
ndarray.__int__(self)
# numpy.ndarray.__invert__
method
ndarray.__invert__(/)
    
~self
# numpy.ndarray.__ior__
method
ndarray.__ior__(value, /)
    
Return self|=value.
# numpy.ndarray.__ipow__
method
ndarray.__ipow__(value, /)
    
Return self**=value.
# numpy.ndarray.__irshift__
method
ndarray.__irshift__(value, /)
    
Return self>>=value.
# numpy.ndarray.__isub__
method
ndarray.__isub__(value, /)
    
Return self-=value.
# numpy.ndarray.__itruediv__
method
ndarray.__itruediv__(value, /)
    
Return self/=value.
# numpy.ndarray.__ixor__
method
ndarray.__ixor__(value, /)
    
Return self^=value.
# numpy.ndarray.__le__
method
ndarray.__le__(value, /)
    
Return self<=value.
# numpy.ndarray.__len__
method
ndarray.__len__(/)
    
Return len(self).
# numpy.ndarray.__lshift__
method
ndarray.__lshift__(value, /)
    
Return self<<value.
# numpy.ndarray.__lt__
method
ndarray.__lt__(value, /)
    
Return self<value.
# numpy.ndarray.__matmul__
method
ndarray.__matmul__(value, /)
    
Return self@value.
# numpy.ndarray.__mod__
method
ndarray.__mod__(value, /)
    
Return self%value.
# numpy.ndarray.__mul__
method
ndarray.__mul__(value, /)
    
Return self*value.
# numpy.ndarray.__ne__
method
ndarray.__ne__(value, /)
    
Return self!=value.
# numpy.ndarray.__neg__
method
ndarray.__neg__(/)
    
-self
# numpy.ndarray.__new__
method
ndarray.__new__(*args, **kwargs)
# numpy.ndarray.__or__
method
ndarray.__or__(value, /)
    
Return self|value.
# numpy.ndarray.__pos__
method
ndarray.__pos__(/)
    
+self
# numpy.ndarray.__pow__
method
ndarray.__pow__(value, mod=None, /)
    
Return pow(self, value, mod).
# numpy.ndarray.__reduce__
method
ndarray.__reduce__()
    
For pickling.
# numpy.ndarray.__repr__
method
ndarray.__repr__(/)
    
Return repr(self).
# numpy.ndarray.__rshift__
method
ndarray.__rshift__(value, /)
    
Return self>>value.
# numpy.ndarray.__setitem__
method
ndarray.__setitem__(key, value, /)
    
Set self[key] to value.
# numpy.ndarray.__setstate__
method
ndarray.__setstate__(state, /)
    
For unpickling.
The `state` argument must be a sequence that contains the following elements:
Parameters:
    
versionint
    
optional pickle version. If omitted defaults to 0.
shapetuple
dtypedata-type
isFortranbool
rawdatastring or list
    
a binary string with the data (or a list if ‘a’ is an object array)
# numpy.ndarray.__str__
method
ndarray.__str__(/)
    
Return str(self).
# numpy.ndarray.__sub__
method
ndarray.__sub__(value, /)
    
Return self-value.
# numpy.ndarray.__truediv__
method
ndarray.__truediv__(value, /)
    
Return self/value.
# numpy.ndarray.__xor__
method
ndarray.__xor__(value, /)
    
Return self^value.
# numpy.ndarray.all
method
ndarray.all(axis=None, out=None, keepdims=False, *, where=True)
    
Returns True if all elements evaluate to True.
Refer to `numpy.all` for full documentation.
See also
`numpy.all`
    
equivalent function
# numpy.ndarray.any
method
ndarray.any(axis=None, out=None, keepdims=False, *, where=True)
    
Returns True if any of the elements of `a` evaluate to True.
Refer to `numpy.any` for full documentation.
See also
`numpy.any`
    
equivalent function
# numpy.ndarray.argmax
method
ndarray.argmax(axis=None, out=None, *, keepdims=False)
    
Return indices of the maximum values along the given axis.
Refer to `numpy.argmax` for full documentation.
See also
`numpy.argmax`
    
equivalent function
# numpy.ndarray.argmin
method
ndarray.argmin(axis=None, out=None, *, keepdims=False)
    
Return indices of the minimum values along the given axis.
Refer to `numpy.argmin` for detailed documentation.
See also
`numpy.argmin`
    
equivalent function
# numpy.ndarray.argpartition
method
ndarray.argpartition(kth, axis=-1, kind='introselect', order=None)
    
Returns the indices that would partition this array.
Refer to `numpy.argpartition` for full documentation.
See also
`numpy.argpartition`
    
equivalent function
# numpy.ndarray.argsort
method
ndarray.argsort(axis=-1, kind=None, order=None)
    
Returns the indices that would sort this array.
Refer to `numpy.argsort` for full documentation.
See also
`numpy.argsort`
    
equivalent function
# numpy.ndarray.astype
method
ndarray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
    
Copy of the array, cast to a specified type.
Parameters:
    
dtypestr or dtype
    
Typecode or data-type to which the array is cast.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout order of the result. ‘C’ means C order, ‘F’ means Fortran order, ‘A’ means ‘F’ order if all the arrays are Fortran contiguous, ‘C’ order otherwise, and ‘K’ means as close to the order the array elements appear in memory as possible. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘unsafe’ for backwards compatibility.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


subokbool, optional
    
If True, then sub-classes will be passed-through (default), otherwise the returned array will be forced to be a base-class array.
copybool, optional
    
By default, astype always returns a newly allocated array. If this is set to false, and the `dtype`, `order`, and `subok` requirements are satisfied, the input array is returned instead of a copy.
Returns:
    
arr_tndarray
    
Unless `copy` is False and the other conditions for returning the input array are satisfied (see description for `copy` input parameter), `arr_t` is a new array of the same shape as the input array, with dtype, order given by `dtype`, `order`.
Raises:
    
ComplexWarning
    
When casting from complex to float or int. To avoid this, one should use `a.real.astype(t)`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 2.5])
    >>> x
    array([1. ,  2. ,  2.5])
    
    
    >>> x.astype(int)
    array([1, 2, 2])
    
# numpy.ndarray.base
attribute
ndarray.base
    
Base object if memory is from some other object.
#### Examples
The base of an array that owns its memory is None:
    
    >>> import numpy as np
    >>> x = np.array([1,2,3,4])
    >>> x.base is None
    True
    
Slicing creates a view, whose memory is shared with x:
    
    >>> y = x[2:]
    >>> y.base is x
    True
    
# numpy.ndarray.byteswap
method
ndarray.byteswap(inplace=False)
    
Swap the bytes of the array elements
Toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Arrays of byte-strings are not swapped. The real and imaginary parts of a complex number are swapped individually.
Parameters:
    
inplacebool, optional
    
If `True`, swap bytes in-place, default is `False`.
Returns:
    
outndarray
    
The byteswapped array. If `inplace` is `True`, this is a view to self.
#### Examples
    
    >>> import numpy as np
    >>> A = np.array([1, 256, 8755], dtype=np.int16)
    >>> list(map(hex, A))
    ['0x1', '0x100', '0x2233']
    >>> A.byteswap(inplace=True)
    array([  256,     1, 13090], dtype=int16)
    >>> list(map(hex, A))
    ['0x100', '0x1', '0x3322']
    
Arrays of byte-strings are not swapped
    
    >>> A = np.array([b'ceg', b'fac'])
    >>> A.byteswap()
    array([b'ceg', b'fac'], dtype='|S3')
    
`A.view(A.dtype.newbyteorder()).byteswap()` produces an array with the same values but different representation in memory
    
    >>> A = np.array([1, 2, 3],dtype=np.int64)
    >>> A.view(np.uint8)
    array([1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
           0, 0], dtype=uint8)
    >>> A.view(A.dtype.newbyteorder()).byteswap(inplace=True)
    array([1, 2, 3], dtype='>i8')
    >>> A.view(np.uint8)
    array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
           0, 3], dtype=uint8)
    
# numpy.ndarray.choose
method
ndarray.choose(choices, out=None, mode='raise')
    
Use an index array to construct a new array from a set of choices.
Refer to `numpy.choose` for full documentation.
See also
`numpy.choose`
    
equivalent function
# numpy.ndarray.clip
method
ndarray.clip(min=None, max=None, out=None, **kwargs)
    
Return an array whose values are limited to `[min, max]`. One of max or min must be given.
Refer to `numpy.clip` for full documentation.
See also
`numpy.clip`
    
equivalent function
# numpy.ndarray.compress
method
ndarray.compress(condition, axis=None, out=None)
    
Return selected slices of this array along given axis.
Refer to `numpy.compress` for full documentation.
See also
`numpy.compress`
    
equivalent function
# numpy.ndarray.conj
method
ndarray.conj()
    
Complex-conjugate all elements.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.ndarray.conjugate
method
ndarray.conjugate()
    
Return the complex conjugate, element-wise.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.ndarray.copy
method
ndarray.copy(order='C')
    
Return a copy of the array.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `numpy.copy` are very similar but have different default values for their order= arguments, and this function always passes sub-classes through.)
See also
`numpy.copy`
    
Similar function with different default behavior
`numpy.copyto`
#### Notes
This function is the preferred method for creating an array copy. The function `numpy.copy` is similar, but it defaults to using order ‘K’, and will not pass sub-classes through by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3],[4,5,6]], order='F')
    
    
    >>> y = x.copy()
    
    
    >>> x.fill(0)
    
    
    >>> x
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> y.flags['C_CONTIGUOUS']
    True
    
For arrays containing Python objects (e.g. dtype=object), the copy is a shallow one. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):
    
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> b = a.copy()
    >>> b[2][0] = 10
    >>> a
    array([1, 'm', list([10, 3, 4])], dtype=object)
    
To ensure all elements within an `object` array are copied, use `copy.deepcopy`:
    
    >>> import copy
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> c = copy.deepcopy(a)
    >>> c[2][0] = 10
    >>> c
    array([1, 'm', list([10, 3, 4])], dtype=object)
    >>> a
    array([1, 'm', list([2, 3, 4])], dtype=object)
    
# numpy.ndarray.ctypes
attribute
ndarray.ctypes
    
An object to simplify the interaction of the array with the ctypes module.
This attribute creates an object that makes it easier to use arrays when calling shared libraries with the ctypes module. The returned object has, among others, data, shape, and strides attributes (see Notes below) which themselves return ctypes objects that can be used as arguments to a shared library.
Parameters:
    
None
Returns:
    
cPython object
    
Possessing attributes data, shape, strides, etc.
See also
`numpy.ctypeslib`
#### Notes
Below are the public attributes of this object which were documented in “Guide to NumPy” (we have omitted undocumented public attributes, as well as documented private attributes):
_ctypes.data
    
A pointer to the memory area of the array as a Python integer. This memory area may contain data that is not aligned, or not in correct byte-order. The memory area may not even be writeable. The array flags and data-type of this array should be respected when passing this attribute to arbitrary C-code to avoid trouble that can include Python crashing. User Beware! The value of this attribute is exactly the same as: `self._array_interface_['data'][0]`.
Note that unlike `data_as`, a reference won’t be kept to the array: code like `ctypes.c_void_p((a + b).ctypes.data)` will result in a pointer to a deallocated array, and should be spelt `(a + b).ctypes.data_as(ctypes.c_void_p)`
_ctypes.shape
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the C-integer corresponding to `dtype('p')` on this platform (see `c_intp`). This base-type could be `ctypes.c_int`, `ctypes.c_long`, or `ctypes.c_longlong` depending on the platform. The ctypes array contains the shape of the underlying array.
_ctypes.strides
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the same as for the shape attribute. This ctypes array contains the strides information from the underlying array. This strides information is important for showing how many bytes must be jumped to get to the next element in the array.
_ctypes.data_as(obj)[source]
    
Return the data pointer cast to a particular c-types object. For example, calling `self._as_parameter_` is equivalent to `self.data_as(ctypes.c_void_p)`. Perhaps you want to use the data as a pointer to a ctypes array of floating-point data: `self.data_as(ctypes.POINTER(ctypes.c_double))`.
The returned pointer will keep a reference to the array.
_ctypes.shape_as(obj)[source]
    
Return the shape tuple as an array of some other c-types type. For example: `self.shape_as(ctypes.c_short)`.
_ctypes.strides_as(obj)[source]
    
Return the strides tuple as an array of some other c-types type. For example: `self.strides_as(ctypes.c_longlong)`.
If the ctypes module is not available, then the ctypes attribute of array objects still returns something useful, but ctypes objects are not returned and errors may be raised instead. In particular, the object will still have the `as_parameter` attribute which will return an integer equal to the data attribute.
#### Examples
    
    >>> import numpy as np
    >>> import ctypes
    >>> x = np.array([[0, 1], [2, 3]], dtype=np.int32)
    >>> x
    array([[0, 1],
           [2, 3]], dtype=int32)
    >>> x.ctypes.data
    31962608 # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32))
    <__main__.LP_c_uint object at 0x7ff2fc1fc200> # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32)).contents
    c_uint(0)
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint64)).contents
    c_ulong(4294967296)
    >>> x.ctypes.shape
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1fce60> # may vary
    >>> x.ctypes.strides
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1ff320> # may vary
    
# numpy.ndarray.cumprod
method
ndarray.cumprod(axis=None, dtype=None, out=None)
    
Return the cumulative product of the elements along the given axis.
Refer to `numpy.cumprod` for full documentation.
See also
`numpy.cumprod`
    
equivalent function
# numpy.ndarray.cumsum
method
ndarray.cumsum(axis=None, dtype=None, out=None)
    
Return the cumulative sum of the elements along the given axis.
Refer to `numpy.cumsum` for full documentation.
See also
`numpy.cumsum`
    
equivalent function
# numpy.ndarray.data
attribute
ndarray.data
    
Python buffer object pointing to the start of the array’s data.
# numpy.ndarray.diagonal
method
ndarray.diagonal(offset=0, axis1=0, axis2=1)
    
Return specified diagonals. In NumPy 1.9 the returned array is a read-only view instead of a copy as in previous NumPy versions. In a future version the read-only restriction will be removed.
Refer to `numpy.diagonal` for full documentation.
See also
`numpy.diagonal`
    
equivalent function
# numpy.ndarray.dtype
attribute
ndarray.dtype
    
Data-type of the array’s elements.
Warning
Setting `arr.dtype` is discouraged and may be deprecated in the future. Setting will replace the `dtype` without modifying the memory (see also `ndarray.view` and `ndarray.astype`).
Parameters:
    
None
Returns:
    
dnumpy dtype object
See also
`ndarray.astype`
    
Cast the values contained in the array to a new data-type.
`ndarray.view`
    
Create a view of the same data but a different data-type.
`numpy.dtype`
#### Examples
    
    >>> x
    array([[0, 1],
           [2, 3]])
    >>> x.dtype
    dtype('int32')
    >>> type(x.dtype)
    <type 'numpy.dtype'>
    
# numpy.ndarray.dump
method
ndarray.dump(file)
    
Dump a pickle of the array to the specified file. The array can be read back with pickle.load or numpy.load.
Parameters:
    
filestr or Path
    
A string naming the dump file.
# numpy.ndarray.dumps
method
ndarray.dumps()
    
Returns the pickle of the array as a string. pickle.loads will convert the string back to an array.
Parameters:
    
None
# numpy.ndarray.fill
method
ndarray.fill(value)
    
Fill the array with a scalar value.
Parameters:
    
valuescalar
    
All elements of `a` will be assigned this value.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2])
    >>> a.fill(0)
    >>> a
    array([0, 0])
    >>> a = np.empty(2)
    >>> a.fill(1)
    >>> a
    array([1.,  1.])
    
Fill expects a scalar value and always behaves the same as assigning to a single array element. The following is a rare example where this distinction is important:
    
    >>> a = np.array([None, None], dtype=object)
    >>> a[0] = np.array(3)
    >>> a
    array([array(3), None], dtype=object)
    >>> a.fill(np.array(3))
    >>> a
    array([array(3), array(3)], dtype=object)
    
Where other forms of assignments will unpack the array being assigned:
    
    >>> a[...] = np.array(3)
    >>> a
    array([3, 3], dtype=object)
    
# numpy.ndarray.flags
attribute
ndarray.flags
    
Information about the memory layout of the array.
#### Notes
The `flags` object can be accessed dictionary-like (as in `a.flags['WRITEABLE']`), or by using lowercased attribute names (as in `a.flags.writeable`). Short flag names are only supported in dictionary access.
Only the WRITEBACKIFCOPY, WRITEABLE, and ALIGNED flags can be changed by the user, via direct assignment to the attribute or dictionary entry, or by calling `ndarray.setflags`.
The array flags cannot be set arbitrarily:
  * WRITEBACKIFCOPY can only be set `False`.
  * ALIGNED can only be set `True` if the data is truly aligned.
  * WRITEABLE can only be set `True` if the array owns its own memory or the ultimate owner of the memory exposes a writeable buffer interface or is a string.


Arrays can be both C-style and Fortran-style contiguous simultaneously. This is clear for 1-dimensional arrays, but can also be true for higher dimensional arrays.
Even for contiguous arrays a stride for a given dimension `arr.strides[dim]` may be arbitrary if `arr.shape[dim] == 1` or the array has no elements. It does not generally hold that `self.strides[-1] == self.itemsize` for C-style contiguous arrays or `self.strides[0] == self.itemsize` for Fortran-style contiguous arrays is true.
Attributes:
    
C_CONTIGUOUS (C)
    
The data is in a single, C-style contiguous segment.
F_CONTIGUOUS (F)
    
The data is in a single, Fortran-style contiguous segment.
OWNDATA (O)
    
The array owns the memory it uses or borrows it from another object.
WRITEABLE (W)
    
The data area can be written to. Setting this to False locks the data, making it read-only. A view (slice, etc.) inherits WRITEABLE from its base array at creation time, but a view of a writeable array may be subsequently locked while the base array remains writeable. (The opposite is not true, in that a view of a locked array may not be made writeable. However, currently, locking a base object does not lock any views that already reference it, so under that circumstance it is possible to alter the contents of a locked array via a previously created writeable view onto it.) Attempting to change a non-writeable array raises a RuntimeError exception.
ALIGNED (A)
    
The data and all elements are aligned appropriately for the hardware.
WRITEBACKIFCOPY (X)
    
This array is a copy of some other array. The C-API function PyArray_ResolveWritebackIfCopy must be called before deallocating to the base array will be updated with the contents of this array.
FNC
    
F_CONTIGUOUS and not C_CONTIGUOUS.
FORC
    
F_CONTIGUOUS or C_CONTIGUOUS (one-segment test).
BEHAVED (B)
    
ALIGNED and WRITEABLE.
CARRAY (CA)
    
BEHAVED and C_CONTIGUOUS.
FARRAY (FA)
    
BEHAVED and F_CONTIGUOUS and not C_CONTIGUOUS.
# numpy.ndarray.flat
attribute
ndarray.flat
    
A 1-D iterator over the array.
This is a `numpy.flatiter` instance, which acts similarly to, but is not a subclass of, Python’s built-in iterator object.
See also
`flatten`
    
Return a copy of the array collapsed into one dimension.
`flatiter`
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(1, 7).reshape(2, 3)
    >>> x
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> x.flat[3]
    4
    >>> x.T
    array([[1, 4],
           [2, 5],
           [3, 6]])
    >>> x.T.flat[3]
    5
    >>> type(x.flat)
    <class 'numpy.flatiter'>
    
An assignment example:
    
    >>> x.flat = 3; x
    array([[3, 3, 3],
           [3, 3, 3]])
    >>> x.flat[[1,4]] = 1; x
    array([[3, 1, 3],
           [3, 1, 3]])
    
# numpy.ndarray.flatten
method
ndarray.flatten(order='C')
    
Return a copy of the array collapsed into one dimension.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran- style) order. ‘A’ means to flatten in column-major order if `a` is Fortran contiguous in memory, row-major order otherwise. ‘K’ means to flatten `a` in the order the elements occur in memory. The default is ‘C’.
Returns:
    
yndarray
    
A copy of the input array, flattened to one dimension.
See also
`ravel`
    
Return a flattened array.
`flat`
    
A 1-D flat iterator over the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2], [3,4]])
    >>> a.flatten()
    array([1, 2, 3, 4])
    >>> a.flatten('F')
    array([1, 3, 2, 4])
    
# numpy.ndarray.getfield
method
ndarray.getfield(dtype, offset=0)
    
Returns a field of the given array as a certain type.
A field is a view of the array data with a given data-type. The values in the view are determined by the given type and the offset into the current array in bytes. The offset needs to be such that the view dtype fits in the array dtype; for example an array of dtype complex128 has 16-byte elements. If taking a view with a 32-bit integer (4 bytes), the offset needs to be between 0 and 12 bytes.
Parameters:
    
dtypestr or dtype
    
The data type of the view. The dtype size of the view can not be larger than that of the array itself.
offsetint
    
Number of bytes to skip before beginning the element view.
#### Examples
    
    >>> import numpy as np
    >>> x = np.diag([1.+1.j]*2)
    >>> x[1, 1] = 2 + 4.j
    >>> x
    array([[1.+1.j,  0.+0.j],
           [0.+0.j,  2.+4.j]])
    >>> x.getfield(np.float64)
    array([[1.,  0.],
           [0.,  2.]])
    
By choosing an offset of 8 bytes we can select the complex part of the array for our view:
    
    >>> x.getfield(np.float64, offset=8)
    array([[1.,  0.],
           [0.,  4.]])
    
# numpy.ndarray
classnumpy.ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)[source]
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
`T`ndarray
    
View of the transposed array.
`data`buffer
    
Python buffer object pointing to the start of the array’s data.
`dtype`dtype object
    
Data-type of the array’s elements.
`flags`dict
    
Information about the memory layout of the array.
`flat`numpy.flatiter object
    
A 1-D iterator over the array.
`imag`ndarray
    
The imaginary part of the array.
`real`ndarray
    
The real part of the array.
`size`int
    
Number of elements in the array.
`itemsize`int
    
Length of one array element in bytes.
`nbytes`int
    
Total bytes consumed by the elements of the array.
`ndim`int
    
Number of array dimensions.
`shape`tuple of ints
    
Tuple of array dimensions.
`strides`tuple of ints
    
Tuple of bytes to step in each dimension when traversing an array.
`ctypes`ctypes object
    
An object to simplify the interaction of the array with the ctypes module.
`base`ndarray
    
Base object if memory is from some other object.
#### Methods
`all`([axis, out, keepdims, where])
Returns True if all elements evaluate to True.  
`any`([axis, out, keepdims, where])
Returns True if any of the elements of `a` evaluate to True.  
`argmax`([axis, out, keepdims])
Return indices of the maximum values along the given axis.  
`argmin`([axis, out, keepdims])
Return indices of the minimum values along the given axis.  
`argpartition`(kth[, axis, kind, order])
Returns the indices that would partition this array.  
`argsort`([axis, kind, order])
Returns the indices that would sort this array.  
`astype`(dtype[, order, casting, subok, copy])
Copy of the array, cast to a specified type.  
`byteswap`([inplace])
Swap the bytes of the array elements  
`choose`(choices[, out, mode])
Use an index array to construct a new array from a set of choices.  
`clip`([min, max, out])
Return an array whose values are limited to `[min, max]`.  
`compress`(condition[, axis, out])
Return selected slices of this array along given axis.  
`conj`()
Complex-conjugate all elements.  
`conjugate`()
Return the complex conjugate, element-wise.  
`copy`([order])
Return a copy of the array.  
`cumprod`([axis, dtype, out])
Return the cumulative product of the elements along the given axis.  
`cumsum`([axis, dtype, out])
Return the cumulative sum of the elements along the given axis.  
`diagonal`([offset, axis1, axis2])
Return specified diagonals.  
`dump`(file)
Dump a pickle of the array to the specified file.  
`dumps`()
Returns the pickle of the array as a string.  
`fill`(value)
Fill the array with a scalar value.  
`flatten`([order])
Return a copy of the array collapsed into one dimension.  
`getfield`(dtype[, offset])
Returns a field of the given array as a certain type.  
`item`(*args)
Copy an element of an array to a standard Python scalar and return it.  
`max`([axis, out, keepdims, initial, where])
Return the maximum along a given axis.  
`mean`([axis, dtype, out, keepdims, where])
Returns the average of the array elements along given axis.  
`min`([axis, out, keepdims, initial, where])
Return the minimum along a given axis.  
`nonzero`()
Return the indices of the elements that are non-zero.  
`partition`(kth[, axis, kind, order])
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array.  
`prod`([axis, dtype, out, keepdims, initial, ...])
Return the product of the array elements over the given axis  
`put`(indices, values[, mode])
Set `a.flat[n] = values[n]` for all `n` in indices.  
`ravel`([order])
Return a flattened array.  
`repeat`(repeats[, axis])
Repeat elements of an array.  
`reshape`(shape, /, *[, order, copy])
Returns an array containing the same data with a new shape.  
`resize`(new_shape[, refcheck])
Change shape and size of array in-place.  
`round`([decimals, out])
Return `a` with each element rounded to the given number of decimals.  
`searchsorted`(v[, side, sorter])
Find indices where elements of v should be inserted in a to maintain order.  
`setfield`(val, dtype[, offset])
Put a value into a specified place in a field defined by a data-type.  
`setflags`([write, align, uic])
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.  
`sort`([axis, kind, order])
Sort an array in-place.  
`squeeze`([axis])
Remove axes of length one from `a`.  
`std`([axis, dtype, out, ddof, keepdims, where])
Returns the standard deviation of the array elements along given axis.  
`sum`([axis, dtype, out, keepdims, initial, where])
Return the sum of the array elements over the given axis.  
`swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`take`(indices[, axis, out, mode])
Return an array formed from the elements of `a` at the given indices.  
`tobytes`([order])
Construct Python bytes containing the raw data bytes in the array.  
`tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
`tolist`()
Return the array as an `a.ndim`-levels deep nested list of Python scalars.  
`tostring`([order])
A compatibility alias for `tobytes`, with exactly the same behavior.  
`trace`([offset, axis1, axis2, dtype, out])
Return the sum along diagonals of the array.  
`transpose`(*axes)
Returns a view of the array with axes transposed.  
`var`([axis, dtype, out, ddof, keepdims, where])
Returns the variance of the array elements, along given axis.  
`view`([dtype][, type])
New view of array with the same data.  
dot  
to_device  
# numpy.ndarray.imag
attribute
ndarray.imag
    
The imaginary part of the array.
#### Examples
    
    >>> import numpy as np
    >>> x = np.sqrt([1+0j, 0+1j])
    >>> x.imag
    array([ 0.        ,  0.70710678])
    >>> x.imag.dtype
    dtype('float64')
    
# numpy.ndarray.item
method
ndarray.item(*args)
    
Copy an element of an array to a standard Python scalar and return it.
Parameters:
    
*argsArguments (variable number and type)
    
  * none: in this case, the method only works for arrays with one element (`a.size == 1`), which element is copied into a standard Python scalar object and returned.
  * int_type: this argument is interpreted as a flat index into the array, specifying which element to copy and return.
  * tuple of int_types: functions as does a single int_type argument, except that the argument is interpreted as an nd-index into the array.


Returns:
    
zStandard Python scalar object
    
A copy of the specified element of the array as a suitable Python scalar
#### Notes
When the data type of `a` is longdouble or clongdouble, item() returns a scalar array object because there is no available Python scalar that would not lose information. Void arrays return a buffer object for item(), unless fields are defined, in which case a tuple is returned.
`item` is very similar to a[args], except, instead of an array scalar, a standard Python scalar is returned. This can be useful for speeding up access to elements of the array and doing arithmetic on elements of the array using Python’s optimized math.
#### Examples
    
    >>> import numpy as np
    >>> np.random.seed(123)
    >>> x = np.random.randint(9, size=(3, 3))
    >>> x
    array([[2, 2, 6],
           [1, 3, 6],
           [1, 0, 1]])
    >>> x.item(3)
    1
    >>> x.item(7)
    0
    >>> x.item((0, 1))
    2
    >>> x.item((2, 2))
    1
    
For an array with object dtype, elements are returned as-is.
    
    >>> a = np.array([np.int64(1)], dtype=object)
    >>> a.item() #return np.int64
    np.int64(1)
    
# numpy.ndarray.itemsize
attribute
ndarray.itemsize
    
Length of one array element in bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1,2,3], dtype=np.float64)
    >>> x.itemsize
    8
    >>> x = np.array([1,2,3], dtype=np.complex128)
    >>> x.itemsize
    16
    
# numpy.ndarray.max
method
ndarray.max(axis=None, out=None, keepdims=False, initial=<no value>, where=True)
    
Return the maximum along a given axis.
Refer to `numpy.amax` for full documentation.
See also
`numpy.amax`
    
equivalent function
# numpy.ndarray.mean
method
ndarray.mean(axis=None, dtype=None, out=None, keepdims=False, *, where=True)
    
Returns the average of the array elements along given axis.
Refer to `numpy.mean` for full documentation.
See also
`numpy.mean`
    
equivalent function
# numpy.ndarray.min
method
ndarray.min(axis=None, out=None, keepdims=False, initial=<no value>, where=True)
    
Return the minimum along a given axis.
Refer to `numpy.amin` for full documentation.
See also
`numpy.amin`
    
equivalent function
# numpy.ndarray.nbytes
attribute
ndarray.nbytes
    
Total bytes consumed by the elements of the array.
See also
`sys.getsizeof`
    
Memory consumed by the object itself without parents in case view. This does include memory consumed by non-element attributes.
#### Notes
Does not include memory consumed by non-element attributes of the array object.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3,5,2), dtype=np.complex128)
    >>> x.nbytes
    480
    >>> np.prod(x.shape) * x.itemsize
    480
    
# numpy.ndarray.ndim
attribute
ndarray.ndim
    
Number of array dimensions.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> x.ndim
    1
    >>> y = np.zeros((2, 3, 4))
    >>> y.ndim
    3
    
# numpy.ndarray.nonzero
method
ndarray.nonzero()
    
Return the indices of the elements that are non-zero.
Refer to `numpy.nonzero` for full documentation.
See also
`numpy.nonzero`
    
equivalent function
# numpy.ndarray.partition
method
ndarray.partition(kth, axis=-1, kind='introselect', order=None)
    
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array. In the output array, all elements smaller than the k-th element are located to the left of this element and all equal or greater are located to its right. The ordering of the elements in the two partitions on the either side of the k-th element in the output array is undefined.
Parameters:
    
kthint or sequence of ints
    
Element index to partition by. The kth element value will be in its final sorted position and all smaller elements will be moved before it and all equal or greater elements behind it. The order of all elements in the partitions is undefined. If provided with a sequence of kth it will partition all elements indexed by kth of them into their sorted position at once.
Deprecated since version 1.22.0: Passing booleans as index is deprecated.
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘introselect’}, optional
    
Selection algorithm. Default is ‘introselect’.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need to be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.partition`
    
Return a partitioned copy of an array.
`argpartition`
    
Indirect partition.
`sort`
    
Full sort.
#### Notes
See `np.partition` for notes on the different algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([3, 4, 2, 1])
    >>> a.partition(3)
    >>> a
    array([2, 1, 3, 4]) # may vary
    
    
    >>> a.partition((1, 3))
    >>> a
    array([1, 2, 3, 4])
    
# numpy.ndarray.prod
method
ndarray.prod(axis=None, dtype=None, out=None, keepdims=False, initial=1, where=True)
    
Return the product of the array elements over the given axis
Refer to `numpy.prod` for full documentation.
See also
`numpy.prod`
    
equivalent function
# numpy.ndarray.ptp
attribute
ndarray.ptp
# numpy.ndarray.put
method
ndarray.put(indices, values, mode='raise')
    
Set `a.flat[n] = values[n]` for all `n` in indices.
Refer to `numpy.put` for full documentation.
See also
`numpy.put`
    
equivalent function
# numpy.ndarray.ravel
method
ndarray.ravel([order])
    
Return a flattened array.
Refer to `numpy.ravel` for full documentation.
See also
`numpy.ravel`
    
equivalent function
`ndarray.flat`
    
a flat iterator on the array.
# numpy.ndarray.real
attribute
ndarray.real
    
The real part of the array.
See also
`numpy.real`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    >>> x = np.sqrt([1+0j, 0+1j])
    >>> x.real
    array([ 1.        ,  0.70710678])
    >>> x.real.dtype
    dtype('float64')
    
# numpy.ndarray.repeat
method
ndarray.repeat(repeats, axis=None)
    
Repeat elements of an array.
Refer to `numpy.repeat` for full documentation.
See also
`numpy.repeat`
    
equivalent function
# numpy.ndarray.reshape
method
ndarray.reshape(shape, /, *, order='C', copy=None)
    
Returns an array containing the same data with a new shape.
Refer to `numpy.reshape` for full documentation.
See also
`numpy.reshape`
    
equivalent function
#### Notes
Unlike the free function `numpy.reshape`, this method on `ndarray` allows the elements of the shape parameter to be passed in as separate arguments. For example, `a.reshape(10, 11)` is equivalent to `a.reshape((10, 11))`.
# numpy.ndarray.resize
method
ndarray.resize(new_shape, refcheck=True)
    
Change shape and size of array in-place.
Parameters:
    
new_shapetuple of ints, or `n` ints
    
Shape of resized array.
refcheckbool, optional
    
If False, reference count will not be checked. Default is True.
Returns:
    
None
Raises:
    
ValueError
    
If `a` does not own its own data or references or views to it exist, and the data memory must be changed. PyPy only: will always raise if the data memory must be changed, since there is no reliable way to determine if references or views to it exist.
SystemError
    
If the `order` keyword argument is specified. This behaviour is a bug in NumPy.
See also
`resize`
    
Return a new array with the specified shape.
#### Notes
This reallocates space for the data area if necessary.
Only contiguous arrays (data elements consecutive in memory) can be resized.
The purpose of the reference count check is to make sure you do not use this array as a buffer for another Python object and then reallocate the memory. However, reference counts can increase in other ways so if you are sure that you have not shared the memory for this array with another Python object, then you may safely set `refcheck` to False.
#### Examples
Shrinking an array: array is flattened (in the order that the data are stored in memory), resized, and reshaped:
    
    >>> import numpy as np
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='C')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [1]])
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='F')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [2]])
    
Enlarging an array: as above, but missing entries are filled with zeros:
    
    >>> b = np.array([[0, 1], [2, 3]])
    >>> b.resize(2, 3) # new_shape parameter doesn't have to be a tuple
    >>> b
    array([[0, 1, 2],
           [3, 0, 0]])
    
Referencing an array prevents resizing…
    
    >>> c = a
    >>> a.resize((1, 1))
    Traceback (most recent call last):
    ...
    ValueError: cannot resize an array that references or is referenced ...
    
Unless `refcheck` is False:
    
    >>> a.resize((1, 1), refcheck=False)
    >>> a
    array([[0]])
    >>> c
    array([[0]])
    
# numpy.ndarray.round
method
ndarray.round(decimals=0, out=None)
    
Return `a` with each element rounded to the given number of decimals.
Refer to `numpy.around` for full documentation.
See also
`numpy.around`
    
equivalent function
# numpy.ndarray.searchsorted
method
ndarray.searchsorted(v, side='left', sorter=None)
    
Find indices where elements of v should be inserted in a to maintain order.
For full documentation, see `numpy.searchsorted`
See also
`numpy.searchsorted`
    
equivalent function
# numpy.ndarray.setfield
method
ndarray.setfield(val, dtype, offset=0)
    
Put a value into a specified place in a field defined by a data-type.
Place `val` into `a`’s field defined by `dtype` and beginning `offset` bytes into the field.
Parameters:
    
valobject
    
Value to be placed in field.
dtypedtype object
    
Data-type of the field in which to place `val`.
offsetint, optional
    
The number of bytes into the field at which to place `val`.
Returns:
    
None
See also
`getfield`
#### Examples
    
    >>> import numpy as np
    >>> x = np.eye(3)
    >>> x.getfield(np.float64)
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    >>> x.setfield(3, np.int32)
    >>> x.getfield(np.int32)
    array([[3, 3, 3],
           [3, 3, 3],
           [3, 3, 3]], dtype=int32)
    >>> x
    array([[1.0e+000, 1.5e-323, 1.5e-323],
           [1.5e-323, 1.0e+000, 1.5e-323],
           [1.5e-323, 1.5e-323, 1.0e+000]])
    >>> x.setfield(np.eye(3), np.int32)
    >>> x
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    
# numpy.ndarray.setflags
method
ndarray.setflags(write=None, align=None, uic=None)
    
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.
These Boolean-valued flags affect how numpy interprets the memory area used by `a` (see Notes below). The ALIGNED flag can only be set to True if the data is actually aligned according to the type. The WRITEBACKIFCOPY flag can never be set to True. The flag WRITEABLE can only be set to True if the array owns its own memory, or the ultimate owner of the memory exposes a writeable buffer interface, or is a string. (The exception for string is made so that unpickling can be done without copying memory.)
Parameters:
    
writebool, optional
    
Describes whether or not `a` can be written to.
alignbool, optional
    
Describes whether or not `a` is aligned properly for its type.
uicbool, optional
    
Describes whether or not `a` is a copy of another “base” array.
#### Notes
Array flags provide information about how the memory area used for the array is to be interpreted. There are 7 Boolean flags in use, only three of which can be changed by the user: WRITEBACKIFCOPY, WRITEABLE, and ALIGNED.
WRITEABLE (W) the data area can be written to;
ALIGNED (A) the data and strides are aligned appropriately for the hardware (as determined by the compiler);
WRITEBACKIFCOPY (X) this array is a copy of some other array (referenced by .base). When the C-API function PyArray_ResolveWritebackIfCopy is called, the base array will be updated with the contents of this array.
All flags can be accessed using the single (upper case) letter as well as the full name.
#### Examples
    
    >>> import numpy as np
    >>> y = np.array([[3, 1, 7],
    ...               [2, 0, 0],
    ...               [8, 5, 9]])
    >>> y
    array([[3, 1, 7],
           [2, 0, 0],
           [8, 5, 9]])
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
    >>> y.setflags(write=0, align=0)
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : False
      ALIGNED : False
      WRITEBACKIFCOPY : False
    >>> y.setflags(uic=1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: cannot set WRITEBACKIFCOPY flag to True
    
# numpy.ndarray.shape
attribute
ndarray.shape
    
Tuple of array dimensions.
The shape property is usually used to get the current shape of an array, but may also be used to reshape the array in-place by assigning a tuple of array dimensions to it. As with `numpy.reshape`, one of the new shape dimensions can be -1, in which case its value is inferred from the size of the array and the remaining dimensions. Reshaping an array in-place will fail if a copy is required.
Warning
Setting `arr.shape` is discouraged and may be deprecated in the future. Using `ndarray.reshape` is the preferred approach.
See also
`numpy.shape`
    
Equivalent getter function.
`numpy.reshape`
    
Function similar to setting `shape`.
`ndarray.reshape`
    
Method similar to setting `shape`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3, 4])
    >>> x.shape
    (4,)
    >>> y = np.zeros((2, 3, 4))
    >>> y.shape
    (2, 3, 4)
    >>> y.shape = (3, 8)
    >>> y
    array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
    >>> y.shape = (3, 6)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: total size of new array must be unchanged
    >>> np.zeros((4,2))[::2].shape = (-1,)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: Incompatible shape for in-place modification. Use
    `.reshape()` to make a copy with the desired shape.
    
# numpy.ndarray.size
attribute
ndarray.size
    
Number of elements in the array.
Equal to `np.prod(a.shape)`, i.e., the product of the array’s dimensions.
#### Notes
`a.size` returns a standard arbitrary precision Python integer. This may not be the case with other methods of obtaining the same value (like the suggested `np.prod(a.shape)`, which returns an instance of `np.int_`), and may be relevant if the value is used further in calculations that may overflow a fixed size integer type.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3, 5, 2), dtype=np.complex128)
    >>> x.size
    30
    >>> np.prod(x.shape)
    30
    
# numpy.ndarray.sort
method
ndarray.sort(axis=-1, kind=None, order=None)
    
Sort an array in-place. Refer to `numpy.sort` for full documentation.
Parameters:
    
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort under the covers and, in general, the actual implementation will vary with datatype. The ‘mergesort’ option is retained for backwards compatibility.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.sort`
    
Return a sorted copy of an array.
`numpy.argsort`
    
Indirect sort.
`numpy.lexsort`
    
Indirect stable sort on multiple keys.
`numpy.searchsorted`
    
Find elements in sorted array.
`numpy.partition`
    
Partial sort.
#### Notes
See `numpy.sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,4], [3,1]])
    >>> a.sort(axis=1)
    >>> a
    array([[1, 4],
           [1, 3]])
    >>> a.sort(axis=0)
    >>> a
    array([[1, 3],
           [1, 4]])
    
Use the `order` keyword to specify a field to use when sorting a structured array:
    
    >>> a = np.array([('a', 2), ('c', 1)], dtype=[('x', 'S1'), ('y', int)])
    >>> a.sort(order='y')
    >>> a
    array([(b'c', 1), (b'a', 2)],
          dtype=[('x', 'S1'), ('y', '<i8')])
    
# numpy.ndarray.squeeze
method
ndarray.squeeze(axis=None)
    
Remove axes of length one from `a`.
Refer to `numpy.squeeze` for full documentation.
See also
`numpy.squeeze`
    
equivalent function
# numpy.ndarray.std
method
ndarray.std(axis=None, dtype=None, out=None, ddof=0, keepdims=False, *, where=True)
    
Returns the standard deviation of the array elements along given axis.
Refer to `numpy.std` for full documentation.
See also
`numpy.std`
    
equivalent function
# numpy.ndarray.strides
attribute
ndarray.strides
    
Tuple of bytes to step in each dimension when traversing an array.
The byte offset of element `(i[0], i[1], ..., i[n])` in an array `a` is:
    
    offset = sum(np.array(i) * a.strides)
    
A more detailed explanation of strides can be found in The N-dimensional array (ndarray).
Warning
Setting `arr.strides` is discouraged and may be deprecated in the future. `numpy.lib.stride_tricks.as_strided` should be preferred to create a new view of the same data in a safer way.
See also
`numpy.lib.stride_tricks.as_strided`
#### Notes
Imagine an array of 32-bit integers (each 4 bytes):
    
    x = np.array([[0, 1, 2, 3, 4],
                  [5, 6, 7, 8, 9]], dtype=np.int32)
    
This array is stored in memory as 40 bytes, one after the other (known as a contiguous block of memory). The strides of an array tell us how many bytes we have to skip in memory to move to the next position along a certain axis. For example, we have to skip 4 bytes (1 value) to move to the next column, but 20 bytes (5 values) to get to the same position in the next row. As such, the strides for the array `x` will be `(20, 4)`.
#### Examples
    
    >>> import numpy as np
    >>> y = np.reshape(np.arange(2*3*4), (2,3,4))
    >>> y
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>> y.strides
    (48, 16, 4)
    >>> y[1,1,1]
    17
    >>> offset=sum(y.strides * np.array((1,1,1)))
    >>> offset/y.itemsize
    17
    
    
    >>> x = np.reshape(np.arange(5*6*7*8), (5,6,7,8)).transpose(2,3,1,0)
    >>> x.strides
    (32, 4, 224, 1344)
    >>> i = np.array([3,5,2,2])
    >>> offset = sum(i * x.strides)
    >>> x[3,5,2,2]
    813
    >>> offset / x.itemsize
    813
    
# numpy.ndarray.sum
method
ndarray.sum(axis=None, dtype=None, out=None, keepdims=False, initial=0, where=True)
    
Return the sum of the array elements over the given axis.
Refer to `numpy.sum` for full documentation.
See also
`numpy.sum`
    
equivalent function
# numpy.ndarray.swapaxes
method
ndarray.swapaxes(axis1, axis2)
    
Return a view of the array with `axis1` and `axis2` interchanged.
Refer to `numpy.swapaxes` for full documentation.
See also
`numpy.swapaxes`
    
equivalent function
# numpy.ndarray.T
attribute
ndarray.T
    
View of the transposed array.
Same as `self.transpose()`.
See also
`transpose`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.T
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.T
    array([1, 2, 3, 4])
    
# numpy.ndarray.take
method
ndarray.take(indices, axis=None, out=None, mode='raise')
    
Return an array formed from the elements of `a` at the given indices.
Refer to `numpy.take` for full documentation.
See also
`numpy.take`
    
equivalent function
# numpy.ndarray.tobytes
method
ndarray.tobytes(order='C')
    
Construct Python bytes containing the raw data bytes in the array.
Constructs Python bytes showing a copy of the raw contents of data memory. The bytes object is produced in C-order by default. This behavior is controlled by the `order` parameter.
Parameters:
    
order{‘C’, ‘F’, ‘A’}, optional
    
Controls the memory layout of the bytes object. ‘C’ means C-order, ‘F’ means F-order, ‘A’ (short for Any) means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. Default is ‘C’.
Returns:
    
sbytes
    
Python bytes exhibiting a copy of `a`’s raw data.
See also
`frombuffer`
    
Inverse of this operation, construct a 1-dimensional array from Python bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[0, 1], [2, 3]], dtype='<u2')
    >>> x.tobytes()
    b'\x00\x00\x01\x00\x02\x00\x03\x00'
    >>> x.tobytes('C') == x.tobytes()
    True
    >>> x.tobytes('F')
    b'\x00\x00\x02\x00\x01\x00\x03\x00'
    
# numpy.ndarray.tofile
method
ndarray.tofile(fid, sep='', format='%s')
    
Write array to a file as text or binary (default).
Data is always written in ‘C’ order, independent of the order of `a`. The data produced by this method can be recovered using the function fromfile().
Parameters:
    
fidfile or str or Path
    
An open file object, or a string containing a filename.
sepstr
    
Separator between array items for text output. If “” (empty), a binary file is written, equivalent to `file.write(a.tobytes())`.
formatstr
    
Format string for text file output. Each entry in the array is formatted to text by first converting it to the closest Python type, and then using “format” % item.
#### Notes
This is a convenience function for quick storage of array data. Information on endianness and precision is lost, so this method is not a good choice for files intended to archive data or transport data between machines with different endianness. Some of these problems can be overcome by outputting the data as text files, at the expense of speed and file size.
When fid is a file object, array contents are directly written to the file, bypassing the file object’s `write` method. As a result, tofile cannot be used with files objects supporting compression (e.g., GzipFile) or file-like objects that do not support `fileno()` (e.g., BytesIO).
# numpy.ndarray.tolist
method
ndarray.tolist()
    
Return the array as an `a.ndim`-levels deep nested list of Python scalars.
Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible builtin Python type, via the `item` function.
If `a.ndim` is 0, then since the depth of the nested list is 0, it will not be a list at all, but a simple Python scalar.
Parameters:
    
none
Returns:
    
yobject, or list of object, or list of list of object, or …
    
The possibly nested list of array elements.
#### Notes
The array may be recreated via `a = np.array(a.tolist())`, although this may sometimes lose precision.
#### Examples
For a 1D array, `a.tolist()` is almost the same as `list(a)`, except that `tolist` changes numpy scalars to Python scalars:
    
    >>> import numpy as np
    >>> a = np.uint32([1, 2])
    >>> a_list = list(a)
    >>> a_list
    [np.uint32(1), np.uint32(2)]
    >>> type(a_list[0])
    <class 'numpy.uint32'>
    >>> a_tolist = a.tolist()
    >>> a_tolist
    [1, 2]
    >>> type(a_tolist[0])
    <class 'int'>
    
Additionally, for a 2D array, `tolist` applies recursively:
    
    >>> a = np.array([[1, 2], [3, 4]])
    >>> list(a)
    [array([1, 2]), array([3, 4])]
    >>> a.tolist()
    [[1, 2], [3, 4]]
    
The base case for this recursion is a 0D array:
    
    >>> a = np.array(1)
    >>> list(a)
    Traceback (most recent call last):
      ...
    TypeError: iteration over a 0-d array
    >>> a.tolist()
    1
    
# numpy.ndarray.tostring
method
ndarray.tostring(order='C')
    
A compatibility alias for `tobytes`, with exactly the same behavior.
Despite its name, it returns `bytes` not `str`s.
Deprecated since version 1.19.0.
# numpy.ndarray.trace
method
ndarray.trace(offset=0, axis1=0, axis2=1, dtype=None, out=None)
    
Return the sum along diagonals of the array.
Refer to `numpy.trace` for full documentation.
See also
`numpy.trace`
    
equivalent function
# numpy.ndarray.transpose
method
ndarray.transpose(*axes)
    
Returns a view of the array with axes transposed.
Refer to `numpy.transpose` for full documentation.
Parameters:
    
axesNone, tuple of ints, or `n` ints
    
  * None or no argument: reverses the order of the axes.
  * tuple of ints: `i` in the `j`-th place in the tuple means that the array’s `i`-th axis becomes the transposed array’s `j`-th axis.
  * `n` ints: same as an n-tuple of the same ints (this form is intended simply as a “convenience” alternative to the tuple form).


Returns:
    
pndarray
    
View of the array with its axes suitably permuted.
See also
`transpose`
    
Equivalent function.
`ndarray.T`
    
Array property returning the array transposed.
`ndarray.reshape`
    
Give a new shape to an array without changing its data.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.transpose()
    array([[1, 3],
           [2, 4]])
    >>> a.transpose((1, 0))
    array([[1, 3],
           [2, 4]])
    >>> a.transpose(1, 0)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.transpose()
    array([1, 2, 3, 4])
    
# numpy.ndarray.var
method
ndarray.var(axis=None, dtype=None, out=None, ddof=0, keepdims=False, *, where=True)
    
Returns the variance of the array elements, along given axis.
Refer to `numpy.var` for full documentation.
See also
`numpy.var`
    
equivalent function
# numpy.ndarray.view
method
ndarray.view([dtype][, type])
    
New view of array with the same data.
Note
Passing None for `dtype` is different from omitting the parameter, since the former invokes `dtype(None)` which is an alias for `dtype('float64')`.
Parameters:
    
dtypedata-type or ndarray sub-class, optional
    
Data-type descriptor of the returned view, e.g., float32 or int16. Omitting it results in the view having the same data-type as `a`. This argument can also be specified as an ndarray sub-class, which then specifies the type of the returned object (this is equivalent to setting the `type` parameter).
typePython type, optional
    
Type of the returned view, e.g., ndarray or matrix. Again, omission of the parameter results in type preservation.
#### Notes
`a.view()` is used two different ways:
`a.view(some_dtype)` or `a.view(dtype=some_dtype)` constructs a view of the array’s memory with a different data-type. This can cause a reinterpretation of the bytes of memory.
`a.view(ndarray_subclass)` or `a.view(type=ndarray_subclass)` just returns an instance of `ndarray_subclass` that looks at the same array (same shape, dtype, etc.) This does not cause a reinterpretation of the memory.
For `a.view(some_dtype)`, if `some_dtype` has a different number of bytes per entry than the previous dtype (for example, converting a regular array to a structured array), then the last axis of `a` must be contiguous. This axis will be resized in the result.
Changed in version 1.23.0: Only the last axis needs to be contiguous. Previously, the entire array had to be C-contiguous.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([(-1, 2)], dtype=[('a', np.int8), ('b', np.int8)])
    
Viewing array data using a different type and dtype:
    
    >>> nonneg = np.dtype([("a", np.uint8), ("b", np.uint8)])
    >>> y = x.view(dtype=nonneg, type=np.recarray)
    >>> x["a"]
    array([-1], dtype=int8)
    >>> y.a
    array([255], dtype=uint8)
    
Creating a view on a structured array so it can be used in calculations
    
    >>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)])
    >>> xv = x.view(dtype=np.int8).reshape(-1,2)
    >>> xv
    array([[1, 2],
           [3, 4]], dtype=int8)
    >>> xv.mean(0)
    array([2.,  3.])
    
Making changes to the view changes the underlying array
    
    >>> xv[0,1] = 20
    >>> x
    array([(1, 20), (3,  4)], dtype=[('a', 'i1'), ('b', 'i1')])
    
Using a view to convert an array to a recarray:
    
    >>> z = x.view(np.recarray)
    >>> z.a
    array([1, 3], dtype=int8)
    
Views share data:
    
    >>> x[0] = (9, 10)
    >>> z[0]
    np.record((9, 10), dtype=[('a', 'i1'), ('b', 'i1')])
    
Views that change the dtype size (bytes per entry) should normally be avoided on arrays defined by slices, transposes, fortran-ordering, etc.:
    
    >>> x = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int16)
    >>> y = x[:, ::2]
    >>> y
    array([[1, 3],
           [4, 6]], dtype=int16)
    >>> y.view(dtype=[('width', np.int16), ('length', np.int16)])
    Traceback (most recent call last):
        ...
    ValueError: To change to a dtype of a different size, the last axis must be contiguous
    >>> z = y.copy()
    >>> z.view(dtype=[('width', np.int16), ('length', np.int16)])
    array([[(1, 3)],
           [(4, 6)]], dtype=[('width', '<i2'), ('length', '<i2')])
    
However, views that change dtype are totally fine for arrays with a contiguous last axis, even if the rest of the axes are not C-contiguous:
    
    >>> x = np.arange(2 * 3 * 4, dtype=np.int8).reshape(2, 3, 4)
    >>> x.transpose(1, 0, 2).view(np.int16)
    array([[[ 256,  770],
            [3340, 3854]],
    
           [[1284, 1798],
            [4368, 4882]],
    
           [[2312, 2826],
            [5396, 5910]]], dtype=int16)
    
# numpy.ndenumerate
classnumpy.ndenumerate(arr)[source]
    
Multidimensional index iterator.
Return an iterator yielding pairs of array coordinates and values.
Parameters:
    
arrndarray
    
Input array.
See also
`ndindex`, `flatiter`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> for index, x in np.ndenumerate(a):
    ...     print(index, x)
    (0, 0) 1
    (0, 1) 2
    (1, 0) 3
    (1, 1) 4
    
# numpy.ndim
numpy.ndim(a)[source]
    
Return the number of dimensions of an array.
Parameters:
    
aarray_like
    
Input array. If it is not already an ndarray, a conversion is attempted.
Returns:
    
number_of_dimensionsint
    
The number of dimensions in `a`. Scalars are zero-dimensional.
See also
`ndarray.ndim`
    
equivalent method
`shape`
    
dimensions of array
`ndarray.shape`
    
dimensions of array
#### Examples
    
    >>> import numpy as np
    >>> np.ndim([[1,2,3],[4,5,6]])
    2
    >>> np.ndim(np.array([[1,2,3],[4,5,6]]))
    2
    >>> np.ndim(1)
    0
    
# numpy.ndindex
classnumpy.ndindex(*shape)[source]
    
An N-dimensional iterator object to index arrays.
Given the shape of an array, an `ndindex` instance iterates over the N-dimensional index of the array. At each iteration a tuple of indices is returned, the last dimension is iterated over first.
Parameters:
    
shapeints, or a single tuple of ints
    
The size of each dimension of the array can be passed as individual parameters or as the elements of a tuple.
See also
`ndenumerate`, `flatiter`
#### Examples
    
    >>> import numpy as np
    
Dimensions as individual arguments
    
    >>> for index in np.ndindex(3, 2, 1):
    ...     print(index)
    (0, 0, 0)
    (0, 1, 0)
    (1, 0, 0)
    (1, 1, 0)
    (2, 0, 0)
    (2, 1, 0)
    
Same dimensions - but in a tuple `(3, 2, 1)`
    
    >>> for index in np.ndindex((3, 2, 1)):
    ...     print(index)
    (0, 0, 0)
    (0, 1, 0)
    (1, 0, 0)
    (1, 1, 0)
    (2, 0, 0)
    (2, 1, 0)
    
#### Methods
`ndincr`()
Increment the multi-dimensional index by one.  
# numpy.ndindex.ndincr
method
ndindex.ndincr()[source]
    
Increment the multi-dimensional index by one.
This method is for backward compatibility only: do not use.
Deprecated since version 1.20.0: This method has been advised against since numpy 1.8.0, but only started emitting DeprecationWarning as of this version.
# numpy.nditer.close
method
nditer.close()
    
Resolve all writeback semantics in writeable operands.
See also
Modifying array values
# numpy.nditer.copy
method
nditer.copy()
    
Get a copy of the iterator in its current state.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(10)
    >>> y = x + 1
    >>> it = np.nditer([x, y])
    >>> next(it)
    (array(0), array(1))
    >>> it2 = it.copy()
    >>> next(it2)
    (array(1), array(2))
    
# numpy.nditer.debug_print
method
nditer.debug_print()
    
Print the current state of the `nditer` instance and debug info to stdout.
# numpy.nditer.enable_external_loop
method
nditer.enable_external_loop()
    
When the “external_loop” was not used during construction, but is desired, this modifies the iterator to behave as if the flag was specified.
# numpy.nditer
classnumpy.nditer(op, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', op_axes=None, itershape=None, buffersize=0)[source]
    
Efficient multi-dimensional iterator object to iterate over arrays. To get started using this object, see the introductory guide to array iteration.
Parameters:
    
opndarray or sequence of array_like
    
The array(s) to iterate over.
flagssequence of str, optional
    
Flags to control the behavior of the iterator.
  * `buffered` enables buffering when required.
  * `c_index` causes a C-order index to be tracked.
  * `f_index` causes a Fortran-order index to be tracked.
  * `multi_index` causes a multi-index, or a tuple of indices with one per iteration dimension, to be tracked.
  * `common_dtype` causes all the operands to be converted to a common data type, with copying or buffering as necessary.
  * `copy_if_overlap` causes the iterator to determine if read operands have overlap with write operands, and make temporary copies as necessary to avoid overlap. False positives (needless copying) are possible in some cases.
  * `delay_bufalloc` delays allocation of the buffers until a reset() call is made. Allows `allocate` operands to be initialized before their values are copied into the buffers.
  * `external_loop` causes the `values` given to be one-dimensional arrays with multiple values instead of zero-dimensional arrays.
  * `grow_inner` allows the `value` array sizes to be made larger than the buffer size when both `buffered` and `external_loop` is used.
  * `ranged` allows the iterator to be restricted to a sub-range of the iterindex values.
  * `refs_ok` enables iteration of reference types, such as object arrays.
  * `reduce_ok` enables iteration of `readwrite` operands which are broadcasted, also known as reduction operands.
  * `zerosize_ok` allows `itersize` to be zero.


op_flagslist of list of str, optional
    
This is a list of flags for each operand. At minimum, one of `readonly`, `readwrite`, or `writeonly` must be specified.
  * `readonly` indicates the operand will only be read from.
  * `readwrite` indicates the operand will be read from and written to.
  * `writeonly` indicates the operand will only be written to.
  * `no_broadcast` prevents the operand from being broadcasted.
  * `contig` forces the operand data to be contiguous.
  * `aligned` forces the operand data to be aligned.
  * `nbo` forces the operand data to be in native byte order.
  * `copy` allows a temporary read-only copy if required.
  * `updateifcopy` allows a temporary read-write copy if required.
  * `allocate` causes the array to be allocated if it is None in the `op` parameter.
  * `no_subtype` prevents an `allocate` operand from using a subtype.
  * `arraymask` indicates that this operand is the mask to use for selecting elements when writing to operands with the ‘writemasked’ flag set. The iterator does not enforce this, but when writing from a buffer back to the array, it only copies those elements indicated by this mask.
  * `writemasked` indicates that only elements where the chosen `arraymask` operand is True will be written to.
  * `overlap_assume_elementwise` can be used to mark operands that are accessed only in the iterator order, to allow less conservative copying when `copy_if_overlap` is present.


op_dtypesdtype or tuple of dtype(s), optional
    
The required data type(s) of the operands. If copying or buffering is enabled, the data will be converted to/from their original types.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the iteration order. ‘C’ means C order, ‘F’ means Fortran order, ‘A’ means ‘F’ order if all the arrays are Fortran contiguous, ‘C’ order otherwise, and ‘K’ means as close to the order the array elements appear in memory as possible. This also affects the element memory order of `allocate` operands, as they are allocated to be compatible with iteration order. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur when making a copy or buffering. Setting this to ‘unsafe’ is not recommended, as it can adversely affect accumulations.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


op_axeslist of list of ints, optional
    
If provided, is a list of ints or None for each operands. The list of axes for an operand is a mapping from the dimensions of the iterator to the dimensions of the operand. A value of -1 can be placed for entries, causing that dimension to be treated as `newaxis`.
itershapetuple of ints, optional
    
The desired shape of the iterator. This allows `allocate` operands with a dimension mapped by op_axes not corresponding to a dimension of a different operand to get a value not equal to 1 for that dimension.
buffersizeint, optional
    
When buffering is enabled, controls the size of the temporary buffers. Set to 0 for the default value.
#### Notes
`nditer` supersedes `flatiter`. The iterator implementation behind `nditer` is also exposed by the NumPy C API.
The Python exposure supplies two iteration interfaces, one which follows the Python iterator protocol, and another which mirrors the C-style do-while pattern. The native Python approach is better in most cases, but if you need the coordinates or index of an iterator, use the C-style pattern.
#### Examples
Here is how we might write an `iter_add` function, using the Python iterator protocol:
    
    >>> import numpy as np
    
    
    >>> def iter_add_py(x, y, out=None):
    ...     addop = np.add
    ...     it = np.nditer([x, y, out], [],
    ...                 [['readonly'], ['readonly'], ['writeonly','allocate']])
    ...     with it:
    ...         for (a, b, c) in it:
    ...             addop(a, b, out=c)
    ...         return it.operands[2]
    
Here is the same function, but following the C-style pattern:
    
    >>> def iter_add(x, y, out=None):
    ...    addop = np.add
    ...    it = np.nditer([x, y, out], [],
    ...                [['readonly'], ['readonly'], ['writeonly','allocate']])
    ...    with it:
    ...        while not it.finished:
    ...            addop(it[0], it[1], out=it[2])
    ...            it.iternext()
    ...        return it.operands[2]
    
Here is an example outer product function:
    
    >>> def outer_it(x, y, out=None):
    ...     mulop = np.multiply
    ...     it = np.nditer([x, y, out], ['external_loop'],
    ...             [['readonly'], ['readonly'], ['writeonly', 'allocate']],
    ...             op_axes=[list(range(x.ndim)) + [-1] * y.ndim,
    ...                      [-1] * x.ndim + list(range(y.ndim)),
    ...                      None])
    ...     with it:
    ...         for (a, b, c) in it:
    ...             mulop(a, b, out=c)
    ...         return it.operands[2]
    
    
    >>> a = np.arange(2)+1
    >>> b = np.arange(3)+1
    >>> outer_it(a,b)
    array([[1, 2, 3],
           [2, 4, 6]])
    
Here is an example function which operates like a “lambda” ufunc:
    
    >>> def luf(lamdaexpr, *args, **kwargs):
    ...    '''luf(lambdaexpr, op1, ..., opn, out=None, order='K', casting='safe', buffersize=0)'''
    ...    nargs = len(args)
    ...    op = (kwargs.get('out',None),) + args
    ...    it = np.nditer(op, ['buffered','external_loop'],
    ...            [['writeonly','allocate','no_broadcast']] +
    ...                            [['readonly','nbo','aligned']]*nargs,
    ...            order=kwargs.get('order','K'),
    ...            casting=kwargs.get('casting','safe'),
    ...            buffersize=kwargs.get('buffersize',0))
    ...    while not it.finished:
    ...        it[0] = lamdaexpr(*it[1:])
    ...        it.iternext()
    ...    return it.operands[0]
    
    
    >>> a = np.arange(5)
    >>> b = np.ones(5)
    >>> luf(lambda i,j:i*i + j/2, a, b)
    array([  0.5,   1.5,   4.5,   9.5,  16.5])
    
If operand flags `"writeonly"` or `"readwrite"` are used the operands may be views into the original data with the `WRITEBACKIFCOPY` flag. In this case `nditer` must be used as a context manager or the `nditer.close` method must be called before using the result. The temporary data will be written back to the original data when the `__exit__` function is called but not before:
    
    >>> a = np.arange(6, dtype='i4')[::-2]
    >>> with np.nditer(a, [],
    ...        [['writeonly', 'updateifcopy']],
    ...        casting='unsafe',
    ...        op_dtypes=[np.dtype('f4')]) as i:
    ...    x = i.operands[0]
    ...    x[:] = [-1, -2, -3]
    ...    # a still unchanged here
    >>> a, x
    (array([-1, -2, -3], dtype=int32), array([-1., -2., -3.], dtype=float32))
    
It is important to note that once the iterator is exited, dangling references (like `x` in the example) may or may not share data with the original data `a`. If writeback semantics were active, i.e. if `x.base.flags.writebackifcopy` is `True`, then exiting the iterator will sever the connection between `x` and `a`, writing to `x` will no longer write to `a`. If writeback semantics are not active, then `x.data` will still point at some part of `a.data`, and writing to one will affect the other.
Context management and the `close` method appeared in version 1.15.0.
Attributes:
    
dtypestuple of dtype(s)
    
The data types of the values provided in `value`. This may be different from the operand data types if buffering is enabled. Valid only before the iterator is closed.
finishedbool
    
Whether the iteration over the operands is finished or not.
has_delayed_bufallocbool
    
If True, the iterator was created with the `delay_bufalloc` flag, and no reset() function was called on it yet.
has_indexbool
    
If True, the iterator was created with either the `c_index` or the `f_index` flag, and the property `index` can be used to retrieve it.
has_multi_indexbool
    
If True, the iterator was created with the `multi_index` flag, and the property `multi_index` can be used to retrieve it.
index
    
When the `c_index` or `f_index` flag was used, this property provides access to the index. Raises a ValueError if accessed and `has_index` is False.
iterationneedsapibool
    
Whether iteration requires access to the Python API, for example if one of the operands is an object array.
iterindexint
    
An index which matches the order of iteration.
itersizeint
    
Size of the iterator.
itviews
    
Structured view(s) of `operands` in memory, matching the reordered and optimized iterator access pattern. Valid only before the iterator is closed.
multi_index
    
When the `multi_index` flag was used, this property provides access to the index. Raises a ValueError if accessed accessed and `has_multi_index` is False.
ndimint
    
The dimensions of the iterator.
nopint
    
The number of iterator operands.
`operands`tuple of operand(s)
    
operands[`Slice`]
shapetuple of ints
    
Shape tuple, the shape of the iterator.
value
    
Value of `operands` at current iteration. Normally, this is a tuple of array scalars, but if the flag `external_loop` is used, it is a tuple of one dimensional arrays.
#### Methods
`close`()
Resolve all writeback semantics in writeable operands.  
`copy`()
Get a copy of the iterator in its current state.  
`debug_print`()
Print the current state of the `nditer` instance and debug info to stdout.  
`enable_external_loop`()
When the "external_loop" was not used during construction, but is desired, this modifies the iterator to behave as if the flag was specified.  
`iternext`()
Check whether iterations are left, and perform a single internal iteration without returning the result.  
`remove_axis`(i, /)
Removes axis `i` from the iterator.  
`remove_multi_index`()
When the "multi_index" flag was specified, this removes it, allowing the internal iteration structure to be optimized further.  
`reset`()
Reset the iterator to its initial state.  
# numpy.nditer.index
attribute
nditer.index
# numpy.nditer.iternext
method
nditer.iternext()
    
Check whether iterations are left, and perform a single internal iteration without returning the result. Used in the C-style pattern do-while pattern. For an example, see `nditer`.
Returns:
    
iternextbool
    
Whether or not there are iterations left.
# numpy.nditer.itersize
attribute
nditer.itersize
# numpy.nditer.multi_index
attribute
nditer.multi_index
# numpy.nditer.operands
attribute
nditer.operands
    
The array(s) to be iterated over. Valid only before the iterator is closed.
# numpy.nditer.remove_axis
method
nditer.remove_axis(i, /)
    
Removes axis `i` from the iterator. Requires that the flag “multi_index” be enabled.
# numpy.nditer.remove_multi_index
method
nditer.remove_multi_index()
    
When the “multi_index” flag was specified, this removes it, allowing the internal iteration structure to be optimized further.
# numpy.nditer.reset
method
nditer.reset()
    
Reset the iterator to its initial state.
# numpy.nditer.value
attribute
nditer.value
# numpy.negative
numpy.negative(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'negative'>
    
Numerical negative, element-wise.
Parameters:
    
xarray_like or scalar
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
Returned array or scalar: `y = -x`. This is a scalar if `x` is a scalar.
#### Examples
    
    >>> import numpy as np
    >>> np.negative([1.,-1.])
    array([-1.,  1.])
    
The unary `-` operator can be used as a shorthand for `np.negative` on ndarrays.
    
    >>> x1 = np.array(([1., -1.]))
    >>> -x1
    array([-1.,  1.])
    
# numpy.nested_iters
numpy.nested_iters(op, axes, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', buffersize=0)
    
Create nditers for use in nested loops
Create a tuple of `nditer` objects which iterate in nested loops over different axes of the op argument. The first iterator is used in the outermost loop, the last in the innermost loop. Advancing one will change the subsequent iterators to point at its new element.
Parameters:
    
opndarray or sequence of array_like
    
The array(s) to iterate over.
axeslist of list of int
    
Each item is used as an “op_axes” argument to an nditer
flags, op_flags, op_dtypes, order, casting, buffersize (optional)
    
See `nditer` parameters of the same name
Returns:
    
iterstuple of nditer
    
An nditer for each item in `axes`, outermost first
See also
`nditer`
#### Examples
Basic usage. Note how y is the “flattened” version of [a[:, 0, :], a[:, 1, 0], a[:, 2, :]] since we specified the first iter’s axes as [1]
    
    >>> import numpy as np
    >>> a = np.arange(12).reshape(2, 3, 2)
    >>> i, j = np.nested_iters(a, [[1], [0, 2]], flags=["multi_index"])
    >>> for x in i:
    ...      print(i.multi_index)
    ...      for y in j:
    ...          print('', j.multi_index, y)
    (0,)
     (0, 0) 0
     (0, 1) 1
     (1, 0) 6
     (1, 1) 7
    (1,)
     (0, 0) 2
     (0, 1) 3
     (1, 0) 8
     (1, 1) 9
    (2,)
     (0, 0) 4
     (0, 1) 5
     (1, 0) 10
     (1, 1) 11
    
# numpy.nextafter
numpy.nextafter(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'nextafter'>
    
Return the next floating-point value after x1 towards x2, element-wise.
Parameters:
    
x1array_like
    
Values to find the next representable value of.
x2array_like
    
The direction where to look for the next representable value of `x1`. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
The next representable values of `x1` in the direction of `x2`. This is a scalar if both `x1` and `x2` are scalars.
#### Examples
    
    >>> import numpy as np
    >>> eps = np.finfo(np.float64).eps
    >>> np.nextafter(1, 2) == eps + 1
    True
    >>> np.nextafter([1, 2], [2, 1]) == [eps + 1, 2 - eps]
    array([ True,  True])
    
# numpy.nonzero
numpy.nonzero(a)[source]
    
Return the indices of the elements that are non-zero.
Returns a tuple of arrays, one for each dimension of `a`, containing the indices of the non-zero elements in that dimension. The values in `a` are always tested and returned in row-major, C-style order.
To group the indices by element, rather than dimension, use `argwhere`, which returns a row for each non-zero element.
Note
When called on a zero-d array or scalar, `nonzero(a)` is treated as `nonzero(atleast_1d(a))`.
Deprecated since version 1.17.0: Use `atleast_1d` explicitly if this behavior is deliberate.
Parameters:
    
aarray_like
    
Input array.
Returns:
    
tuple_of_arraystuple
    
Indices of elements that are non-zero.
See also
`flatnonzero`
    
Return indices that are non-zero in the flattened version of the input array.
`ndarray.nonzero`
    
Equivalent ndarray method.
`count_nonzero`
    
Counts the number of non-zero elements in the input array.
#### Notes
While the nonzero values can be obtained with `a[nonzero(a)]`, it is recommended to use `x[x.astype(bool)]` or `x[x != 0]` instead, which will correctly handle 0-d arrays.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])
    >>> x
    array([[3, 0, 0],
           [0, 4, 0],
           [5, 6, 0]])
    >>> np.nonzero(x)
    (array([0, 1, 2, 2]), array([0, 1, 0, 1]))
    
    
    >>> x[np.nonzero(x)]
    array([3, 4, 5, 6])
    >>> np.transpose(np.nonzero(x))
    array([[0, 0],
           [1, 1],
           [2, 0],
           [2, 1]])
    
A common use for `nonzero` is to find the indices of an array, where a condition is True. Given an array `a`, the condition `a` > 3 is a boolean array and since False is interpreted as 0, np.nonzero(a > 3) yields the indices of the `a` where the condition is true.
    
    >>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    >>> a > 3
    array([[False, False, False],
           [ True,  True,  True],
           [ True,  True,  True]])
    >>> np.nonzero(a > 3)
    (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
    
Using this result to index `a` is equivalent to using the mask directly:
    
    >>> a[np.nonzero(a > 3)]
    array([4, 5, 6, 7, 8, 9])
    >>> a[a > 3]  # prefer this spelling
    array([4, 5, 6, 7, 8, 9])
    
`nonzero` can also be called as a method of the array.
    
    >>> (a > 3).nonzero()
    (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
    
# numpy.not_equal
numpy.not_equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'not_equal'>
    
Return (x1 != x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`equal`, `greater`, `greater_equal`, `less`, `less_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.not_equal([1.,2.], [1., 3.])
    array([False,  True])
    >>> np.not_equal([1, 2], [[1, 3],[1, 4]])
    array([[False,  True],
           [False,  True]])
    
The `!=` operator can be used as a shorthand for `np.not_equal` on ndarrays.
    
    >>> a = np.array([1., 2.])
    >>> b = np.array([1., 3.])
    >>> a != b
    array([False,  True])
    
# numpy.number.__class_getitem__
method
number.__class_getitem__(item, /)
    
Return a parametrized wrapper around the `number` type.
New in version 1.22.
Returns:
    
aliastypes.GenericAlias
    
A parametrized `number` type.
See also
PEP 585
    
Type hinting generics in standard collections.
#### Examples
    
    >>> from typing import Any
    >>> import numpy as np
    
    
    >>> np.signedinteger[Any]
    numpy.signedinteger[typing.Any]
    
# numpy.ogrid
numpy.ogrid=<numpy.lib._index_tricks_impl.OGridClass object>
    
An instance which returns an open multi-dimensional “meshgrid”.
An instance which returns an open (i.e. not fleshed out) mesh-grid when indexed, so that only one dimension of each returned array is greater than 1. The dimension and number of the output arrays are equal to the number of indexing dimensions. If the step length is not a complex number, then the stop is not inclusive.
However, if the step length is a complex number (e.g. 5j), then the integer part of its magnitude is interpreted as specifying the number of points to create between the start and stop values, where the stop value is inclusive.
Returns:
    
mesh-gridndarray or tuple of ndarrays
    
If the input is a single slice, returns an array. If the input is multiple slices, returns a tuple of arrays, with only one dimension not equal to 1.
See also
`mgrid`
    
like `ogrid` but returns dense (or fleshed out) mesh grids
`meshgrid`
    
return coordinate matrices from coordinate vectors
`r_`
    
array concatenator
How to create arrays with regularly-spaced values
#### Examples
    
    >>> from numpy import ogrid
    >>> ogrid[-1:1:5j]
    array([-1. , -0.5,  0. ,  0.5,  1. ])
    >>> ogrid[0:5, 0:5]
    (array([[0],
            [1],
            [2],
            [3],
            [4]]),
     array([[0, 1, 2, 3, 4]]))
    
# numpy.ones
numpy.ones(shape, dtype=None, order='C', *, device=None, like=None)[source]
    
Return a new array of given shape and type, filled with ones.
Parameters:
    
shapeint or sequence of ints
    
Shape of the new array, e.g., `(2, 3)` or `2`.
dtypedata-type, optional
    
The desired data-type for the array, e.g., `numpy.int8`. Default is `numpy.float64`.
order{‘C’, ‘F’}, optional, default: C
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Array of ones with the given shape, dtype, and order.
See also
`ones_like`
    
Return an array of ones with shape and type of input.
`empty`
    
Return a new uninitialized array.
`zeros`
    
Return a new array setting values to zero.
`full`
    
Return a new array of given shape filled with value.
#### Examples
    
    >>> import numpy as np
    >>> np.ones(5)
    array([1., 1., 1., 1., 1.])
    
    
    >>> np.ones((5,), dtype=int)
    array([1, 1, 1, 1, 1])
    
    
    >>> np.ones((2, 1))
    array([[1.],
           [1.]])
    
    
    >>> s = (2,2)
    >>> np.ones(s)
    array([[1.,  1.],
           [1.,  1.]])
    
# numpy.ones_like
numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None, *, device=None)[source]
    
Return an array of ones with the same shape and type as a given array.
Parameters:
    
aarray_like
    
The shape and data-type of `a` define these same attributes of the returned array.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `a`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outndarray
    
Array of ones with the same shape and type as `a`.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`zeros_like`
    
Return an array of zeros with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`ones`
    
Return a new array setting values to one.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6)
    >>> x = x.reshape((2, 3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.ones_like(x)
    array([[1, 1, 1],
           [1, 1, 1]])
    
    
    >>> y = np.arange(3, dtype=float)
    >>> y
    array([0., 1., 2.])
    >>> np.ones_like(y)
    array([1.,  1.,  1.])
    
# numpy.outer
numpy.outer(a, b, out=None)[source]
    
Compute the outer product of two vectors.
Given two vectors `a` and `b` of length `M` and `N`, respectively, the outer product [1] is:
    
    [[a_0*b_0  a_0*b_1 ... a_0*b_{N-1} ]
     [a_1*b_0    .
     [ ...          .
     [a_{M-1}*b_0            a_{M-1}*b_{N-1} ]]
    
Parameters:
    
a(M,) array_like
    
First input vector. Input is flattened if not already 1-dimensional.
b(N,) array_like
    
Second input vector. Input is flattened if not already 1-dimensional.
out(M, N) ndarray, optional
    
A location where the result is stored
Returns:
    
out(M, N) ndarray
    
`out[i, j] = a[i] * b[j]`
See also
`inner`
`einsum`
    
`einsum('i,j->ij', a.ravel(), b.ravel())` is the equivalent.
`ufunc.outer`
    
A generalization to dimensions other than 1D and other operations. `np.multiply.outer(a.ravel(), b.ravel())` is the equivalent.
`linalg.outer`
    
An Array API compatible variation of `np.outer`, which accepts 1-dimensional inputs only.
`tensordot`
    
`np.tensordot(a.ravel(), b.ravel(), axes=((), ()))` is the equivalent.
#### References
[1]
G. H. Golub and C. F. Van Loan, Matrix Computations, 3rd ed., Baltimore, MD, Johns Hopkins University Press, 1996, pg. 8.
#### Examples
Make a (very coarse) grid for computing a Mandelbrot set:
    
    >>> import numpy as np
    >>> rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
    >>> rl
    array([[-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.],
           [-2., -1.,  0.,  1.,  2.]])
    >>> im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
    >>> im
    array([[0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j],
           [0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j],
           [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
           [0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j],
           [0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]])
    >>> grid = rl + im
    >>> grid
    array([[-2.+2.j, -1.+2.j,  0.+2.j,  1.+2.j,  2.+2.j],
           [-2.+1.j, -1.+1.j,  0.+1.j,  1.+1.j,  2.+1.j],
           [-2.+0.j, -1.+0.j,  0.+0.j,  1.+0.j,  2.+0.j],
           [-2.-1.j, -1.-1.j,  0.-1.j,  1.-1.j,  2.-1.j],
           [-2.-2.j, -1.-2.j,  0.-2.j,  1.-2.j,  2.-2.j]])
    
An example using a “vector” of letters:
    
    >>> x = np.array(['a', 'b', 'c'], dtype=object)
    >>> np.outer(x, [1, 2, 3])
    array([['a', 'aa', 'aaa'],
           ['b', 'bb', 'bbb'],
           ['c', 'cc', 'ccc']], dtype=object)
    
# numpy.packbits
numpy.packbits(a, /, axis=None, bitorder='big')
    
Packs the elements of a binary-valued array into bits in a uint8 array.
The result is padded to full bytes by inserting zero bits at the end.
Parameters:
    
aarray_like
    
An array of integers or booleans whose elements should be packed to bits.
axisint, optional
    
The dimension over which bit-packing is done. `None` implies packing the flattened array.
bitorder{‘big’, ‘little’}, optional
    
The order of the input bits. ‘big’ will mimic bin(val), `[0, 0, 0, 0, 0, 0, 1, 1] => 3 = 0b00000011`, ‘little’ will reverse the order so `[1, 1, 0, 0, 0, 0, 0, 0] => 3`. Defaults to ‘big’.
Returns:
    
packedndarray
    
Array of type uint8 whose elements represent bits corresponding to the logical (0 or nonzero) value of the input elements. The shape of `packed` has the same number of dimensions as the input (unless `axis` is None, in which case the output is 1-D).
See also
`unpackbits`
    
Unpacks elements of a uint8 array into a binary-valued output array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[[1,0,1],
    ...                [0,1,0]],
    ...               [[1,1,0],
    ...                [0,0,1]]])
    >>> b = np.packbits(a, axis=-1)
    >>> b
    array([[[160],
            [ 64]],
           [[192],
            [ 32]]], dtype=uint8)
    
Note that in binary 160 = 1010 0000, 64 = 0100 0000, 192 = 1100 0000, and 32 = 0010 0000.
# numpy.pad
numpy.pad(array, pad_width, mode='constant', **kwargs)[source]
    
Pad an array.
Parameters:
    
arrayarray_like of rank N
    
The array to pad.
pad_width{sequence, array_like, int}
    
Number of values padded to the edges of each axis. `((before_1, after_1), ... (before_N, after_N))` unique pad widths for each axis. `(before, after)` or `((before, after),)` yields same before and after pad for each axis. `(pad,)` or `int` is a shortcut for before = after = pad width for all axes.
modestr or function, optional
    
One of the following string values or a user supplied function.
‘constant’ (default)
    
Pads with a constant value.
‘edge’
    
Pads with the edge values of array.
‘linear_ramp’
    
Pads with the linear ramp between end_value and the array edge value.
‘maximum’
    
Pads with the maximum value of all or part of the vector along each axis.
‘mean’
    
Pads with the mean value of all or part of the vector along each axis.
‘median’
    
Pads with the median value of all or part of the vector along each axis.
‘minimum’
    
Pads with the minimum value of all or part of the vector along each axis.
‘reflect’
    
Pads with the reflection of the vector mirrored on the first and last values of the vector along each axis.
‘symmetric’
    
Pads with the reflection of the vector mirrored along the edge of the array.
‘wrap’
    
Pads with the wrap of the vector along the axis. The first values are used to pad the end and the end values are used to pad the beginning.
‘empty’
    
Pads with undefined values.
<function>
    
Padding function, see Notes.
stat_lengthsequence or int, optional
    
Used in ‘maximum’, ‘mean’, ‘median’, and ‘minimum’. Number of values at edge of each axis used to calculate the statistic value.
`((before_1, after_1), ... (before_N, after_N))` unique statistic lengths for each axis.
`(before, after)` or `((before, after),)` yields same before and after statistic lengths for each axis.
`(stat_length,)` or `int` is a shortcut for `before = after = statistic` length for all axes.
Default is `None`, to use the entire axis.
constant_valuessequence or scalar, optional
    
Used in ‘constant’. The values to set the padded values for each axis.
`((before_1, after_1), ... (before_N, after_N))` unique pad constants for each axis.
`(before, after)` or `((before, after),)` yields same before and after constants for each axis.
`(constant,)` or `constant` is a shortcut for `before = after = constant` for all axes.
Default is 0.
end_valuessequence or scalar, optional
    
Used in ‘linear_ramp’. The values used for the ending value of the linear_ramp and that will form the edge of the padded array.
`((before_1, after_1), ... (before_N, after_N))` unique end values for each axis.
`(before, after)` or `((before, after),)` yields same before and after end values for each axis.
`(constant,)` or `constant` is a shortcut for `before = after = constant` for all axes.
Default is 0.
reflect_type{‘even’, ‘odd’}, optional
    
Used in ‘reflect’, and ‘symmetric’. The ‘even’ style is the default with an unaltered reflection around the edge value. For the ‘odd’ style, the extended part of the array is created by subtracting the reflected values from two times the edge value.
Returns:
    
padndarray
    
Padded array of rank equal to `array` with shape increased according to `pad_width`.
#### Notes
For an array with rank greater than 1, some of the padding of later axes is calculated from padding of previous axes. This is easiest to think about with a rank 2 array where the corners of the padded array are calculated by using padded values from the first axis.
The padding function, if used, should modify a rank 1 array in-place. It has the following signature:
    
    padding_func(vector, iaxis_pad_width, iaxis, kwargs)
    
where
vectorndarray
    
A rank 1 array already padded with zeros. Padded values are vector[:iaxis_pad_width[0]] and vector[-iaxis_pad_width[1]:].
iaxis_pad_widthtuple
    
A 2-tuple of ints, iaxis_pad_width[0] represents the number of values padded at the beginning of vector where iaxis_pad_width[1] represents the number of values padded at the end of vector.
iaxisint
    
The axis currently being calculated.
kwargsdict
    
Any keyword arguments the function requires.
#### Examples
    
    >>> import numpy as np
    >>> a = [1, 2, 3, 4, 5]
    >>> np.pad(a, (2, 3), 'constant', constant_values=(4, 6))
    array([4, 4, 1, ..., 6, 6, 6])
    
    
    >>> np.pad(a, (2, 3), 'edge')
    array([1, 1, 1, ..., 5, 5, 5])
    
    
    >>> np.pad(a, (2, 3), 'linear_ramp', end_values=(5, -4))
    array([ 5,  3,  1,  2,  3,  4,  5,  2, -1, -4])
    
    
    >>> np.pad(a, (2,), 'maximum')
    array([5, 5, 1, 2, 3, 4, 5, 5, 5])
    
    
    >>> np.pad(a, (2,), 'mean')
    array([3, 3, 1, 2, 3, 4, 5, 3, 3])
    
    
    >>> np.pad(a, (2,), 'median')
    array([3, 3, 1, 2, 3, 4, 5, 3, 3])
    
    
    >>> a = [[1, 2], [3, 4]]
    >>> np.pad(a, ((3, 2), (2, 3)), 'minimum')
    array([[1, 1, 1, 2, 1, 1, 1],
           [1, 1, 1, 2, 1, 1, 1],
           [1, 1, 1, 2, 1, 1, 1],
           [1, 1, 1, 2, 1, 1, 1],
           [3, 3, 3, 4, 3, 3, 3],
           [1, 1, 1, 2, 1, 1, 1],
           [1, 1, 1, 2, 1, 1, 1]])
    
    
    >>> a = [1, 2, 3, 4, 5]
    >>> np.pad(a, (2, 3), 'reflect')
    array([3, 2, 1, 2, 3, 4, 5, 4, 3, 2])
    
    
    >>> np.pad(a, (2, 3), 'reflect', reflect_type='odd')
    array([-1,  0,  1,  2,  3,  4,  5,  6,  7,  8])
    
    
    >>> np.pad(a, (2, 3), 'symmetric')
    array([2, 1, 1, 2, 3, 4, 5, 5, 4, 3])
    
    
    >>> np.pad(a, (2, 3), 'symmetric', reflect_type='odd')
    array([0, 1, 1, 2, 3, 4, 5, 5, 6, 7])
    
    
    >>> np.pad(a, (2, 3), 'wrap')
    array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3])
    
    
    >>> def pad_with(vector, pad_width, iaxis, kwargs):
    ...     pad_value = kwargs.get('padder', 10)
    ...     vector[:pad_width[0]] = pad_value
    ...     vector[-pad_width[1]:] = pad_value
    >>> a = np.arange(6)
    >>> a = a.reshape((2, 3))
    >>> np.pad(a, 2, pad_with)
    array([[10, 10, 10, 10, 10, 10, 10],
           [10, 10, 10, 10, 10, 10, 10],
           [10, 10,  0,  1,  2, 10, 10],
           [10, 10,  3,  4,  5, 10, 10],
           [10, 10, 10, 10, 10, 10, 10],
           [10, 10, 10, 10, 10, 10, 10]])
    >>> np.pad(a, 2, pad_with, padder=100)
    array([[100, 100, 100, 100, 100, 100, 100],
           [100, 100, 100, 100, 100, 100, 100],
           [100, 100,   0,   1,   2, 100, 100],
           [100, 100,   3,   4,   5, 100, 100],
           [100, 100, 100, 100, 100, 100, 100],
           [100, 100, 100, 100, 100, 100, 100]])
    
# numpy.partition
numpy.partition(a, kth, axis=-1, kind='introselect', order=None)[source]
    
Return a partitioned copy of an array.
Creates a copy of the array and partially sorts it in such a way that the value of the element in k-th position is in the position it would be in a sorted array. In the output array, all elements smaller than the k-th element are located to the left of this element and all equal or greater are located to its right. The ordering of the elements in the two partitions on the either side of the k-th element in the output array is undefined.
Parameters:
    
aarray_like
    
Array to be sorted.
kthint or sequence of ints
    
Element index to partition by. The k-th value of the element will be in its final sorted position and all smaller elements will be moved before it and all equal or greater elements behind it. The order of all elements in the partitions is undefined. If provided with a sequence of k-th it will partition all elements indexed by k-th of them into their sorted position at once.
Deprecated since version 1.22.0: Passing booleans as index is deprecated.
axisint or None, optional
    
Axis along which to sort. If None, the array is flattened before sorting. The default is -1, which sorts along the last axis.
kind{‘introselect’}, optional
    
Selection algorithm. Default is ‘introselect’.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string. Not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
Returns:
    
partitioned_arrayndarray
    
Array of the same type and shape as `a`.
See also
`ndarray.partition`
    
Method to sort an array in-place.
`argpartition`
    
Indirect partition.
`sort`
    
Full sorting
#### Notes
The various selection algorithms are characterized by their average speed, worst case performance, work space size, and whether they are stable. A stable sort keeps items with the same key in the same relative order. The available algorithms have the following properties:
kind
speed
worst case
work space
stable  
‘introselect’
1
O(n)
0
no  
All the partition algorithms make temporary copies of the data when partitioning along any but the last axis. Consequently, partitioning along the last axis is faster and uses less space than partitioning along any other axis.
The sort order for complex numbers is lexicographic. If both the real and imaginary parts are non-nan then the order is determined by the real parts except when they are equal, in which case the order is determined by the imaginary parts.
The sort order of `np.nan` is bigger than `np.inf`.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([7, 1, 7, 7, 1, 5, 7, 2, 3, 2, 6, 2, 3, 0])
    >>> p = np.partition(a, 4)
    >>> p
    array([0, 1, 2, 1, 2, 5, 2, 3, 3, 6, 7, 7, 7, 7]) # may vary
    
`p[4]` is 2; all elements in `p[:4]` are less than or equal to `p[4]`, and all elements in `p[5:]` are greater than or equal to `p[4]`. The partition is:
    
    [0, 1, 2, 1], [2], [5, 2, 3, 3, 6, 7, 7, 7, 7]
    
The next example shows the use of multiple values passed to `kth`.
    
    >>> p2 = np.partition(a, (4, 8))
    >>> p2
    array([0, 1, 2, 1, 2, 3, 3, 2, 5, 6, 7, 7, 7, 7])
    
`p2[4]` is 2 and `p2[8]` is 5. All elements in `p2[:4]` are less than or equal to `p2[4]`, all elements in `p2[5:8]` are greater than or equal to `p2[4]` and less than or equal to `p2[8]`, and all elements in `p2[9:]` are greater than or equal to `p2[8]`. The partition is:
    
    [0, 1, 2, 1], [2], [3, 3, 2], [5], [6, 7, 7, 7, 7]
    
# numpy.percentile
numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=False, *, weights=None, interpolation=None)[source]
    
Compute the q-th percentile of the data along the specified axis.
Returns the q-th percentile(s) of the array elements.
Parameters:
    
aarray_like of real numbers
    
Input array or object that can be converted to an array.
qarray_like of float
    
Percentage or sequence of percentages for the percentiles to compute. Values must be between 0 and 100 inclusive.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the percentiles are computed. The default is to compute the percentile(s) along a flattened version of the array.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow the input array `a` to be modified by intermediate calculations, to save memory. In this case, the contents of the input `a` after this function completes is undefined.
methodstr, optional
    
This parameter specifies the method to use for estimating the percentile. There are many different methods, some unique to NumPy. See the notes for explanation. The options sorted by their R type as summarized in the H&F paper [1] are:
  1. ‘inverted_cdf’
  2. ‘averaged_inverted_cdf’
  3. ‘closest_observation’
  4. ‘interpolated_inverted_cdf’
  5. ‘hazen’
  6. ‘weibull’
  7. ‘linear’ (default)
  8. ‘median_unbiased’
  9. ‘normal_unbiased’


The first three methods are discontinuous. NumPy further defines the following discontinuous variations of the default ‘linear’ (7.) option:
  * ‘lower’
  * ‘higher’,
  * ‘midpoint’
  * ‘nearest’


Changed in version 1.22.0: This argument was previously called “interpolation” and only offered the “linear” default and last four options.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original array `a`.
weightsarray_like, optional
    
An array of weights associated with the values in `a`. Each value in `a` contributes to the percentile according to its associated weight. The weights array can either be 1-D (in which case its length must be the size of `a` along the given axis) or of the same shape as `a`. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. Only `method=”inverted_cdf”` supports weights. See the notes for more details.
New in version 2.0.0.
interpolationstr, optional
    
Deprecated name for the method keyword argument.
Deprecated since version 1.22.0.
Returns:
    
percentilescalar or ndarray
    
If `q` is a single percentile and `axis=None`, then the result is a scalar. If multiple percentiles are given, first axis of the result corresponds to the percentiles. The other axes are the axes that remain after the reduction of `a`. If the input contains integers or floats smaller than `float64`, the output data-type is `float64`. Otherwise, the output data-type is the same as that of the input. If `out` is specified, that array is returned instead.
See also
`mean`
`median`
    
equivalent to `percentile(..., 50)`
`nanpercentile`
`quantile`
    
equivalent to percentile, except q in the range [0, 1].
#### Notes
The behavior of `numpy.percentile` with percentage `q` is that of `numpy.quantile` with argument `q/100`. For more information, please see `numpy.quantile`.
#### References
[1]
R. J. Hyndman and Y. Fan, “Sample quantiles in statistical packages,” The American Statistician, 50(4), pp. 361-365, 1996
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[10, 7, 4], [3, 2, 1]])
    >>> a
    array([[10,  7,  4],
           [ 3,  2,  1]])
    >>> np.percentile(a, 50)
    3.5
    >>> np.percentile(a, 50, axis=0)
    array([6.5, 4.5, 2.5])
    >>> np.percentile(a, 50, axis=1)
    array([7.,  2.])
    >>> np.percentile(a, 50, axis=1, keepdims=True)
    array([[7.],
           [2.]])
    
    
    >>> m = np.percentile(a, 50, axis=0)
    >>> out = np.zeros_like(m)
    >>> np.percentile(a, 50, axis=0, out=out)
    array([6.5, 4.5, 2.5])
    >>> m
    array([6.5, 4.5, 2.5])
    
    
    >>> b = a.copy()
    >>> np.percentile(b, 50, axis=1, overwrite_input=True)
    array([7.,  2.])
    >>> assert not np.all(a == b)
    
The different methods can be visualized graphically:
    
    import matplotlib.pyplot as plt
    
    a = np.arange(4)
    p = np.linspace(0, 100, 6001)
    ax = plt.gca()
    lines = [
        ('linear', '-', 'C0'),
        ('inverted_cdf', ':', 'C1'),
        # Almost the same as `inverted_cdf`:
        ('averaged_inverted_cdf', '-.', 'C1'),
        ('closest_observation', ':', 'C2'),
        ('interpolated_inverted_cdf', '--', 'C1'),
        ('hazen', '--', 'C3'),
        ('weibull', '-.', 'C4'),
        ('median_unbiased', '--', 'C5'),
        ('normal_unbiased', '-.', 'C6'),
        ]
    for method, style, color in lines:
        ax.plot(
            p, np.percentile(a, p, method=method),
            label=method, linestyle=style, color=color)
    ax.set(
        title='Percentiles for different methods and data: ' + str(a),
        xlabel='Percentile',
        ylabel='Estimated percentile value',
        yticks=a)
    ax.legend(bbox_to_anchor=(1.03, 1))
    plt.tight_layout()
    plt.show()
    
# numpy.permute_dims
numpy.permute_dims(a, axes=None)[source]
    
Returns an array with axes transposed.
For a 1-D array, this returns an unchanged view of the original array, as a transposed vector is simply the same vector. To convert a 1-D array into a 2-D column vector, an additional dimension must be added, e.g., `np.atleast_2d(a).T` achieves this, as does `a[:, np.newaxis]`. For a 2-D array, this is the standard matrix transpose. For an n-D array, if axes are given, their order indicates how the axes are permuted (see Examples). If axes are not provided, then `transpose(a).shape == a.shape[::-1]`.
Parameters:
    
aarray_like
    
Input array.
axestuple or list of ints, optional
    
If specified, it must be a tuple or list which contains a permutation of [0, 1, …, N-1] where N is the number of axes of `a`. Negative indices can also be used to specify axes. The i-th axis of the returned array will correspond to the axis numbered `axes[i]` of the input. If not specified, defaults to `range(a.ndim)[::-1]`, which reverses the order of the axes.
Returns:
    
pndarray
    
`a` with its axes permuted. A view is returned whenever possible.
See also
`ndarray.transpose`
    
Equivalent method.
`moveaxis`
    
Move axes of an array to new positions.
`argsort`
    
Return the indices that would sort an array.
#### Notes
Use `transpose(a, argsort(axes))` to invert the transposition of tensors when using the `axes` keyword argument.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> np.transpose(a)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> np.transpose(a)
    array([1, 2, 3, 4])
    
    
    >>> a = np.ones((1, 2, 3))
    >>> np.transpose(a, (1, 0, 2)).shape
    (2, 1, 3)
    
    
    >>> a = np.ones((2, 3, 4, 5))
    >>> np.transpose(a).shape
    (5, 4, 3, 2)
    
    
    >>> a = np.arange(3*4*5).reshape((3, 4, 5))
    >>> np.transpose(a, (-1, 0, -2)).shape
    (5, 3, 4)
    
# numpy.piecewise
numpy.piecewise(x, condlist, funclist, *args, **kw)[source]
    
Evaluate a piecewise-defined function.
Given a set of conditions and corresponding functions, evaluate each function on the input data wherever its condition is true.
Parameters:
    
xndarray or scalar
    
The input domain.
condlistlist of bool arrays or bool scalars
    
Each boolean array corresponds to a function in `funclist`. Wherever `condlist[i]` is True, `funclist[i](x)` is used as the output value.
Each boolean array in `condlist` selects a piece of `x`, and should therefore be of the same shape as `x`.
The length of `condlist` must correspond to that of `funclist`. If one extra function is given, i.e. if `len(funclist) == len(condlist) + 1`, then that extra function is the default value, used wherever all conditions are false.
funclistlist of callables, f(x,*args,**kw), or scalars
    
Each function is evaluated over `x` wherever its corresponding condition is True. It should take a 1d array as input and give an 1d array or a scalar value as output. If, instead of a callable, a scalar is provided then a constant function (`lambda x: scalar`) is assumed.
argstuple, optional
    
Any further arguments given to `piecewise` are passed to the functions upon execution, i.e., if called `piecewise(..., ..., 1, 'a')`, then each function is called as `f(x, 1, 'a')`.
kwdict, optional
    
Keyword arguments used in calling `piecewise` are passed to the functions upon execution, i.e., if called `piecewise(..., ..., alpha=1)`, then each function is called as `f(x, alpha=1)`.
Returns:
    
outndarray
    
The output is the same shape and type as x and is found by calling the functions in `funclist` on the appropriate portions of `x`, as defined by the boolean arrays in `condlist`. Portions not covered by any condition have a default value of 0.
See also
`choose`, `select`, `where`
#### Notes
This is similar to choose or select, except that functions are evaluated on elements of `x` that satisfy the corresponding condition from `condlist`.
The result is:
    
          |--
          |funclist[0](x[condlist[0]])
    out = |funclist[1](x[condlist[1]])
          |...
          |funclist[n2](x[condlist[n2]])
          |--
    
#### Examples
    
    >>> import numpy as np
    
Define the signum function, which is -1 for `x < 0` and +1 for `x >= 0`.
    
    >>> x = np.linspace(-2.5, 2.5, 6)
    >>> np.piecewise(x, [x < 0, x >= 0], [-1, 1])
    array([-1., -1., -1.,  1.,  1.,  1.])
    
Define the absolute value, which is `-x` for `x <0` and `x` for `x >= 0`.
    
    >>> np.piecewise(x, [x < 0, x >= 0], [lambda x: -x, lambda x: x])
    array([2.5,  1.5,  0.5,  0.5,  1.5,  2.5])
    
Apply the same function to a scalar value.
    
    >>> y = -2
    >>> np.piecewise(y, [y < 0, y >= 0], [lambda x: -x, lambda x: x])
    array(2)
    
# numpy.place
numpy.place(arr, mask, vals)[source]
    
Change elements of an array based on conditional and input values.
Similar to `np.copyto(arr, vals, where=mask)`, the difference is that `place` uses the first N elements of `vals`, where N is the number of True values in `mask`, while `copyto` uses the elements where `mask` is True.
Note that `extract` does the exact opposite of `place`.
Parameters:
    
arrndarray
    
Array to put data into.
maskarray_like
    
Boolean mask array. Must have the same size as `a`.
vals1-D sequence
    
Values to put into `a`. Only the first N elements are used, where N is the number of True values in `mask`. If `vals` is smaller than N, it will be repeated, and if elements of `a` are to be masked, this sequence must be non-empty.
See also
`copyto`, `put`, `take`, `extract`
#### Examples
    
    >>> import numpy as np
    >>> arr = np.arange(6).reshape(2, 3)
    >>> np.place(arr, arr>2, [44, 55])
    >>> arr
    array([[ 0,  1,  2],
           [44, 55, 44]])
    
# numpy.poly
numpy.poly(seq_of_zeros)[source]
    
Find the coefficients of a polynomial with the given sequence of roots.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Returns the coefficients of the polynomial whose leading coefficient is one for the given sequence of zeros (multiple roots must be included in the sequence as many times as their multiplicity; see Examples). A square matrix (or array, which will be treated as a matrix) can also be given, in which case the coefficients of the characteristic polynomial of the matrix are returned.
Parameters:
    
seq_of_zerosarray_like, shape (N,) or (N, N)
    
A sequence of polynomial roots, or a square array or matrix object.
Returns:
    
cndarray
    
1D array of polynomial coefficients from highest to lowest degree:
`c[0] * x**(N) + c[1] * x**(N-1) + ... + c[N-1] * x + c[N]` where c[0] always equals 1.
Raises:
    
ValueError
    
If input is the wrong shape (the input must be a 1-D or square 2-D array).
See also
`polyval`
    
Compute polynomial values.
`roots`
    
Return the roots of a polynomial.
`polyfit`
    
Least squares polynomial fit.
`poly1d`
    
A one-dimensional polynomial class.
#### Notes
Specifying the roots of a polynomial still leaves one degree of freedom, typically represented by an undetermined leading coefficient. [1] In the case of this function, that coefficient - the first one in the returned array - is always taken as one. (If for some reason you have one other point, the only automatic way presently to leverage that information is to use `polyfit`.)
The characteristic polynomial, \\(p_a(t)\\), of an `n`-by-`n` matrix A is given by
\\(p_a(t) = \mathrm{det}(t\, \mathbf{I} - \mathbf{A})\\),
where I is the `n`-by-`n` identity matrix. [2]
#### References
[1]
M. Sullivan and M. Sullivan, III, “Algebra and Trigonometry, Enhanced With Graphing Utilities,” Prentice-Hall, pg. 318, 1996.
[2]
G. Strang, “Linear Algebra and Its Applications, 2nd Edition,” Academic Press, pg. 182, 1980.
#### Examples
Given a sequence of a polynomial’s zeros:
    
    >>> import numpy as np
    
    
    >>> np.poly((0, 0, 0)) # Multiple root example
    array([1., 0., 0., 0.])
    
The line above represents z**3 + 0*z**2 + 0*z + 0.
    
    >>> np.poly((-1./2, 0, 1./2))
    array([ 1.  ,  0.  , -0.25,  0.  ])
    
The line above represents z**3 - z/4
    
    >>> np.poly((np.random.random(1)[0], 0, np.random.random(1)[0]))
    array([ 1.        , -0.77086955,  0.08618131,  0.        ]) # random
    
Given a square array object:
    
    >>> P = np.array([[0, 1./3], [-1./2, 0]])
    >>> np.poly(P)
    array([1.        , 0.        , 0.16666667])
    
Note how in all cases the leading coefficient is always 1.
# numpy.poly1d.__call__
method
poly1d.__call__(val)[source]
    
Call self as a function.
# numpy.poly1d.c
property
propertypoly1d.c
    
The polynomial coefficients
# numpy.poly1d.coef
property
propertypoly1d.coef
    
The polynomial coefficients
# numpy.poly1d.coefficients
property
propertypoly1d.coefficients
    
The polynomial coefficients
# numpy.poly1d.coeffs
property
propertypoly1d.coeffs
    
The polynomial coefficients
# numpy.poly1d.deriv
method
poly1d.deriv(m=1)[source]
    
Return a derivative of this polynomial.
Refer to `polyder` for full documentation.
See also
`polyder`
    
equivalent function
# numpy.poly1d
classnumpy.poly1d(c_or_r, r=False, variable=None)[source]
    
A one-dimensional polynomial class.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
A convenience class, used to encapsulate “natural” operations on polynomials so that said operations may take on their customary form in code (see Examples).
Parameters:
    
c_or_rarray_like
    
The polynomial’s coefficients, in decreasing powers, or if the value of the second parameter is True, the polynomial’s roots (values where the polynomial evaluates to 0). For example, `poly1d([1, 2, 3])` returns an object that represents \\(x^2 + 2x + 3\\), whereas `poly1d([1, 2, 3], True)` returns one that represents \\((x-1)(x-2)(x-3) = x^3 - 6x^2 + 11x -6\\).
rbool, optional
    
If True, `c_or_r` specifies the polynomial’s roots; the default is False.
variablestr, optional
    
Changes the variable used when printing `p` from `x` to `variable` (see Examples).
#### Examples
Construct the polynomial \\(x^2 + 2x + 3\\):
    
    >>> import numpy as np
    
    
    >>> p = np.poly1d([1, 2, 3])
    >>> print(np.poly1d(p))
       2
    1 x + 2 x + 3
    
Evaluate the polynomial at \\(x = 0.5\\):
    
    >>> p(0.5)
    4.25
    
Find the roots:
    
    >>> p.r
    array([-1.+1.41421356j, -1.-1.41421356j])
    >>> p(p.r)
    array([ -4.44089210e-16+0.j,  -4.44089210e-16+0.j]) # may vary
    
These numbers in the previous line represent (0, 0) to machine precision
Show the coefficients:
    
    >>> p.c
    array([1, 2, 3])
    
Display the order (the leading zero-coefficients are removed):
    
    >>> p.order
    2
    
Show the coefficient of the k-th power in the polynomial (which is equivalent to `p.c[-(i+1)]`):
    
    >>> p[1]
    2
    
Polynomials can be added, subtracted, multiplied, and divided (returns quotient and remainder):
    
    >>> p * p
    poly1d([ 1,  4, 10, 12,  9])
    
    
    >>> (p**3 + 4) / p
    (poly1d([ 1.,  4., 10., 12.,  9.]), poly1d([4.]))
    
`asarray(p)` gives the coefficient array, so polynomials can be used in all functions that accept arrays:
    
    >>> p**2 # square of polynomial
    poly1d([ 1,  4, 10, 12,  9])
    
    
    >>> np.square(p) # square of individual coefficients
    array([1, 4, 9])
    
The variable used in the string representation of `p` can be modified, using the `variable` parameter:
    
    >>> p = np.poly1d([1,2,3], variable='z')
    >>> print(p)
       2
    1 z + 2 z + 3
    
Construct a polynomial from its roots:
    
    >>> np.poly1d([1, 2], True)
    poly1d([ 1., -3.,  2.])
    
This is the same polynomial as obtained by:
    
    >>> np.poly1d([1, -1]) * np.poly1d([1, -2])
    poly1d([ 1, -3,  2])
    
Attributes:
    
`c`
    
The polynomial coefficients
`coef`
    
The polynomial coefficients
`coefficients`
    
The polynomial coefficients
`coeffs`
    
The polynomial coefficients
`o`
    
The order or degree of the polynomial
`order`
    
The order or degree of the polynomial
`r`
    
The roots of the polynomial, where self(x) == 0
`roots`
    
The roots of the polynomial, where self(x) == 0
`variable`
    
The name of the polynomial variable
#### Methods
`__call__`(val)
Call self as a function.  
`deriv`([m])
Return a derivative of this polynomial.  
`integ`([m, k])
Return an antiderivative (indefinite integral) of this polynomial.  
# numpy.poly1d.integ
method
poly1d.integ(m=1, k=0)[source]
    
Return an antiderivative (indefinite integral) of this polynomial.
Refer to `polyint` for full documentation.
See also
`polyint`
    
equivalent function
# numpy.poly1d.o
property
propertypoly1d.o
    
The order or degree of the polynomial
# numpy.poly1d.order
property
propertypoly1d.order
    
The order or degree of the polynomial
# numpy.poly1d.r
property
propertypoly1d.r
    
The roots of the polynomial, where self(x) == 0
# numpy.poly1d.variable
property
propertypoly1d.variable
    
The name of the polynomial variable
# numpy.polyadd
numpy.polyadd(a1, a2)[source]
    
Find the sum of two polynomials.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Returns the polynomial resulting from the sum of two input polynomials. Each input must be either a poly1d object or a 1D sequence of polynomial coefficients, from highest to lowest degree.
Parameters:
    
a1, a2array_like or poly1d object
    
Input polynomials.
Returns:
    
outndarray or poly1d object
    
The sum of the inputs. If either input is a poly1d object, then the output is also a poly1d object. Otherwise, it is a 1D array of polynomial coefficients from highest to lowest degree.
See also
`poly1d`
    
A one-dimensional polynomial class.
`poly`, `polyadd`, `polyder`, `polydiv`, `polyfit`, `polyint`, `polysub`, `polyval`
#### Examples
    
    >>> import numpy as np
    >>> np.polyadd([1, 2], [9, 5, 4])
    array([9, 6, 6])
    
Using poly1d objects:
    
    >>> p1 = np.poly1d([1, 2])
    >>> p2 = np.poly1d([9, 5, 4])
    >>> print(p1)
    1 x + 2
    >>> print(p2)
       2
    9 x + 5 x + 4
    >>> print(np.polyadd(p1, p2))
       2
    9 x + 6 x + 6
    
# numpy.polyder
numpy.polyder(p, m=1)[source]
    
Return the derivative of the specified order of a polynomial.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Parameters:
    
ppoly1d or sequence
    
Polynomial to differentiate. A sequence is interpreted as polynomial coefficients, see `poly1d`.
mint, optional
    
Order of differentiation (default: 1)
Returns:
    
derpoly1d
    
A new polynomial representing the derivative.
See also
`polyint`
    
Anti-derivative of a polynomial.
`poly1d`
    
Class for one-dimensional polynomials.
#### Examples
The derivative of the polynomial \\(x^3 + x^2 + x^1 + 1\\) is:
    
    >>> import numpy as np
    
    
    >>> p = np.poly1d([1,1,1,1])
    >>> p2 = np.polyder(p)
    >>> p2
    poly1d([3, 2, 1])
    
which evaluates to:
    
    >>> p2(2.)
    17.0
    
We can verify this, approximating the derivative with `(f(x + h) - f(x))/h`:
    
    >>> (p(2. + 0.001) - p(2.)) / 0.001
    17.007000999997857
    
The fourth-order derivative of a 3rd-order polynomial is zero:
    
    >>> np.polyder(p, 2)
    poly1d([6, 2])
    >>> np.polyder(p, 3)
    poly1d([6])
    >>> np.polyder(p, 4)
    poly1d([0])
    
# numpy.polydiv
numpy.polydiv(u, v)[source]
    
Returns the quotient and remainder of polynomial division.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
The input arrays are the coefficients (including any coefficients equal to zero) of the “numerator” (dividend) and “denominator” (divisor) polynomials, respectively.
Parameters:
    
uarray_like or poly1d
    
Dividend polynomial’s coefficients.
varray_like or poly1d
    
Divisor polynomial’s coefficients.
Returns:
    
qndarray
    
Coefficients, including those equal to zero, of the quotient.
rndarray
    
Coefficients, including those equal to zero, of the remainder.
See also
`poly`, `polyadd`, `polyder`, `polydiv`, `polyfit`, `polyint`, `polymul`, `polysub`
`polyval`
#### Notes
Both `u` and `v` must be 0-d or 1-d (ndim = 0 or 1), but `u.ndim` need not equal `v.ndim`. In other words, all four possible combinations - `u.ndim = v.ndim = 0`, `u.ndim = v.ndim = 1`, `u.ndim = 1, v.ndim = 0`, and `u.ndim = 0, v.ndim = 1` \- work.
#### Examples
\\[\frac{3x^2 + 5x + 2}{2x + 1} = 1.5x + 1.75, remainder 0.25\\]
    
    >>> import numpy as np
    >>> x = np.array([3.0, 5.0, 2.0])
    >>> y = np.array([2.0, 1.0])
    >>> np.polydiv(x, y)
    (array([1.5 , 1.75]), array([0.25]))
    
# numpy.polyfit
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)[source]
    
Least squares polynomial fit.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Fit a polynomial `p(x) = p[0] * x**deg + ... + p[deg]` of degree `deg` to points `(x, y)`. Returns a vector of coefficients `p` that minimises the squared error in the order `deg`, `deg-1`, … `0`.
The `Polynomial.fit` class method is recommended for new code as it is more stable numerically. See the documentation of the method for more information.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint
    
Degree of the fitting polynomial
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
covbool or str, optional
    
If given and not `False`, return not just the estimate but also its covariance matrix. By default, the covariance are scaled by chi2/dof, where dof = M - (deg + 1), i.e., the weights are presumed to be unreliable except in a relative sense and everything is scaled such that the reduced chi2 is unity. This scaling is omitted if `cov='unscaled'`, as is relevant for the case that the weights are w = 1/sigma, with sigma known to be a reliable estimate of the uncertainty.
Returns:
    
pndarray, shape (deg + 1,) or (deg + 1, K)
    
Polynomial coefficients, highest power first. If `y` was 2-D, the coefficients for `k`-th data set are in `p[:,k]`.
residuals, rank, singular_values, rcond
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the effective rank of the scaled Vandermonde
    
coefficient matrix
  * singular_values – singular values of the scaled Vandermonde
    
coefficient matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Vndarray, shape (deg + 1, deg + 1) or (deg + 1, deg + 1, K)
    
Present only if `full == False` and `cov == True`. The covariance matrix of the polynomial coefficient estimates. The diagonal of this matrix are the variance estimates for each coefficient. If y is a 2-D array, then the covariance matrix for the `k`-th data set are in `V[:,:,k]`
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full == False`.
The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`polyval`
    
Compute polynomial values.
`linalg.lstsq`
    
Computes a least-squares fit.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution minimizes the squared error
\\[E = \sum_{j=0}^k |p(x_j) - y_j|^2\\]
in the equations:
    
    x[0]**n * p[0] + ... + x[0] * p[n-1] + p[n] = y[0]
    x[1]**n * p[0] + ... + x[1] * p[n-1] + p[n] = y[1]
    ...
    x[k]**n * p[0] + ... + x[k] * p[n-1] + p[n] = y[k]
    
The coefficient matrix of the coefficients `p` is a Vandermonde matrix.
`polyfit` issues a `RankWarning` when the least-squares fit is badly conditioned. This implies that the best fit is not well-defined due to numerical error. The results may be improved by lowering the polynomial degree or by replacing `x` by `x` \- `x`.mean(). The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious: including contributions from the small singular values can add numerical noise to the result.
Note that fitting polynomial coefficients is inherently badly conditioned when the degree of the polynomial is large or the interval of sample points is badly centered. The quality of the fit should always be checked in these cases. When polynomial fits are not satisfactory, splines may be a good alternative.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
[2]
Wikipedia, “Polynomial interpolation”, https://en.wikipedia.org/wiki/Polynomial_interpolation
#### Examples
    
    >>> import numpy as np
    >>> import warnings
    >>> x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
    >>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
    >>> z = np.polyfit(x, y, 3)
    >>> z
    array([ 0.08703704, -0.81349206,  1.69312169, -0.03968254]) # may vary
    
It is convenient to use `poly1d` objects for dealing with polynomials:
    
    >>> p = np.poly1d(z)
    >>> p(0.5)
    0.6143849206349179 # may vary
    >>> p(3.5)
    -0.34732142857143039 # may vary
    >>> p(10)
    22.579365079365115 # may vary
    
High-order polynomials may oscillate wildly:
    
    >>> with warnings.catch_warnings():
    ...     warnings.simplefilter('ignore', np.exceptions.RankWarning)
    ...     p30 = np.poly1d(np.polyfit(x, y, 30))
    ...
    >>> p30(4)
    -0.80000000000000204 # may vary
    >>> p30(5)
    -0.99999999999999445 # may vary
    >>> p30(4.5)
    -0.10547061179440398 # may vary
    
Illustration:
    
    >>> import matplotlib.pyplot as plt
    >>> xp = np.linspace(-2, 6, 100)
    >>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--')
    >>> plt.ylim(-2,2)
    (-2, 2)
    >>> plt.show()
    
# numpy.polyint
numpy.polyint(p, m=1, k=None)[source]
    
Return an antiderivative (indefinite integral) of a polynomial.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
The returned order `m` antiderivative `P` of polynomial `p` satisfies \\(\frac{d^m}{dx^m}P(x) = p(x)\\) and is defined up to `m - 1` integration constants `k`. The constants determine the low-order polynomial part
\\[\frac{k_{m-1}}{0!} x^0 + \ldots + \frac{k_0}{(m-1)!}x^{m-1}\\]
of `P` so that \\(P^{(j)}(0) = k_{m-j-1}\\).
Parameters:
    
parray_like or poly1d
    
Polynomial to integrate. A sequence is interpreted as polynomial coefficients, see `poly1d`.
mint, optional
    
Order of the antiderivative. (Default: 1)
klist of `m` scalars or scalar, optional
    
Integration constants. They are given in the order of integration: those corresponding to highest-order terms come first.
If `None` (default), all constants are assumed to be zero. If `m = 1`, a single scalar can be given instead of a list.
See also
`polyder`
    
derivative of a polynomial
`poly1d.integ`
    
equivalent method
#### Examples
The defining property of the antiderivative:
    
    >>> import numpy as np
    
    
    >>> p = np.poly1d([1,1,1])
    >>> P = np.polyint(p)
    >>> P
     poly1d([ 0.33333333,  0.5       ,  1.        ,  0.        ]) # may vary
    >>> np.polyder(P) == p
    True
    
The integration constants default to zero, but can be specified:
    
    >>> P = np.polyint(p, 3)
    >>> P(0)
    0.0
    >>> np.polyder(P)(0)
    0.0
    >>> np.polyder(P, 2)(0)
    0.0
    >>> P = np.polyint(p, 3, k=[6,5,3])
    >>> P
    poly1d([ 0.01666667,  0.04166667,  0.16666667,  3. ,  5. ,  3. ]) # may vary
    
Note that 3 = 6 / 2!, and that the constants are given in the order of integrations. Constant of the highest-order polynomial term comes first:
    
    >>> np.polyder(P, 2)(0)
    6.0
    >>> np.polyder(P, 1)(0)
    5.0
    >>> P(0)
    3.0
    
# numpy.polymul
numpy.polymul(a1, a2)[source]
    
Find the product of two polynomials.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Finds the polynomial resulting from the multiplication of the two input polynomials. Each input must be either a poly1d object or a 1D sequence of polynomial coefficients, from highest to lowest degree.
Parameters:
    
a1, a2array_like or poly1d object
    
Input polynomials.
Returns:
    
outndarray or poly1d object
    
The polynomial resulting from the multiplication of the inputs. If either inputs is a poly1d object, then the output is also a poly1d object. Otherwise, it is a 1D array of polynomial coefficients from highest to lowest degree.
See also
`poly1d`
    
A one-dimensional polynomial class.
`poly`, `polyadd`, `polyder`, `polydiv`, `polyfit`, `polyint`, `polysub`, `polyval`
`convolve`
    
Array convolution. Same output as polymul, but has parameter for overlap mode.
#### Examples
    
    >>> import numpy as np
    >>> np.polymul([1, 2, 3], [9, 5, 1])
    array([ 9, 23, 38, 17,  3])
    
Using poly1d objects:
    
    >>> p1 = np.poly1d([1, 2, 3])
    >>> p2 = np.poly1d([9, 5, 1])
    >>> print(p1)
       2
    1 x + 2 x + 3
    >>> print(p2)
       2
    9 x + 5 x + 1
    >>> print(np.polymul(p1, p2))
       4      3      2
    9 x + 23 x + 38 x + 17 x + 3
    
# numpy.polynomial.chebyshev.cheb2poly
polynomial.chebyshev.cheb2poly(c)[source]
    
Convert a Chebyshev series to a polynomial.
Convert an array representing the coefficients of a Chebyshev series, ordered from lowest degree to highest, to an array of the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest to highest degree.
Parameters:
    
carray_like
    
1-D array containing the Chebyshev series coefficients, ordered from lowest order term to highest.
Returns:
    
polndarray
    
1-D array containing the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest order term to highest.
See also
`poly2cheb`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy import polynomial as P
    >>> c = P.Chebyshev(range(4))
    >>> c
    Chebyshev([0., 1., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p = c.convert(kind=P.Polynomial)
    >>> p
    Polynomial([-2., -8.,  4., 12.], domain=[-1.,  1.], window=[-1.,  1.], ...
    >>> P.chebyshev.cheb2poly(range(4))
    array([-2.,  -8.,   4.,  12.])
    
# numpy.polynomial.chebyshev.chebadd
polynomial.chebyshev.chebadd(c1, c2)[source]
    
Add one Chebyshev series to another.
Returns the sum of two Chebyshev series `c1` \+ `c2`. The arguments are sequences of coefficients ordered from lowest order term to highest, i.e., [1,2,3] represents the series `T_0 + 2*T_1 + 3*T_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Chebyshev series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the Chebyshev series of their sum.
See also
`chebsub`, `chebmulx`, `chebmul`, `chebdiv`, `chebpow`
#### Notes
Unlike multiplication, division, etc., the sum of two Chebyshev series is a Chebyshev series (without having to “reproject” the result onto the basis set) so addition, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> C.chebadd(c1,c2)
    array([4., 4., 4.])
    
# numpy.polynomial.chebyshev.chebcompanion
polynomial.chebyshev.chebcompanion(c)[source]
    
Return the scaled companion matrix of c.
The basis polynomials are scaled so that the companion matrix is symmetric when `c` is a Chebyshev basis polynomial. This provides better eigenvalue estimates than the unscaled case and for basis polynomials the eigenvalues are guaranteed to be real if `numpy.linalg.eigvalsh` is used to obtain them.
Parameters:
    
carray_like
    
1-D array of Chebyshev series coefficients ordered from low to high degree.
Returns:
    
matndarray
    
Scaled companion matrix of dimensions (deg, deg).
# numpy.polynomial.chebyshev.chebder
polynomial.chebyshev.chebder(c, m=1, scl=1, axis=0)[source]
    
Differentiate a Chebyshev series.
Returns the Chebyshev series coefficients `c` differentiated `m` times along `axis`. At each iteration the result is multiplied by `scl` (the scaling factor is for use in a linear change of variable). The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `1*T_0 + 2*T_1 + 3*T_2` while [[1,2],[1,2]] represents `1*T_0(x)*T_0(y) + 1*T_1(x)*T_0(y) + 2*T_0(x)*T_1(y) + 2*T_1(x)*T_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Chebyshev series coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Number of derivatives taken, must be non-negative. (Default: 1)
sclscalar, optional
    
Each differentiation is multiplied by `scl`. The end result is multiplication by `scl**m`. This is for use in a linear change of variable. (Default: 1)
axisint, optional
    
Axis over which the derivative is taken. (Default: 0).
Returns:
    
derndarray
    
Chebyshev series of the derivative.
See also
`chebint`
#### Notes
In general, the result of differentiating a C-series needs to be “reprojected” onto the C-series basis set. Thus, typically, the result of this function is “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> c = (1,2,3,4)
    >>> C.chebder(c)
    array([14., 12., 24.])
    >>> C.chebder(c,3)
    array([96.])
    >>> C.chebder(c,scl=-1)
    array([-14., -12., -24.])
    >>> C.chebder(c,2,-1)
    array([12.,  96.])
    
# numpy.polynomial.chebyshev.chebdiv
polynomial.chebyshev.chebdiv(c1, c2)[source]
    
Divide one Chebyshev series by another.
Returns the quotient-with-remainder of two Chebyshev series `c1` / `c2`. The arguments are sequences of coefficients from lowest order “term” to highest, e.g., [1,2,3] represents the series `T_0 + 2*T_1 + 3*T_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Chebyshev series coefficients ordered from low to high.
Returns:
    
[quo, rem]ndarrays
    
Of Chebyshev series coefficients representing the quotient and remainder.
See also
`chebadd`, `chebsub`, `chebmulx`, `chebmul`, `chebpow`
#### Notes
In general, the (polynomial) division of one C-series by another results in quotient and remainder terms that are not in the Chebyshev polynomial basis set. Thus, to express these results as C-series, it is typically necessary to “reproject” the results onto said basis set, which typically produces “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> C.chebdiv(c1,c2) # quotient "intuitive," remainder not
    (array([3.]), array([-8., -4.]))
    >>> c2 = (0,1,2,3)
    >>> C.chebdiv(c2,c1) # neither "intuitive"
    (array([0., 2.]), array([-2., -4.]))
    
# numpy.polynomial.chebyshev.chebdomain
polynomial.chebyshev.chebdomain=array([-1., 1.]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.chebyshev.chebfit
polynomial.chebyshev.chebfit(x, y, deg, rcond=None, full=False, w=None)[source]
    
Least squares fit of Chebyshev series to data.
Return the coefficients of a Chebyshev series of degree `deg` that is the least squares fit to the data values `y` given at points `x`. If `y` is 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple fits are done, one for each column of `y`, and the resulting coefficients are stored in the corresponding columns of a 2-D return. The fitted polynomial(s) are in the form
\\[p(x) = c_0 + c_1 * T_1(x) + ... + c_n * T_n(x),\\]
where `n` is `deg`.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer, all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (`M`,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
Returns:
    
coefndarray, shape (M,) or (M, K)
    
Chebyshev coefficients ordered from low to high. If `y` was 2-D, the coefficients for the data in column k of `y` are in column `k`.
[residuals, rank, singular_values, rcond]list
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * singular_values – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full == False`. The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`numpy.polynomial.polynomial.polyfit`
`numpy.polynomial.legendre.legfit`
`numpy.polynomial.laguerre.lagfit`
`numpy.polynomial.hermite.hermfit`
`numpy.polynomial.hermite_e.hermefit`
`chebval`
    
Evaluates a Chebyshev series.
`chebvander`
    
Vandermonde matrix of Chebyshev series.
`chebweight`
    
Chebyshev weight function.
`numpy.linalg.lstsq`
    
Computes a least-squares fit from the matrix.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution is the coefficients of the Chebyshev series `p` that minimizes the sum of the weighted squared errors
\\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\\]
where \\(w_j\\) are the weights. This problem is solved by setting up as the (typically) overdetermined matrix equation
\\[V(x) * c = w * y,\\]
where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the coefficients to be solved for, `w` are the weights, and `y` are the observed values. This equation is then solved using the singular value decomposition of `V`.
If some of the singular values of `V` are so small that they are neglected, then a `RankWarning` will be issued. This means that the coefficient values may be poorly determined. Using a lower order fit will usually get rid of the warning. The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious and have large contributions from roundoff error.
Fits using Chebyshev series are usually better conditioned than fits using power series, but much can depend on the distribution of the sample points and the smoothness of the data. If the quality of the fit is inadequate splines may be a good alternative.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
# numpy.polynomial.chebyshev.chebfromroots
polynomial.chebyshev.chebfromroots(roots)[source]
    
Generate a Chebyshev series with given roots.
The function returns the coefficients of the polynomial
\\[p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),\\]
in Chebyshev form, where the \\(r_n\\) are the roots specified in `roots`. If a zero has multiplicity n, then it must appear in `roots` n times. For instance, if 2 is a root of multiplicity three and 3 is a root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The roots can appear in any order.
If the returned coefficients are `c`, then
\\[p(x) = c_0 + c_1 * T_1(x) + ... + c_n * T_n(x)\\]
The coefficient of the last term is not generally 1 for monic polynomials in Chebyshev form.
Parameters:
    
rootsarray_like
    
Sequence containing the roots.
Returns:
    
outndarray
    
1-D array of coefficients. If all roots are real then `out` is a real array, if some of the roots are complex, then `out` is complex even if all the coefficients in the result are real (see Examples below).
See also
`numpy.polynomial.polynomial.polyfromroots`
`numpy.polynomial.legendre.legfromroots`
`numpy.polynomial.laguerre.lagfromroots`
`numpy.polynomial.hermite.hermfromroots`
`numpy.polynomial.hermite_e.hermefromroots`
#### Examples
    
    >>> import numpy.polynomial.chebyshev as C
    >>> C.chebfromroots((-1,0,1)) # x^3 - x relative to the standard basis
    array([ 0.  , -0.25,  0.  ,  0.25])
    >>> j = complex(0,1)
    >>> C.chebfromroots((-j,j)) # x^2 + 1 relative to the standard basis
    array([1.5+0.j, 0. +0.j, 0.5+0.j])
    
# numpy.polynomial.chebyshev.chebgauss
polynomial.chebyshev.chebgauss(deg)[source]
    
Gauss-Chebyshev quadrature.
Computes the sample points and weights for Gauss-Chebyshev quadrature. These sample points and weights will correctly integrate polynomials of degree \\(2*deg - 1\\) or less over the interval \\([-1, 1]\\) with the weight function \\(f(x) = 1/\sqrt{1 - x^2}\\).
Parameters:
    
degint
    
Number of sample points and weights. It must be >= 1.
Returns:
    
xndarray
    
1-D ndarray containing the sample points.
yndarray
    
1-D ndarray containing the weights.
#### Notes
The results have only been tested up to degree 100, higher degrees may be problematic. For Gauss-Chebyshev there are closed form solutions for the sample points and weights. If n = `deg`, then
\\[x_i = \cos(\pi (2 i - 1) / (2 n))\\]
\\[w_i = \pi / n\\]
# numpy.polynomial.chebyshev.chebgrid2d
polynomial.chebyshev.chebgrid2d(x, y, c)[source]
    
Evaluate a 2-D Chebyshev series on the Cartesian product of x and y.
This function returns the values:
\\[p(a,b) = \sum_{i,j} c_{i,j} * T_i(a) * T_j(b),\\]
where the points `(a, b)` consist of all pairs formed by taking `a` from `x` and `b` from `y`. The resulting points form a grid with `x` in the first dimension and `y` in the second.
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape + y.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points in the Cartesian product of `x` and `y`. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional Chebyshev series at points in the Cartesian product of `x` and `y`.
See also
`chebval`, `chebval2d`, `chebval3d`, `chebgrid3d`
# numpy.polynomial.chebyshev.chebgrid3d
polynomial.chebyshev.chebgrid3d(x, y, z, c)[source]
    
Evaluate a 3-D Chebyshev series on the Cartesian product of x, y, and z.
This function returns the values:
\\[p(a,b,c) = \sum_{i,j,k} c_{i,j,k} * T_i(a) * T_j(b) * T_k(c)\\]
where the points `(a, b, c)` consist of all triples formed by taking `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form a grid with `x` in the first dimension, `y` in the second, and `z` in the third.
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than three dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape + y.shape + z.shape.
Parameters:
    
x, y, zarray_like, compatible objects
    
The three dimensional series is evaluated at the points in the Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`chebval`, `chebval2d`, `chebgrid2d`, `chebval3d`
# numpy.polynomial.chebyshev.chebint
polynomial.chebyshev.chebint(c, m=1, k=[], lbnd=0, scl=1, axis=0)[source]
    
Integrate a Chebyshev series.
Returns the Chebyshev series coefficients `c` integrated `m` times from `lbnd` along `axis`. At each iteration the resulting series is multiplied by `scl` and an integration constant, `k`, is added. The scaling factor is for use in a linear change of variable. (“Buyer beware”: note that, depending on what one is doing, one may want `scl` to be the reciprocal of what one might expect; for more information, see the Notes section below.) The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `T_0 + 2*T_1 + 3*T_2` while [[1,2],[1,2]] represents `1*T_0(x)*T_0(y) + 1*T_1(x)*T_0(y) + 2*T_0(x)*T_1(y) + 2*T_1(x)*T_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Chebyshev series coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Order of integration, must be positive. (Default: 1)
k{[], list, scalar}, optional
    
Integration constant(s). The value of the first integral at zero is the first value in the list, the value of the second integral at zero is the second value, etc. If `k == []` (the default), all constants are set to zero. If `m == 1`, a single scalar can be given instead of a list.
lbndscalar, optional
    
The lower bound of the integral. (Default: 0)
sclscalar, optional
    
Following each integration the result is multiplied by `scl` before the integration constant is added. (Default: 1)
axisint, optional
    
Axis over which the integral is taken. (Default: 0).
Returns:
    
Sndarray
    
C-series coefficients of the integral.
Raises:
    
ValueError
    
If `m < 1`, `len(k) > m`, `np.ndim(lbnd) != 0`, or `np.ndim(scl) != 0`.
See also
`chebder`
#### Notes
Note that the result of each integration is multiplied by `scl`. Why is this important to note? Say one is making a linear change of variable \\(u = ax + b\\) in an integral relative to `x`. Then \\(dx = du/a\\), so one will need to set `scl` equal to \\(1/a\\)\- perhaps not what one would have first thought.
Also note that, in general, the result of integrating a C-series needs to be “reprojected” onto the C-series basis set. Thus, typically, the result of this function is “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> c = (1,2,3)
    >>> C.chebint(c)
    array([ 0.5, -0.5,  0.5,  0.5])
    >>> C.chebint(c,3)
    array([ 0.03125   , -0.1875    ,  0.04166667, -0.05208333,  0.01041667, # may vary
        0.00625   ])
    >>> C.chebint(c, k=3)
    array([ 3.5, -0.5,  0.5,  0.5])
    >>> C.chebint(c,lbnd=-2)
    array([ 8.5, -0.5,  0.5,  0.5])
    >>> C.chebint(c,scl=-2)
    array([-1.,  1., -1., -1.])
    
# numpy.polynomial.chebyshev.chebinterpolate
polynomial.chebyshev.chebinterpolate(func, deg, args=())[source]
    
Interpolate a function at the Chebyshev points of the first kind.
Returns the Chebyshev series that interpolates `func` at the Chebyshev points of the first kind in the interval [-1, 1]. The interpolating series tends to a minmax approximation to `func` with increasing `deg` if the function is continuous in the interval.
Parameters:
    
funcfunction
    
The function to be approximated. It must be a function of a single variable of the form `f(x, a, b, c...)`, where `a, b, c...` are extra arguments passed in the `args` parameter.
degint
    
Degree of the interpolating polynomial
argstuple, optional
    
Extra arguments to be used in the function call. Default is no extra arguments.
Returns:
    
coefndarray, shape (deg + 1,)
    
Chebyshev coefficients of the interpolating series ordered from low to high.
#### Notes
The Chebyshev polynomials used in the interpolation are orthogonal when sampled at the Chebyshev points of the first kind. If it is desired to constrain some of the coefficients they can simply be set to the desired value after the interpolation, no new interpolation or fit is needed. This is especially useful if it is known apriori that some of coefficients are zero. For instance, if the function is even then the coefficients of the terms of odd degree in the result can be set to zero.
#### Examples
    
    >>> import numpy.polynomial.chebyshev as C
    >>> C.chebinterpolate(lambda x: np.tanh(x) + 0.5, 8)
    array([  5.00000000e-01,   8.11675684e-01,  -9.86864911e-17,
            -5.42457905e-02,  -2.71387850e-16,   4.51658839e-03,
             2.46716228e-17,  -3.79694221e-04,  -3.26899002e-16])
    
# numpy.polynomial.chebyshev.chebline
polynomial.chebyshev.chebline(off, scl)[source]
    
Chebyshev series whose graph is a straight line.
Parameters:
    
off, sclscalars
    
The specified line is given by `off + scl*x`.
Returns:
    
yndarray
    
This module’s representation of the Chebyshev series for `off + scl*x`.
See also
`numpy.polynomial.polynomial.polyline`
`numpy.polynomial.legendre.legline`
`numpy.polynomial.laguerre.lagline`
`numpy.polynomial.hermite.hermline`
`numpy.polynomial.hermite_e.hermeline`
#### Examples
    
    >>> import numpy.polynomial.chebyshev as C
    >>> C.chebline(3,2)
    array([3, 2])
    >>> C.chebval(-3, C.chebline(3,2)) # should be -3
    -3.0
    
# numpy.polynomial.chebyshev.chebmul
polynomial.chebyshev.chebmul(c1, c2)[source]
    
Multiply one Chebyshev series by another.
Returns the product of two Chebyshev series `c1` * `c2`. The arguments are sequences of coefficients, from lowest order “term” to highest, e.g., [1,2,3] represents the series `T_0 + 2*T_1 + 3*T_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Chebyshev series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Chebyshev series coefficients representing their product.
See also
`chebadd`, `chebsub`, `chebmulx`, `chebdiv`, `chebpow`
#### Notes
In general, the (polynomial) product of two C-series results in terms that are not in the Chebyshev polynomial basis set. Thus, to express the product as a C-series, it is typically necessary to “reproject” the product onto said basis set, which typically produces “unintuitive live” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> C.chebmul(c1,c2) # multiplication requires "reprojection"
    array([  6.5,  12. ,  12. ,   4. ,   1.5])
    
# numpy.polynomial.chebyshev.chebmulx
polynomial.chebyshev.chebmulx(c)[source]
    
Multiply a Chebyshev series by x.
Multiply the polynomial `c` by x, where x is the independent variable.
Parameters:
    
carray_like
    
1-D array of Chebyshev series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the result of the multiplication.
See also
`chebadd`, `chebsub`, `chebmul`, `chebdiv`, `chebpow`
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> C.chebmulx([1,2,3])
    array([1. , 2.5, 1. , 1.5])
    
# numpy.polynomial.chebyshev.chebone
polynomial.chebyshev.chebone=array([1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.chebyshev.chebpow
polynomial.chebyshev.chebpow(c, pow, maxpower=16)[source]
    
Raise a Chebyshev series to a power.
Returns the Chebyshev series `c` raised to the power `pow`. The argument `c` is a sequence of coefficients ordered from low to high. i.e., [1,2,3] is the series `T_0 + 2*T_1 + 3*T_2.`
Parameters:
    
carray_like
    
1-D array of Chebyshev series coefficients ordered from low to high.
powinteger
    
Power to which the series will be raised
maxpowerinteger, optional
    
Maximum power allowed. This is mainly to limit growth of the series to unmanageable size. Default is 16
Returns:
    
coefndarray
    
Chebyshev series of power.
See also
`chebadd`, `chebsub`, `chebmulx`, `chebmul`, `chebdiv`
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> C.chebpow([1, 2, 3, 4], 2)
    array([15.5, 22. , 16. , ..., 12.5, 12. ,  8. ])
    
# numpy.polynomial.chebyshev.chebpts1
polynomial.chebyshev.chebpts1(npts)[source]
    
Chebyshev points of the first kind.
The Chebyshev points of the first kind are the points `cos(x)`, where `x = [pi*(k + .5)/npts for k in range(npts)]`.
Parameters:
    
nptsint
    
Number of sample points desired.
Returns:
    
ptsndarray
    
The Chebyshev points of the first kind.
See also
`chebpts2`
# numpy.polynomial.chebyshev.chebpts2
polynomial.chebyshev.chebpts2(npts)[source]
    
Chebyshev points of the second kind.
The Chebyshev points of the second kind are the points `cos(x)`, where `x = [pi*k/(npts - 1) for k in range(npts)]` sorted in ascending order.
Parameters:
    
nptsint
    
Number of sample points desired.
Returns:
    
ptsndarray
    
The Chebyshev points of the second kind.
# numpy.polynomial.chebyshev.chebroots
polynomial.chebyshev.chebroots(c)[source]
    
Compute the roots of a Chebyshev series.
Return the roots (a.k.a. “zeros”) of the polynomial
\\[p(x) = \sum_i c[i] * T_i(x).\\]
Parameters:
    
c1-D array_like
    
1-D array of coefficients.
Returns:
    
outndarray
    
Array of the roots of the series. If all the roots are real, then `out` is also real, otherwise it is complex.
See also
`numpy.polynomial.polynomial.polyroots`
`numpy.polynomial.legendre.legroots`
`numpy.polynomial.laguerre.lagroots`
`numpy.polynomial.hermite.hermroots`
`numpy.polynomial.hermite_e.hermeroots`
#### Notes
The root estimates are obtained as the eigenvalues of the companion matrix, Roots far from the origin of the complex plane may have large errors due to the numerical instability of the series for such values. Roots with multiplicity greater than 1 will also show larger errors as the value of the series near such points is relatively insensitive to errors in the roots. Isolated roots near the origin can be improved by a few iterations of Newton’s method.
The Chebyshev series basis polynomials aren’t powers of `x` so the results of this function may seem unintuitive.
#### Examples
    
    >>> import numpy.polynomial.chebyshev as cheb
    >>> cheb.chebroots((-1, 1,-1, 1)) # T3 - T2 + T1 - T0 has real roots
    array([ -5.00000000e-01,   2.60860684e-17,   1.00000000e+00]) # may vary
    
# numpy.polynomial.chebyshev.chebsub
polynomial.chebyshev.chebsub(c1, c2)[source]
    
Subtract one Chebyshev series from another.
Returns the difference of two Chebyshev series `c1` \- `c2`. The sequences of coefficients are from lowest order term to highest, i.e., [1,2,3] represents the series `T_0 + 2*T_1 + 3*T_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Chebyshev series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Chebyshev series coefficients representing their difference.
See also
`chebadd`, `chebmulx`, `chebmul`, `chebdiv`, `chebpow`
#### Notes
Unlike multiplication, division, etc., the difference of two Chebyshev series is a Chebyshev series (without having to “reproject” the result onto the basis set) so subtraction, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial import chebyshev as C
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> C.chebsub(c1,c2)
    array([-2.,  0.,  2.])
    >>> C.chebsub(c2,c1) # -C.chebsub(c1,c2)
    array([ 2.,  0., -2.])
    
# numpy.polynomial.chebyshev.chebtrim
polynomial.chebyshev.chebtrim(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.chebyshev.chebval
polynomial.chebyshev.chebval(x, c, tensor=True)[source]
    
Evaluate a Chebyshev series at points x.
If `c` is of length `n + 1`, this function returns the value:
\\[p(x) = c_0 * T_0(x) + c_1 * T_1(x) + ... + c_n * T_n(x)\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array, then `p(x)` will have the same shape as `x`. If `c` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is true the shape will be c.shape[1:] + x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that scalars have shape (,).
Trailing zeros in the coefficients will be used in the evaluation, so they should be avoided if efficiency is a concern.
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with themselves and with the elements of `c`.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree n are contained in c[n]. If `c` is multidimensional the remaining indices enumerate multiple polynomials. In the two dimensional case the coefficients may be thought of as stored in the columns of `c`.
tensorboolean, optional
    
If True, the shape of the coefficient array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `c` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `c` for the evaluation. This keyword is useful when `c` is multidimensional. The default value is True.
Returns:
    
valuesndarray, algebra_like
    
The shape of the return value is described above.
See also
`chebval2d`, `chebgrid2d`, `chebval3d`, `chebgrid3d`
#### Notes
The evaluation uses Clenshaw recursion, aka synthetic division.
# numpy.polynomial.chebyshev.chebval2d
polynomial.chebyshev.chebval2d(x, y, c)[source]
    
Evaluate a 2-D Chebyshev series at points (x, y).
This function returns the values:
\\[p(x,y) = \sum_{i,j} c_{i,j} * T_i(x) * T_j(y)\\]
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array a one is implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points `(x, y)`, where `x` and `y` must have the same shape. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than 2 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional Chebyshev series at points formed from pairs of corresponding values from `x` and `y`.
See also
`chebval`, `chebgrid2d`, `chebval3d`, `chebgrid3d`
# numpy.polynomial.chebyshev.chebval3d
polynomial.chebyshev.chebval3d(x, y, z, c)[source]
    
Evaluate a 3-D Chebyshev series at points (x, y, z).
This function returns the values:
\\[p(x,y,z) = \sum_{i,j,k} c_{i,j,k} * T_i(x) * T_j(y) * T_k(z)\\]
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than 3 dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape.
Parameters:
    
x, y, zarray_like, compatible object
    
The three dimensional series is evaluated at the points `(x, y, z)`, where `x`, `y`, and `z` must have the same shape. If any of `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j,k is contained in `c[i,j,k]`. If `c` has dimension greater than 3 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the multidimensional polynomial on points formed with triples of corresponding values from `x`, `y`, and `z`.
See also
`chebval`, `chebval2d`, `chebgrid2d`, `chebgrid3d`
# numpy.polynomial.chebyshev.chebvander
polynomial.chebyshev.chebvander(x, deg)[source]
    
Pseudo-Vandermonde matrix of given degree.
Returns the pseudo-Vandermonde matrix of degree `deg` and sample points `x`. The pseudo-Vandermonde matrix is defined by
\\[V[..., i] = T_i(x),\\]
where `0 <= i <= deg`. The leading indices of `V` index the elements of `x` and the last index is the degree of the Chebyshev polynomial.
If `c` is a 1-D array of coefficients of length `n + 1` and `V` is the matrix `V = chebvander(x, n)`, then `np.dot(V, c)` and `chebval(x, c)` are the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of Chebyshev series of the same degree and sample points.
Parameters:
    
xarray_like
    
Array of points. The dtype is converted to float64 or complex128 depending on whether any of the elements are complex. If `x` is scalar it is converted to a 1-D array.
degint
    
Degree of the resulting matrix.
Returns:
    
vanderndarray
    
The pseudo Vandermonde matrix. The shape of the returned matrix is `x.shape + (deg + 1,)`, where The last index is the degree of the corresponding Chebyshev polynomial. The dtype will be the same as the converted `x`.
# numpy.polynomial.chebyshev.chebvander2d
polynomial.chebyshev.chebvander2d(x, y, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y)`. The pseudo-Vandermonde matrix is defined by
\\[V[..., (deg[1] + 1)*i + j] = T_i(x) * T_j(y),\\]
where `0 <= i <= deg[0]` and `0 <= j <= deg[1]`. The leading indices of `V` index the points `(x, y)` and the last index encodes the degrees of the Chebyshev polynomials.
If `V = chebvander2d(x, y, [xdeg, ydeg])`, then the columns of `V` correspond to the elements of a 2-D coefficient array `c` of shape (xdeg + 1, ydeg + 1) in the order
\\[c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...\\]
and `np.dot(V, c.flat)` and `chebval2d(x, y, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 2-D Chebyshev series of the same degrees and sample points.
Parameters:
    
x, yarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg].
Returns:
    
vander2dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)\\). The dtype will be the same as the converted `x` and `y`.
See also
`chebvander`, `chebvander3d`, `chebval2d`, `chebval3d`
# numpy.polynomial.chebyshev.chebvander3d
polynomial.chebyshev.chebvander3d(x, y, z, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y, z)`. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`, then The pseudo-Vandermonde matrix is defined by
\\[V[..., (m+1)(n+1)i + (n+1)j + k] = T_i(x)*T_j(y)*T_k(z),\\]
where `0 <= i <= l`, `0 <= j <= m`, and `0 <= j <= n`. The leading indices of `V` index the points `(x, y, z)` and the last index encodes the degrees of the Chebyshev polynomials.
If `V = chebvander3d(x, y, z, [xdeg, ydeg, zdeg])`, then the columns of `V` correspond to the elements of a 3-D coefficient array `c` of shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
\\[c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...\\]
and `np.dot(V, c.flat)` and `chebval3d(x, y, z, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 3-D Chebyshev series of the same degrees and sample points.
Parameters:
    
x, y, zarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg, z_deg].
Returns:
    
vander3dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)\\). The dtype will be the same as the converted `x`, `y`, and `z`.
See also
`chebvander`, `chebvander3d`, `chebval2d`, `chebval3d`
# numpy.polynomial.chebyshev.chebweight
polynomial.chebyshev.chebweight(x)[source]
    
The weight function of the Chebyshev polynomials.
The weight function is \\(1/\sqrt{1 - x^2}\\) and the interval of integration is \\([-1, 1]\\). The Chebyshev polynomials are orthogonal, but not normalized, with respect to this weight function.
Parameters:
    
xarray_like
    
Values at which the weight function will be computed.
Returns:
    
wndarray
    
The weight function at `x`.
# numpy.polynomial.chebyshev.chebx
polynomial.chebyshev.chebx=array([0, 1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.chebyshev.Chebyshev.__call__
method
polynomial.chebyshev.Chebyshev.__call__(arg)[source]
    
Call self as a function.
# numpy.polynomial.chebyshev.Chebyshev.basis
method
classmethodpolynomial.chebyshev.Chebyshev.basis(deg, domain=None, window=None, symbol='x')[source]
    
Series basis polynomial of degree `deg`.
Returns the series representing the basis polynomial of degree `deg`.
Parameters:
    
degint
    
Degree of the basis polynomial for the series. Must be >= 0.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series with the coefficient of the `deg` term set to one and all others zero.
# numpy.polynomial.chebyshev.Chebyshev.cast
method
classmethodpolynomial.chebyshev.Chebyshev.cast(series, domain=None, window=None)[source]
    
Convert series to series of this class.
The `series` is expected to be an instance of some polynomial series of one of the types supported by by the numpy.polynomial module, but could be some other class that supports the convert method.
Parameters:
    
seriesseries
    
The series instance to be converted.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
Returns:
    
new_seriesseries
    
A series of the same kind as the calling class and equal to `series` when evaluated.
See also
`convert`
    
similar instance method
# numpy.polynomial.chebyshev.Chebyshev.convert
method
polynomial.chebyshev.Chebyshev.convert(domain=None, kind=None, window=None)[source]
    
Convert series to a different kind and/or domain and/or window.
Parameters:
    
domainarray_like, optional
    
The domain of the converted series. If the value is None, the default domain of `kind` is used.
kindclass, optional
    
The polynomial series type class to which the current instance should be converted. If kind is None, then the class of the current instance is used.
windowarray_like, optional
    
The window of the converted series. If the value is None, the default window of `kind` is used.
Returns:
    
new_seriesseries
    
The returned class can be of different type than the current instance and/or have a different domain and/or different window.
#### Notes
Conversion between domains and class types can result in numerically ill defined series.
# numpy.polynomial.chebyshev.Chebyshev.copy
method
polynomial.chebyshev.Chebyshev.copy()[source]
    
Return a copy.
Returns:
    
new_seriesseries
    
Copy of self.
# numpy.polynomial.chebyshev.Chebyshev.cutdeg
method
polynomial.chebyshev.Chebyshev.cutdeg(deg)[source]
    
Truncate series to the given degree.
Reduce the degree of the series to `deg` by discarding the high order terms. If `deg` is greater than the current degree a copy of the current series is returned. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
degnon-negative int
    
The series is reduced to degree `deg` by discarding the high order terms. The value of `deg` must be a non-negative integer.
Returns:
    
new_seriesseries
    
New instance of series with reduced degree.
# numpy.polynomial.chebyshev.Chebyshev.degree
method
polynomial.chebyshev.Chebyshev.degree()[source]
    
The degree of the series.
Returns:
    
degreeint
    
Degree of the series, one less than the number of coefficients.
#### Examples
Create a polynomial object for `1 + 7*x + 4*x**2`:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 4])
    >>> print(poly)
    1.0 + 7.0·x + 4.0·x²
    >>> poly.degree()
    2
    
Note that this method does not check for non-zero coefficients. You must trim the polynomial to remove any trailing zeroes:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 0])
    >>> print(poly)
    1.0 + 7.0·x + 0.0·x²
    >>> poly.degree()
    2
    >>> poly.trim().degree()
    1
    
# numpy.polynomial.chebyshev.Chebyshev.deriv
method
polynomial.chebyshev.Chebyshev.deriv(m=1)[source]
    
Differentiate.
Return a series instance of that is the derivative of the current series.
Parameters:
    
mnon-negative int
    
Find the derivative of order `m`.
Returns:
    
new_seriesseries
    
A new series representing the derivative. The domain is the same as the domain of the differentiated series.
# numpy.polynomial.chebyshev.Chebyshev.domain
attribute
polynomial.chebyshev.Chebyshev.domain=array([-1., 1.]) 
# numpy.polynomial.chebyshev.Chebyshev.fit
method
classmethodpolynomial.chebyshev.Chebyshev.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')[source]
    
Least squares fit to data.
Return a series instance that is the least squares fit to the data `y` sampled at `x`. The domain of the returned instance can be specified and this will often result in a superior fit with less chance of ill conditioning.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,)
    
y-coordinates of the M sample points `(x[i], y[i])`.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
domain{None, [beg, end], []}, optional
    
Domain to use for the returned series. If `None`, then a minimal domain that covers the points `x` is chosen. If `[]` the class domain is used. The default value was the class domain in NumPy 1.4 and `None` in later versions. The `[]` option was added in numpy 1.5.0.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
window{[beg, end]}, optional
    
Window to use for the returned series. The default value is the default class domain
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series that represents the least squares fit to the data and has the domain and window specified in the call. If the coefficients for the unscaled and unshifted basis polynomials are of interest, do `new_series.convert().coef`.
[resid, rank, sv, rcond]list
    
These values are only returned if `full == True`
  * resid – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * sv – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `linalg.lstsq`.
# numpy.polynomial.chebyshev.Chebyshev.fromroots
method
classmethodpolynomial.chebyshev.Chebyshev.fromroots(roots, domain=[], window=None, symbol='x')[source]
    
Return series instance that has the specified roots.
Returns a series representing the product `(x - r[0])*(x - r[1])*...*(x - r[n-1])`, where `r` is a list of roots.
Parameters:
    
rootsarray_like
    
List of roots.
domain{[], None, array_like}, optional
    
Domain for the resulting series. If None the domain is the interval from the smallest root to the largest. If [] the domain is the class domain. The default is [].
window{None, array_like}, optional
    
Window for the returned series. If None the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series with the specified roots.
# numpy.polynomial.chebyshev.Chebyshev.has_samecoef
method
polynomial.chebyshev.Chebyshev.has_samecoef(other)[source]
    
Check if coefficients match.
Parameters:
    
otherclass instance
    
The other class must have the `coef` attribute.
Returns:
    
boolboolean
    
True if the coefficients are the same, False otherwise.
# numpy.polynomial.chebyshev.Chebyshev.has_samedomain
method
polynomial.chebyshev.Chebyshev.has_samedomain(other)[source]
    
Check if domains match.
Parameters:
    
otherclass instance
    
The other class must have the `domain` attribute.
Returns:
    
boolboolean
    
True if the domains are the same, False otherwise.
# numpy.polynomial.chebyshev.Chebyshev.has_sametype
method
polynomial.chebyshev.Chebyshev.has_sametype(other)[source]
    
Check if types match.
Parameters:
    
otherobject
    
Class instance.
Returns:
    
boolboolean
    
True if other is same class as self
# numpy.polynomial.chebyshev.Chebyshev.has_samewindow
method
polynomial.chebyshev.Chebyshev.has_samewindow(other)[source]
    
Check if windows match.
Parameters:
    
otherclass instance
    
The other class must have the `window` attribute.
Returns:
    
boolboolean
    
True if the windows are the same, False otherwise.
# numpy.polynomial.chebyshev.Chebyshev
classnumpy.polynomial.chebyshev.Chebyshev(coef, domain=None, window=None, symbol='x')[source]
    
A Chebyshev series class.
The Chebyshev class provides the standard Python numerical methods ‘+’, ‘-’, ‘*’, ‘//’, ‘%’, ‘divmod’, ‘**’, and ‘()’ as well as the attributes and methods listed below.
Parameters:
    
coefarray_like
    
Chebyshev coefficients in order of increasing degree, i.e., `(1, 2, 3)` gives `1*T_0(x) + 2*T_1(x) + 3*T_2(x)`.
domain(2,) array_like, optional
    
Domain to use. The interval `[domain[0], domain[1]]` is mapped to the interval `[window[0], window[1]]` by shifting and scaling. The default value is [-1., 1.].
window(2,) array_like, optional
    
Window, see `domain` for its use. The default value is [-1., 1.].
symbolstr, optional
    
Symbol used to represent the independent variable in string representations of the polynomial expression, e.g. for printing. The symbol must be a valid Python identifier. Default value is ‘x’.
New in version 1.24.
Attributes:
    
symbol
#### Methods
`__call__`(arg)
Call self as a function.  
`basis`(deg[, domain, window, symbol])
Series basis polynomial of degree `deg`.  
`cast`(series[, domain, window])
Convert series to series of this class.  
`convert`([domain, kind, window])
Convert series to a different kind and/or domain and/or window.  
`copy`()
Return a copy.  
`cutdeg`(deg)
Truncate series to the given degree.  
`degree`()
The degree of the series.  
`deriv`([m])
Differentiate.  
`fit`(x, y, deg[, domain, rcond, full, w, ...])
Least squares fit to data.  
`fromroots`(roots[, domain, window, symbol])
Return series instance that has the specified roots.  
`has_samecoef`(other)
Check if coefficients match.  
`has_samedomain`(other)
Check if domains match.  
`has_sametype`(other)
Check if types match.  
`has_samewindow`(other)
Check if windows match.  
`identity`([domain, window, symbol])
Identity function.  
`integ`([m, k, lbnd])
Integrate.  
`interpolate`(func, deg[, domain, args])
Interpolate a function at the Chebyshev points of the first kind.  
`linspace`([n, domain])
Return x, y values at equally spaced points in domain.  
`mapparms`()
Return the mapping parameters.  
`roots`()
Return the roots of the series polynomial.  
`trim`([tol])
Remove trailing coefficients  
`truncate`(size)
Truncate series to length `size`.  
# numpy.polynomial.chebyshev.Chebyshev.identity
method
classmethodpolynomial.chebyshev.Chebyshev.identity(domain=None, window=None, symbol='x')[source]
    
Identity function.
If `p` is the returned series, then `p(x) == x` for all values of x.
Parameters:
    
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series of representing the identity.
# numpy.polynomial.chebyshev.Chebyshev.integ
method
polynomial.chebyshev.Chebyshev.integ(m=1, k=[], lbnd=None)[source]
    
Integrate.
Return a series instance that is the definite integral of the current series.
Parameters:
    
mnon-negative int
    
The number of integrations to perform.
karray_like
    
Integration constants. The first constant is applied to the first integration, the second to the second, and so on. The list of values must less than or equal to `m` in length and any missing values are set to zero.
lbndScalar
    
The lower bound of the definite integral.
Returns:
    
new_seriesseries
    
A new series representing the integral. The domain is the same as the domain of the integrated series.
# numpy.polynomial.chebyshev.Chebyshev.interpolate
method
classmethodpolynomial.chebyshev.Chebyshev.interpolate(func, deg, domain=None, args=())[source]
    
Interpolate a function at the Chebyshev points of the first kind.
Returns the series that interpolates `func` at the Chebyshev points of the first kind scaled and shifted to the `domain`. The resulting series tends to a minmax approximation of `func` when the function is continuous in the domain.
Parameters:
    
funcfunction
    
The function to be interpolated. It must be a function of a single variable of the form `f(x, a, b, c...)`, where `a, b, c...` are extra arguments passed in the `args` parameter.
degint
    
Degree of the interpolating polynomial.
domain{None, [beg, end]}, optional
    
Domain over which `func` is interpolated. The default is None, in which case the domain is [-1, 1].
argstuple, optional
    
Extra arguments to be used in the function call. Default is no extra arguments.
Returns:
    
polynomialChebyshev instance
    
Interpolating Chebyshev instance.
#### Notes
See `numpy.polynomial.chebinterpolate` for more details.
# numpy.polynomial.chebyshev.Chebyshev.linspace
method
polynomial.chebyshev.Chebyshev.linspace(n=100, domain=None)[source]
    
Return x, y values at equally spaced points in domain.
Returns the x, y values at `n` linearly spaced points across the domain. Here y is the value of the polynomial at the points x. By default the domain is the same as that of the series instance. This method is intended mostly as a plotting aid.
Parameters:
    
nint, optional
    
Number of point pairs to return. The default value is 100.
domain{None, array_like}, optional
    
If not None, the specified domain is used instead of that of the calling instance. It should be of the form `[beg,end]`. The default is None which case the class domain is used.
Returns:
    
x, yndarray
    
x is equal to linspace(self.domain[0], self.domain[1], n) and y is the series evaluated at element of x.
# numpy.polynomial.chebyshev.Chebyshev.mapparms
method
polynomial.chebyshev.Chebyshev.mapparms()[source]
    
Return the mapping parameters.
The returned values define a linear map `off + scl*x` that is applied to the input arguments before the series is evaluated. The map depends on the `domain` and `window`; if the current `domain` is equal to the `window` the resulting map is the identity. If the coefficients of the series instance are to be used by themselves outside this class, then the linear function must be substituted for the `x` in the standard representation of the base polynomials.
Returns:
    
off, sclfloat or complex
    
The mapping function is defined by `off + scl*x`.
#### Notes
If the current domain is the interval `[l1, r1]` and the window is `[l2, r2]`, then the linear mapping function `L` is defined by the equations:
    
    L(l1) = l2
    L(r1) = r2
    
# numpy.polynomial.chebyshev.Chebyshev.roots
method
polynomial.chebyshev.Chebyshev.roots()[source]
    
Return the roots of the series polynomial.
Compute the roots for the series. Note that the accuracy of the roots decreases the further outside the `domain` they lie.
Returns:
    
rootsndarray
    
Array containing the roots of the series.
# numpy.polynomial.chebyshev.Chebyshev.trim
method
polynomial.chebyshev.Chebyshev.trim(tol=0)[source]
    
Remove trailing coefficients
Remove trailing coefficients until a coefficient is reached whose absolute value greater than `tol` or the beginning of the series is reached. If all the coefficients would be removed the series is set to `[0]`. A new series instance is returned with the new coefficients. The current instance remains unchanged.
Parameters:
    
tolnon-negative number.
    
All trailing coefficients less than `tol` will be removed.
Returns:
    
new_seriesseries
    
New instance of series with trimmed coefficients.
# numpy.polynomial.chebyshev.Chebyshev.truncate
method
polynomial.chebyshev.Chebyshev.truncate(size)[source]
    
Truncate series to length `size`.
Reduce the series to length `size` by discarding the high degree terms. The value of `size` must be a positive integer. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
sizepositive int
    
The series is reduced to length `size` by discarding the high degree terms. The value of `size` must be a positive integer.
Returns:
    
new_seriesseries
    
New instance of series with truncated coefficients.
# numpy.polynomial.chebyshev.chebzero
polynomial.chebyshev.chebzero=array([0]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.chebyshev.poly2cheb
polynomial.chebyshev.poly2cheb(pol)[source]
    
Convert a polynomial to a Chebyshev series.
Convert an array representing the coefficients of a polynomial (relative to the “standard” basis) ordered from lowest degree to highest, to an array of the coefficients of the equivalent Chebyshev series, ordered from lowest to highest degree.
Parameters:
    
polarray_like
    
1-D array containing the polynomial coefficients
Returns:
    
cndarray
    
1-D array containing the coefficients of the equivalent Chebyshev series.
See also
`cheb2poly`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy import polynomial as P
    >>> p = P.Polynomial(range(4))
    >>> p
    Polynomial([0., 1., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> c = p.convert(kind=P.Chebyshev)
    >>> c
    Chebyshev([1.  , 3.25, 1.  , 0.75], domain=[-1.,  1.], window=[-1., ...
    >>> P.chebyshev.poly2cheb(range(4))
    array([1.  , 3.25, 1.  , 0.75])
    
# numpy.polynomial.hermite.herm2poly
polynomial.hermite.herm2poly(c)[source]
    
Convert a Hermite series to a polynomial.
Convert an array representing the coefficients of a Hermite series, ordered from lowest degree to highest, to an array of the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest to highest degree.
Parameters:
    
carray_like
    
1-D array containing the Hermite series coefficients, ordered from lowest order term to highest.
Returns:
    
polndarray
    
1-D array containing the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest order term to highest.
See also
`poly2herm`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy.polynomial.hermite import herm2poly
    >>> herm2poly([ 1.   ,  2.75 ,  0.5  ,  0.375])
    array([0., 1., 2., 3.])
    
# numpy.polynomial.hermite.hermadd
polynomial.hermite.hermadd(c1, c2)[source]
    
Add one Hermite series to another.
Returns the sum of two Hermite series `c1` \+ `c2`. The arguments are sequences of coefficients ordered from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the Hermite series of their sum.
See also
`hermsub`, `hermmulx`, `hermmul`, `hermdiv`, `hermpow`
#### Notes
Unlike multiplication, division, etc., the sum of two Hermite series is a Hermite series (without having to “reproject” the result onto the basis set) so addition, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial.hermite import hermadd
    >>> hermadd([1, 2, 3], [1, 2, 3, 4])
    array([2., 4., 6., 4.])
    
# numpy.polynomial.hermite.hermcompanion
polynomial.hermite.hermcompanion(c)[source]
    
Return the scaled companion matrix of c.
The basis polynomials are scaled so that the companion matrix is symmetric when `c` is an Hermite basis polynomial. This provides better eigenvalue estimates than the unscaled case and for basis polynomials the eigenvalues are guaranteed to be real if `numpy.linalg.eigvalsh` is used to obtain them.
Parameters:
    
carray_like
    
1-D array of Hermite series coefficients ordered from low to high degree.
Returns:
    
matndarray
    
Scaled companion matrix of dimensions (deg, deg).
#### Examples
    
    >>> from numpy.polynomial.hermite import hermcompanion
    >>> hermcompanion([1, 0, 1])
    array([[0.        , 0.35355339],
           [0.70710678, 0.        ]])
    
# numpy.polynomial.hermite.hermder
polynomial.hermite.hermder(c, m=1, scl=1, axis=0)[source]
    
Differentiate a Hermite series.
Returns the Hermite series coefficients `c` differentiated `m` times along `axis`. At each iteration the result is multiplied by `scl` (the scaling factor is for use in a linear change of variable). The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `1*H_0 + 2*H_1 + 3*H_2` while [[1,2],[1,2]] represents `1*H_0(x)*H_0(y) + 1*H_1(x)*H_0(y) + 2*H_0(x)*H_1(y) + 2*H_1(x)*H_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Hermite series coefficients. If `c` is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Number of derivatives taken, must be non-negative. (Default: 1)
sclscalar, optional
    
Each differentiation is multiplied by `scl`. The end result is multiplication by `scl**m`. This is for use in a linear change of variable. (Default: 1)
axisint, optional
    
Axis over which the derivative is taken. (Default: 0).
Returns:
    
derndarray
    
Hermite series of the derivative.
See also
`hermint`
#### Notes
In general, the result of differentiating a Hermite series does not resemble the same operation on a power series. Thus the result of this function may be “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermder
    >>> hermder([ 1. ,  0.5,  0.5,  0.5])
    array([1., 2., 3.])
    >>> hermder([-0.5,  1./2.,  1./8.,  1./12.,  1./16.], m=2)
    array([1., 2., 3.])
    
# numpy.polynomial.hermite.hermdiv
polynomial.hermite.hermdiv(c1, c2)[source]
    
Divide one Hermite series by another.
Returns the quotient-with-remainder of two Hermite series `c1` / `c2`. The arguments are sequences of coefficients from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
[quo, rem]ndarrays
    
Of Hermite series coefficients representing the quotient and remainder.
See also
`hermadd`, `hermsub`, `hermmulx`, `hermmul`, `hermpow`
#### Notes
In general, the (polynomial) division of one Hermite series by another results in quotient and remainder terms that are not in the Hermite polynomial basis set. Thus, to express these results as a Hermite series, it is necessary to “reproject” the results onto the Hermite basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermdiv
    >>> hermdiv([ 52.,  29.,  52.,   7.,   6.], [0, 1, 2])
    (array([1., 2., 3.]), array([0.]))
    >>> hermdiv([ 54.,  31.,  52.,   7.,   6.], [0, 1, 2])
    (array([1., 2., 3.]), array([2., 2.]))
    >>> hermdiv([ 53.,  30.,  52.,   7.,   6.], [0, 1, 2])
    (array([1., 2., 3.]), array([1., 1.]))
    
# numpy.polynomial.hermite.hermdomain
polynomial.hermite.hermdomain=array([-1., 1.]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite.hermfit
polynomial.hermite.hermfit(x, y, deg, rcond=None, full=False, w=None)[source]
    
Least squares fit of Hermite series to data.
Return the coefficients of a Hermite series of degree `deg` that is the least squares fit to the data values `y` given at points `x`. If `y` is 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple fits are done, one for each column of `y`, and the resulting coefficients are stored in the corresponding columns of a 2-D return. The fitted polynomial(s) are in the form
\\[p(x) = c_0 + c_1 * H_1(x) + ... + c_n * H_n(x),\\]
where `n` is `deg`.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (`M`,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
Returns:
    
coefndarray, shape (M,) or (M, K)
    
Hermite coefficients ordered from low to high. If `y` was 2-D, the coefficients for the data in column k of `y` are in column `k`.
[residuals, rank, singular_values, rcond]list
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * singular_values – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full == False`. The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`numpy.polynomial.chebyshev.chebfit`
`numpy.polynomial.legendre.legfit`
`numpy.polynomial.laguerre.lagfit`
`numpy.polynomial.polynomial.polyfit`
`numpy.polynomial.hermite_e.hermefit`
`hermval`
    
Evaluates a Hermite series.
`hermvander`
    
Vandermonde matrix of Hermite series.
`hermweight`
    
Hermite weight function
`numpy.linalg.lstsq`
    
Computes a least-squares fit from the matrix.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution is the coefficients of the Hermite series `p` that minimizes the sum of the weighted squared errors
\\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\\]
where the \\(w_j\\) are the weights. This problem is solved by setting up the (typically) overdetermined matrix equation
\\[V(x) * c = w * y,\\]
where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the coefficients to be solved for, `w` are the weights, `y` are the observed values. This equation is then solved using the singular value decomposition of `V`.
If some of the singular values of `V` are so small that they are neglected, then a `RankWarning` will be issued. This means that the coefficient values may be poorly determined. Using a lower order fit will usually get rid of the warning. The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious and have large contributions from roundoff error.
Fits using Hermite series are probably most useful when the data can be approximated by `sqrt(w(x)) * p(x)`, where `w(x)` is the Hermite weight. In that case the weight `sqrt(w(x[i]))` should be used together with data values `y[i]/sqrt(w(x[i]))`. The weight function is available as `hermweight`.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite import hermfit, hermval
    >>> x = np.linspace(-10, 10)
    >>> rng = np.random.default_rng()
    >>> err = rng.normal(scale=1./10, size=len(x))
    >>> y = hermval(x, [1, 2, 3]) + err
    >>> hermfit(x, y, 2)
    array([1.02294967, 2.00016403, 2.99994614]) # may vary
    
# numpy.polynomial.hermite.hermfromroots
polynomial.hermite.hermfromroots(roots)[source]
    
Generate a Hermite series with given roots.
The function returns the coefficients of the polynomial
\\[p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),\\]
in Hermite form, where the \\(r_n\\) are the roots specified in `roots`. If a zero has multiplicity n, then it must appear in `roots` n times. For instance, if 2 is a root of multiplicity three and 3 is a root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The roots can appear in any order.
If the returned coefficients are `c`, then
\\[p(x) = c_0 + c_1 * H_1(x) + ... + c_n * H_n(x)\\]
The coefficient of the last term is not generally 1 for monic polynomials in Hermite form.
Parameters:
    
rootsarray_like
    
Sequence containing the roots.
Returns:
    
outndarray
    
1-D array of coefficients. If all roots are real then `out` is a real array, if some of the roots are complex, then `out` is complex even if all the coefficients in the result are real (see Examples below).
See also
`numpy.polynomial.polynomial.polyfromroots`
`numpy.polynomial.legendre.legfromroots`
`numpy.polynomial.laguerre.lagfromroots`
`numpy.polynomial.chebyshev.chebfromroots`
`numpy.polynomial.hermite_e.hermefromroots`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermfromroots, hermval
    >>> coef = hermfromroots((-1, 0, 1))
    >>> hermval((-1, 0, 1), coef)
    array([0.,  0.,  0.])
    >>> coef = hermfromroots((-1j, 1j))
    >>> hermval((-1j, 1j), coef)
    array([0.+0.j, 0.+0.j])
    
# numpy.polynomial.hermite.hermgauss
polynomial.hermite.hermgauss(deg)[source]
    
Gauss-Hermite quadrature.
Computes the sample points and weights for Gauss-Hermite quadrature. These sample points and weights will correctly integrate polynomials of degree \\(2*deg - 1\\) or less over the interval \\([-\inf, \inf]\\) with the weight function \\(f(x) = \exp(-x^2)\\).
Parameters:
    
degint
    
Number of sample points and weights. It must be >= 1.
Returns:
    
xndarray
    
1-D ndarray containing the sample points.
yndarray
    
1-D ndarray containing the weights.
#### Notes
The results have only been tested up to degree 100, higher degrees may be problematic. The weights are determined by using the fact that
\\[w_k = c / (H'_n(x_k) * H_{n-1}(x_k))\\]
where \\(c\\) is a constant independent of \\(k\\) and \\(x_k\\) is the k’th root of \\(H_n\\), and then scaling the results to get the right value when integrating 1.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermgauss
    >>> hermgauss(2)
    (array([-0.70710678,  0.70710678]), array([0.88622693, 0.88622693]))
    
# numpy.polynomial.hermite.hermgrid2d
polynomial.hermite.hermgrid2d(x, y, c)[source]
    
Evaluate a 2-D Hermite series on the Cartesian product of x and y.
This function returns the values:
\\[p(a,b) = \sum_{i,j} c_{i,j} * H_i(a) * H_j(b)\\]
where the points `(a, b)` consist of all pairs formed by taking `a` from `x` and `b` from `y`. The resulting points form a grid with `x` in the first dimension and `y` in the second.
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points in the Cartesian product of `x` and `y`. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`hermval`, `hermval2d`, `hermval3d`, `hermgrid3d`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermgrid2d
    >>> x = [1, 2, 3]
    >>> y = [4, 5]
    >>> c = [[1, 2, 3], [4, 5, 6]]
    >>> hermgrid2d(x, y, c)
    array([[1035., 1599.],
           [1867., 2883.],
           [2699., 4167.]])
    
# numpy.polynomial.hermite.hermgrid3d
polynomial.hermite.hermgrid3d(x, y, z, c)[source]
    
Evaluate a 3-D Hermite series on the Cartesian product of x, y, and z.
This function returns the values:
\\[p(a,b,c) = \sum_{i,j,k} c_{i,j,k} * H_i(a) * H_j(b) * H_k(c)\\]
where the points `(a, b, c)` consist of all triples formed by taking `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form a grid with `x` in the first dimension, `y` in the second, and `z` in the third.
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than three dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape + y.shape + z.shape.
Parameters:
    
x, y, zarray_like, compatible objects
    
The three dimensional series is evaluated at the points in the Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`hermval`, `hermval2d`, `hermgrid2d`, `hermval3d`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermgrid3d
    >>> x = [1, 2]
    >>> y = [4, 5]
    >>> z = [6, 7]
    >>> c = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
    >>> hermgrid3d(x, y, z, c)
    array([[[ 40077.,  54117.],
            [ 49293.,  66561.]],
           [[ 72375.,  97719.],
            [ 88975., 120131.]]])
    
# numpy.polynomial.hermite.hermint
polynomial.hermite.hermint(c, m=1, k=[], lbnd=0, scl=1, axis=0)[source]
    
Integrate a Hermite series.
Returns the Hermite series coefficients `c` integrated `m` times from `lbnd` along `axis`. At each iteration the resulting series is multiplied by `scl` and an integration constant, `k`, is added. The scaling factor is for use in a linear change of variable. (“Buyer beware”: note that, depending on what one is doing, one may want `scl` to be the reciprocal of what one might expect; for more information, see the Notes section below.) The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `H_0 + 2*H_1 + 3*H_2` while [[1,2],[1,2]] represents `1*H_0(x)*H_0(y) + 1*H_1(x)*H_0(y) + 2*H_0(x)*H_1(y) + 2*H_1(x)*H_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Hermite series coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Order of integration, must be positive. (Default: 1)
k{[], list, scalar}, optional
    
Integration constant(s). The value of the first integral at `lbnd` is the first value in the list, the value of the second integral at `lbnd` is the second value, etc. If `k == []` (the default), all constants are set to zero. If `m == 1`, a single scalar can be given instead of a list.
lbndscalar, optional
    
The lower bound of the integral. (Default: 0)
sclscalar, optional
    
Following each integration the result is multiplied by `scl` before the integration constant is added. (Default: 1)
axisint, optional
    
Axis over which the integral is taken. (Default: 0).
Returns:
    
Sndarray
    
Hermite series coefficients of the integral.
Raises:
    
ValueError
    
If `m < 0`, `len(k) > m`, `np.ndim(lbnd) != 0`, or `np.ndim(scl) != 0`.
See also
`hermder`
#### Notes
Note that the result of each integration is multiplied by `scl`. Why is this important to note? Say one is making a linear change of variable \\(u = ax + b\\) in an integral relative to `x`. Then \\(dx = du/a\\), so one will need to set `scl` equal to \\(1/a\\) \- perhaps not what one would have first thought.
Also note that, in general, the result of integrating a C-series needs to be “reprojected” onto the C-series basis set. Thus, typically, the result of this function is “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermint
    >>> hermint([1,2,3]) # integrate once, value 0 at 0.
    array([1. , 0.5, 0.5, 0.5])
    >>> hermint([1,2,3], m=2) # integrate twice, value & deriv 0 at 0
    array([-0.5       ,  0.5       ,  0.125     ,  0.08333333,  0.0625    ]) # may vary
    >>> hermint([1,2,3], k=1) # integrate once, value 1 at 0.
    array([2. , 0.5, 0.5, 0.5])
    >>> hermint([1,2,3], lbnd=-1) # integrate once, value 0 at -1
    array([-2. ,  0.5,  0.5,  0.5])
    >>> hermint([1,2,3], m=2, k=[1,2], lbnd=-1)
    array([ 1.66666667, -0.5       ,  0.125     ,  0.08333333,  0.0625    ]) # may vary
    
# numpy.polynomial.hermite.Hermite.__call__
method
polynomial.hermite.Hermite.__call__(arg)[source]
    
Call self as a function.
# numpy.polynomial.hermite.Hermite.basis
method
classmethodpolynomial.hermite.Hermite.basis(deg, domain=None, window=None, symbol='x')[source]
    
Series basis polynomial of degree `deg`.
Returns the series representing the basis polynomial of degree `deg`.
Parameters:
    
degint
    
Degree of the basis polynomial for the series. Must be >= 0.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series with the coefficient of the `deg` term set to one and all others zero.
# numpy.polynomial.hermite.Hermite.cast
method
classmethodpolynomial.hermite.Hermite.cast(series, domain=None, window=None)[source]
    
Convert series to series of this class.
The `series` is expected to be an instance of some polynomial series of one of the types supported by by the numpy.polynomial module, but could be some other class that supports the convert method.
Parameters:
    
seriesseries
    
The series instance to be converted.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
Returns:
    
new_seriesseries
    
A series of the same kind as the calling class and equal to `series` when evaluated.
See also
`convert`
    
similar instance method
# numpy.polynomial.hermite.Hermite.convert
method
polynomial.hermite.Hermite.convert(domain=None, kind=None, window=None)[source]
    
Convert series to a different kind and/or domain and/or window.
Parameters:
    
domainarray_like, optional
    
The domain of the converted series. If the value is None, the default domain of `kind` is used.
kindclass, optional
    
The polynomial series type class to which the current instance should be converted. If kind is None, then the class of the current instance is used.
windowarray_like, optional
    
The window of the converted series. If the value is None, the default window of `kind` is used.
Returns:
    
new_seriesseries
    
The returned class can be of different type than the current instance and/or have a different domain and/or different window.
#### Notes
Conversion between domains and class types can result in numerically ill defined series.
# numpy.polynomial.hermite.Hermite.copy
method
polynomial.hermite.Hermite.copy()[source]
    
Return a copy.
Returns:
    
new_seriesseries
    
Copy of self.
# numpy.polynomial.hermite.Hermite.cutdeg
method
polynomial.hermite.Hermite.cutdeg(deg)[source]
    
Truncate series to the given degree.
Reduce the degree of the series to `deg` by discarding the high order terms. If `deg` is greater than the current degree a copy of the current series is returned. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
degnon-negative int
    
The series is reduced to degree `deg` by discarding the high order terms. The value of `deg` must be a non-negative integer.
Returns:
    
new_seriesseries
    
New instance of series with reduced degree.
# numpy.polynomial.hermite.Hermite.degree
method
polynomial.hermite.Hermite.degree()[source]
    
The degree of the series.
Returns:
    
degreeint
    
Degree of the series, one less than the number of coefficients.
#### Examples
Create a polynomial object for `1 + 7*x + 4*x**2`:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 4])
    >>> print(poly)
    1.0 + 7.0·x + 4.0·x²
    >>> poly.degree()
    2
    
Note that this method does not check for non-zero coefficients. You must trim the polynomial to remove any trailing zeroes:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 0])
    >>> print(poly)
    1.0 + 7.0·x + 0.0·x²
    >>> poly.degree()
    2
    >>> poly.trim().degree()
    1
    
# numpy.polynomial.hermite.Hermite.deriv
method
polynomial.hermite.Hermite.deriv(m=1)[source]
    
Differentiate.
Return a series instance of that is the derivative of the current series.
Parameters:
    
mnon-negative int
    
Find the derivative of order `m`.
Returns:
    
new_seriesseries
    
A new series representing the derivative. The domain is the same as the domain of the differentiated series.
# numpy.polynomial.hermite.Hermite.domain
attribute
polynomial.hermite.Hermite.domain=array([-1., 1.]) 
# numpy.polynomial.hermite.Hermite.fit
method
classmethodpolynomial.hermite.Hermite.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')[source]
    
Least squares fit to data.
Return a series instance that is the least squares fit to the data `y` sampled at `x`. The domain of the returned instance can be specified and this will often result in a superior fit with less chance of ill conditioning.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,)
    
y-coordinates of the M sample points `(x[i], y[i])`.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
domain{None, [beg, end], []}, optional
    
Domain to use for the returned series. If `None`, then a minimal domain that covers the points `x` is chosen. If `[]` the class domain is used. The default value was the class domain in NumPy 1.4 and `None` in later versions. The `[]` option was added in numpy 1.5.0.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
window{[beg, end]}, optional
    
Window to use for the returned series. The default value is the default class domain
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series that represents the least squares fit to the data and has the domain and window specified in the call. If the coefficients for the unscaled and unshifted basis polynomials are of interest, do `new_series.convert().coef`.
[resid, rank, sv, rcond]list
    
These values are only returned if `full == True`
  * resid – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * sv – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `linalg.lstsq`.
# numpy.polynomial.hermite.Hermite.fromroots
method
classmethodpolynomial.hermite.Hermite.fromroots(roots, domain=[], window=None, symbol='x')[source]
    
Return series instance that has the specified roots.
Returns a series representing the product `(x - r[0])*(x - r[1])*...*(x - r[n-1])`, where `r` is a list of roots.
Parameters:
    
rootsarray_like
    
List of roots.
domain{[], None, array_like}, optional
    
Domain for the resulting series. If None the domain is the interval from the smallest root to the largest. If [] the domain is the class domain. The default is [].
window{None, array_like}, optional
    
Window for the returned series. If None the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series with the specified roots.
# numpy.polynomial.hermite.Hermite.has_samecoef
method
polynomial.hermite.Hermite.has_samecoef(other)[source]
    
Check if coefficients match.
Parameters:
    
otherclass instance
    
The other class must have the `coef` attribute.
Returns:
    
boolboolean
    
True if the coefficients are the same, False otherwise.
# numpy.polynomial.hermite.Hermite.has_samedomain
method
polynomial.hermite.Hermite.has_samedomain(other)[source]
    
Check if domains match.
Parameters:
    
otherclass instance
    
The other class must have the `domain` attribute.
Returns:
    
boolboolean
    
True if the domains are the same, False otherwise.
# numpy.polynomial.hermite.Hermite.has_sametype
method
polynomial.hermite.Hermite.has_sametype(other)[source]
    
Check if types match.
Parameters:
    
otherobject
    
Class instance.
Returns:
    
boolboolean
    
True if other is same class as self
# numpy.polynomial.hermite.Hermite.has_samewindow
method
polynomial.hermite.Hermite.has_samewindow(other)[source]
    
Check if windows match.
Parameters:
    
otherclass instance
    
The other class must have the `window` attribute.
Returns:
    
boolboolean
    
True if the windows are the same, False otherwise.
# numpy.polynomial.hermite.Hermite
classnumpy.polynomial.hermite.Hermite(coef, domain=None, window=None, symbol='x')[source]
    
An Hermite series class.
The Hermite class provides the standard Python numerical methods ‘+’, ‘-’, ‘*’, ‘//’, ‘%’, ‘divmod’, ‘**’, and ‘()’ as well as the attributes and methods listed below.
Parameters:
    
coefarray_like
    
Hermite coefficients in order of increasing degree, i.e, `(1, 2, 3)` gives `1*H_0(x) + 2*H_1(x) + 3*H_2(x)`.
domain(2,) array_like, optional
    
Domain to use. The interval `[domain[0], domain[1]]` is mapped to the interval `[window[0], window[1]]` by shifting and scaling. The default value is [-1., 1.].
window(2,) array_like, optional
    
Window, see `domain` for its use. The default value is [-1., 1.].
symbolstr, optional
    
Symbol used to represent the independent variable in string representations of the polynomial expression, e.g. for printing. The symbol must be a valid Python identifier. Default value is ‘x’.
New in version 1.24.
Attributes:
    
symbol
#### Methods
`__call__`(arg)
Call self as a function.  
`basis`(deg[, domain, window, symbol])
Series basis polynomial of degree `deg`.  
`cast`(series[, domain, window])
Convert series to series of this class.  
`convert`([domain, kind, window])
Convert series to a different kind and/or domain and/or window.  
`copy`()
Return a copy.  
`cutdeg`(deg)
Truncate series to the given degree.  
`degree`()
The degree of the series.  
`deriv`([m])
Differentiate.  
`fit`(x, y, deg[, domain, rcond, full, w, ...])
Least squares fit to data.  
`fromroots`(roots[, domain, window, symbol])
Return series instance that has the specified roots.  
`has_samecoef`(other)
Check if coefficients match.  
`has_samedomain`(other)
Check if domains match.  
`has_sametype`(other)
Check if types match.  
`has_samewindow`(other)
Check if windows match.  
`identity`([domain, window, symbol])
Identity function.  
`integ`([m, k, lbnd])
Integrate.  
`linspace`([n, domain])
Return x, y values at equally spaced points in domain.  
`mapparms`()
Return the mapping parameters.  
`roots`()
Return the roots of the series polynomial.  
`trim`([tol])
Remove trailing coefficients  
`truncate`(size)
Truncate series to length `size`.  
# numpy.polynomial.hermite.Hermite.identity
method
classmethodpolynomial.hermite.Hermite.identity(domain=None, window=None, symbol='x')[source]
    
Identity function.
If `p` is the returned series, then `p(x) == x` for all values of x.
Parameters:
    
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series of representing the identity.
# numpy.polynomial.hermite.Hermite.integ
method
polynomial.hermite.Hermite.integ(m=1, k=[], lbnd=None)[source]
    
Integrate.
Return a series instance that is the definite integral of the current series.
Parameters:
    
mnon-negative int
    
The number of integrations to perform.
karray_like
    
Integration constants. The first constant is applied to the first integration, the second to the second, and so on. The list of values must less than or equal to `m` in length and any missing values are set to zero.
lbndScalar
    
The lower bound of the definite integral.
Returns:
    
new_seriesseries
    
A new series representing the integral. The domain is the same as the domain of the integrated series.
# numpy.polynomial.hermite.Hermite.linspace
method
polynomial.hermite.Hermite.linspace(n=100, domain=None)[source]
    
Return x, y values at equally spaced points in domain.
Returns the x, y values at `n` linearly spaced points across the domain. Here y is the value of the polynomial at the points x. By default the domain is the same as that of the series instance. This method is intended mostly as a plotting aid.
Parameters:
    
nint, optional
    
Number of point pairs to return. The default value is 100.
domain{None, array_like}, optional
    
If not None, the specified domain is used instead of that of the calling instance. It should be of the form `[beg,end]`. The default is None which case the class domain is used.
Returns:
    
x, yndarray
    
x is equal to linspace(self.domain[0], self.domain[1], n) and y is the series evaluated at element of x.
# numpy.polynomial.hermite.Hermite.mapparms
method
polynomial.hermite.Hermite.mapparms()[source]
    
Return the mapping parameters.
The returned values define a linear map `off + scl*x` that is applied to the input arguments before the series is evaluated. The map depends on the `domain` and `window`; if the current `domain` is equal to the `window` the resulting map is the identity. If the coefficients of the series instance are to be used by themselves outside this class, then the linear function must be substituted for the `x` in the standard representation of the base polynomials.
Returns:
    
off, sclfloat or complex
    
The mapping function is defined by `off + scl*x`.
#### Notes
If the current domain is the interval `[l1, r1]` and the window is `[l2, r2]`, then the linear mapping function `L` is defined by the equations:
    
    L(l1) = l2
    L(r1) = r2
    
# numpy.polynomial.hermite.Hermite.roots
method
polynomial.hermite.Hermite.roots()[source]
    
Return the roots of the series polynomial.
Compute the roots for the series. Note that the accuracy of the roots decreases the further outside the `domain` they lie.
Returns:
    
rootsndarray
    
Array containing the roots of the series.
# numpy.polynomial.hermite.Hermite.trim
method
polynomial.hermite.Hermite.trim(tol=0)[source]
    
Remove trailing coefficients
Remove trailing coefficients until a coefficient is reached whose absolute value greater than `tol` or the beginning of the series is reached. If all the coefficients would be removed the series is set to `[0]`. A new series instance is returned with the new coefficients. The current instance remains unchanged.
Parameters:
    
tolnon-negative number.
    
All trailing coefficients less than `tol` will be removed.
Returns:
    
new_seriesseries
    
New instance of series with trimmed coefficients.
# numpy.polynomial.hermite.Hermite.truncate
method
polynomial.hermite.Hermite.truncate(size)[source]
    
Truncate series to length `size`.
Reduce the series to length `size` by discarding the high degree terms. The value of `size` must be a positive integer. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
sizepositive int
    
The series is reduced to length `size` by discarding the high degree terms. The value of `size` must be a positive integer.
Returns:
    
new_seriesseries
    
New instance of series with truncated coefficients.
# numpy.polynomial.hermite.hermline
polynomial.hermite.hermline(off, scl)[source]
    
Hermite series whose graph is a straight line.
Parameters:
    
off, sclscalars
    
The specified line is given by `off + scl*x`.
Returns:
    
yndarray
    
This module’s representation of the Hermite series for `off + scl*x`.
See also
`numpy.polynomial.polynomial.polyline`
`numpy.polynomial.chebyshev.chebline`
`numpy.polynomial.legendre.legline`
`numpy.polynomial.laguerre.lagline`
`numpy.polynomial.hermite_e.hermeline`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermline, hermval
    >>> hermval(0,hermline(3, 2))
    3.0
    >>> hermval(1,hermline(3, 2))
    5.0
    
# numpy.polynomial.hermite.hermmul
polynomial.hermite.hermmul(c1, c2)[source]
    
Multiply one Hermite series by another.
Returns the product of two Hermite series `c1` * `c2`. The arguments are sequences of coefficients, from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Hermite series coefficients representing their product.
See also
`hermadd`, `hermsub`, `hermmulx`, `hermdiv`, `hermpow`
#### Notes
In general, the (polynomial) product of two C-series results in terms that are not in the Hermite polynomial basis set. Thus, to express the product as a Hermite series, it is necessary to “reproject” the product onto said basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermmul
    >>> hermmul([1, 2, 3], [0, 1, 2])
    array([52.,  29.,  52.,   7.,   6.])
    
# numpy.polynomial.hermite.hermmulx
polynomial.hermite.hermmulx(c)[source]
    
Multiply a Hermite series by x.
Multiply the Hermite series `c` by x, where x is the independent variable.
Parameters:
    
carray_like
    
1-D array of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the result of the multiplication.
See also
`hermadd`, `hermsub`, `hermmul`, `hermdiv`, `hermpow`
#### Notes
The multiplication uses the recursion relationship for Hermite polynomials in the form
\\[xP_i(x) = (P_{i + 1}(x)/2 + i*P_{i - 1}(x))\\]
#### Examples
    
    >>> from numpy.polynomial.hermite import hermmulx
    >>> hermmulx([1, 2, 3])
    array([2. , 6.5, 1. , 1.5])
    
# numpy.polynomial.hermite.hermone
polynomial.hermite.hermone=array([1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite.hermpow
polynomial.hermite.hermpow(c, pow, maxpower=16)[source]
    
Raise a Hermite series to a power.
Returns the Hermite series `c` raised to the power `pow`. The argument `c` is a sequence of coefficients ordered from low to high. i.e., [1,2,3] is the series `P_0 + 2*P_1 + 3*P_2.`
Parameters:
    
carray_like
    
1-D array of Hermite series coefficients ordered from low to high.
powinteger
    
Power to which the series will be raised
maxpowerinteger, optional
    
Maximum power allowed. This is mainly to limit growth of the series to unmanageable size. Default is 16
Returns:
    
coefndarray
    
Hermite series of power.
See also
`hermadd`, `hermsub`, `hermmulx`, `hermmul`, `hermdiv`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermpow
    >>> hermpow([1, 2, 3], 2)
    array([81.,  52.,  82.,  12.,   9.])
    
# numpy.polynomial.hermite.hermroots
polynomial.hermite.hermroots(c)[source]
    
Compute the roots of a Hermite series.
Return the roots (a.k.a. “zeros”) of the polynomial
\\[p(x) = \sum_i c[i] * H_i(x).\\]
Parameters:
    
c1-D array_like
    
1-D array of coefficients.
Returns:
    
outndarray
    
Array of the roots of the series. If all the roots are real, then `out` is also real, otherwise it is complex.
See also
`numpy.polynomial.polynomial.polyroots`
`numpy.polynomial.legendre.legroots`
`numpy.polynomial.laguerre.lagroots`
`numpy.polynomial.chebyshev.chebroots`
`numpy.polynomial.hermite_e.hermeroots`
#### Notes
The root estimates are obtained as the eigenvalues of the companion matrix, Roots far from the origin of the complex plane may have large errors due to the numerical instability of the series for such values. Roots with multiplicity greater than 1 will also show larger errors as the value of the series near such points is relatively insensitive to errors in the roots. Isolated roots near the origin can be improved by a few iterations of Newton’s method.
The Hermite series basis polynomials aren’t powers of `x` so the results of this function may seem unintuitive.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermroots, hermfromroots
    >>> coef = hermfromroots([-1, 0, 1])
    >>> coef
    array([0.   ,  0.25 ,  0.   ,  0.125])
    >>> hermroots(coef)
    array([-1.00000000e+00, -1.38777878e-17,  1.00000000e+00])
    
# numpy.polynomial.hermite.hermsub
polynomial.hermite.hermsub(c1, c2)[source]
    
Subtract one Hermite series from another.
Returns the difference of two Hermite series `c1` \- `c2`. The sequences of coefficients are from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Hermite series coefficients representing their difference.
See also
`hermadd`, `hermmulx`, `hermmul`, `hermdiv`, `hermpow`
#### Notes
Unlike multiplication, division, etc., the difference of two Hermite series is a Hermite series (without having to “reproject” the result onto the basis set) so subtraction, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial.hermite import hermsub
    >>> hermsub([1, 2, 3, 4], [1, 2, 3])
    array([0.,  0.,  0.,  4.])
    
# numpy.polynomial.hermite.hermtrim
polynomial.hermite.hermtrim(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.hermite.hermval
polynomial.hermite.hermval(x, c, tensor=True)[source]
    
Evaluate an Hermite series at points x.
If `c` is of length `n + 1`, this function returns the value:
\\[p(x) = c_0 * H_0(x) + c_1 * H_1(x) + ... + c_n * H_n(x)\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array, then `p(x)` will have the same shape as `x`. If `c` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is true the shape will be c.shape[1:] + x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that scalars have shape (,).
Trailing zeros in the coefficients will be used in the evaluation, so they should be avoided if efficiency is a concern.
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with themselves and with the elements of `c`.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree n are contained in c[n]. If `c` is multidimensional the remaining indices enumerate multiple polynomials. In the two dimensional case the coefficients may be thought of as stored in the columns of `c`.
tensorboolean, optional
    
If True, the shape of the coefficient array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `c` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `c` for the evaluation. This keyword is useful when `c` is multidimensional. The default value is True.
Returns:
    
valuesndarray, algebra_like
    
The shape of the return value is described above.
See also
`hermval2d`, `hermgrid2d`, `hermval3d`, `hermgrid3d`
#### Notes
The evaluation uses Clenshaw recursion, aka synthetic division.
#### Examples
    
    >>> from numpy.polynomial.hermite import hermval
    >>> coef = [1,2,3]
    >>> hermval(1, coef)
    11.0
    >>> hermval([[1,2],[3,4]], coef)
    array([[ 11.,   51.],
           [115.,  203.]])
    
# numpy.polynomial.hermite.hermval2d
polynomial.hermite.hermval2d(x, y, c)[source]
    
Evaluate a 2-D Hermite series at points (x, y).
This function returns the values:
\\[p(x,y) = \sum_{i,j} c_{i,j} * H_i(x) * H_j(y)\\]
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array a one is implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points `(x, y)`, where `x` and `y` must have the same shape. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points formed with pairs of corresponding values from `x` and `y`.
See also
`hermval`, `hermgrid2d`, `hermval3d`, `hermgrid3d`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermval2d
    >>> x = [1, 2]
    >>> y = [4, 5]
    >>> c = [[1, 2, 3], [4, 5, 6]]
    >>> hermval2d(x, y, c)
    array([1035., 2883.])
    
# numpy.polynomial.hermite.hermval3d
polynomial.hermite.hermval3d(x, y, z, c)[source]
    
Evaluate a 3-D Hermite series at points (x, y, z).
This function returns the values:
\\[p(x,y,z) = \sum_{i,j,k} c_{i,j,k} * H_i(x) * H_j(y) * H_k(z)\\]
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than 3 dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape.
Parameters:
    
x, y, zarray_like, compatible object
    
The three dimensional series is evaluated at the points `(x, y, z)`, where `x`, `y`, and `z` must have the same shape. If any of `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j,k is contained in `c[i,j,k]`. If `c` has dimension greater than 3 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the multidimensional polynomial on points formed with triples of corresponding values from `x`, `y`, and `z`.
See also
`hermval`, `hermval2d`, `hermgrid2d`, `hermgrid3d`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermval3d
    >>> x = [1, 2]
    >>> y = [4, 5]
    >>> z = [6, 7]
    >>> c = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
    >>> hermval3d(x, y, z, c)
    array([ 40077., 120131.])
    
# numpy.polynomial.hermite.hermvander
polynomial.hermite.hermvander(x, deg)[source]
    
Pseudo-Vandermonde matrix of given degree.
Returns the pseudo-Vandermonde matrix of degree `deg` and sample points `x`. The pseudo-Vandermonde matrix is defined by
\\[V[..., i] = H_i(x),\\]
where `0 <= i <= deg`. The leading indices of `V` index the elements of `x` and the last index is the degree of the Hermite polynomial.
If `c` is a 1-D array of coefficients of length `n + 1` and `V` is the array `V = hermvander(x, n)`, then `np.dot(V, c)` and `hermval(x, c)` are the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of Hermite series of the same degree and sample points.
Parameters:
    
xarray_like
    
Array of points. The dtype is converted to float64 or complex128 depending on whether any of the elements are complex. If `x` is scalar it is converted to a 1-D array.
degint
    
Degree of the resulting matrix.
Returns:
    
vanderndarray
    
The pseudo-Vandermonde matrix. The shape of the returned matrix is `x.shape + (deg + 1,)`, where The last index is the degree of the corresponding Hermite polynomial. The dtype will be the same as the converted `x`.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite import hermvander
    >>> x = np.array([-1, 0, 1])
    >>> hermvander(x, 3)
    array([[ 1., -2.,  2.,  4.],
           [ 1.,  0., -2., -0.],
           [ 1.,  2.,  2., -4.]])
    
# numpy.polynomial.hermite.hermvander2d
polynomial.hermite.hermvander2d(x, y, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y)`. The pseudo-Vandermonde matrix is defined by
\\[V[..., (deg[1] + 1)*i + j] = H_i(x) * H_j(y),\\]
where `0 <= i <= deg[0]` and `0 <= j <= deg[1]`. The leading indices of `V` index the points `(x, y)` and the last index encodes the degrees of the Hermite polynomials.
If `V = hermvander2d(x, y, [xdeg, ydeg])`, then the columns of `V` correspond to the elements of a 2-D coefficient array `c` of shape (xdeg + 1, ydeg + 1) in the order
\\[c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...\\]
and `np.dot(V, c.flat)` and `hermval2d(x, y, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 2-D Hermite series of the same degrees and sample points.
Parameters:
    
x, yarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg].
Returns:
    
vander2dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)\\). The dtype will be the same as the converted `x` and `y`.
See also
`hermvander`, `hermvander3d`, `hermval2d`, `hermval3d`
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite import hermvander2d
    >>> x = np.array([-1, 0, 1])
    >>> y = np.array([-1, 0, 1])
    >>> hermvander2d(x, y, [2, 2])
    array([[ 1., -2.,  2., -2.,  4., -4.,  2., -4.,  4.],
           [ 1.,  0., -2.,  0.,  0., -0., -2., -0.,  4.],
           [ 1.,  2.,  2.,  2.,  4.,  4.,  2.,  4.,  4.]])
    
# numpy.polynomial.hermite.hermvander3d
polynomial.hermite.hermvander3d(x, y, z, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y, z)`. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`, then The pseudo-Vandermonde matrix is defined by
\\[V[..., (m+1)(n+1)i + (n+1)j + k] = H_i(x)*H_j(y)*H_k(z),\\]
where `0 <= i <= l`, `0 <= j <= m`, and `0 <= j <= n`. The leading indices of `V` index the points `(x, y, z)` and the last index encodes the degrees of the Hermite polynomials.
If `V = hermvander3d(x, y, z, [xdeg, ydeg, zdeg])`, then the columns of `V` correspond to the elements of a 3-D coefficient array `c` of shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
\\[c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...\\]
and `np.dot(V, c.flat)` and `hermval3d(x, y, z, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 3-D Hermite series of the same degrees and sample points.
Parameters:
    
x, y, zarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg, z_deg].
Returns:
    
vander3dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)\\). The dtype will be the same as the converted `x`, `y`, and `z`.
See also
`hermvander`, `hermvander3d`, `hermval2d`, `hermval3d`
#### Examples
    
    >>> from numpy.polynomial.hermite import hermvander3d
    >>> x = np.array([-1, 0, 1])
    >>> y = np.array([-1, 0, 1])
    >>> z = np.array([-1, 0, 1])
    >>> hermvander3d(x, y, z, [0, 1, 2])
    array([[ 1., -2.,  2., -2.,  4., -4.],
           [ 1.,  0., -2.,  0.,  0., -0.],
           [ 1.,  2.,  2.,  2.,  4.,  4.]])
    
# numpy.polynomial.hermite.hermweight
polynomial.hermite.hermweight(x)[source]
    
Weight function of the Hermite polynomials.
The weight function is \\(\exp(-x^2)\\) and the interval of integration is \\([-\inf, \inf]\\). the Hermite polynomials are orthogonal, but not normalized, with respect to this weight function.
Parameters:
    
xarray_like
    
Values at which the weight function will be computed.
Returns:
    
wndarray
    
The weight function at `x`.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite import hermweight
    >>> x = np.arange(-2, 2)
    >>> hermweight(x)
    array([0.01831564, 0.36787944, 1.        , 0.36787944])
    
# numpy.polynomial.hermite.hermx
polynomial.hermite.hermx=array([0. , 0.5]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite.hermzero
polynomial.hermite.hermzero=array([0]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite.poly2herm
polynomial.hermite.poly2herm(pol)[source]
    
Convert a polynomial to a Hermite series.
Convert an array representing the coefficients of a polynomial (relative to the “standard” basis) ordered from lowest degree to highest, to an array of the coefficients of the equivalent Hermite series, ordered from lowest to highest degree.
Parameters:
    
polarray_like
    
1-D array containing the polynomial coefficients
Returns:
    
cndarray
    
1-D array containing the coefficients of the equivalent Hermite series.
See also
`herm2poly`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy.polynomial.hermite import poly2herm
    >>> poly2herm(np.arange(4))
    array([1.   ,  2.75 ,  0.5  ,  0.375])
    
# numpy.polynomial.hermite_e.herme2poly
polynomial.hermite_e.herme2poly(c)[source]
    
Convert a Hermite series to a polynomial.
Convert an array representing the coefficients of a Hermite series, ordered from lowest degree to highest, to an array of the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest to highest degree.
Parameters:
    
carray_like
    
1-D array containing the Hermite series coefficients, ordered from lowest order term to highest.
Returns:
    
polndarray
    
1-D array containing the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest order term to highest.
See also
`poly2herme`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import herme2poly
    >>> herme2poly([  2.,  10.,   2.,   3.])
    array([0.,  1.,  2.,  3.])
    
# numpy.polynomial.hermite_e.hermeadd
polynomial.hermite_e.hermeadd(c1, c2)[source]
    
Add one Hermite series to another.
Returns the sum of two Hermite series `c1` \+ `c2`. The arguments are sequences of coefficients ordered from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the Hermite series of their sum.
See also
`hermesub`, `hermemulx`, `hermemul`, `hermediv`, `hermepow`
#### Notes
Unlike multiplication, division, etc., the sum of two Hermite series is a Hermite series (without having to “reproject” the result onto the basis set) so addition, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermeadd
    >>> hermeadd([1, 2, 3], [1, 2, 3, 4])
    array([2.,  4.,  6.,  4.])
    
# numpy.polynomial.hermite_e.hermecompanion
polynomial.hermite_e.hermecompanion(c)[source]
    
Return the scaled companion matrix of c.
The basis polynomials are scaled so that the companion matrix is symmetric when `c` is an HermiteE basis polynomial. This provides better eigenvalue estimates than the unscaled case and for basis polynomials the eigenvalues are guaranteed to be real if `numpy.linalg.eigvalsh` is used to obtain them.
Parameters:
    
carray_like
    
1-D array of HermiteE series coefficients ordered from low to high degree.
Returns:
    
matndarray
    
Scaled companion matrix of dimensions (deg, deg).
# numpy.polynomial.hermite_e.hermeder
polynomial.hermite_e.hermeder(c, m=1, scl=1, axis=0)[source]
    
Differentiate a Hermite_e series.
Returns the series coefficients `c` differentiated `m` times along `axis`. At each iteration the result is multiplied by `scl` (the scaling factor is for use in a linear change of variable). The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `1*He_0 + 2*He_1 + 3*He_2` while [[1,2],[1,2]] represents `1*He_0(x)*He_0(y) + 1*He_1(x)*He_0(y) + 2*He_0(x)*He_1(y) + 2*He_1(x)*He_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Hermite_e series coefficients. If `c` is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Number of derivatives taken, must be non-negative. (Default: 1)
sclscalar, optional
    
Each differentiation is multiplied by `scl`. The end result is multiplication by `scl**m`. This is for use in a linear change of variable. (Default: 1)
axisint, optional
    
Axis over which the derivative is taken. (Default: 0).
Returns:
    
derndarray
    
Hermite series of the derivative.
See also
`hermeint`
#### Notes
In general, the result of differentiating a Hermite series does not resemble the same operation on a power series. Thus the result of this function may be “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermeder
    >>> hermeder([ 1.,  1.,  1.,  1.])
    array([1.,  2.,  3.])
    >>> hermeder([-0.25,  1.,  1./2.,  1./3.,  1./4 ], m=2)
    array([1.,  2.,  3.])
    
# numpy.polynomial.hermite_e.hermediv
polynomial.hermite_e.hermediv(c1, c2)[source]
    
Divide one Hermite series by another.
Returns the quotient-with-remainder of two Hermite series `c1` / `c2`. The arguments are sequences of coefficients from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
[quo, rem]ndarrays
    
Of Hermite series coefficients representing the quotient and remainder.
See also
`hermeadd`, `hermesub`, `hermemulx`, `hermemul`, `hermepow`
#### Notes
In general, the (polynomial) division of one Hermite series by another results in quotient and remainder terms that are not in the Hermite polynomial basis set. Thus, to express these results as a Hermite series, it is necessary to “reproject” the results onto the Hermite basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermediv
    >>> hermediv([ 14.,  15.,  28.,   7.,   6.], [0, 1, 2])
    (array([1., 2., 3.]), array([0.]))
    >>> hermediv([ 15.,  17.,  28.,   7.,   6.], [0, 1, 2])
    (array([1., 2., 3.]), array([1., 2.]))
    
# numpy.polynomial.hermite_e.hermedomain
polynomial.hermite_e.hermedomain=array([-1., 1.]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite_e.hermefit
polynomial.hermite_e.hermefit(x, y, deg, rcond=None, full=False, w=None)[source]
    
Least squares fit of Hermite series to data.
Return the coefficients of a HermiteE series of degree `deg` that is the least squares fit to the data values `y` given at points `x`. If `y` is 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple fits are done, one for each column of `y`, and the resulting coefficients are stored in the corresponding columns of a 2-D return. The fitted polynomial(s) are in the form
\\[p(x) = c_0 + c_1 * He_1(x) + ... + c_n * He_n(x),\\]
where `n` is `deg`.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (`M`,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
Returns:
    
coefndarray, shape (M,) or (M, K)
    
Hermite coefficients ordered from low to high. If `y` was 2-D, the coefficients for the data in column k of `y` are in column `k`.
[residuals, rank, singular_values, rcond]list
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * singular_values – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full = False`. The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`numpy.polynomial.chebyshev.chebfit`
`numpy.polynomial.legendre.legfit`
`numpy.polynomial.polynomial.polyfit`
`numpy.polynomial.hermite.hermfit`
`numpy.polynomial.laguerre.lagfit`
`hermeval`
    
Evaluates a Hermite series.
`hermevander`
    
pseudo Vandermonde matrix of Hermite series.
`hermeweight`
    
HermiteE weight function.
`numpy.linalg.lstsq`
    
Computes a least-squares fit from the matrix.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution is the coefficients of the HermiteE series `p` that minimizes the sum of the weighted squared errors
\\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\\]
where the \\(w_j\\) are the weights. This problem is solved by setting up the (typically) overdetermined matrix equation
\\[V(x) * c = w * y,\\]
where `V` is the pseudo Vandermonde matrix of `x`, the elements of `c` are the coefficients to be solved for, and the elements of `y` are the observed values. This equation is then solved using the singular value decomposition of `V`.
If some of the singular values of `V` are so small that they are neglected, then a `RankWarning` will be issued. This means that the coefficient values may be poorly determined. Using a lower order fit will usually get rid of the warning. The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious and have large contributions from roundoff error.
Fits using HermiteE series are probably most useful when the data can be approximated by `sqrt(w(x)) * p(x)`, where `w(x)` is the HermiteE weight. In that case the weight `sqrt(w(x[i]))` should be used together with data values `y[i]/sqrt(w(x[i]))`. The weight function is available as `hermeweight`.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite_e import hermefit, hermeval
    >>> x = np.linspace(-10, 10)
    >>> rng = np.random.default_rng()
    >>> err = rng.normal(scale=1./10, size=len(x))
    >>> y = hermeval(x, [1, 2, 3]) + err
    >>> hermefit(x, y, 2)
    array([1.02284196, 2.00032805, 2.99978457]) # may vary
    
# numpy.polynomial.hermite_e.hermefromroots
polynomial.hermite_e.hermefromroots(roots)[source]
    
Generate a HermiteE series with given roots.
The function returns the coefficients of the polynomial
\\[p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),\\]
in HermiteE form, where the \\(r_n\\) are the roots specified in `roots`. If a zero has multiplicity n, then it must appear in `roots` n times. For instance, if 2 is a root of multiplicity three and 3 is a root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The roots can appear in any order.
If the returned coefficients are `c`, then
\\[p(x) = c_0 + c_1 * He_1(x) + ... + c_n * He_n(x)\\]
The coefficient of the last term is not generally 1 for monic polynomials in HermiteE form.
Parameters:
    
rootsarray_like
    
Sequence containing the roots.
Returns:
    
outndarray
    
1-D array of coefficients. If all roots are real then `out` is a real array, if some of the roots are complex, then `out` is complex even if all the coefficients in the result are real (see Examples below).
See also
`numpy.polynomial.polynomial.polyfromroots`
`numpy.polynomial.legendre.legfromroots`
`numpy.polynomial.laguerre.lagfromroots`
`numpy.polynomial.hermite.hermfromroots`
`numpy.polynomial.chebyshev.chebfromroots`
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermefromroots, hermeval
    >>> coef = hermefromroots((-1, 0, 1))
    >>> hermeval((-1, 0, 1), coef)
    array([0., 0., 0.])
    >>> coef = hermefromroots((-1j, 1j))
    >>> hermeval((-1j, 1j), coef)
    array([0.+0.j, 0.+0.j])
    
# numpy.polynomial.hermite_e.hermegauss
polynomial.hermite_e.hermegauss(deg)[source]
    
Gauss-HermiteE quadrature.
Computes the sample points and weights for Gauss-HermiteE quadrature. These sample points and weights will correctly integrate polynomials of degree \\(2*deg - 1\\) or less over the interval \\([-\inf, \inf]\\) with the weight function \\(f(x) = \exp(-x^2/2)\\).
Parameters:
    
degint
    
Number of sample points and weights. It must be >= 1.
Returns:
    
xndarray
    
1-D ndarray containing the sample points.
yndarray
    
1-D ndarray containing the weights.
#### Notes
The results have only been tested up to degree 100, higher degrees may be problematic. The weights are determined by using the fact that
\\[w_k = c / (He'_n(x_k) * He_{n-1}(x_k))\\]
where \\(c\\) is a constant independent of \\(k\\) and \\(x_k\\) is the k’th root of \\(He_n\\), and then scaling the results to get the right value when integrating 1.
# numpy.polynomial.hermite_e.hermegrid2d
polynomial.hermite_e.hermegrid2d(x, y, c)[source]
    
Evaluate a 2-D HermiteE series on the Cartesian product of x and y.
This function returns the values:
\\[p(a,b) = \sum_{i,j} c_{i,j} * H_i(a) * H_j(b)\\]
where the points `(a, b)` consist of all pairs formed by taking `a` from `x` and `b` from `y`. The resulting points form a grid with `x` in the first dimension and `y` in the second.
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points in the Cartesian product of `x` and `y`. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`hermeval`, `hermeval2d`, `hermeval3d`, `hermegrid3d`
# numpy.polynomial.hermite_e.hermegrid3d
polynomial.hermite_e.hermegrid3d(x, y, z, c)[source]
    
Evaluate a 3-D HermiteE series on the Cartesian product of x, y, and z.
This function returns the values:
\\[p(a,b,c) = \sum_{i,j,k} c_{i,j,k} * He_i(a) * He_j(b) * He_k(c)\\]
where the points `(a, b, c)` consist of all triples formed by taking `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form a grid with `x` in the first dimension, `y` in the second, and `z` in the third.
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than three dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape + y.shape + z.shape.
Parameters:
    
x, y, zarray_like, compatible objects
    
The three dimensional series is evaluated at the points in the Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`hermeval`, `hermeval2d`, `hermegrid2d`, `hermeval3d`
# numpy.polynomial.hermite_e.hermeint
polynomial.hermite_e.hermeint(c, m=1, k=[], lbnd=0, scl=1, axis=0)[source]
    
Integrate a Hermite_e series.
Returns the Hermite_e series coefficients `c` integrated `m` times from `lbnd` along `axis`. At each iteration the resulting series is multiplied by `scl` and an integration constant, `k`, is added. The scaling factor is for use in a linear change of variable. (“Buyer beware”: note that, depending on what one is doing, one may want `scl` to be the reciprocal of what one might expect; for more information, see the Notes section below.) The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `H_0 + 2*H_1 + 3*H_2` while [[1,2],[1,2]] represents `1*H_0(x)*H_0(y) + 1*H_1(x)*H_0(y) + 2*H_0(x)*H_1(y) + 2*H_1(x)*H_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Hermite_e series coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Order of integration, must be positive. (Default: 1)
k{[], list, scalar}, optional
    
Integration constant(s). The value of the first integral at `lbnd` is the first value in the list, the value of the second integral at `lbnd` is the second value, etc. If `k == []` (the default), all constants are set to zero. If `m == 1`, a single scalar can be given instead of a list.
lbndscalar, optional
    
The lower bound of the integral. (Default: 0)
sclscalar, optional
    
Following each integration the result is multiplied by `scl` before the integration constant is added. (Default: 1)
axisint, optional
    
Axis over which the integral is taken. (Default: 0).
Returns:
    
Sndarray
    
Hermite_e series coefficients of the integral.
Raises:
    
ValueError
    
If `m < 0`, `len(k) > m`, `np.ndim(lbnd) != 0`, or `np.ndim(scl) != 0`.
See also
`hermeder`
#### Notes
Note that the result of each integration is multiplied by `scl`. Why is this important to note? Say one is making a linear change of variable \\(u = ax + b\\) in an integral relative to `x`. Then \\(dx = du/a\\), so one will need to set `scl` equal to \\(1/a\\) \- perhaps not what one would have first thought.
Also note that, in general, the result of integrating a C-series needs to be “reprojected” onto the C-series basis set. Thus, typically, the result of this function is “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermeint
    >>> hermeint([1, 2, 3]) # integrate once, value 0 at 0.
    array([1., 1., 1., 1.])
    >>> hermeint([1, 2, 3], m=2) # integrate twice, value & deriv 0 at 0
    array([-0.25      ,  1.        ,  0.5       ,  0.33333333,  0.25      ]) # may vary
    >>> hermeint([1, 2, 3], k=1) # integrate once, value 1 at 0.
    array([2., 1., 1., 1.])
    >>> hermeint([1, 2, 3], lbnd=-1) # integrate once, value 0 at -1
    array([-1.,  1.,  1.,  1.])
    >>> hermeint([1, 2, 3], m=2, k=[1, 2], lbnd=-1)
    array([ 1.83333333,  0.        ,  0.5       ,  0.33333333,  0.25      ]) # may vary
    
# numpy.polynomial.hermite_e.hermeline
polynomial.hermite_e.hermeline(off, scl)[source]
    
Hermite series whose graph is a straight line.
Parameters:
    
off, sclscalars
    
The specified line is given by `off + scl*x`.
Returns:
    
yndarray
    
This module’s representation of the Hermite series for `off + scl*x`.
See also
`numpy.polynomial.polynomial.polyline`
`numpy.polynomial.chebyshev.chebline`
`numpy.polynomial.legendre.legline`
`numpy.polynomial.laguerre.lagline`
`numpy.polynomial.hermite.hermline`
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermeline
    >>> from numpy.polynomial.hermite_e import hermeline, hermeval
    >>> hermeval(0,hermeline(3, 2))
    3.0
    >>> hermeval(1,hermeline(3, 2))
    5.0
    
# numpy.polynomial.hermite_e.hermemul
polynomial.hermite_e.hermemul(c1, c2)[source]
    
Multiply one Hermite series by another.
Returns the product of two Hermite series `c1` * `c2`. The arguments are sequences of coefficients, from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Hermite series coefficients representing their product.
See also
`hermeadd`, `hermesub`, `hermemulx`, `hermediv`, `hermepow`
#### Notes
In general, the (polynomial) product of two C-series results in terms that are not in the Hermite polynomial basis set. Thus, to express the product as a Hermite series, it is necessary to “reproject” the product onto said basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermemul
    >>> hermemul([1, 2, 3], [0, 1, 2])
    array([14.,  15.,  28.,   7.,   6.])
    
# numpy.polynomial.hermite_e.hermemulx
polynomial.hermite_e.hermemulx(c)[source]
    
Multiply a Hermite series by x.
Multiply the Hermite series `c` by x, where x is the independent variable.
Parameters:
    
carray_like
    
1-D array of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the result of the multiplication.
See also
`hermeadd`, `hermesub`, `hermemul`, `hermediv`, `hermepow`
#### Notes
The multiplication uses the recursion relationship for Hermite polynomials in the form
\\[xP_i(x) = (P_{i + 1}(x) + iP_{i - 1}(x)))\\]
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermemulx
    >>> hermemulx([1, 2, 3])
    array([2.,  7.,  2.,  3.])
    
# numpy.polynomial.hermite_e.hermeone
polynomial.hermite_e.hermeone=array([1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite_e.hermepow
polynomial.hermite_e.hermepow(c, pow, maxpower=16)[source]
    
Raise a Hermite series to a power.
Returns the Hermite series `c` raised to the power `pow`. The argument `c` is a sequence of coefficients ordered from low to high. i.e., [1,2,3] is the series `P_0 + 2*P_1 + 3*P_2.`
Parameters:
    
carray_like
    
1-D array of Hermite series coefficients ordered from low to high.
powinteger
    
Power to which the series will be raised
maxpowerinteger, optional
    
Maximum power allowed. This is mainly to limit growth of the series to unmanageable size. Default is 16
Returns:
    
coefndarray
    
Hermite series of power.
See also
`hermeadd`, `hermesub`, `hermemulx`, `hermemul`, `hermediv`
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermepow
    >>> hermepow([1, 2, 3], 2)
    array([23.,  28.,  46.,  12.,   9.])
    
# numpy.polynomial.hermite_e.hermeroots
polynomial.hermite_e.hermeroots(c)[source]
    
Compute the roots of a HermiteE series.
Return the roots (a.k.a. “zeros”) of the polynomial
\\[p(x) = \sum_i c[i] * He_i(x).\\]
Parameters:
    
c1-D array_like
    
1-D array of coefficients.
Returns:
    
outndarray
    
Array of the roots of the series. If all the roots are real, then `out` is also real, otherwise it is complex.
See also
`numpy.polynomial.polynomial.polyroots`
`numpy.polynomial.legendre.legroots`
`numpy.polynomial.laguerre.lagroots`
`numpy.polynomial.hermite.hermroots`
`numpy.polynomial.chebyshev.chebroots`
#### Notes
The root estimates are obtained as the eigenvalues of the companion matrix, Roots far from the origin of the complex plane may have large errors due to the numerical instability of the series for such values. Roots with multiplicity greater than 1 will also show larger errors as the value of the series near such points is relatively insensitive to errors in the roots. Isolated roots near the origin can be improved by a few iterations of Newton’s method.
The HermiteE series basis polynomials aren’t powers of `x` so the results of this function may seem unintuitive.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermeroots, hermefromroots
    >>> coef = hermefromroots([-1, 0, 1])
    >>> coef
    array([0., 2., 0., 1.])
    >>> hermeroots(coef)
    array([-1.,  0.,  1.]) # may vary
    
# numpy.polynomial.hermite_e.hermesub
polynomial.hermite_e.hermesub(c1, c2)[source]
    
Subtract one Hermite series from another.
Returns the difference of two Hermite series `c1` \- `c2`. The sequences of coefficients are from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Hermite series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Hermite series coefficients representing their difference.
See also
`hermeadd`, `hermemulx`, `hermemul`, `hermediv`, `hermepow`
#### Notes
Unlike multiplication, division, etc., the difference of two Hermite series is a Hermite series (without having to “reproject” the result onto the basis set) so subtraction, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermesub
    >>> hermesub([1, 2, 3, 4], [1, 2, 3])
    array([0., 0., 0., 4.])
    
# numpy.polynomial.hermite_e.hermetrim
polynomial.hermite_e.hermetrim(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.hermite_e.hermeval
polynomial.hermite_e.hermeval(x, c, tensor=True)[source]
    
Evaluate an HermiteE series at points x.
If `c` is of length `n + 1`, this function returns the value:
\\[p(x) = c_0 * He_0(x) + c_1 * He_1(x) + ... + c_n * He_n(x)\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array, then `p(x)` will have the same shape as `x`. If `c` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is true the shape will be c.shape[1:] + x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that scalars have shape (,).
Trailing zeros in the coefficients will be used in the evaluation, so they should be avoided if efficiency is a concern.
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with with themselves and with the elements of `c`.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree n are contained in c[n]. If `c` is multidimensional the remaining indices enumerate multiple polynomials. In the two dimensional case the coefficients may be thought of as stored in the columns of `c`.
tensorboolean, optional
    
If True, the shape of the coefficient array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `c` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `c` for the evaluation. This keyword is useful when `c` is multidimensional. The default value is True.
Returns:
    
valuesndarray, algebra_like
    
The shape of the return value is described above.
See also
`hermeval2d`, `hermegrid2d`, `hermeval3d`, `hermegrid3d`
#### Notes
The evaluation uses Clenshaw recursion, aka synthetic division.
#### Examples
    
    >>> from numpy.polynomial.hermite_e import hermeval
    >>> coef = [1,2,3]
    >>> hermeval(1, coef)
    3.0
    >>> hermeval([[1,2],[3,4]], coef)
    array([[ 3., 14.],
           [31., 54.]])
    
# numpy.polynomial.hermite_e.hermeval2d
polynomial.hermite_e.hermeval2d(x, y, c)[source]
    
Evaluate a 2-D HermiteE series at points (x, y).
This function returns the values:
\\[p(x,y) = \sum_{i,j} c_{i,j} * He_i(x) * He_j(y)\\]
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array a one is implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points `(x, y)`, where `x` and `y` must have the same shape. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points formed with pairs of corresponding values from `x` and `y`.
See also
`hermeval`, `hermegrid2d`, `hermeval3d`, `hermegrid3d`
# numpy.polynomial.hermite_e.hermeval3d
polynomial.hermite_e.hermeval3d(x, y, z, c)[source]
    
Evaluate a 3-D Hermite_e series at points (x, y, z).
This function returns the values:
\\[p(x,y,z) = \sum_{i,j,k} c_{i,j,k} * He_i(x) * He_j(y) * He_k(z)\\]
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than 3 dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape.
Parameters:
    
x, y, zarray_like, compatible object
    
The three dimensional series is evaluated at the points `(x, y, z)`, where `x`, `y`, and `z` must have the same shape. If any of `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j,k is contained in `c[i,j,k]`. If `c` has dimension greater than 3 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the multidimensional polynomial on points formed with triples of corresponding values from `x`, `y`, and `z`.
See also
`hermeval`, `hermeval2d`, `hermegrid2d`, `hermegrid3d`
# numpy.polynomial.hermite_e.hermevander
polynomial.hermite_e.hermevander(x, deg)[source]
    
Pseudo-Vandermonde matrix of given degree.
Returns the pseudo-Vandermonde matrix of degree `deg` and sample points `x`. The pseudo-Vandermonde matrix is defined by
\\[V[..., i] = He_i(x),\\]
where `0 <= i <= deg`. The leading indices of `V` index the elements of `x` and the last index is the degree of the HermiteE polynomial.
If `c` is a 1-D array of coefficients of length `n + 1` and `V` is the array `V = hermevander(x, n)`, then `np.dot(V, c)` and `hermeval(x, c)` are the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of HermiteE series of the same degree and sample points.
Parameters:
    
xarray_like
    
Array of points. The dtype is converted to float64 or complex128 depending on whether any of the elements are complex. If `x` is scalar it is converted to a 1-D array.
degint
    
Degree of the resulting matrix.
Returns:
    
vanderndarray
    
The pseudo-Vandermonde matrix. The shape of the returned matrix is `x.shape + (deg + 1,)`, where The last index is the degree of the corresponding HermiteE polynomial. The dtype will be the same as the converted `x`.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite_e import hermevander
    >>> x = np.array([-1, 0, 1])
    >>> hermevander(x, 3)
    array([[ 1., -1.,  0.,  2.],
           [ 1.,  0., -1., -0.],
           [ 1.,  1.,  0., -2.]])
    
# numpy.polynomial.hermite_e.hermevander2d
polynomial.hermite_e.hermevander2d(x, y, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y)`. The pseudo-Vandermonde matrix is defined by
\\[V[..., (deg[1] + 1)*i + j] = He_i(x) * He_j(y),\\]
where `0 <= i <= deg[0]` and `0 <= j <= deg[1]`. The leading indices of `V` index the points `(x, y)` and the last index encodes the degrees of the HermiteE polynomials.
If `V = hermevander2d(x, y, [xdeg, ydeg])`, then the columns of `V` correspond to the elements of a 2-D coefficient array `c` of shape (xdeg + 1, ydeg + 1) in the order
\\[c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...\\]
and `np.dot(V, c.flat)` and `hermeval2d(x, y, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 2-D HermiteE series of the same degrees and sample points.
Parameters:
    
x, yarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg].
Returns:
    
vander2dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)\\). The dtype will be the same as the converted `x` and `y`.
See also
`hermevander`, `hermevander3d`, `hermeval2d`, `hermeval3d`
# numpy.polynomial.hermite_e.hermevander3d
polynomial.hermite_e.hermevander3d(x, y, z, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y, z)`. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`, then Hehe pseudo-Vandermonde matrix is defined by
\\[V[..., (m+1)(n+1)i + (n+1)j + k] = He_i(x)*He_j(y)*He_k(z),\\]
where `0 <= i <= l`, `0 <= j <= m`, and `0 <= j <= n`. The leading indices of `V` index the points `(x, y, z)` and the last index encodes the degrees of the HermiteE polynomials.
If `V = hermevander3d(x, y, z, [xdeg, ydeg, zdeg])`, then the columns of `V` correspond to the elements of a 3-D coefficient array `c` of shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
\\[c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...\\]
and `np.dot(V, c.flat)` and `hermeval3d(x, y, z, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 3-D HermiteE series of the same degrees and sample points.
Parameters:
    
x, y, zarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg, z_deg].
Returns:
    
vander3dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)\\). The dtype will be the same as the converted `x`, `y`, and `z`.
See also
`hermevander`, `hermevander3d`, `hermeval2d`, `hermeval3d`
# numpy.polynomial.hermite_e.hermeweight
polynomial.hermite_e.hermeweight(x)[source]
    
Weight function of the Hermite_e polynomials.
The weight function is \\(\exp(-x^2/2)\\) and the interval of integration is \\([-\inf, \inf]\\). the HermiteE polynomials are orthogonal, but not normalized, with respect to this weight function.
Parameters:
    
xarray_like
    
Values at which the weight function will be computed.
Returns:
    
wndarray
    
The weight function at `x`.
# numpy.polynomial.hermite_e.hermex
polynomial.hermite_e.hermex=array([0, 1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite_e.hermezero
polynomial.hermite_e.hermezero=array([0]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.hermite_e.HermiteE.__call__
method
polynomial.hermite_e.HermiteE.__call__(arg)[source]
    
Call self as a function.
# numpy.polynomial.hermite_e.HermiteE.basis
method
classmethodpolynomial.hermite_e.HermiteE.basis(deg, domain=None, window=None, symbol='x')[source]
    
Series basis polynomial of degree `deg`.
Returns the series representing the basis polynomial of degree `deg`.
Parameters:
    
degint
    
Degree of the basis polynomial for the series. Must be >= 0.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series with the coefficient of the `deg` term set to one and all others zero.
# numpy.polynomial.hermite_e.HermiteE.cast
method
classmethodpolynomial.hermite_e.HermiteE.cast(series, domain=None, window=None)[source]
    
Convert series to series of this class.
The `series` is expected to be an instance of some polynomial series of one of the types supported by by the numpy.polynomial module, but could be some other class that supports the convert method.
Parameters:
    
seriesseries
    
The series instance to be converted.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
Returns:
    
new_seriesseries
    
A series of the same kind as the calling class and equal to `series` when evaluated.
See also
`convert`
    
similar instance method
# numpy.polynomial.hermite_e.HermiteE.convert
method
polynomial.hermite_e.HermiteE.convert(domain=None, kind=None, window=None)[source]
    
Convert series to a different kind and/or domain and/or window.
Parameters:
    
domainarray_like, optional
    
The domain of the converted series. If the value is None, the default domain of `kind` is used.
kindclass, optional
    
The polynomial series type class to which the current instance should be converted. If kind is None, then the class of the current instance is used.
windowarray_like, optional
    
The window of the converted series. If the value is None, the default window of `kind` is used.
Returns:
    
new_seriesseries
    
The returned class can be of different type than the current instance and/or have a different domain and/or different window.
#### Notes
Conversion between domains and class types can result in numerically ill defined series.
# numpy.polynomial.hermite_e.HermiteE.copy
method
polynomial.hermite_e.HermiteE.copy()[source]
    
Return a copy.
Returns:
    
new_seriesseries
    
Copy of self.
# numpy.polynomial.hermite_e.HermiteE.cutdeg
method
polynomial.hermite_e.HermiteE.cutdeg(deg)[source]
    
Truncate series to the given degree.
Reduce the degree of the series to `deg` by discarding the high order terms. If `deg` is greater than the current degree a copy of the current series is returned. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
degnon-negative int
    
The series is reduced to degree `deg` by discarding the high order terms. The value of `deg` must be a non-negative integer.
Returns:
    
new_seriesseries
    
New instance of series with reduced degree.
# numpy.polynomial.hermite_e.HermiteE.degree
method
polynomial.hermite_e.HermiteE.degree()[source]
    
The degree of the series.
Returns:
    
degreeint
    
Degree of the series, one less than the number of coefficients.
#### Examples
Create a polynomial object for `1 + 7*x + 4*x**2`:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 4])
    >>> print(poly)
    1.0 + 7.0·x + 4.0·x²
    >>> poly.degree()
    2
    
Note that this method does not check for non-zero coefficients. You must trim the polynomial to remove any trailing zeroes:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 0])
    >>> print(poly)
    1.0 + 7.0·x + 0.0·x²
    >>> poly.degree()
    2
    >>> poly.trim().degree()
    1
    
# numpy.polynomial.hermite_e.HermiteE.deriv
method
polynomial.hermite_e.HermiteE.deriv(m=1)[source]
    
Differentiate.
Return a series instance of that is the derivative of the current series.
Parameters:
    
mnon-negative int
    
Find the derivative of order `m`.
Returns:
    
new_seriesseries
    
A new series representing the derivative. The domain is the same as the domain of the differentiated series.
# numpy.polynomial.hermite_e.HermiteE.domain
attribute
polynomial.hermite_e.HermiteE.domain=array([-1., 1.]) 
# numpy.polynomial.hermite_e.HermiteE.fit
method
classmethodpolynomial.hermite_e.HermiteE.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')[source]
    
Least squares fit to data.
Return a series instance that is the least squares fit to the data `y` sampled at `x`. The domain of the returned instance can be specified and this will often result in a superior fit with less chance of ill conditioning.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,)
    
y-coordinates of the M sample points `(x[i], y[i])`.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
domain{None, [beg, end], []}, optional
    
Domain to use for the returned series. If `None`, then a minimal domain that covers the points `x` is chosen. If `[]` the class domain is used. The default value was the class domain in NumPy 1.4 and `None` in later versions. The `[]` option was added in numpy 1.5.0.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
window{[beg, end]}, optional
    
Window to use for the returned series. The default value is the default class domain
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series that represents the least squares fit to the data and has the domain and window specified in the call. If the coefficients for the unscaled and unshifted basis polynomials are of interest, do `new_series.convert().coef`.
[resid, rank, sv, rcond]list
    
These values are only returned if `full == True`
  * resid – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * sv – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `linalg.lstsq`.
# numpy.polynomial.hermite_e.HermiteE.fromroots
method
classmethodpolynomial.hermite_e.HermiteE.fromroots(roots, domain=[], window=None, symbol='x')[source]
    
Return series instance that has the specified roots.
Returns a series representing the product `(x - r[0])*(x - r[1])*...*(x - r[n-1])`, where `r` is a list of roots.
Parameters:
    
rootsarray_like
    
List of roots.
domain{[], None, array_like}, optional
    
Domain for the resulting series. If None the domain is the interval from the smallest root to the largest. If [] the domain is the class domain. The default is [].
window{None, array_like}, optional
    
Window for the returned series. If None the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series with the specified roots.
# numpy.polynomial.hermite_e.HermiteE.has_samecoef
method
polynomial.hermite_e.HermiteE.has_samecoef(other)[source]
    
Check if coefficients match.
Parameters:
    
otherclass instance
    
The other class must have the `coef` attribute.
Returns:
    
boolboolean
    
True if the coefficients are the same, False otherwise.
# numpy.polynomial.hermite_e.HermiteE.has_samedomain
method
polynomial.hermite_e.HermiteE.has_samedomain(other)[source]
    
Check if domains match.
Parameters:
    
otherclass instance
    
The other class must have the `domain` attribute.
Returns:
    
boolboolean
    
True if the domains are the same, False otherwise.
# numpy.polynomial.hermite_e.HermiteE.has_sametype
method
polynomial.hermite_e.HermiteE.has_sametype(other)[source]
    
Check if types match.
Parameters:
    
otherobject
    
Class instance.
Returns:
    
boolboolean
    
True if other is same class as self
# numpy.polynomial.hermite_e.HermiteE.has_samewindow
method
polynomial.hermite_e.HermiteE.has_samewindow(other)[source]
    
Check if windows match.
Parameters:
    
otherclass instance
    
The other class must have the `window` attribute.
Returns:
    
boolboolean
    
True if the windows are the same, False otherwise.
# numpy.polynomial.hermite_e.HermiteE
classnumpy.polynomial.hermite_e.HermiteE(coef, domain=None, window=None, symbol='x')[source]
    
An HermiteE series class.
The HermiteE class provides the standard Python numerical methods ‘+’, ‘-’, ‘*’, ‘//’, ‘%’, ‘divmod’, ‘**’, and ‘()’ as well as the attributes and methods listed below.
Parameters:
    
coefarray_like
    
HermiteE coefficients in order of increasing degree, i.e, `(1, 2, 3)` gives `1*He_0(x) + 2*He_1(X) + 3*He_2(x)`.
domain(2,) array_like, optional
    
Domain to use. The interval `[domain[0], domain[1]]` is mapped to the interval `[window[0], window[1]]` by shifting and scaling. The default value is [-1., 1.].
window(2,) array_like, optional
    
Window, see `domain` for its use. The default value is [-1., 1.].
symbolstr, optional
    
Symbol used to represent the independent variable in string representations of the polynomial expression, e.g. for printing. The symbol must be a valid Python identifier. Default value is ‘x’.
New in version 1.24.
Attributes:
    
symbol
#### Methods
`__call__`(arg)
Call self as a function.  
`basis`(deg[, domain, window, symbol])
Series basis polynomial of degree `deg`.  
`cast`(series[, domain, window])
Convert series to series of this class.  
`convert`([domain, kind, window])
Convert series to a different kind and/or domain and/or window.  
`copy`()
Return a copy.  
`cutdeg`(deg)
Truncate series to the given degree.  
`degree`()
The degree of the series.  
`deriv`([m])
Differentiate.  
`fit`(x, y, deg[, domain, rcond, full, w, ...])
Least squares fit to data.  
`fromroots`(roots[, domain, window, symbol])
Return series instance that has the specified roots.  
`has_samecoef`(other)
Check if coefficients match.  
`has_samedomain`(other)
Check if domains match.  
`has_sametype`(other)
Check if types match.  
`has_samewindow`(other)
Check if windows match.  
`identity`([domain, window, symbol])
Identity function.  
`integ`([m, k, lbnd])
Integrate.  
`linspace`([n, domain])
Return x, y values at equally spaced points in domain.  
`mapparms`()
Return the mapping parameters.  
`roots`()
Return the roots of the series polynomial.  
`trim`([tol])
Remove trailing coefficients  
`truncate`(size)
Truncate series to length `size`.  
# numpy.polynomial.hermite_e.HermiteE.identity
method
classmethodpolynomial.hermite_e.HermiteE.identity(domain=None, window=None, symbol='x')[source]
    
Identity function.
If `p` is the returned series, then `p(x) == x` for all values of x.
Parameters:
    
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series of representing the identity.
# numpy.polynomial.hermite_e.HermiteE.integ
method
polynomial.hermite_e.HermiteE.integ(m=1, k=[], lbnd=None)[source]
    
Integrate.
Return a series instance that is the definite integral of the current series.
Parameters:
    
mnon-negative int
    
The number of integrations to perform.
karray_like
    
Integration constants. The first constant is applied to the first integration, the second to the second, and so on. The list of values must less than or equal to `m` in length and any missing values are set to zero.
lbndScalar
    
The lower bound of the definite integral.
Returns:
    
new_seriesseries
    
A new series representing the integral. The domain is the same as the domain of the integrated series.
# numpy.polynomial.hermite_e.HermiteE.linspace
method
polynomial.hermite_e.HermiteE.linspace(n=100, domain=None)[source]
    
Return x, y values at equally spaced points in domain.
Returns the x, y values at `n` linearly spaced points across the domain. Here y is the value of the polynomial at the points x. By default the domain is the same as that of the series instance. This method is intended mostly as a plotting aid.
Parameters:
    
nint, optional
    
Number of point pairs to return. The default value is 100.
domain{None, array_like}, optional
    
If not None, the specified domain is used instead of that of the calling instance. It should be of the form `[beg,end]`. The default is None which case the class domain is used.
Returns:
    
x, yndarray
    
x is equal to linspace(self.domain[0], self.domain[1], n) and y is the series evaluated at element of x.
# numpy.polynomial.hermite_e.HermiteE.mapparms
method
polynomial.hermite_e.HermiteE.mapparms()[source]
    
Return the mapping parameters.
The returned values define a linear map `off + scl*x` that is applied to the input arguments before the series is evaluated. The map depends on the `domain` and `window`; if the current `domain` is equal to the `window` the resulting map is the identity. If the coefficients of the series instance are to be used by themselves outside this class, then the linear function must be substituted for the `x` in the standard representation of the base polynomials.
Returns:
    
off, sclfloat or complex
    
The mapping function is defined by `off + scl*x`.
#### Notes
If the current domain is the interval `[l1, r1]` and the window is `[l2, r2]`, then the linear mapping function `L` is defined by the equations:
    
    L(l1) = l2
    L(r1) = r2
    
# numpy.polynomial.hermite_e.HermiteE.roots
method
polynomial.hermite_e.HermiteE.roots()[source]
    
Return the roots of the series polynomial.
Compute the roots for the series. Note that the accuracy of the roots decreases the further outside the `domain` they lie.
Returns:
    
rootsndarray
    
Array containing the roots of the series.
# numpy.polynomial.hermite_e.HermiteE.trim
method
polynomial.hermite_e.HermiteE.trim(tol=0)[source]
    
Remove trailing coefficients
Remove trailing coefficients until a coefficient is reached whose absolute value greater than `tol` or the beginning of the series is reached. If all the coefficients would be removed the series is set to `[0]`. A new series instance is returned with the new coefficients. The current instance remains unchanged.
Parameters:
    
tolnon-negative number.
    
All trailing coefficients less than `tol` will be removed.
Returns:
    
new_seriesseries
    
New instance of series with trimmed coefficients.
# numpy.polynomial.hermite_e.HermiteE.truncate
method
polynomial.hermite_e.HermiteE.truncate(size)[source]
    
Truncate series to length `size`.
Reduce the series to length `size` by discarding the high degree terms. The value of `size` must be a positive integer. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
sizepositive int
    
The series is reduced to length `size` by discarding the high degree terms. The value of `size` must be a positive integer.
Returns:
    
new_seriesseries
    
New instance of series with truncated coefficients.
# numpy.polynomial.hermite_e.poly2herme
polynomial.hermite_e.poly2herme(pol)[source]
    
Convert a polynomial to a Hermite series.
Convert an array representing the coefficients of a polynomial (relative to the “standard” basis) ordered from lowest degree to highest, to an array of the coefficients of the equivalent Hermite series, ordered from lowest to highest degree.
Parameters:
    
polarray_like
    
1-D array containing the polynomial coefficients
Returns:
    
cndarray
    
1-D array containing the coefficients of the equivalent Hermite series.
See also
`herme2poly`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.hermite_e import poly2herme
    >>> poly2herme(np.arange(4))
    array([  2.,  10.,   2.,   3.])
    
# numpy.polynomial.laguerre.lag2poly
polynomial.laguerre.lag2poly(c)[source]
    
Convert a Laguerre series to a polynomial.
Convert an array representing the coefficients of a Laguerre series, ordered from lowest degree to highest, to an array of the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest to highest degree.
Parameters:
    
carray_like
    
1-D array containing the Laguerre series coefficients, ordered from lowest order term to highest.
Returns:
    
polndarray
    
1-D array containing the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest order term to highest.
See also
`poly2lag`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lag2poly
    >>> lag2poly([ 23., -63.,  58., -18.])
    array([0., 1., 2., 3.])
    
# numpy.polynomial.laguerre.lagadd
polynomial.laguerre.lagadd(c1, c2)[source]
    
Add one Laguerre series to another.
Returns the sum of two Laguerre series `c1` \+ `c2`. The arguments are sequences of coefficients ordered from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Laguerre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the Laguerre series of their sum.
See also
`lagsub`, `lagmulx`, `lagmul`, `lagdiv`, `lagpow`
#### Notes
Unlike multiplication, division, etc., the sum of two Laguerre series is a Laguerre series (without having to “reproject” the result onto the basis set) so addition, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagadd
    >>> lagadd([1, 2, 3], [1, 2, 3, 4])
    array([2.,  4.,  6.,  4.])
    
# numpy.polynomial.laguerre.lagcompanion
polynomial.laguerre.lagcompanion(c)[source]
    
Return the companion matrix of c.
The usual companion matrix of the Laguerre polynomials is already symmetric when `c` is a basis Laguerre polynomial, so no scaling is applied.
Parameters:
    
carray_like
    
1-D array of Laguerre series coefficients ordered from low to high degree.
Returns:
    
matndarray
    
Companion matrix of dimensions (deg, deg).
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagcompanion
    >>> lagcompanion([1, 2, 3])
    array([[ 1.        , -0.33333333],
           [-1.        ,  4.33333333]])
    
# numpy.polynomial.laguerre.lagder
polynomial.laguerre.lagder(c, m=1, scl=1, axis=0)[source]
    
Differentiate a Laguerre series.
Returns the Laguerre series coefficients `c` differentiated `m` times along `axis`. At each iteration the result is multiplied by `scl` (the scaling factor is for use in a linear change of variable). The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `1*L_0 + 2*L_1 + 3*L_2` while [[1,2],[1,2]] represents `1*L_0(x)*L_0(y) + 1*L_1(x)*L_0(y) + 2*L_0(x)*L_1(y) + 2*L_1(x)*L_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Laguerre series coefficients. If `c` is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Number of derivatives taken, must be non-negative. (Default: 1)
sclscalar, optional
    
Each differentiation is multiplied by `scl`. The end result is multiplication by `scl**m`. This is for use in a linear change of variable. (Default: 1)
axisint, optional
    
Axis over which the derivative is taken. (Default: 0).
Returns:
    
derndarray
    
Laguerre series of the derivative.
See also
`lagint`
#### Notes
In general, the result of differentiating a Laguerre series does not resemble the same operation on a power series. Thus the result of this function may be “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagder
    >>> lagder([ 1.,  1.,  1., -3.])
    array([1.,  2.,  3.])
    >>> lagder([ 1.,  0.,  0., -4.,  3.], m=2)
    array([1.,  2.,  3.])
    
# numpy.polynomial.laguerre.lagdiv
polynomial.laguerre.lagdiv(c1, c2)[source]
    
Divide one Laguerre series by another.
Returns the quotient-with-remainder of two Laguerre series `c1` / `c2`. The arguments are sequences of coefficients from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Laguerre series coefficients ordered from low to high.
Returns:
    
[quo, rem]ndarrays
    
Of Laguerre series coefficients representing the quotient and remainder.
See also
`lagadd`, `lagsub`, `lagmulx`, `lagmul`, `lagpow`
#### Notes
In general, the (polynomial) division of one Laguerre series by another results in quotient and remainder terms that are not in the Laguerre polynomial basis set. Thus, to express these results as a Laguerre series, it is necessary to “reproject” the results onto the Laguerre basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagdiv
    >>> lagdiv([  8., -13.,  38., -51.,  36.], [0, 1, 2])
    (array([1., 2., 3.]), array([0.]))
    >>> lagdiv([  9., -12.,  38., -51.,  36.], [0, 1, 2])
    (array([1., 2., 3.]), array([1., 1.]))
    
# numpy.polynomial.laguerre.lagdomain
polynomial.laguerre.lagdomain=array([0., 1.]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.laguerre.lagfit
polynomial.laguerre.lagfit(x, y, deg, rcond=None, full=False, w=None)[source]
    
Least squares fit of Laguerre series to data.
Return the coefficients of a Laguerre series of degree `deg` that is the least squares fit to the data values `y` given at points `x`. If `y` is 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple fits are done, one for each column of `y`, and the resulting coefficients are stored in the corresponding columns of a 2-D return. The fitted polynomial(s) are in the form
\\[p(x) = c_0 + c_1 * L_1(x) + ... + c_n * L_n(x),\\]
where `n` is `deg`.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (`M`,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
Returns:
    
coefndarray, shape (M,) or (M, K)
    
Laguerre coefficients ordered from low to high. If `y` was 2-D, the coefficients for the data in column k of `y` are in column k.
[residuals, rank, singular_values, rcond]list
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * singular_values – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full == False`. The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`numpy.polynomial.polynomial.polyfit`
`numpy.polynomial.legendre.legfit`
`numpy.polynomial.chebyshev.chebfit`
`numpy.polynomial.hermite.hermfit`
`numpy.polynomial.hermite_e.hermefit`
`lagval`
    
Evaluates a Laguerre series.
`lagvander`
    
pseudo Vandermonde matrix of Laguerre series.
`lagweight`
    
Laguerre weight function.
`numpy.linalg.lstsq`
    
Computes a least-squares fit from the matrix.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution is the coefficients of the Laguerre series `p` that minimizes the sum of the weighted squared errors
\\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\\]
where the \\(w_j\\) are the weights. This problem is solved by setting up as the (typically) overdetermined matrix equation
\\[V(x) * c = w * y,\\]
where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the coefficients to be solved for, `w` are the weights, and `y` are the observed values. This equation is then solved using the singular value decomposition of `V`.
If some of the singular values of `V` are so small that they are neglected, then a `RankWarning` will be issued. This means that the coefficient values may be poorly determined. Using a lower order fit will usually get rid of the warning. The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious and have large contributions from roundoff error.
Fits using Laguerre series are probably most useful when the data can be approximated by `sqrt(w(x)) * p(x)`, where `w(x)` is the Laguerre weight. In that case the weight `sqrt(w(x[i]))` should be used together with data values `y[i]/sqrt(w(x[i]))`. The weight function is available as `lagweight`.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.laguerre import lagfit, lagval
    >>> x = np.linspace(0, 10)
    >>> rng = np.random.default_rng()
    >>> err = rng.normal(scale=1./10, size=len(x))
    >>> y = lagval(x, [1, 2, 3]) + err
    >>> lagfit(x, y, 2)
    array([1.00578369, 1.99417356, 2.99827656]) # may vary
    
# numpy.polynomial.laguerre.lagfromroots
polynomial.laguerre.lagfromroots(roots)[source]
    
Generate a Laguerre series with given roots.
The function returns the coefficients of the polynomial
\\[p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),\\]
in Laguerre form, where the \\(r_n\\) are the roots specified in `roots`. If a zero has multiplicity n, then it must appear in `roots` n times. For instance, if 2 is a root of multiplicity three and 3 is a root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The roots can appear in any order.
If the returned coefficients are `c`, then
\\[p(x) = c_0 + c_1 * L_1(x) + ... + c_n * L_n(x)\\]
The coefficient of the last term is not generally 1 for monic polynomials in Laguerre form.
Parameters:
    
rootsarray_like
    
Sequence containing the roots.
Returns:
    
outndarray
    
1-D array of coefficients. If all roots are real then `out` is a real array, if some of the roots are complex, then `out` is complex even if all the coefficients in the result are real (see Examples below).
See also
`numpy.polynomial.polynomial.polyfromroots`
`numpy.polynomial.legendre.legfromroots`
`numpy.polynomial.chebyshev.chebfromroots`
`numpy.polynomial.hermite.hermfromroots`
`numpy.polynomial.hermite_e.hermefromroots`
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagfromroots, lagval
    >>> coef = lagfromroots((-1, 0, 1))
    >>> lagval((-1, 0, 1), coef)
    array([0.,  0.,  0.])
    >>> coef = lagfromroots((-1j, 1j))
    >>> lagval((-1j, 1j), coef)
    array([0.+0.j, 0.+0.j])
    
# numpy.polynomial.laguerre.laggauss
polynomial.laguerre.laggauss(deg)[source]
    
Gauss-Laguerre quadrature.
Computes the sample points and weights for Gauss-Laguerre quadrature. These sample points and weights will correctly integrate polynomials of degree \\(2*deg - 1\\) or less over the interval \\([0, \inf]\\) with the weight function \\(f(x) = \exp(-x)\\).
Parameters:
    
degint
    
Number of sample points and weights. It must be >= 1.
Returns:
    
xndarray
    
1-D ndarray containing the sample points.
yndarray
    
1-D ndarray containing the weights.
#### Notes
The results have only been tested up to degree 100 higher degrees may be problematic. The weights are determined by using the fact that
\\[w_k = c / (L'_n(x_k) * L_{n-1}(x_k))\\]
where \\(c\\) is a constant independent of \\(k\\) and \\(x_k\\) is the k’th root of \\(L_n\\), and then scaling the results to get the right value when integrating 1.
#### Examples
    
    >>> from numpy.polynomial.laguerre import laggauss
    >>> laggauss(2)
    (array([0.58578644, 3.41421356]), array([0.85355339, 0.14644661]))
    
# numpy.polynomial.laguerre.laggrid2d
polynomial.laguerre.laggrid2d(x, y, c)[source]
    
Evaluate a 2-D Laguerre series on the Cartesian product of x and y.
This function returns the values:
\\[p(a,b) = \sum_{i,j} c_{i,j} * L_i(a) * L_j(b)\\]
where the points `(a, b)` consist of all pairs formed by taking `a` from `x` and `b` from `y`. The resulting points form a grid with `x` in the first dimension and `y` in the second.
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape + y.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points in the Cartesian product of `x` and `y`. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional Chebyshev series at points in the Cartesian product of `x` and `y`.
See also
`lagval`, `lagval2d`, `lagval3d`, `laggrid3d`
#### Examples
    
    >>> from numpy.polynomial.laguerre import laggrid2d
    >>> c = [[1, 2], [3, 4]]
    >>> laggrid2d([0, 1], [0, 1], c)
    array([[10.,  4.],
           [ 3.,  1.]])
    
# numpy.polynomial.laguerre.laggrid3d
polynomial.laguerre.laggrid3d(x, y, z, c)[source]
    
Evaluate a 3-D Laguerre series on the Cartesian product of x, y, and z.
This function returns the values:
\\[p(a,b,c) = \sum_{i,j,k} c_{i,j,k} * L_i(a) * L_j(b) * L_k(c)\\]
where the points `(a, b, c)` consist of all triples formed by taking `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form a grid with `x` in the first dimension, `y` in the second, and `z` in the third.
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than three dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape + y.shape + z.shape.
Parameters:
    
x, y, zarray_like, compatible objects
    
The three dimensional series is evaluated at the points in the Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`lagval`, `lagval2d`, `laggrid2d`, `lagval3d`
#### Examples
    
    >>> from numpy.polynomial.laguerre import laggrid3d
    >>> c = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
    >>> laggrid3d([0, 1], [0, 1], [2, 4], c)
    array([[[ -4., -44.],
            [ -2., -18.]],
           [[ -2., -14.],
            [ -1.,  -5.]]])
    
# numpy.polynomial.laguerre.lagint
polynomial.laguerre.lagint(c, m=1, k=[], lbnd=0, scl=1, axis=0)[source]
    
Integrate a Laguerre series.
Returns the Laguerre series coefficients `c` integrated `m` times from `lbnd` along `axis`. At each iteration the resulting series is multiplied by `scl` and an integration constant, `k`, is added. The scaling factor is for use in a linear change of variable. (“Buyer beware”: note that, depending on what one is doing, one may want `scl` to be the reciprocal of what one might expect; for more information, see the Notes section below.) The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `L_0 + 2*L_1 + 3*L_2` while [[1,2],[1,2]] represents `1*L_0(x)*L_0(y) + 1*L_1(x)*L_0(y) + 2*L_0(x)*L_1(y) + 2*L_1(x)*L_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Laguerre series coefficients. If `c` is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Order of integration, must be positive. (Default: 1)
k{[], list, scalar}, optional
    
Integration constant(s). The value of the first integral at `lbnd` is the first value in the list, the value of the second integral at `lbnd` is the second value, etc. If `k == []` (the default), all constants are set to zero. If `m == 1`, a single scalar can be given instead of a list.
lbndscalar, optional
    
The lower bound of the integral. (Default: 0)
sclscalar, optional
    
Following each integration the result is multiplied by `scl` before the integration constant is added. (Default: 1)
axisint, optional
    
Axis over which the integral is taken. (Default: 0).
Returns:
    
Sndarray
    
Laguerre series coefficients of the integral.
Raises:
    
ValueError
    
If `m < 0`, `len(k) > m`, `np.ndim(lbnd) != 0`, or `np.ndim(scl) != 0`.
See also
`lagder`
#### Notes
Note that the result of each integration is multiplied by `scl`. Why is this important to note? Say one is making a linear change of variable \\(u = ax + b\\) in an integral relative to `x`. Then \\(dx = du/a\\), so one will need to set `scl` equal to \\(1/a\\) \- perhaps not what one would have first thought.
Also note that, in general, the result of integrating a C-series needs to be “reprojected” onto the C-series basis set. Thus, typically, the result of this function is “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagint
    >>> lagint([1,2,3])
    array([ 1.,  1.,  1., -3.])
    >>> lagint([1,2,3], m=2)
    array([ 1.,  0.,  0., -4.,  3.])
    >>> lagint([1,2,3], k=1)
    array([ 2.,  1.,  1., -3.])
    >>> lagint([1,2,3], lbnd=-1)
    array([11.5,  1. ,  1. , -3. ])
    >>> lagint([1,2], m=2, k=[1,2], lbnd=-1)
    array([ 11.16666667,  -5.        ,  -3.        ,   2.        ]) # may vary
    
# numpy.polynomial.laguerre.lagline
polynomial.laguerre.lagline(off, scl)[source]
    
Laguerre series whose graph is a straight line.
Parameters:
    
off, sclscalars
    
The specified line is given by `off + scl*x`.
Returns:
    
yndarray
    
This module’s representation of the Laguerre series for `off + scl*x`.
See also
`numpy.polynomial.polynomial.polyline`
`numpy.polynomial.chebyshev.chebline`
`numpy.polynomial.legendre.legline`
`numpy.polynomial.hermite.hermline`
`numpy.polynomial.hermite_e.hermeline`
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagline, lagval
    >>> lagval(0,lagline(3, 2))
    3.0
    >>> lagval(1,lagline(3, 2))
    5.0
    
# numpy.polynomial.laguerre.lagmul
polynomial.laguerre.lagmul(c1, c2)[source]
    
Multiply one Laguerre series by another.
Returns the product of two Laguerre series `c1` * `c2`. The arguments are sequences of coefficients, from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Laguerre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Laguerre series coefficients representing their product.
See also
`lagadd`, `lagsub`, `lagmulx`, `lagdiv`, `lagpow`
#### Notes
In general, the (polynomial) product of two C-series results in terms that are not in the Laguerre polynomial basis set. Thus, to express the product as a Laguerre series, it is necessary to “reproject” the product onto said basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagmul
    >>> lagmul([1, 2, 3], [0, 1, 2])
    array([  8., -13.,  38., -51.,  36.])
    
# numpy.polynomial.laguerre.lagmulx
polynomial.laguerre.lagmulx(c)[source]
    
Multiply a Laguerre series by x.
Multiply the Laguerre series `c` by x, where x is the independent variable.
Parameters:
    
carray_like
    
1-D array of Laguerre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the result of the multiplication.
See also
`lagadd`, `lagsub`, `lagmul`, `lagdiv`, `lagpow`
#### Notes
The multiplication uses the recursion relationship for Laguerre polynomials in the form
\\[xP_i(x) = (-(i + 1)*P_{i + 1}(x) + (2i + 1)P_{i}(x) - iP_{i - 1}(x))\\]
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagmulx
    >>> lagmulx([1, 2, 3])
    array([-1.,  -1.,  11.,  -9.])
    
# numpy.polynomial.laguerre.lagone
polynomial.laguerre.lagone=array([1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.laguerre.lagpow
polynomial.laguerre.lagpow(c, pow, maxpower=16)[source]
    
Raise a Laguerre series to a power.
Returns the Laguerre series `c` raised to the power `pow`. The argument `c` is a sequence of coefficients ordered from low to high. i.e., [1,2,3] is the series `P_0 + 2*P_1 + 3*P_2.`
Parameters:
    
carray_like
    
1-D array of Laguerre series coefficients ordered from low to high.
powinteger
    
Power to which the series will be raised
maxpowerinteger, optional
    
Maximum power allowed. This is mainly to limit growth of the series to unmanageable size. Default is 16
Returns:
    
coefndarray
    
Laguerre series of power.
See also
`lagadd`, `lagsub`, `lagmulx`, `lagmul`, `lagdiv`
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagpow
    >>> lagpow([1, 2, 3], 2)
    array([ 14., -16.,  56., -72.,  54.])
    
# numpy.polynomial.laguerre.lagroots
polynomial.laguerre.lagroots(c)[source]
    
Compute the roots of a Laguerre series.
Return the roots (a.k.a. “zeros”) of the polynomial
\\[p(x) = \sum_i c[i] * L_i(x).\\]
Parameters:
    
c1-D array_like
    
1-D array of coefficients.
Returns:
    
outndarray
    
Array of the roots of the series. If all the roots are real, then `out` is also real, otherwise it is complex.
See also
`numpy.polynomial.polynomial.polyroots`
`numpy.polynomial.legendre.legroots`
`numpy.polynomial.chebyshev.chebroots`
`numpy.polynomial.hermite.hermroots`
`numpy.polynomial.hermite_e.hermeroots`
#### Notes
The root estimates are obtained as the eigenvalues of the companion matrix, Roots far from the origin of the complex plane may have large errors due to the numerical instability of the series for such values. Roots with multiplicity greater than 1 will also show larger errors as the value of the series near such points is relatively insensitive to errors in the roots. Isolated roots near the origin can be improved by a few iterations of Newton’s method.
The Laguerre series basis polynomials aren’t powers of `x` so the results of this function may seem unintuitive.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagroots, lagfromroots
    >>> coef = lagfromroots([0, 1, 2])
    >>> coef
    array([  2.,  -8.,  12.,  -6.])
    >>> lagroots(coef)
    array([-4.4408921e-16,  1.0000000e+00,  2.0000000e+00])
    
# numpy.polynomial.laguerre.lagsub
polynomial.laguerre.lagsub(c1, c2)[source]
    
Subtract one Laguerre series from another.
Returns the difference of two Laguerre series `c1` \- `c2`. The sequences of coefficients are from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Laguerre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Laguerre series coefficients representing their difference.
See also
`lagadd`, `lagmulx`, `lagmul`, `lagdiv`, `lagpow`
#### Notes
Unlike multiplication, division, etc., the difference of two Laguerre series is a Laguerre series (without having to “reproject” the result onto the basis set) so subtraction, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagsub
    >>> lagsub([1, 2, 3, 4], [1, 2, 3])
    array([0.,  0.,  0.,  4.])
    
# numpy.polynomial.laguerre.lagtrim
polynomial.laguerre.lagtrim(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.laguerre.Laguerre.__call__
method
polynomial.laguerre.Laguerre.__call__(arg)[source]
    
Call self as a function.
# numpy.polynomial.laguerre.Laguerre.basis
method
classmethodpolynomial.laguerre.Laguerre.basis(deg, domain=None, window=None, symbol='x')[source]
    
Series basis polynomial of degree `deg`.
Returns the series representing the basis polynomial of degree `deg`.
Parameters:
    
degint
    
Degree of the basis polynomial for the series. Must be >= 0.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series with the coefficient of the `deg` term set to one and all others zero.
# numpy.polynomial.laguerre.Laguerre.cast
method
classmethodpolynomial.laguerre.Laguerre.cast(series, domain=None, window=None)[source]
    
Convert series to series of this class.
The `series` is expected to be an instance of some polynomial series of one of the types supported by by the numpy.polynomial module, but could be some other class that supports the convert method.
Parameters:
    
seriesseries
    
The series instance to be converted.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
Returns:
    
new_seriesseries
    
A series of the same kind as the calling class and equal to `series` when evaluated.
See also
`convert`
    
similar instance method
# numpy.polynomial.laguerre.Laguerre.convert
method
polynomial.laguerre.Laguerre.convert(domain=None, kind=None, window=None)[source]
    
Convert series to a different kind and/or domain and/or window.
Parameters:
    
domainarray_like, optional
    
The domain of the converted series. If the value is None, the default domain of `kind` is used.
kindclass, optional
    
The polynomial series type class to which the current instance should be converted. If kind is None, then the class of the current instance is used.
windowarray_like, optional
    
The window of the converted series. If the value is None, the default window of `kind` is used.
Returns:
    
new_seriesseries
    
The returned class can be of different type than the current instance and/or have a different domain and/or different window.
#### Notes
Conversion between domains and class types can result in numerically ill defined series.
# numpy.polynomial.laguerre.Laguerre.copy
method
polynomial.laguerre.Laguerre.copy()[source]
    
Return a copy.
Returns:
    
new_seriesseries
    
Copy of self.
# numpy.polynomial.laguerre.Laguerre.cutdeg
method
polynomial.laguerre.Laguerre.cutdeg(deg)[source]
    
Truncate series to the given degree.
Reduce the degree of the series to `deg` by discarding the high order terms. If `deg` is greater than the current degree a copy of the current series is returned. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
degnon-negative int
    
The series is reduced to degree `deg` by discarding the high order terms. The value of `deg` must be a non-negative integer.
Returns:
    
new_seriesseries
    
New instance of series with reduced degree.
# numpy.polynomial.laguerre.Laguerre.degree
method
polynomial.laguerre.Laguerre.degree()[source]
    
The degree of the series.
Returns:
    
degreeint
    
Degree of the series, one less than the number of coefficients.
#### Examples
Create a polynomial object for `1 + 7*x + 4*x**2`:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 4])
    >>> print(poly)
    1.0 + 7.0·x + 4.0·x²
    >>> poly.degree()
    2
    
Note that this method does not check for non-zero coefficients. You must trim the polynomial to remove any trailing zeroes:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 0])
    >>> print(poly)
    1.0 + 7.0·x + 0.0·x²
    >>> poly.degree()
    2
    >>> poly.trim().degree()
    1
    
# numpy.polynomial.laguerre.Laguerre.deriv
method
polynomial.laguerre.Laguerre.deriv(m=1)[source]
    
Differentiate.
Return a series instance of that is the derivative of the current series.
Parameters:
    
mnon-negative int
    
Find the derivative of order `m`.
Returns:
    
new_seriesseries
    
A new series representing the derivative. The domain is the same as the domain of the differentiated series.
# numpy.polynomial.laguerre.Laguerre.domain
attribute
polynomial.laguerre.Laguerre.domain=array([0., 1.]) 
# numpy.polynomial.laguerre.Laguerre.fit
method
classmethodpolynomial.laguerre.Laguerre.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')[source]
    
Least squares fit to data.
Return a series instance that is the least squares fit to the data `y` sampled at `x`. The domain of the returned instance can be specified and this will often result in a superior fit with less chance of ill conditioning.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,)
    
y-coordinates of the M sample points `(x[i], y[i])`.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
domain{None, [beg, end], []}, optional
    
Domain to use for the returned series. If `None`, then a minimal domain that covers the points `x` is chosen. If `[]` the class domain is used. The default value was the class domain in NumPy 1.4 and `None` in later versions. The `[]` option was added in numpy 1.5.0.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
window{[beg, end]}, optional
    
Window to use for the returned series. The default value is the default class domain
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series that represents the least squares fit to the data and has the domain and window specified in the call. If the coefficients for the unscaled and unshifted basis polynomials are of interest, do `new_series.convert().coef`.
[resid, rank, sv, rcond]list
    
These values are only returned if `full == True`
  * resid – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * sv – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `linalg.lstsq`.
# numpy.polynomial.laguerre.Laguerre.fromroots
method
classmethodpolynomial.laguerre.Laguerre.fromroots(roots, domain=[], window=None, symbol='x')[source]
    
Return series instance that has the specified roots.
Returns a series representing the product `(x - r[0])*(x - r[1])*...*(x - r[n-1])`, where `r` is a list of roots.
Parameters:
    
rootsarray_like
    
List of roots.
domain{[], None, array_like}, optional
    
Domain for the resulting series. If None the domain is the interval from the smallest root to the largest. If [] the domain is the class domain. The default is [].
window{None, array_like}, optional
    
Window for the returned series. If None the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series with the specified roots.
# numpy.polynomial.laguerre.Laguerre.has_samecoef
method
polynomial.laguerre.Laguerre.has_samecoef(other)[source]
    
Check if coefficients match.
Parameters:
    
otherclass instance
    
The other class must have the `coef` attribute.
Returns:
    
boolboolean
    
True if the coefficients are the same, False otherwise.
# numpy.polynomial.laguerre.Laguerre.has_samedomain
method
polynomial.laguerre.Laguerre.has_samedomain(other)[source]
    
Check if domains match.
Parameters:
    
otherclass instance
    
The other class must have the `domain` attribute.
Returns:
    
boolboolean
    
True if the domains are the same, False otherwise.
# numpy.polynomial.laguerre.Laguerre.has_sametype
method
polynomial.laguerre.Laguerre.has_sametype(other)[source]
    
Check if types match.
Parameters:
    
otherobject
    
Class instance.
Returns:
    
boolboolean
    
True if other is same class as self
# numpy.polynomial.laguerre.Laguerre.has_samewindow
method
polynomial.laguerre.Laguerre.has_samewindow(other)[source]
    
Check if windows match.
Parameters:
    
otherclass instance
    
The other class must have the `window` attribute.
Returns:
    
boolboolean
    
True if the windows are the same, False otherwise.
# numpy.polynomial.laguerre.Laguerre
classnumpy.polynomial.laguerre.Laguerre(coef, domain=None, window=None, symbol='x')[source]
    
A Laguerre series class.
The Laguerre class provides the standard Python numerical methods ‘+’, ‘-’, ‘*’, ‘//’, ‘%’, ‘divmod’, ‘**’, and ‘()’ as well as the attributes and methods listed below.
Parameters:
    
coefarray_like
    
Laguerre coefficients in order of increasing degree, i.e, `(1, 2, 3)` gives `1*L_0(x) + 2*L_1(X) + 3*L_2(x)`.
domain(2,) array_like, optional
    
Domain to use. The interval `[domain[0], domain[1]]` is mapped to the interval `[window[0], window[1]]` by shifting and scaling. The default value is [0., 1.].
window(2,) array_like, optional
    
Window, see `domain` for its use. The default value is [0., 1.].
symbolstr, optional
    
Symbol used to represent the independent variable in string representations of the polynomial expression, e.g. for printing. The symbol must be a valid Python identifier. Default value is ‘x’.
New in version 1.24.
Attributes:
    
symbol
#### Methods
`__call__`(arg)
Call self as a function.  
`basis`(deg[, domain, window, symbol])
Series basis polynomial of degree `deg`.  
`cast`(series[, domain, window])
Convert series to series of this class.  
`convert`([domain, kind, window])
Convert series to a different kind and/or domain and/or window.  
`copy`()
Return a copy.  
`cutdeg`(deg)
Truncate series to the given degree.  
`degree`()
The degree of the series.  
`deriv`([m])
Differentiate.  
`fit`(x, y, deg[, domain, rcond, full, w, ...])
Least squares fit to data.  
`fromroots`(roots[, domain, window, symbol])
Return series instance that has the specified roots.  
`has_samecoef`(other)
Check if coefficients match.  
`has_samedomain`(other)
Check if domains match.  
`has_sametype`(other)
Check if types match.  
`has_samewindow`(other)
Check if windows match.  
`identity`([domain, window, symbol])
Identity function.  
`integ`([m, k, lbnd])
Integrate.  
`linspace`([n, domain])
Return x, y values at equally spaced points in domain.  
`mapparms`()
Return the mapping parameters.  
`roots`()
Return the roots of the series polynomial.  
`trim`([tol])
Remove trailing coefficients  
`truncate`(size)
Truncate series to length `size`.  
# numpy.polynomial.laguerre.Laguerre.identity
method
classmethodpolynomial.laguerre.Laguerre.identity(domain=None, window=None, symbol='x')[source]
    
Identity function.
If `p` is the returned series, then `p(x) == x` for all values of x.
Parameters:
    
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series of representing the identity.
# numpy.polynomial.laguerre.Laguerre.integ
method
polynomial.laguerre.Laguerre.integ(m=1, k=[], lbnd=None)[source]
    
Integrate.
Return a series instance that is the definite integral of the current series.
Parameters:
    
mnon-negative int
    
The number of integrations to perform.
karray_like
    
Integration constants. The first constant is applied to the first integration, the second to the second, and so on. The list of values must less than or equal to `m` in length and any missing values are set to zero.
lbndScalar
    
The lower bound of the definite integral.
Returns:
    
new_seriesseries
    
A new series representing the integral. The domain is the same as the domain of the integrated series.
# numpy.polynomial.laguerre.Laguerre.linspace
method
polynomial.laguerre.Laguerre.linspace(n=100, domain=None)[source]
    
Return x, y values at equally spaced points in domain.
Returns the x, y values at `n` linearly spaced points across the domain. Here y is the value of the polynomial at the points x. By default the domain is the same as that of the series instance. This method is intended mostly as a plotting aid.
Parameters:
    
nint, optional
    
Number of point pairs to return. The default value is 100.
domain{None, array_like}, optional
    
If not None, the specified domain is used instead of that of the calling instance. It should be of the form `[beg,end]`. The default is None which case the class domain is used.
Returns:
    
x, yndarray
    
x is equal to linspace(self.domain[0], self.domain[1], n) and y is the series evaluated at element of x.
# numpy.polynomial.laguerre.Laguerre.mapparms
method
polynomial.laguerre.Laguerre.mapparms()[source]
    
Return the mapping parameters.
The returned values define a linear map `off + scl*x` that is applied to the input arguments before the series is evaluated. The map depends on the `domain` and `window`; if the current `domain` is equal to the `window` the resulting map is the identity. If the coefficients of the series instance are to be used by themselves outside this class, then the linear function must be substituted for the `x` in the standard representation of the base polynomials.
Returns:
    
off, sclfloat or complex
    
The mapping function is defined by `off + scl*x`.
#### Notes
If the current domain is the interval `[l1, r1]` and the window is `[l2, r2]`, then the linear mapping function `L` is defined by the equations:
    
    L(l1) = l2
    L(r1) = r2
    
# numpy.polynomial.laguerre.Laguerre.roots
method
polynomial.laguerre.Laguerre.roots()[source]
    
Return the roots of the series polynomial.
Compute the roots for the series. Note that the accuracy of the roots decreases the further outside the `domain` they lie.
Returns:
    
rootsndarray
    
Array containing the roots of the series.
# numpy.polynomial.laguerre.Laguerre.trim
method
polynomial.laguerre.Laguerre.trim(tol=0)[source]
    
Remove trailing coefficients
Remove trailing coefficients until a coefficient is reached whose absolute value greater than `tol` or the beginning of the series is reached. If all the coefficients would be removed the series is set to `[0]`. A new series instance is returned with the new coefficients. The current instance remains unchanged.
Parameters:
    
tolnon-negative number.
    
All trailing coefficients less than `tol` will be removed.
Returns:
    
new_seriesseries
    
New instance of series with trimmed coefficients.
# numpy.polynomial.laguerre.Laguerre.truncate
method
polynomial.laguerre.Laguerre.truncate(size)[source]
    
Truncate series to length `size`.
Reduce the series to length `size` by discarding the high degree terms. The value of `size` must be a positive integer. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
sizepositive int
    
The series is reduced to length `size` by discarding the high degree terms. The value of `size` must be a positive integer.
Returns:
    
new_seriesseries
    
New instance of series with truncated coefficients.
# numpy.polynomial.laguerre.lagval
polynomial.laguerre.lagval(x, c, tensor=True)[source]
    
Evaluate a Laguerre series at points x.
If `c` is of length `n + 1`, this function returns the value:
\\[p(x) = c_0 * L_0(x) + c_1 * L_1(x) + ... + c_n * L_n(x)\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array, then `p(x)` will have the same shape as `x`. If `c` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is true the shape will be c.shape[1:] + x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that scalars have shape (,).
Trailing zeros in the coefficients will be used in the evaluation, so they should be avoided if efficiency is a concern.
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with themselves and with the elements of `c`.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree n are contained in c[n]. If `c` is multidimensional the remaining indices enumerate multiple polynomials. In the two dimensional case the coefficients may be thought of as stored in the columns of `c`.
tensorboolean, optional
    
If True, the shape of the coefficient array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `c` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `c` for the evaluation. This keyword is useful when `c` is multidimensional. The default value is True.
Returns:
    
valuesndarray, algebra_like
    
The shape of the return value is described above.
See also
`lagval2d`, `laggrid2d`, `lagval3d`, `laggrid3d`
#### Notes
The evaluation uses Clenshaw recursion, aka synthetic division.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagval
    >>> coef = [1, 2, 3]
    >>> lagval(1, coef)
    -0.5
    >>> lagval([[1, 2],[3, 4]], coef)
    array([[-0.5, -4. ],
           [-4.5, -2. ]])
    
# numpy.polynomial.laguerre.lagval2d
polynomial.laguerre.lagval2d(x, y, c)[source]
    
Evaluate a 2-D Laguerre series at points (x, y).
This function returns the values:
\\[p(x,y) = \sum_{i,j} c_{i,j} * L_i(x) * L_j(y)\\]
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array a one is implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points `(x, y)`, where `x` and `y` must have the same shape. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points formed with pairs of corresponding values from `x` and `y`.
See also
`lagval`, `laggrid2d`, `lagval3d`, `laggrid3d`
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagval2d
    >>> c = [[1, 2],[3, 4]]
    >>> lagval2d(1, 1, c)
    1.0
    
# numpy.polynomial.laguerre.lagval3d
polynomial.laguerre.lagval3d(x, y, z, c)[source]
    
Evaluate a 3-D Laguerre series at points (x, y, z).
This function returns the values:
\\[p(x,y,z) = \sum_{i,j,k} c_{i,j,k} * L_i(x) * L_j(y) * L_k(z)\\]
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than 3 dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape.
Parameters:
    
x, y, zarray_like, compatible object
    
The three dimensional series is evaluated at the points `(x, y, z)`, where `x`, `y`, and `z` must have the same shape. If any of `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j,k is contained in `c[i,j,k]`. If `c` has dimension greater than 3 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the multidimensional polynomial on points formed with triples of corresponding values from `x`, `y`, and `z`.
See also
`lagval`, `lagval2d`, `laggrid2d`, `laggrid3d`
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagval3d
    >>> c = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
    >>> lagval3d(1, 1, 2, c)
    -1.0
    
# numpy.polynomial.laguerre.lagvander
polynomial.laguerre.lagvander(x, deg)[source]
    
Pseudo-Vandermonde matrix of given degree.
Returns the pseudo-Vandermonde matrix of degree `deg` and sample points `x`. The pseudo-Vandermonde matrix is defined by
\\[V[..., i] = L_i(x)\\]
where `0 <= i <= deg`. The leading indices of `V` index the elements of `x` and the last index is the degree of the Laguerre polynomial.
If `c` is a 1-D array of coefficients of length `n + 1` and `V` is the array `V = lagvander(x, n)`, then `np.dot(V, c)` and `lagval(x, c)` are the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of Laguerre series of the same degree and sample points.
Parameters:
    
xarray_like
    
Array of points. The dtype is converted to float64 or complex128 depending on whether any of the elements are complex. If `x` is scalar it is converted to a 1-D array.
degint
    
Degree of the resulting matrix.
Returns:
    
vanderndarray
    
The pseudo-Vandermonde matrix. The shape of the returned matrix is `x.shape + (deg + 1,)`, where The last index is the degree of the corresponding Laguerre polynomial. The dtype will be the same as the converted `x`.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.laguerre import lagvander
    >>> x = np.array([0, 1, 2])
    >>> lagvander(x, 3)
    array([[ 1.        ,  1.        ,  1.        ,  1.        ],
           [ 1.        ,  0.        , -0.5       , -0.66666667],
           [ 1.        , -1.        , -1.        , -0.33333333]])
    
# numpy.polynomial.laguerre.lagvander2d
polynomial.laguerre.lagvander2d(x, y, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y)`. The pseudo-Vandermonde matrix is defined by
\\[V[..., (deg[1] + 1)*i + j] = L_i(x) * L_j(y),\\]
where `0 <= i <= deg[0]` and `0 <= j <= deg[1]`. The leading indices of `V` index the points `(x, y)` and the last index encodes the degrees of the Laguerre polynomials.
If `V = lagvander2d(x, y, [xdeg, ydeg])`, then the columns of `V` correspond to the elements of a 2-D coefficient array `c` of shape (xdeg + 1, ydeg + 1) in the order
\\[c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...\\]
and `np.dot(V, c.flat)` and `lagval2d(x, y, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 2-D Laguerre series of the same degrees and sample points.
Parameters:
    
x, yarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg].
Returns:
    
vander2dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)\\). The dtype will be the same as the converted `x` and `y`.
See also
`lagvander`, `lagvander3d`, `lagval2d`, `lagval3d`
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.laguerre import lagvander2d
    >>> x = np.array([0])
    >>> y = np.array([2])
    >>> lagvander2d(x, y, [2, 1])
    array([[ 1., -1.,  1., -1.,  1., -1.]])
    
# numpy.polynomial.laguerre.lagvander3d
polynomial.laguerre.lagvander3d(x, y, z, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y, z)`. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`, then The pseudo-Vandermonde matrix is defined by
\\[V[..., (m+1)(n+1)i + (n+1)j + k] = L_i(x)*L_j(y)*L_k(z),\\]
where `0 <= i <= l`, `0 <= j <= m`, and `0 <= j <= n`. The leading indices of `V` index the points `(x, y, z)` and the last index encodes the degrees of the Laguerre polynomials.
If `V = lagvander3d(x, y, z, [xdeg, ydeg, zdeg])`, then the columns of `V` correspond to the elements of a 3-D coefficient array `c` of shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
\\[c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...\\]
and `np.dot(V, c.flat)` and `lagval3d(x, y, z, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 3-D Laguerre series of the same degrees and sample points.
Parameters:
    
x, y, zarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg, z_deg].
Returns:
    
vander3dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)\\). The dtype will be the same as the converted `x`, `y`, and `z`.
See also
`lagvander`, `lagvander3d`, `lagval2d`, `lagval3d`
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.laguerre import lagvander3d
    >>> x = np.array([0])
    >>> y = np.array([2])
    >>> z = np.array([0])
    >>> lagvander3d(x, y, z, [2, 1, 3])
    array([[ 1.,  1.,  1.,  1., -1., -1., -1., -1.,  1.,  1.,  1.,  1., -1.,
            -1., -1., -1.,  1.,  1.,  1.,  1., -1., -1., -1., -1.]])
    
# numpy.polynomial.laguerre.lagweight
polynomial.laguerre.lagweight(x)[source]
    
Weight function of the Laguerre polynomials.
The weight function is \\(exp(-x)\\) and the interval of integration is \\([0, \inf]\\). The Laguerre polynomials are orthogonal, but not normalized, with respect to this weight function.
Parameters:
    
xarray_like
    
Values at which the weight function will be computed.
Returns:
    
wndarray
    
The weight function at `x`.
#### Examples
    
    >>> from numpy.polynomial.laguerre import lagweight
    >>> x = np.array([0, 1, 2])
    >>> lagweight(x)
    array([1.        , 0.36787944, 0.13533528])
    
# numpy.polynomial.laguerre.lagx
polynomial.laguerre.lagx=array([ 1, -1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.laguerre.lagzero
polynomial.laguerre.lagzero=array([0]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.laguerre.poly2lag
polynomial.laguerre.poly2lag(pol)[source]
    
Convert a polynomial to a Laguerre series.
Convert an array representing the coefficients of a polynomial (relative to the “standard” basis) ordered from lowest degree to highest, to an array of the coefficients of the equivalent Laguerre series, ordered from lowest to highest degree.
Parameters:
    
polarray_like
    
1-D array containing the polynomial coefficients
Returns:
    
cndarray
    
1-D array containing the coefficients of the equivalent Laguerre series.
See also
`lag2poly`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.laguerre import poly2lag
    >>> poly2lag(np.arange(4))
    array([ 23., -63.,  58., -18.])
    
# numpy.polynomial.legendre.leg2poly
polynomial.legendre.leg2poly(c)[source]
    
Convert a Legendre series to a polynomial.
Convert an array representing the coefficients of a Legendre series, ordered from lowest degree to highest, to an array of the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest to highest degree.
Parameters:
    
carray_like
    
1-D array containing the Legendre series coefficients, ordered from lowest order term to highest.
Returns:
    
polndarray
    
1-D array containing the coefficients of the equivalent polynomial (relative to the “standard” basis) ordered from lowest order term to highest.
See also
`poly2leg`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> from numpy import polynomial as P
    >>> c = P.Legendre(range(4))
    >>> c
    Legendre([0., 1., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p = c.convert(kind=P.Polynomial)
    >>> p
    Polynomial([-1. , -3.5,  3. ,  7.5], domain=[-1.,  1.], window=[-1., ...
    >>> P.legendre.leg2poly(range(4))
    array([-1. , -3.5,  3. ,  7.5])
    
# numpy.polynomial.legendre.legadd
polynomial.legendre.legadd(c1, c2)[source]
    
Add one Legendre series to another.
Returns the sum of two Legendre series `c1` \+ `c2`. The arguments are sequences of coefficients ordered from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Legendre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the Legendre series of their sum.
See also
`legsub`, `legmulx`, `legmul`, `legdiv`, `legpow`
#### Notes
Unlike multiplication, division, etc., the sum of two Legendre series is a Legendre series (without having to “reproject” the result onto the basis set) so addition, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> L.legadd(c1,c2)
    array([4.,  4.,  4.])
    
# numpy.polynomial.legendre.legcompanion
polynomial.legendre.legcompanion(c)[source]
    
Return the scaled companion matrix of c.
The basis polynomials are scaled so that the companion matrix is symmetric when `c` is an Legendre basis polynomial. This provides better eigenvalue estimates than the unscaled case and for basis polynomials the eigenvalues are guaranteed to be real if `numpy.linalg.eigvalsh` is used to obtain them.
Parameters:
    
carray_like
    
1-D array of Legendre series coefficients ordered from low to high degree.
Returns:
    
matndarray
    
Scaled companion matrix of dimensions (deg, deg).
# numpy.polynomial.legendre.legder
polynomial.legendre.legder(c, m=1, scl=1, axis=0)[source]
    
Differentiate a Legendre series.
Returns the Legendre series coefficients `c` differentiated `m` times along `axis`. At each iteration the result is multiplied by `scl` (the scaling factor is for use in a linear change of variable). The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `1*L_0 + 2*L_1 + 3*L_2` while [[1,2],[1,2]] represents `1*L_0(x)*L_0(y) + 1*L_1(x)*L_0(y) + 2*L_0(x)*L_1(y) + 2*L_1(x)*L_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Legendre series coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Number of derivatives taken, must be non-negative. (Default: 1)
sclscalar, optional
    
Each differentiation is multiplied by `scl`. The end result is multiplication by `scl**m`. This is for use in a linear change of variable. (Default: 1)
axisint, optional
    
Axis over which the derivative is taken. (Default: 0).
Returns:
    
derndarray
    
Legendre series of the derivative.
See also
`legint`
#### Notes
In general, the result of differentiating a Legendre series does not resemble the same operation on a power series. Thus the result of this function may be “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> c = (1,2,3,4)
    >>> L.legder(c)
    array([  6.,   9.,  20.])
    >>> L.legder(c, 3)
    array([60.])
    >>> L.legder(c, scl=-1)
    array([ -6.,  -9., -20.])
    >>> L.legder(c, 2,-1)
    array([  9.,  60.])
    
# numpy.polynomial.legendre.legdiv
polynomial.legendre.legdiv(c1, c2)[source]
    
Divide one Legendre series by another.
Returns the quotient-with-remainder of two Legendre series `c1` / `c2`. The arguments are sequences of coefficients from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Legendre series coefficients ordered from low to high.
Returns:
    
quo, remndarrays
    
Of Legendre series coefficients representing the quotient and remainder.
See also
`legadd`, `legsub`, `legmulx`, `legmul`, `legpow`
#### Notes
In general, the (polynomial) division of one Legendre series by another results in quotient and remainder terms that are not in the Legendre polynomial basis set. Thus, to express these results as a Legendre series, it is necessary to “reproject” the results onto the Legendre basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> L.legdiv(c1,c2) # quotient "intuitive," remainder not
    (array([3.]), array([-8., -4.]))
    >>> c2 = (0,1,2,3)
    >>> L.legdiv(c2,c1) # neither "intuitive"
    (array([-0.07407407,  1.66666667]), array([-1.03703704, -2.51851852])) # may vary
    
# numpy.polynomial.legendre.legdomain
polynomial.legendre.legdomain=array([-1., 1.]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.legendre.Legendre.__call__
method
polynomial.legendre.Legendre.__call__(arg)[source]
    
Call self as a function.
# numpy.polynomial.legendre.Legendre.basis
method
classmethodpolynomial.legendre.Legendre.basis(deg, domain=None, window=None, symbol='x')[source]
    
Series basis polynomial of degree `deg`.
Returns the series representing the basis polynomial of degree `deg`.
Parameters:
    
degint
    
Degree of the basis polynomial for the series. Must be >= 0.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series with the coefficient of the `deg` term set to one and all others zero.
# numpy.polynomial.legendre.Legendre.cast
method
classmethodpolynomial.legendre.Legendre.cast(series, domain=None, window=None)[source]
    
Convert series to series of this class.
The `series` is expected to be an instance of some polynomial series of one of the types supported by by the numpy.polynomial module, but could be some other class that supports the convert method.
Parameters:
    
seriesseries
    
The series instance to be converted.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
Returns:
    
new_seriesseries
    
A series of the same kind as the calling class and equal to `series` when evaluated.
See also
`convert`
    
similar instance method
# numpy.polynomial.legendre.Legendre.convert
method
polynomial.legendre.Legendre.convert(domain=None, kind=None, window=None)[source]
    
Convert series to a different kind and/or domain and/or window.
Parameters:
    
domainarray_like, optional
    
The domain of the converted series. If the value is None, the default domain of `kind` is used.
kindclass, optional
    
The polynomial series type class to which the current instance should be converted. If kind is None, then the class of the current instance is used.
windowarray_like, optional
    
The window of the converted series. If the value is None, the default window of `kind` is used.
Returns:
    
new_seriesseries
    
The returned class can be of different type than the current instance and/or have a different domain and/or different window.
#### Notes
Conversion between domains and class types can result in numerically ill defined series.
# numpy.polynomial.legendre.Legendre.copy
method
polynomial.legendre.Legendre.copy()[source]
    
Return a copy.
Returns:
    
new_seriesseries
    
Copy of self.
# numpy.polynomial.legendre.Legendre.cutdeg
method
polynomial.legendre.Legendre.cutdeg(deg)[source]
    
Truncate series to the given degree.
Reduce the degree of the series to `deg` by discarding the high order terms. If `deg` is greater than the current degree a copy of the current series is returned. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
degnon-negative int
    
The series is reduced to degree `deg` by discarding the high order terms. The value of `deg` must be a non-negative integer.
Returns:
    
new_seriesseries
    
New instance of series with reduced degree.
# numpy.polynomial.legendre.Legendre.degree
method
polynomial.legendre.Legendre.degree()[source]
    
The degree of the series.
Returns:
    
degreeint
    
Degree of the series, one less than the number of coefficients.
#### Examples
Create a polynomial object for `1 + 7*x + 4*x**2`:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 4])
    >>> print(poly)
    1.0 + 7.0·x + 4.0·x²
    >>> poly.degree()
    2
    
Note that this method does not check for non-zero coefficients. You must trim the polynomial to remove any trailing zeroes:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 0])
    >>> print(poly)
    1.0 + 7.0·x + 0.0·x²
    >>> poly.degree()
    2
    >>> poly.trim().degree()
    1
    
# numpy.polynomial.legendre.Legendre.deriv
method
polynomial.legendre.Legendre.deriv(m=1)[source]
    
Differentiate.
Return a series instance of that is the derivative of the current series.
Parameters:
    
mnon-negative int
    
Find the derivative of order `m`.
Returns:
    
new_seriesseries
    
A new series representing the derivative. The domain is the same as the domain of the differentiated series.
# numpy.polynomial.legendre.Legendre.domain
attribute
polynomial.legendre.Legendre.domain=array([-1., 1.]) 
# numpy.polynomial.legendre.Legendre.fit
method
classmethodpolynomial.legendre.Legendre.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')[source]
    
Least squares fit to data.
Return a series instance that is the least squares fit to the data `y` sampled at `x`. The domain of the returned instance can be specified and this will often result in a superior fit with less chance of ill conditioning.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,)
    
y-coordinates of the M sample points `(x[i], y[i])`.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
domain{None, [beg, end], []}, optional
    
Domain to use for the returned series. If `None`, then a minimal domain that covers the points `x` is chosen. If `[]` the class domain is used. The default value was the class domain in NumPy 1.4 and `None` in later versions. The `[]` option was added in numpy 1.5.0.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
window{[beg, end]}, optional
    
Window to use for the returned series. The default value is the default class domain
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series that represents the least squares fit to the data and has the domain and window specified in the call. If the coefficients for the unscaled and unshifted basis polynomials are of interest, do `new_series.convert().coef`.
[resid, rank, sv, rcond]list
    
These values are only returned if `full == True`
  * resid – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * sv – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `linalg.lstsq`.
# numpy.polynomial.legendre.Legendre.fromroots
method
classmethodpolynomial.legendre.Legendre.fromroots(roots, domain=[], window=None, symbol='x')[source]
    
Return series instance that has the specified roots.
Returns a series representing the product `(x - r[0])*(x - r[1])*...*(x - r[n-1])`, where `r` is a list of roots.
Parameters:
    
rootsarray_like
    
List of roots.
domain{[], None, array_like}, optional
    
Domain for the resulting series. If None the domain is the interval from the smallest root to the largest. If [] the domain is the class domain. The default is [].
window{None, array_like}, optional
    
Window for the returned series. If None the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series with the specified roots.
# numpy.polynomial.legendre.Legendre.has_samecoef
method
polynomial.legendre.Legendre.has_samecoef(other)[source]
    
Check if coefficients match.
Parameters:
    
otherclass instance
    
The other class must have the `coef` attribute.
Returns:
    
boolboolean
    
True if the coefficients are the same, False otherwise.
# numpy.polynomial.legendre.Legendre.has_samedomain
method
polynomial.legendre.Legendre.has_samedomain(other)[source]
    
Check if domains match.
Parameters:
    
otherclass instance
    
The other class must have the `domain` attribute.
Returns:
    
boolboolean
    
True if the domains are the same, False otherwise.
# numpy.polynomial.legendre.Legendre.has_sametype
method
polynomial.legendre.Legendre.has_sametype(other)[source]
    
Check if types match.
Parameters:
    
otherobject
    
Class instance.
Returns:
    
boolboolean
    
True if other is same class as self
# numpy.polynomial.legendre.Legendre.has_samewindow
method
polynomial.legendre.Legendre.has_samewindow(other)[source]
    
Check if windows match.
Parameters:
    
otherclass instance
    
The other class must have the `window` attribute.
Returns:
    
boolboolean
    
True if the windows are the same, False otherwise.
# numpy.polynomial.legendre.Legendre
classnumpy.polynomial.legendre.Legendre(coef, domain=None, window=None, symbol='x')[source]
    
A Legendre series class.
The Legendre class provides the standard Python numerical methods ‘+’, ‘-’, ‘*’, ‘//’, ‘%’, ‘divmod’, ‘**’, and ‘()’ as well as the attributes and methods listed below.
Parameters:
    
coefarray_like
    
Legendre coefficients in order of increasing degree, i.e., `(1, 2, 3)` gives `1*P_0(x) + 2*P_1(x) + 3*P_2(x)`.
domain(2,) array_like, optional
    
Domain to use. The interval `[domain[0], domain[1]]` is mapped to the interval `[window[0], window[1]]` by shifting and scaling. The default value is [-1., 1.].
window(2,) array_like, optional
    
Window, see `domain` for its use. The default value is [-1., 1.].
symbolstr, optional
    
Symbol used to represent the independent variable in string representations of the polynomial expression, e.g. for printing. The symbol must be a valid Python identifier. Default value is ‘x’.
New in version 1.24.
Attributes:
    
symbol
#### Methods
`__call__`(arg)
Call self as a function.  
`basis`(deg[, domain, window, symbol])
Series basis polynomial of degree `deg`.  
`cast`(series[, domain, window])
Convert series to series of this class.  
`convert`([domain, kind, window])
Convert series to a different kind and/or domain and/or window.  
`copy`()
Return a copy.  
`cutdeg`(deg)
Truncate series to the given degree.  
`degree`()
The degree of the series.  
`deriv`([m])
Differentiate.  
`fit`(x, y, deg[, domain, rcond, full, w, ...])
Least squares fit to data.  
`fromroots`(roots[, domain, window, symbol])
Return series instance that has the specified roots.  
`has_samecoef`(other)
Check if coefficients match.  
`has_samedomain`(other)
Check if domains match.  
`has_sametype`(other)
Check if types match.  
`has_samewindow`(other)
Check if windows match.  
`identity`([domain, window, symbol])
Identity function.  
`integ`([m, k, lbnd])
Integrate.  
`linspace`([n, domain])
Return x, y values at equally spaced points in domain.  
`mapparms`()
Return the mapping parameters.  
`roots`()
Return the roots of the series polynomial.  
`trim`([tol])
Remove trailing coefficients  
`truncate`(size)
Truncate series to length `size`.  
# numpy.polynomial.legendre.Legendre.identity
method
classmethodpolynomial.legendre.Legendre.identity(domain=None, window=None, symbol='x')[source]
    
Identity function.
If `p` is the returned series, then `p(x) == x` for all values of x.
Parameters:
    
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series of representing the identity.
# numpy.polynomial.legendre.Legendre.integ
method
polynomial.legendre.Legendre.integ(m=1, k=[], lbnd=None)[source]
    
Integrate.
Return a series instance that is the definite integral of the current series.
Parameters:
    
mnon-negative int
    
The number of integrations to perform.
karray_like
    
Integration constants. The first constant is applied to the first integration, the second to the second, and so on. The list of values must less than or equal to `m` in length and any missing values are set to zero.
lbndScalar
    
The lower bound of the definite integral.
Returns:
    
new_seriesseries
    
A new series representing the integral. The domain is the same as the domain of the integrated series.
# numpy.polynomial.legendre.Legendre.linspace
method
polynomial.legendre.Legendre.linspace(n=100, domain=None)[source]
    
Return x, y values at equally spaced points in domain.
Returns the x, y values at `n` linearly spaced points across the domain. Here y is the value of the polynomial at the points x. By default the domain is the same as that of the series instance. This method is intended mostly as a plotting aid.
Parameters:
    
nint, optional
    
Number of point pairs to return. The default value is 100.
domain{None, array_like}, optional
    
If not None, the specified domain is used instead of that of the calling instance. It should be of the form `[beg,end]`. The default is None which case the class domain is used.
Returns:
    
x, yndarray
    
x is equal to linspace(self.domain[0], self.domain[1], n) and y is the series evaluated at element of x.
# numpy.polynomial.legendre.Legendre.mapparms
method
polynomial.legendre.Legendre.mapparms()[source]
    
Return the mapping parameters.
The returned values define a linear map `off + scl*x` that is applied to the input arguments before the series is evaluated. The map depends on the `domain` and `window`; if the current `domain` is equal to the `window` the resulting map is the identity. If the coefficients of the series instance are to be used by themselves outside this class, then the linear function must be substituted for the `x` in the standard representation of the base polynomials.
Returns:
    
off, sclfloat or complex
    
The mapping function is defined by `off + scl*x`.
#### Notes
If the current domain is the interval `[l1, r1]` and the window is `[l2, r2]`, then the linear mapping function `L` is defined by the equations:
    
    L(l1) = l2
    L(r1) = r2
    
# numpy.polynomial.legendre.Legendre.roots
method
polynomial.legendre.Legendre.roots()[source]
    
Return the roots of the series polynomial.
Compute the roots for the series. Note that the accuracy of the roots decreases the further outside the `domain` they lie.
Returns:
    
rootsndarray
    
Array containing the roots of the series.
# numpy.polynomial.legendre.Legendre.trim
method
polynomial.legendre.Legendre.trim(tol=0)[source]
    
Remove trailing coefficients
Remove trailing coefficients until a coefficient is reached whose absolute value greater than `tol` or the beginning of the series is reached. If all the coefficients would be removed the series is set to `[0]`. A new series instance is returned with the new coefficients. The current instance remains unchanged.
Parameters:
    
tolnon-negative number.
    
All trailing coefficients less than `tol` will be removed.
Returns:
    
new_seriesseries
    
New instance of series with trimmed coefficients.
# numpy.polynomial.legendre.Legendre.truncate
method
polynomial.legendre.Legendre.truncate(size)[source]
    
Truncate series to length `size`.
Reduce the series to length `size` by discarding the high degree terms. The value of `size` must be a positive integer. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
sizepositive int
    
The series is reduced to length `size` by discarding the high degree terms. The value of `size` must be a positive integer.
Returns:
    
new_seriesseries
    
New instance of series with truncated coefficients.
# numpy.polynomial.legendre.legfit
polynomial.legendre.legfit(x, y, deg, rcond=None, full=False, w=None)[source]
    
Least squares fit of Legendre series to data.
Return the coefficients of a Legendre series of degree `deg` that is the least squares fit to the data values `y` given at points `x`. If `y` is 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple fits are done, one for each column of `y`, and the resulting coefficients are stored in the corresponding columns of a 2-D return. The fitted polynomial(s) are in the form
\\[p(x) = c_0 + c_1 * L_1(x) + ... + c_n * L_n(x),\\]
where `n` is `deg`.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,) or (M, K)
    
y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (`M`,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
Returns:
    
coefndarray, shape (M,) or (M, K)
    
Legendre coefficients ordered from low to high. If `y` was 2-D, the coefficients for the data in column k of `y` are in column `k`. If `deg` is specified as a list, coefficients for terms not included in the fit are set equal to zero in the returned `coef`.
[residuals, rank, singular_values, rcond]list
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * singular_values – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Warns:
    
RankWarning
    
The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full == False`. The warnings can be turned off by
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`numpy.polynomial.polynomial.polyfit`
`numpy.polynomial.chebyshev.chebfit`
`numpy.polynomial.laguerre.lagfit`
`numpy.polynomial.hermite.hermfit`
`numpy.polynomial.hermite_e.hermefit`
`legval`
    
Evaluates a Legendre series.
`legvander`
    
Vandermonde matrix of Legendre series.
`legweight`
    
Legendre weight function (= 1).
`numpy.linalg.lstsq`
    
Computes a least-squares fit from the matrix.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution is the coefficients of the Legendre series `p` that minimizes the sum of the weighted squared errors
\\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\\]
where \\(w_j\\) are the weights. This problem is solved by setting up as the (typically) overdetermined matrix equation
\\[V(x) * c = w * y,\\]
where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the coefficients to be solved for, `w` are the weights, and `y` are the observed values. This equation is then solved using the singular value decomposition of `V`.
If some of the singular values of `V` are so small that they are neglected, then a `RankWarning` will be issued. This means that the coefficient values may be poorly determined. Using a lower order fit will usually get rid of the warning. The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious and have large contributions from roundoff error.
Fits using Legendre series are usually better conditioned than fits using power series, but much can depend on the distribution of the sample points and the smoothness of the data. If the quality of the fit is inadequate splines may be a good alternative.
#### References
[1]
Wikipedia, “Curve fitting”, https://en.wikipedia.org/wiki/Curve_fitting
# numpy.polynomial.legendre.legfromroots
polynomial.legendre.legfromroots(roots)[source]
    
Generate a Legendre series with given roots.
The function returns the coefficients of the polynomial
\\[p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),\\]
in Legendre form, where the \\(r_n\\) are the roots specified in `roots`. If a zero has multiplicity n, then it must appear in `roots` n times. For instance, if 2 is a root of multiplicity three and 3 is a root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The roots can appear in any order.
If the returned coefficients are `c`, then
\\[p(x) = c_0 + c_1 * L_1(x) + ... + c_n * L_n(x)\\]
The coefficient of the last term is not generally 1 for monic polynomials in Legendre form.
Parameters:
    
rootsarray_like
    
Sequence containing the roots.
Returns:
    
outndarray
    
1-D array of coefficients. If all roots are real then `out` is a real array, if some of the roots are complex, then `out` is complex even if all the coefficients in the result are real (see Examples below).
See also
`numpy.polynomial.polynomial.polyfromroots`
`numpy.polynomial.chebyshev.chebfromroots`
`numpy.polynomial.laguerre.lagfromroots`
`numpy.polynomial.hermite.hermfromroots`
`numpy.polynomial.hermite_e.hermefromroots`
#### Examples
    
    >>> import numpy.polynomial.legendre as L
    >>> L.legfromroots((-1,0,1)) # x^3 - x relative to the standard basis
    array([ 0. , -0.4,  0. ,  0.4])
    >>> j = complex(0,1)
    >>> L.legfromroots((-j,j)) # x^2 + 1 relative to the standard basis
    array([ 1.33333333+0.j,  0.00000000+0.j,  0.66666667+0.j]) # may vary
    
# numpy.polynomial.legendre.leggauss
polynomial.legendre.leggauss(deg)[source]
    
Gauss-Legendre quadrature.
Computes the sample points and weights for Gauss-Legendre quadrature. These sample points and weights will correctly integrate polynomials of degree \\(2*deg - 1\\) or less over the interval \\([-1, 1]\\) with the weight function \\(f(x) = 1\\).
Parameters:
    
degint
    
Number of sample points and weights. It must be >= 1.
Returns:
    
xndarray
    
1-D ndarray containing the sample points.
yndarray
    
1-D ndarray containing the weights.
#### Notes
The results have only been tested up to degree 100, higher degrees may be problematic. The weights are determined by using the fact that
\\[w_k = c / (L'_n(x_k) * L_{n-1}(x_k))\\]
where \\(c\\) is a constant independent of \\(k\\) and \\(x_k\\) is the k’th root of \\(L_n\\), and then scaling the results to get the right value when integrating 1.
# numpy.polynomial.legendre.leggrid2d
polynomial.legendre.leggrid2d(x, y, c)[source]
    
Evaluate a 2-D Legendre series on the Cartesian product of x and y.
This function returns the values:
\\[p(a,b) = \sum_{i,j} c_{i,j} * L_i(a) * L_j(b)\\]
where the points `(a, b)` consist of all pairs formed by taking `a` from `x` and `b` from `y`. The resulting points form a grid with `x` in the first dimension and `y` in the second.
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape + y.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points in the Cartesian product of `x` and `y`. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional Chebyshev series at points in the Cartesian product of `x` and `y`.
See also
`legval`, `legval2d`, `legval3d`, `leggrid3d`
# numpy.polynomial.legendre.leggrid3d
polynomial.legendre.leggrid3d(x, y, z, c)[source]
    
Evaluate a 3-D Legendre series on the Cartesian product of x, y, and z.
This function returns the values:
\\[p(a,b,c) = \sum_{i,j,k} c_{i,j,k} * L_i(a) * L_j(b) * L_k(c)\\]
where the points `(a, b, c)` consist of all triples formed by taking `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form a grid with `x` in the first dimension, `y` in the second, and `z` in the third.
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than three dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape + y.shape + z.shape.
Parameters:
    
x, y, zarray_like, compatible objects
    
The three dimensional series is evaluated at the points in the Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`legval`, `legval2d`, `leggrid2d`, `legval3d`
# numpy.polynomial.legendre.legint
polynomial.legendre.legint(c, m=1, k=[], lbnd=0, scl=1, axis=0)[source]
    
Integrate a Legendre series.
Returns the Legendre series coefficients `c` integrated `m` times from `lbnd` along `axis`. At each iteration the resulting series is multiplied by `scl` and an integration constant, `k`, is added. The scaling factor is for use in a linear change of variable. (“Buyer beware”: note that, depending on what one is doing, one may want `scl` to be the reciprocal of what one might expect; for more information, see the Notes section below.) The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the series `L_0 + 2*L_1 + 3*L_2` while [[1,2],[1,2]] represents `1*L_0(x)*L_0(y) + 1*L_1(x)*L_0(y) + 2*L_0(x)*L_1(y) + 2*L_1(x)*L_1(y)` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of Legendre series coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Order of integration, must be positive. (Default: 1)
k{[], list, scalar}, optional
    
Integration constant(s). The value of the first integral at `lbnd` is the first value in the list, the value of the second integral at `lbnd` is the second value, etc. If `k == []` (the default), all constants are set to zero. If `m == 1`, a single scalar can be given instead of a list.
lbndscalar, optional
    
The lower bound of the integral. (Default: 0)
sclscalar, optional
    
Following each integration the result is multiplied by `scl` before the integration constant is added. (Default: 1)
axisint, optional
    
Axis over which the integral is taken. (Default: 0).
Returns:
    
Sndarray
    
Legendre series coefficient array of the integral.
Raises:
    
ValueError
    
If `m < 0`, `len(k) > m`, `np.ndim(lbnd) != 0`, or `np.ndim(scl) != 0`.
See also
`legder`
#### Notes
Note that the result of each integration is multiplied by `scl`. Why is this important to note? Say one is making a linear change of variable \\(u = ax + b\\) in an integral relative to `x`. Then \\(dx = du/a\\), so one will need to set `scl` equal to \\(1/a\\) \- perhaps not what one would have first thought.
Also note that, in general, the result of integrating a C-series needs to be “reprojected” onto the C-series basis set. Thus, typically, the result of this function is “unintuitive,” albeit correct; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> c = (1,2,3)
    >>> L.legint(c)
    array([ 0.33333333,  0.4       ,  0.66666667,  0.6       ]) # may vary
    >>> L.legint(c, 3)
    array([  1.66666667e-02,  -1.78571429e-02,   4.76190476e-02, # may vary
             -1.73472348e-18,   1.90476190e-02,   9.52380952e-03])
    >>> L.legint(c, k=3)
     array([ 3.33333333,  0.4       ,  0.66666667,  0.6       ]) # may vary
    >>> L.legint(c, lbnd=-2)
    array([ 7.33333333,  0.4       ,  0.66666667,  0.6       ]) # may vary
    >>> L.legint(c, scl=2)
    array([ 0.66666667,  0.8       ,  1.33333333,  1.2       ]) # may vary
    
# numpy.polynomial.legendre.legline
polynomial.legendre.legline(off, scl)[source]
    
Legendre series whose graph is a straight line.
Parameters:
    
off, sclscalars
    
The specified line is given by `off + scl*x`.
Returns:
    
yndarray
    
This module’s representation of the Legendre series for `off + scl*x`.
See also
`numpy.polynomial.polynomial.polyline`
`numpy.polynomial.chebyshev.chebline`
`numpy.polynomial.laguerre.lagline`
`numpy.polynomial.hermite.hermline`
`numpy.polynomial.hermite_e.hermeline`
#### Examples
    
    >>> import numpy.polynomial.legendre as L
    >>> L.legline(3,2)
    array([3, 2])
    >>> L.legval(-3, L.legline(3,2)) # should be -3
    -3.0
    
# numpy.polynomial.legendre.legmul
polynomial.legendre.legmul(c1, c2)[source]
    
Multiply one Legendre series by another.
Returns the product of two Legendre series `c1` * `c2`. The arguments are sequences of coefficients, from lowest order “term” to highest, e.g., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Legendre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Legendre series coefficients representing their product.
See also
`legadd`, `legsub`, `legmulx`, `legdiv`, `legpow`
#### Notes
In general, the (polynomial) product of two C-series results in terms that are not in the Legendre polynomial basis set. Thus, to express the product as a Legendre series, it is necessary to “reproject” the product onto said basis set, which may produce “unintuitive” (but correct) results; see Examples section below.
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> c1 = (1,2,3)
    >>> c2 = (3,2)
    >>> L.legmul(c1,c2) # multiplication requires "reprojection"
    array([  4.33333333,  10.4       ,  11.66666667,   3.6       ]) # may vary
    
# numpy.polynomial.legendre.legmulx
polynomial.legendre.legmulx(c)[source]
    
Multiply a Legendre series by x.
Multiply the Legendre series `c` by x, where x is the independent variable.
Parameters:
    
carray_like
    
1-D array of Legendre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the result of the multiplication.
See also
`legadd`, `legsub`, `legmul`, `legdiv`, `legpow`
#### Notes
The multiplication uses the recursion relationship for Legendre polynomials in the form
\\[xP_i(x) = ((i + 1)*P_{i + 1}(x) + i*P_{i - 1}(x))/(2i + 1)\\]
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> L.legmulx([1,2,3])
    array([ 0.66666667, 2.2, 1.33333333, 1.8]) # may vary
    
# numpy.polynomial.legendre.legone
polynomial.legendre.legone=array([1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.legendre.legpow
polynomial.legendre.legpow(c, pow, maxpower=16)[source]
    
Raise a Legendre series to a power.
Returns the Legendre series `c` raised to the power `pow`. The argument `c` is a sequence of coefficients ordered from low to high. i.e., [1,2,3] is the series `P_0 + 2*P_1 + 3*P_2.`
Parameters:
    
carray_like
    
1-D array of Legendre series coefficients ordered from low to high.
powinteger
    
Power to which the series will be raised
maxpowerinteger, optional
    
Maximum power allowed. This is mainly to limit growth of the series to unmanageable size. Default is 16
Returns:
    
coefndarray
    
Legendre series of power.
See also
`legadd`, `legsub`, `legmulx`, `legmul`, `legdiv`
# numpy.polynomial.legendre.legroots
polynomial.legendre.legroots(c)[source]
    
Compute the roots of a Legendre series.
Return the roots (a.k.a. “zeros”) of the polynomial
\\[p(x) = \sum_i c[i] * L_i(x).\\]
Parameters:
    
c1-D array_like
    
1-D array of coefficients.
Returns:
    
outndarray
    
Array of the roots of the series. If all the roots are real, then `out` is also real, otherwise it is complex.
See also
`numpy.polynomial.polynomial.polyroots`
`numpy.polynomial.chebyshev.chebroots`
`numpy.polynomial.laguerre.lagroots`
`numpy.polynomial.hermite.hermroots`
`numpy.polynomial.hermite_e.hermeroots`
#### Notes
The root estimates are obtained as the eigenvalues of the companion matrix, Roots far from the origin of the complex plane may have large errors due to the numerical instability of the series for such values. Roots with multiplicity greater than 1 will also show larger errors as the value of the series near such points is relatively insensitive to errors in the roots. Isolated roots near the origin can be improved by a few iterations of Newton’s method.
The Legendre series basis polynomials aren’t powers of `x` so the results of this function may seem unintuitive.
#### Examples
    
    >>> import numpy.polynomial.legendre as leg
    >>> leg.legroots((1, 2, 3, 4)) # 4L_3 + 3L_2 + 2L_1 + 1L_0, all real roots
    array([-0.85099543, -0.11407192,  0.51506735]) # may vary
    
# numpy.polynomial.legendre.legsub
polynomial.legendre.legsub(c1, c2)[source]
    
Subtract one Legendre series from another.
Returns the difference of two Legendre series `c1` \- `c2`. The sequences of coefficients are from lowest order term to highest, i.e., [1,2,3] represents the series `P_0 + 2*P_1 + 3*P_2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of Legendre series coefficients ordered from low to high.
Returns:
    
outndarray
    
Of Legendre series coefficients representing their difference.
See also
`legadd`, `legmulx`, `legmul`, `legdiv`, `legpow`
#### Notes
Unlike multiplication, division, etc., the difference of two Legendre series is a Legendre series (without having to “reproject” the result onto the basis set) so subtraction, just like that of “standard” polynomials, is simply “component-wise.”
#### Examples
    
    >>> from numpy.polynomial import legendre as L
    >>> c1 = (1,2,3)
    >>> c2 = (3,2,1)
    >>> L.legsub(c1,c2)
    array([-2.,  0.,  2.])
    >>> L.legsub(c2,c1) # -C.legsub(c1,c2)
    array([ 2.,  0., -2.])
    
# numpy.polynomial.legendre.legtrim
polynomial.legendre.legtrim(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.legendre.legval
polynomial.legendre.legval(x, c, tensor=True)[source]
    
Evaluate a Legendre series at points x.
If `c` is of length `n + 1`, this function returns the value:
\\[p(x) = c_0 * L_0(x) + c_1 * L_1(x) + ... + c_n * L_n(x)\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array, then `p(x)` will have the same shape as `x`. If `c` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is true the shape will be c.shape[1:] + x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that scalars have shape (,).
Trailing zeros in the coefficients will be used in the evaluation, so they should be avoided if efficiency is a concern.
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with themselves and with the elements of `c`.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree n are contained in c[n]. If `c` is multidimensional the remaining indices enumerate multiple polynomials. In the two dimensional case the coefficients may be thought of as stored in the columns of `c`.
tensorboolean, optional
    
If True, the shape of the coefficient array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `c` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `c` for the evaluation. This keyword is useful when `c` is multidimensional. The default value is True.
Returns:
    
valuesndarray, algebra_like
    
The shape of the return value is described above.
See also
`legval2d`, `leggrid2d`, `legval3d`, `leggrid3d`
#### Notes
The evaluation uses Clenshaw recursion, aka synthetic division.
# numpy.polynomial.legendre.legval2d
polynomial.legendre.legval2d(x, y, c)[source]
    
Evaluate a 2-D Legendre series at points (x, y).
This function returns the values:
\\[p(x,y) = \sum_{i,j} c_{i,j} * L_i(x) * L_j(y)\\]
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array a one is implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points `(x, y)`, where `x` and `y` must have the same shape. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional Legendre series at points formed from pairs of corresponding values from `x` and `y`.
See also
`legval`, `leggrid2d`, `legval3d`, `leggrid3d`
# numpy.polynomial.legendre.legval3d
polynomial.legendre.legval3d(x, y, z, c)[source]
    
Evaluate a 3-D Legendre series at points (x, y, z).
This function returns the values:
\\[p(x,y,z) = \sum_{i,j,k} c_{i,j,k} * L_i(x) * L_j(y) * L_k(z)\\]
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than 3 dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape.
Parameters:
    
x, y, zarray_like, compatible object
    
The three dimensional series is evaluated at the points `(x, y, z)`, where `x`, `y`, and `z` must have the same shape. If any of `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j,k is contained in `c[i,j,k]`. If `c` has dimension greater than 3 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the multidimensional polynomial on points formed with triples of corresponding values from `x`, `y`, and `z`.
See also
`legval`, `legval2d`, `leggrid2d`, `leggrid3d`
# numpy.polynomial.legendre.legvander
polynomial.legendre.legvander(x, deg)[source]
    
Pseudo-Vandermonde matrix of given degree.
Returns the pseudo-Vandermonde matrix of degree `deg` and sample points `x`. The pseudo-Vandermonde matrix is defined by
\\[V[..., i] = L_i(x)\\]
where `0 <= i <= deg`. The leading indices of `V` index the elements of `x` and the last index is the degree of the Legendre polynomial.
If `c` is a 1-D array of coefficients of length `n + 1` and `V` is the array `V = legvander(x, n)`, then `np.dot(V, c)` and `legval(x, c)` are the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of Legendre series of the same degree and sample points.
Parameters:
    
xarray_like
    
Array of points. The dtype is converted to float64 or complex128 depending on whether any of the elements are complex. If `x` is scalar it is converted to a 1-D array.
degint
    
Degree of the resulting matrix.
Returns:
    
vanderndarray
    
The pseudo-Vandermonde matrix. The shape of the returned matrix is `x.shape + (deg + 1,)`, where The last index is the degree of the corresponding Legendre polynomial. The dtype will be the same as the converted `x`.
# numpy.polynomial.legendre.legvander2d
polynomial.legendre.legvander2d(x, y, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y)`. The pseudo-Vandermonde matrix is defined by
\\[V[..., (deg[1] + 1)*i + j] = L_i(x) * L_j(y),\\]
where `0 <= i <= deg[0]` and `0 <= j <= deg[1]`. The leading indices of `V` index the points `(x, y)` and the last index encodes the degrees of the Legendre polynomials.
If `V = legvander2d(x, y, [xdeg, ydeg])`, then the columns of `V` correspond to the elements of a 2-D coefficient array `c` of shape (xdeg + 1, ydeg + 1) in the order
\\[c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...\\]
and `np.dot(V, c.flat)` and `legval2d(x, y, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 2-D Legendre series of the same degrees and sample points.
Parameters:
    
x, yarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg].
Returns:
    
vander2dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)\\). The dtype will be the same as the converted `x` and `y`.
See also
`legvander`, `legvander3d`, `legval2d`, `legval3d`
# numpy.polynomial.legendre.legvander3d
polynomial.legendre.legvander3d(x, y, z, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y, z)`. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`, then The pseudo-Vandermonde matrix is defined by
\\[V[..., (m+1)(n+1)i + (n+1)j + k] = L_i(x)*L_j(y)*L_k(z),\\]
where `0 <= i <= l`, `0 <= j <= m`, and `0 <= j <= n`. The leading indices of `V` index the points `(x, y, z)` and the last index encodes the degrees of the Legendre polynomials.
If `V = legvander3d(x, y, z, [xdeg, ydeg, zdeg])`, then the columns of `V` correspond to the elements of a 3-D coefficient array `c` of shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
\\[c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...\\]
and `np.dot(V, c.flat)` and `legval3d(x, y, z, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 3-D Legendre series of the same degrees and sample points.
Parameters:
    
x, y, zarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg, z_deg].
Returns:
    
vander3dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)\\). The dtype will be the same as the converted `x`, `y`, and `z`.
See also
`legvander`, `legvander3d`, `legval2d`, `legval3d`
# numpy.polynomial.legendre.legweight
polynomial.legendre.legweight(x)[source]
    
Weight function of the Legendre polynomials.
The weight function is \\(1\\) and the interval of integration is \\([-1, 1]\\). The Legendre polynomials are orthogonal, but not normalized, with respect to this weight function.
Parameters:
    
xarray_like
    
Values at which the weight function will be computed.
Returns:
    
wndarray
    
The weight function at `x`.
# numpy.polynomial.legendre.legx
polynomial.legendre.legx=array([0, 1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.legendre.legzero
polynomial.legendre.legzero=array([0]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.legendre.poly2leg
polynomial.legendre.poly2leg(pol)[source]
    
Convert a polynomial to a Legendre series.
Convert an array representing the coefficients of a polynomial (relative to the “standard” basis) ordered from lowest degree to highest, to an array of the coefficients of the equivalent Legendre series, ordered from lowest to highest degree.
Parameters:
    
polarray_like
    
1-D array containing the polynomial coefficients
Returns:
    
cndarray
    
1-D array containing the coefficients of the equivalent Legendre series.
See also
`leg2poly`
#### Notes
The easy way to do conversions between polynomial basis sets is to use the convert method of a class instance.
#### Examples
    
    >>> import numpy as np
    >>> from numpy import polynomial as P
    >>> p = P.Polynomial(np.arange(4))
    >>> p
    Polynomial([0.,  1.,  2.,  3.], domain=[-1.,  1.], window=[-1.,  1.], ...
    >>> c = P.Legendre(P.legendre.poly2leg(p.coef))
    >>> c
    Legendre([ 1.  ,  3.25,  1.  ,  0.75], domain=[-1,  1], window=[-1,  1]) # may vary
    
# numpy.polynomial.polynomial.polyadd
polynomial.polynomial.polyadd(c1, c2)[source]
    
Add one polynomial to another.
Returns the sum of two polynomials `c1` \+ `c2`. The arguments are sequences of coefficients from lowest order term to highest, i.e., [1,2,3] represents the polynomial `1 + 2*x + 3*x**2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of polynomial coefficients ordered from low to high.
Returns:
    
outndarray
    
The coefficient array representing their sum.
See also
`polysub`, `polymulx`, `polymul`, `polydiv`, `polypow`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c1 = (1, 2, 3)
    >>> c2 = (3, 2, 1)
    >>> sum = P.polyadd(c1,c2); sum
    array([4.,  4.,  4.])
    >>> P.polyval(2, sum)  # 4 + 4(2) + 4(2**2)
    28.0
    
# numpy.polynomial.polynomial.polycompanion
polynomial.polynomial.polycompanion(c)[source]
    
Return the companion matrix of c.
The companion matrix for power series cannot be made symmetric by scaling the basis, so this function differs from those for the orthogonal polynomials.
Parameters:
    
carray_like
    
1-D array of polynomial coefficients ordered from low to high degree.
Returns:
    
matndarray
    
Companion matrix of dimensions (deg, deg).
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = (1, 2, 3)
    >>> P.polycompanion(c)
    array([[ 0.        , -0.33333333],
           [ 1.        , -0.66666667]])
    
# numpy.polynomial.polynomial.polyder
polynomial.polynomial.polyder(c, m=1, scl=1, axis=0)[source]
    
Differentiate a polynomial.
Returns the polynomial coefficients `c` differentiated `m` times along `axis`. At each iteration the result is multiplied by `scl` (the scaling factor is for use in a linear change of variable). The argument `c` is an array of coefficients from low to high degree along each axis, e.g., [1,2,3] represents the polynomial `1 + 2*x + 3*x**2` while [[1,2],[1,2]] represents `1 + 1*x + 2*y + 2*x*y` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
Array of polynomial coefficients. If c is multidimensional the different axis correspond to different variables with the degree in each axis given by the corresponding index.
mint, optional
    
Number of derivatives taken, must be non-negative. (Default: 1)
sclscalar, optional
    
Each differentiation is multiplied by `scl`. The end result is multiplication by `scl**m`. This is for use in a linear change of variable. (Default: 1)
axisint, optional
    
Axis over which the derivative is taken. (Default: 0).
Returns:
    
derndarray
    
Polynomial coefficients of the derivative.
See also
`polyint`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = (1, 2, 3, 4)
    >>> P.polyder(c)  # (d/dx)(c)
    array([  2.,   6.,  12.])
    >>> P.polyder(c, 3)  # (d**3/dx**3)(c)
    array([24.])
    >>> P.polyder(c, scl=-1)  # (d/d(-x))(c)
    array([ -2.,  -6., -12.])
    >>> P.polyder(c, 2, -1)  # (d**2/d(-x)**2)(c)
    array([  6.,  24.])
    
# numpy.polynomial.polynomial.polydiv
polynomial.polynomial.polydiv(c1, c2)[source]
    
Divide one polynomial by another.
Returns the quotient-with-remainder of two polynomials `c1` / `c2`. The arguments are sequences of coefficients, from lowest order term to highest, e.g., [1,2,3] represents `1 + 2*x + 3*x**2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of polynomial coefficients ordered from low to high.
Returns:
    
[quo, rem]ndarrays
    
Of coefficient series representing the quotient and remainder.
See also
`polyadd`, `polysub`, `polymulx`, `polymul`, `polypow`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c1 = (1, 2, 3)
    >>> c2 = (3, 2, 1)
    >>> P.polydiv(c1, c2)
    (array([3.]), array([-8., -4.]))
    >>> P.polydiv(c2, c1)
    (array([ 0.33333333]), array([ 2.66666667,  1.33333333]))  # may vary
    
# numpy.polynomial.polynomial.polydomain
polynomial.polynomial.polydomain=array([-1., 1.]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.polynomial.polyfit
polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=None)[source]
    
Least-squares fit of a polynomial to data.
Return the coefficients of a polynomial of degree `deg` that is the least squares fit to the data values `y` given at points `x`. If `y` is 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple fits are done, one for each column of `y`, and the resulting coefficients are stored in the corresponding columns of a 2-D return. The fitted polynomial(s) are in the form
\\[p(x) = c_0 + c_1 * x + ... + c_n * x^n,\\]
where `n` is `deg`.
Parameters:
    
xarray_like, shape (`M`,)
    
x-coordinates of the `M` sample (data) points `(x[i], y[i])`.
yarray_like, shape (`M`,) or (`M`, `K`)
    
y-coordinates of the sample points. Several sets of sample points sharing the same x-coordinates can be (independently) fit with one call to `polyfit` by passing in for `y` a 2-D array that contains one data set per column.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than `rcond`, relative to the largest singular value, will be ignored. The default value is `len(x)*eps`, where `eps` is the relative precision of the platform’s float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining the nature of the return value. When `False` (the default) just the coefficients are returned; when `True`, diagnostic information from the singular value decomposition (used to solve the fit’s matrix equation) is also returned.
warray_like, shape (`M`,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
Returns:
    
coefndarray, shape (`deg` \+ 1,) or (`deg` \+ 1, `K`)
    
Polynomial coefficients ordered from low to high. If `y` was 2-D, the coefficients in column `k` of `coef` represent the polynomial fit to the data in `y`’s `k`-th column.
[residuals, rank, singular_values, rcond]list
    
These values are only returned if `full == True`
  * residuals – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * singular_values – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `numpy.linalg.lstsq`.
Raises:
    
RankWarning
    
Raised if the matrix in the least-squares fit is rank deficient. The warning is only raised if `full == False`. The warnings can be turned off by:
    
    >>> import warnings
    >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
    
See also
`numpy.polynomial.chebyshev.chebfit`
`numpy.polynomial.legendre.legfit`
`numpy.polynomial.laguerre.lagfit`
`numpy.polynomial.hermite.hermfit`
`numpy.polynomial.hermite_e.hermefit`
`polyval`
    
Evaluates a polynomial.
`polyvander`
    
Vandermonde matrix for powers.
`numpy.linalg.lstsq`
    
Computes a least-squares fit from the matrix.
`scipy.interpolate.UnivariateSpline`
    
Computes spline fits.
#### Notes
The solution is the coefficients of the polynomial `p` that minimizes the sum of the weighted squared errors
\\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\\]
where the \\(w_j\\) are the weights. This problem is solved by setting up the (typically) over-determined matrix equation:
\\[V(x) * c = w * y,\\]
where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the coefficients to be solved for, `w` are the weights, and `y` are the observed values. This equation is then solved using the singular value decomposition of `V`.
If some of the singular values of `V` are so small that they are neglected (and `full` == `False`), a `RankWarning` will be raised. This means that the coefficient values may be poorly determined. Fitting to a lower order polynomial will usually get rid of the warning (but may not be what you want, of course; if you have independent reason(s) for choosing the degree which isn’t working, you may have to: a) reconsider those reasons, and/or b) reconsider the quality of your data). The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious and have large contributions from roundoff error.
Polynomial fits using double precision tend to “fail” at about (polynomial) degree 20. Fits using Chebyshev or Legendre series are generally better conditioned, but much can still depend on the distribution of the sample points and the smoothness of the data. If the quality of the fit is inadequate, splines may be a good alternative.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial import polynomial as P
    >>> x = np.linspace(-1,1,51)  # x "data": [-1, -0.96, ..., 0.96, 1]
    >>> rng = np.random.default_rng()
    >>> err = rng.normal(size=len(x))
    >>> y = x**3 - x + err  # x^3 - x + Gaussian noise
    >>> c, stats = P.polyfit(x,y,3,full=True)
    >>> c # c[0], c[1] approx. -1, c[2] should be approx. 0, c[3] approx. 1
    array([ 0.23111996, -1.02785049, -0.2241444 ,  1.08405657]) # may vary
    >>> stats # note the large SSR, explaining the rather poor results
    [array([48.312088]),                                        # may vary
     4,
     array([1.38446749, 1.32119158, 0.50443316, 0.28853036]),
     1.1324274851176597e-14]
    
Same thing without the added noise
    
    >>> y = x**3 - x
    >>> c, stats = P.polyfit(x,y,3,full=True)
    >>> c # c[0], c[1] ~= -1, c[2] should be "very close to 0", c[3] ~= 1
    array([-6.73496154e-17, -1.00000000e+00,  0.00000000e+00,  1.00000000e+00])
    >>> stats # note the minuscule SSR
    [array([8.79579319e-31]),
     np.int32(4),
     array([1.38446749, 1.32119158, 0.50443316, 0.28853036]),
     1.1324274851176597e-14]
    
# numpy.polynomial.polynomial.polyfromroots
polynomial.polynomial.polyfromroots(roots)[source]
    
Generate a monic polynomial with given roots.
Return the coefficients of the polynomial
\\[p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),\\]
where the \\(r_n\\) are the roots specified in `roots`. If a zero has multiplicity n, then it must appear in `roots` n times. For instance, if 2 is a root of multiplicity three and 3 is a root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The roots can appear in any order.
If the returned coefficients are `c`, then
\\[p(x) = c_0 + c_1 * x + ... + x^n\\]
The coefficient of the last term is 1 for monic polynomials in this form.
Parameters:
    
rootsarray_like
    
Sequence containing the roots.
Returns:
    
outndarray
    
1-D array of the polynomial’s coefficients If all the roots are real, then `out` is also real, otherwise it is complex. (see Examples below).
See also
`numpy.polynomial.chebyshev.chebfromroots`
`numpy.polynomial.legendre.legfromroots`
`numpy.polynomial.laguerre.lagfromroots`
`numpy.polynomial.hermite.hermfromroots`
`numpy.polynomial.hermite_e.hermefromroots`
#### Notes
The coefficients are determined by multiplying together linear factors of the form `(x - r_i)`, i.e.
\\[p(x) = (x - r_0) (x - r_1) ... (x - r_n)\\]
where `n == len(roots) - 1`; note that this implies that `1` is always returned for \\(a_n\\).
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> P.polyfromroots((-1,0,1))  # x(x - 1)(x + 1) = x^3 - x
    array([ 0., -1.,  0.,  1.])
    >>> j = complex(0,1)
    >>> P.polyfromroots((-j,j))  # complex returned, though values are real
    array([1.+0.j,  0.+0.j,  1.+0.j])
    
# numpy.polynomial.polynomial.polygrid2d
polynomial.polynomial.polygrid2d(x, y, c)[source]
    
Evaluate a 2-D polynomial on the Cartesian product of x and y.
This function returns the values:
\\[p(a,b) = \sum_{i,j} c_{i,j} * a^i * b^j\\]
where the points `(a, b)` consist of all pairs formed by taking `a` from `x` and `b` from `y`. The resulting points form a grid with `x` in the first dimension and `y` in the second.
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape + y.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points in the Cartesian product of `x` and `y`. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`polyval`, `polyval2d`, `polyval3d`, `polygrid3d`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = ((1, 2, 3), (4, 5, 6))
    >>> P.polygrid2d([0, 1], [0, 1], c)
    array([[ 1.,  6.],
           [ 5., 21.]])
    
# numpy.polynomial.polynomial.polygrid3d
polynomial.polynomial.polygrid3d(x, y, z, c)[source]
    
Evaluate a 3-D polynomial on the Cartesian product of x, y and z.
This function returns the values:
\\[p(a,b,c) = \sum_{i,j,k} c_{i,j,k} * a^i * b^j * c^k\\]
where the points `(a, b, c)` consist of all triples formed by taking `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form a grid with `x` in the first dimension, `y` in the second, and `z` in the third.
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than three dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape + y.shape + z.shape.
Parameters:
    
x, y, zarray_like, compatible objects
    
The three dimensional series is evaluated at the points in the Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree i,j are contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points in the Cartesian product of `x` and `y`.
See also
`polyval`, `polyval2d`, `polygrid2d`, `polyval3d`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
    >>> P.polygrid3d([0, 1], [0, 1], [0, 1], c)
    array([[ 1., 13.],
           [ 6., 51.]])
    
# numpy.polynomial.polynomial.polyint
polynomial.polynomial.polyint(c, m=1, k=[], lbnd=0, scl=1, axis=0)[source]
    
Integrate a polynomial.
Returns the polynomial coefficients `c` integrated `m` times from `lbnd` along `axis`. At each iteration the resulting series is multiplied by `scl` and an integration constant, `k`, is added. The scaling factor is for use in a linear change of variable. (“Buyer beware”: note that, depending on what one is doing, one may want `scl` to be the reciprocal of what one might expect; for more information, see the Notes section below.) The argument `c` is an array of coefficients, from low to high degree along each axis, e.g., [1,2,3] represents the polynomial `1 + 2*x + 3*x**2` while [[1,2],[1,2]] represents `1 + 1*x + 2*y + 2*x*y` if axis=0 is `x` and axis=1 is `y`.
Parameters:
    
carray_like
    
1-D array of polynomial coefficients, ordered from low to high.
mint, optional
    
Order of integration, must be positive. (Default: 1)
k{[], list, scalar}, optional
    
Integration constant(s). The value of the first integral at zero is the first value in the list, the value of the second integral at zero is the second value, etc. If `k == []` (the default), all constants are set to zero. If `m == 1`, a single scalar can be given instead of a list.
lbndscalar, optional
    
The lower bound of the integral. (Default: 0)
sclscalar, optional
    
Following each integration the result is multiplied by `scl` before the integration constant is added. (Default: 1)
axisint, optional
    
Axis over which the integral is taken. (Default: 0).
Returns:
    
Sndarray
    
Coefficient array of the integral.
Raises:
    
ValueError
    
If `m < 1`, `len(k) > m`, `np.ndim(lbnd) != 0`, or `np.ndim(scl) != 0`.
See also
`polyder`
#### Notes
Note that the result of each integration is multiplied by `scl`. Why is this important to note? Say one is making a linear change of variable \\(u = ax + b\\) in an integral relative to `x`. Then \\(dx = du/a\\), so one will need to set `scl` equal to \\(1/a\\) \- perhaps not what one would have first thought.
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = (1, 2, 3)
    >>> P.polyint(c)  # should return array([0, 1, 1, 1])
    array([0.,  1.,  1.,  1.])
    >>> P.polyint(c, 3)  # should return array([0, 0, 0, 1/6, 1/12, 1/20])
     array([ 0.        ,  0.        ,  0.        ,  0.16666667,  0.08333333, # may vary
             0.05      ])
    >>> P.polyint(c, k=3)  # should return array([3, 1, 1, 1])
    array([3.,  1.,  1.,  1.])
    >>> P.polyint(c,lbnd=-2)  # should return array([6, 1, 1, 1])
    array([6.,  1.,  1.,  1.])
    >>> P.polyint(c,scl=-2)  # should return array([0, -2, -2, -2])
    array([ 0., -2., -2., -2.])
    
# numpy.polynomial.polynomial.polyline
polynomial.polynomial.polyline(off, scl)[source]
    
Returns an array representing a linear polynomial.
Parameters:
    
off, sclscalars
    
The “y-intercept” and “slope” of the line, respectively.
Returns:
    
yndarray
    
This module’s representation of the linear polynomial `off + scl*x`.
See also
`numpy.polynomial.chebyshev.chebline`
`numpy.polynomial.legendre.legline`
`numpy.polynomial.laguerre.lagline`
`numpy.polynomial.hermite.hermline`
`numpy.polynomial.hermite_e.hermeline`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> P.polyline(1, -1)
    array([ 1, -1])
    >>> P.polyval(1, P.polyline(1, -1))  # should be 0
    0.0
    
# numpy.polynomial.polynomial.polymul
polynomial.polynomial.polymul(c1, c2)[source]
    
Multiply one polynomial by another.
Returns the product of two polynomials `c1` * `c2`. The arguments are sequences of coefficients, from lowest order term to highest, e.g., [1,2,3] represents the polynomial `1 + 2*x + 3*x**2.`
Parameters:
    
c1, c2array_like
    
1-D arrays of coefficients representing a polynomial, relative to the “standard” basis, and ordered from lowest order term to highest.
Returns:
    
outndarray
    
Of the coefficients of their product.
See also
`polyadd`, `polysub`, `polymulx`, `polydiv`, `polypow`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c1 = (1, 2, 3)
    >>> c2 = (3, 2, 1)
    >>> P.polymul(c1, c2)
    array([  3.,   8.,  14.,   8.,   3.])
    
# numpy.polynomial.polynomial.polymulx
polynomial.polynomial.polymulx(c)[source]
    
Multiply a polynomial by x.
Multiply the polynomial `c` by x, where x is the independent variable.
Parameters:
    
carray_like
    
1-D array of polynomial coefficients ordered from low to high.
Returns:
    
outndarray
    
Array representing the result of the multiplication.
See also
`polyadd`, `polysub`, `polymul`, `polydiv`, `polypow`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = (1, 2, 3)
    >>> P.polymulx(c)
    array([0., 1., 2., 3.])
    
# numpy.polynomial.polynomial.Polynomial.__call__
method
polynomial.polynomial.Polynomial.__call__(arg)[source]
    
Call self as a function.
# numpy.polynomial.polynomial.Polynomial.basis
method
classmethodpolynomial.polynomial.Polynomial.basis(deg, domain=None, window=None, symbol='x')[source]
    
Series basis polynomial of degree `deg`.
Returns the series representing the basis polynomial of degree `deg`.
Parameters:
    
degint
    
Degree of the basis polynomial for the series. Must be >= 0.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series with the coefficient of the `deg` term set to one and all others zero.
# numpy.polynomial.polynomial.Polynomial.cast
method
classmethodpolynomial.polynomial.Polynomial.cast(series, domain=None, window=None)[source]
    
Convert series to series of this class.
The `series` is expected to be an instance of some polynomial series of one of the types supported by by the numpy.polynomial module, but could be some other class that supports the convert method.
Parameters:
    
seriesseries
    
The series instance to be converted.
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
Returns:
    
new_seriesseries
    
A series of the same kind as the calling class and equal to `series` when evaluated.
See also
`convert`
    
similar instance method
# numpy.polynomial.polynomial.Polynomial.convert
method
polynomial.polynomial.Polynomial.convert(domain=None, kind=None, window=None)[source]
    
Convert series to a different kind and/or domain and/or window.
Parameters:
    
domainarray_like, optional
    
The domain of the converted series. If the value is None, the default domain of `kind` is used.
kindclass, optional
    
The polynomial series type class to which the current instance should be converted. If kind is None, then the class of the current instance is used.
windowarray_like, optional
    
The window of the converted series. If the value is None, the default window of `kind` is used.
Returns:
    
new_seriesseries
    
The returned class can be of different type than the current instance and/or have a different domain and/or different window.
#### Notes
Conversion between domains and class types can result in numerically ill defined series.
# numpy.polynomial.polynomial.Polynomial.copy
method
polynomial.polynomial.Polynomial.copy()[source]
    
Return a copy.
Returns:
    
new_seriesseries
    
Copy of self.
# numpy.polynomial.polynomial.Polynomial.cutdeg
method
polynomial.polynomial.Polynomial.cutdeg(deg)[source]
    
Truncate series to the given degree.
Reduce the degree of the series to `deg` by discarding the high order terms. If `deg` is greater than the current degree a copy of the current series is returned. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
degnon-negative int
    
The series is reduced to degree `deg` by discarding the high order terms. The value of `deg` must be a non-negative integer.
Returns:
    
new_seriesseries
    
New instance of series with reduced degree.
# numpy.polynomial.polynomial.Polynomial.degree
method
polynomial.polynomial.Polynomial.degree()[source]
    
The degree of the series.
Returns:
    
degreeint
    
Degree of the series, one less than the number of coefficients.
#### Examples
Create a polynomial object for `1 + 7*x + 4*x**2`:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 4])
    >>> print(poly)
    1.0 + 7.0·x + 4.0·x²
    >>> poly.degree()
    2
    
Note that this method does not check for non-zero coefficients. You must trim the polynomial to remove any trailing zeroes:
    
    >>> poly = np.polynomial.Polynomial([1, 7, 0])
    >>> print(poly)
    1.0 + 7.0·x + 0.0·x²
    >>> poly.degree()
    2
    >>> poly.trim().degree()
    1
    
# numpy.polynomial.polynomial.Polynomial.deriv
method
polynomial.polynomial.Polynomial.deriv(m=1)[source]
    
Differentiate.
Return a series instance of that is the derivative of the current series.
Parameters:
    
mnon-negative int
    
Find the derivative of order `m`.
Returns:
    
new_seriesseries
    
A new series representing the derivative. The domain is the same as the domain of the differentiated series.
# numpy.polynomial.polynomial.Polynomial.domain
attribute
polynomial.polynomial.Polynomial.domain=array([-1., 1.]) 
# numpy.polynomial.polynomial.Polynomial.fit
method
classmethodpolynomial.polynomial.Polynomial.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')[source]
    
Least squares fit to data.
Return a series instance that is the least squares fit to the data `y` sampled at `x`. The domain of the returned instance can be specified and this will often result in a superior fit with less chance of ill conditioning.
Parameters:
    
xarray_like, shape (M,)
    
x-coordinates of the M sample points `(x[i], y[i])`.
yarray_like, shape (M,)
    
y-coordinates of the M sample points `(x[i], y[i])`.
degint or 1-D array_like
    
Degree(s) of the fitting polynomials. If `deg` is a single integer all terms up to and including the `deg`’th term are included in the fit. For NumPy versions >= 1.11.0 a list of integers specifying the degrees of the terms to include may be used instead.
domain{None, [beg, end], []}, optional
    
Domain to use for the returned series. If `None`, then a minimal domain that covers the points `x` is chosen. If `[]` the class domain is used. The default value was the class domain in NumPy 1.4 and `None` in later versions. The `[]` option was added in numpy 1.5.0.
rcondfloat, optional
    
Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is `len(x)*eps`, where eps is the relative precision of the float type, about 2e-16 in most cases.
fullbool, optional
    
Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned.
warray_like, shape (M,), optional
    
Weights. If not None, the weight `w[i]` applies to the unsquared residual `y[i] - y_hat[i]` at `x[i]`. Ideally the weights are chosen so that the errors of the products `w[i]*y[i]` all have the same variance. When using inverse-variance weighting, use `w[i] = 1/sigma(y[i])`. The default value is None.
window{[beg, end]}, optional
    
Window to use for the returned series. The default value is the default class domain
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
A series that represents the least squares fit to the data and has the domain and window specified in the call. If the coefficients for the unscaled and unshifted basis polynomials are of interest, do `new_series.convert().coef`.
[resid, rank, sv, rcond]list
    
These values are only returned if `full == True`
  * resid – sum of squared residuals of the least squares fit
  * rank – the numerical rank of the scaled Vandermonde matrix
  * sv – singular values of the scaled Vandermonde matrix
  * rcond – value of `rcond`.


For more details, see `linalg.lstsq`.
# numpy.polynomial.polynomial.Polynomial.fromroots
method
classmethodpolynomial.polynomial.Polynomial.fromroots(roots, domain=[], window=None, symbol='x')[source]
    
Return series instance that has the specified roots.
Returns a series representing the product `(x - r[0])*(x - r[1])*...*(x - r[n-1])`, where `r` is a list of roots.
Parameters:
    
rootsarray_like
    
List of roots.
domain{[], None, array_like}, optional
    
Domain for the resulting series. If None the domain is the interval from the smallest root to the largest. If [] the domain is the class domain. The default is [].
window{None, array_like}, optional
    
Window for the returned series. If None the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series with the specified roots.
# numpy.polynomial.polynomial.Polynomial.has_samecoef
method
polynomial.polynomial.Polynomial.has_samecoef(other)[source]
    
Check if coefficients match.
Parameters:
    
otherclass instance
    
The other class must have the `coef` attribute.
Returns:
    
boolboolean
    
True if the coefficients are the same, False otherwise.
# numpy.polynomial.polynomial.Polynomial.has_samedomain
method
polynomial.polynomial.Polynomial.has_samedomain(other)[source]
    
Check if domains match.
Parameters:
    
otherclass instance
    
The other class must have the `domain` attribute.
Returns:
    
boolboolean
    
True if the domains are the same, False otherwise.
# numpy.polynomial.polynomial.Polynomial.has_sametype
method
polynomial.polynomial.Polynomial.has_sametype(other)[source]
    
Check if types match.
Parameters:
    
otherobject
    
Class instance.
Returns:
    
boolboolean
    
True if other is same class as self
# numpy.polynomial.polynomial.Polynomial.has_samewindow
method
polynomial.polynomial.Polynomial.has_samewindow(other)[source]
    
Check if windows match.
Parameters:
    
otherclass instance
    
The other class must have the `window` attribute.
Returns:
    
boolboolean
    
True if the windows are the same, False otherwise.
# numpy.polynomial.polynomial.Polynomial
classnumpy.polynomial.polynomial.Polynomial(coef, domain=None, window=None, symbol='x')[source]
    
A power series class.
The Polynomial class provides the standard Python numerical methods ‘+’, ‘-’, ‘*’, ‘//’, ‘%’, ‘divmod’, ‘**’, and ‘()’ as well as the attributes and methods listed below.
Parameters:
    
coefarray_like
    
Polynomial coefficients in order of increasing degree, i.e., `(1, 2, 3)` give `1 + 2*x + 3*x**2`.
domain(2,) array_like, optional
    
Domain to use. The interval `[domain[0], domain[1]]` is mapped to the interval `[window[0], window[1]]` by shifting and scaling. The default value is [-1., 1.].
window(2,) array_like, optional
    
Window, see `domain` for its use. The default value is [-1., 1.].
symbolstr, optional
    
Symbol used to represent the independent variable in string representations of the polynomial expression, e.g. for printing. The symbol must be a valid Python identifier. Default value is ‘x’.
New in version 1.24.
Attributes:
    
basis_name
symbol
#### Methods
`__call__`(arg)
Call self as a function.  
`basis`(deg[, domain, window, symbol])
Series basis polynomial of degree `deg`.  
`cast`(series[, domain, window])
Convert series to series of this class.  
`convert`([domain, kind, window])
Convert series to a different kind and/or domain and/or window.  
`copy`()
Return a copy.  
`cutdeg`(deg)
Truncate series to the given degree.  
`degree`()
The degree of the series.  
`deriv`([m])
Differentiate.  
`fit`(x, y, deg[, domain, rcond, full, w, ...])
Least squares fit to data.  
`fromroots`(roots[, domain, window, symbol])
Return series instance that has the specified roots.  
`has_samecoef`(other)
Check if coefficients match.  
`has_samedomain`(other)
Check if domains match.  
`has_sametype`(other)
Check if types match.  
`has_samewindow`(other)
Check if windows match.  
`identity`([domain, window, symbol])
Identity function.  
`integ`([m, k, lbnd])
Integrate.  
`linspace`([n, domain])
Return x, y values at equally spaced points in domain.  
`mapparms`()
Return the mapping parameters.  
`roots`()
Return the roots of the series polynomial.  
`trim`([tol])
Remove trailing coefficients  
`truncate`(size)
Truncate series to length `size`.  
# numpy.polynomial.polynomial.Polynomial.identity
method
classmethodpolynomial.polynomial.Polynomial.identity(domain=None, window=None, symbol='x')[source]
    
Identity function.
If `p` is the returned series, then `p(x) == x` for all values of x.
Parameters:
    
domain{None, array_like}, optional
    
If given, the array must be of the form `[beg, end]`, where `beg` and `end` are the endpoints of the domain. If None is given then the class domain is used. The default is None.
window{None, array_like}, optional
    
If given, the resulting array must be if the form `[beg, end]`, where `beg` and `end` are the endpoints of the window. If None is given then the class window is used. The default is None.
symbolstr, optional
    
Symbol representing the independent variable. Default is ‘x’.
Returns:
    
new_seriesseries
    
Series of representing the identity.
# numpy.polynomial.polynomial.Polynomial.integ
method
polynomial.polynomial.Polynomial.integ(m=1, k=[], lbnd=None)[source]
    
Integrate.
Return a series instance that is the definite integral of the current series.
Parameters:
    
mnon-negative int
    
The number of integrations to perform.
karray_like
    
Integration constants. The first constant is applied to the first integration, the second to the second, and so on. The list of values must less than or equal to `m` in length and any missing values are set to zero.
lbndScalar
    
The lower bound of the definite integral.
Returns:
    
new_seriesseries
    
A new series representing the integral. The domain is the same as the domain of the integrated series.
# numpy.polynomial.polynomial.Polynomial.linspace
method
polynomial.polynomial.Polynomial.linspace(n=100, domain=None)[source]
    
Return x, y values at equally spaced points in domain.
Returns the x, y values at `n` linearly spaced points across the domain. Here y is the value of the polynomial at the points x. By default the domain is the same as that of the series instance. This method is intended mostly as a plotting aid.
Parameters:
    
nint, optional
    
Number of point pairs to return. The default value is 100.
domain{None, array_like}, optional
    
If not None, the specified domain is used instead of that of the calling instance. It should be of the form `[beg,end]`. The default is None which case the class domain is used.
Returns:
    
x, yndarray
    
x is equal to linspace(self.domain[0], self.domain[1], n) and y is the series evaluated at element of x.
# numpy.polynomial.polynomial.Polynomial.mapparms
method
polynomial.polynomial.Polynomial.mapparms()[source]
    
Return the mapping parameters.
The returned values define a linear map `off + scl*x` that is applied to the input arguments before the series is evaluated. The map depends on the `domain` and `window`; if the current `domain` is equal to the `window` the resulting map is the identity. If the coefficients of the series instance are to be used by themselves outside this class, then the linear function must be substituted for the `x` in the standard representation of the base polynomials.
Returns:
    
off, sclfloat or complex
    
The mapping function is defined by `off + scl*x`.
#### Notes
If the current domain is the interval `[l1, r1]` and the window is `[l2, r2]`, then the linear mapping function `L` is defined by the equations:
    
    L(l1) = l2
    L(r1) = r2
    
# numpy.polynomial.polynomial.Polynomial.roots
method
polynomial.polynomial.Polynomial.roots()[source]
    
Return the roots of the series polynomial.
Compute the roots for the series. Note that the accuracy of the roots decreases the further outside the `domain` they lie.
Returns:
    
rootsndarray
    
Array containing the roots of the series.
# numpy.polynomial.polynomial.Polynomial.trim
method
polynomial.polynomial.Polynomial.trim(tol=0)[source]
    
Remove trailing coefficients
Remove trailing coefficients until a coefficient is reached whose absolute value greater than `tol` or the beginning of the series is reached. If all the coefficients would be removed the series is set to `[0]`. A new series instance is returned with the new coefficients. The current instance remains unchanged.
Parameters:
    
tolnon-negative number.
    
All trailing coefficients less than `tol` will be removed.
Returns:
    
new_seriesseries
    
New instance of series with trimmed coefficients.
# numpy.polynomial.polynomial.Polynomial.truncate
method
polynomial.polynomial.Polynomial.truncate(size)[source]
    
Truncate series to length `size`.
Reduce the series to length `size` by discarding the high degree terms. The value of `size` must be a positive integer. This can be useful in least squares where the coefficients of the high degree terms may be very small.
Parameters:
    
sizepositive int
    
The series is reduced to length `size` by discarding the high degree terms. The value of `size` must be a positive integer.
Returns:
    
new_seriesseries
    
New instance of series with truncated coefficients.
# numpy.polynomial.polynomial.polyone
polynomial.polynomial.polyone=array([1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.polynomial.polypow
polynomial.polynomial.polypow(c, pow, maxpower=None)[source]
    
Raise a polynomial to a power.
Returns the polynomial `c` raised to the power `pow`. The argument `c` is a sequence of coefficients ordered from low to high. i.e., [1,2,3] is the series `1 + 2*x + 3*x**2.`
Parameters:
    
carray_like
    
1-D array of array of series coefficients ordered from low to high degree.
powinteger
    
Power to which the series will be raised
maxpowerinteger, optional
    
Maximum power allowed. This is mainly to limit growth of the series to unmanageable size. Default is 16
Returns:
    
coefndarray
    
Power series of power.
See also
`polyadd`, `polysub`, `polymulx`, `polymul`, `polydiv`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> P.polypow([1, 2, 3], 2)
    array([ 1., 4., 10., 12., 9.])
    
# numpy.polynomial.polynomial.polyroots
polynomial.polynomial.polyroots(c)[source]
    
Compute the roots of a polynomial.
Return the roots (a.k.a. “zeros”) of the polynomial
\\[p(x) = \sum_i c[i] * x^i.\\]
Parameters:
    
c1-D array_like
    
1-D array of polynomial coefficients.
Returns:
    
outndarray
    
Array of the roots of the polynomial. If all the roots are real, then `out` is also real, otherwise it is complex.
See also
`numpy.polynomial.chebyshev.chebroots`
`numpy.polynomial.legendre.legroots`
`numpy.polynomial.laguerre.lagroots`
`numpy.polynomial.hermite.hermroots`
`numpy.polynomial.hermite_e.hermeroots`
#### Notes
The root estimates are obtained as the eigenvalues of the companion matrix, Roots far from the origin of the complex plane may have large errors due to the numerical instability of the power series for such values. Roots with multiplicity greater than 1 will also show larger errors as the value of the series near such points is relatively insensitive to errors in the roots. Isolated roots near the origin can be improved by a few iterations of Newton’s method.
#### Examples
    
    >>> import numpy.polynomial.polynomial as poly
    >>> poly.polyroots(poly.polyfromroots((-1,0,1)))
    array([-1.,  0.,  1.])
    >>> poly.polyroots(poly.polyfromroots((-1,0,1))).dtype
    dtype('float64')
    >>> j = complex(0,1)
    >>> poly.polyroots(poly.polyfromroots((-j,0,j)))
    array([  0.00000000e+00+0.j,   0.00000000e+00+1.j,   2.77555756e-17-1.j])  # may vary
    
# numpy.polynomial.polynomial.polysub
polynomial.polynomial.polysub(c1, c2)[source]
    
Subtract one polynomial from another.
Returns the difference of two polynomials `c1` \- `c2`. The arguments are sequences of coefficients from lowest order term to highest, i.e., [1,2,3] represents the polynomial `1 + 2*x + 3*x**2`.
Parameters:
    
c1, c2array_like
    
1-D arrays of polynomial coefficients ordered from low to high.
Returns:
    
outndarray
    
Of coefficients representing their difference.
See also
`polyadd`, `polymulx`, `polymul`, `polydiv`, `polypow`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c1 = (1, 2, 3)
    >>> c2 = (3, 2, 1)
    >>> P.polysub(c1,c2)
    array([-2.,  0.,  2.])
    >>> P.polysub(c2, c1)  # -P.polysub(c1,c2)
    array([ 2.,  0., -2.])
    
# numpy.polynomial.polynomial.polytrim
polynomial.polynomial.polytrim(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.polynomial.polyval
polynomial.polynomial.polyval(x, c, tensor=True)[source]
    
Evaluate a polynomial at points x.
If `c` is of length `n + 1`, this function returns the value
\\[p(x) = c_0 + c_1 * x + ... + c_n * x^n\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` is a 1-D array, then `p(x)` will have the same shape as `x`. If `c` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is true the shape will be c.shape[1:] + x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that scalars have shape (,).
Trailing zeros in the coefficients will be used in the evaluation, so they should be avoided if efficiency is a concern.
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with with themselves and with the elements of `c`.
carray_like
    
Array of coefficients ordered so that the coefficients for terms of degree n are contained in c[n]. If `c` is multidimensional the remaining indices enumerate multiple polynomials. In the two dimensional case the coefficients may be thought of as stored in the columns of `c`.
tensorboolean, optional
    
If True, the shape of the coefficient array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `c` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `c` for the evaluation. This keyword is useful when `c` is multidimensional. The default value is True.
Returns:
    
valuesndarray, compatible object
    
The shape of the returned array is described above.
See also
`polyval2d`, `polygrid2d`, `polyval3d`, `polygrid3d`
#### Notes
The evaluation uses Horner’s method.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial.polynomial import polyval
    >>> polyval(1, [1,2,3])
    6.0
    >>> a = np.arange(4).reshape(2,2)
    >>> a
    array([[0, 1],
           [2, 3]])
    >>> polyval(a, [1, 2, 3])
    array([[ 1.,   6.],
           [17.,  34.]])
    >>> coef = np.arange(4).reshape(2, 2)  # multidimensional coefficients
    >>> coef
    array([[0, 1],
           [2, 3]])
    >>> polyval([1, 2], coef, tensor=True)
    array([[2.,  4.],
           [4.,  7.]])
    >>> polyval([1, 2], coef, tensor=False)
    array([2.,  7.])
    
# numpy.polynomial.polynomial.polyval2d
polynomial.polynomial.polyval2d(x, y, c)[source]
    
Evaluate a 2-D polynomial at points (x, y).
This function returns the value
\\[p(x,y) = \sum_{i,j} c_{i,j} * x^i * y^j\\]
The parameters `x` and `y` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x` and `y` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than two dimensions, ones are implicitly appended to its shape to make it 2-D. The shape of the result will be c.shape[2:] + x.shape.
Parameters:
    
x, yarray_like, compatible objects
    
The two dimensional series is evaluated at the points `(x, y)`, where `x` and `y` must have the same shape. If `x` or `y` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and, if it isn’t an ndarray, it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j is contained in `c[i,j]`. If `c` has dimension greater than two the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the two dimensional polynomial at points formed with pairs of corresponding values from `x` and `y`.
See also
`polyval`, `polygrid2d`, `polyval3d`, `polygrid3d`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = ((1, 2, 3), (4, 5, 6))
    >>> P.polyval2d(1, 1, c)
    21.0
    
# numpy.polynomial.polynomial.polyval3d
polynomial.polynomial.polyval3d(x, y, z, c)[source]
    
Evaluate a 3-D polynomial at points (x, y, z).
This function returns the values:
\\[p(x,y,z) = \sum_{i,j,k} c_{i,j,k} * x^i * y^j * z^k\\]
The parameters `x`, `y`, and `z` are converted to arrays only if they are tuples or a lists, otherwise they are treated as a scalars and they must have the same shape after conversion. In either case, either `x`, `y`, and `z` or their elements must support multiplication and addition both with themselves and with the elements of `c`.
If `c` has fewer than 3 dimensions, ones are implicitly appended to its shape to make it 3-D. The shape of the result will be c.shape[3:] + x.shape.
Parameters:
    
x, y, zarray_like, compatible object
    
The three dimensional series is evaluated at the points `(x, y, z)`, where `x`, `y`, and `z` must have the same shape. If any of `x`, `y`, or `z` is a list or tuple, it is first converted to an ndarray, otherwise it is left unchanged and if it isn’t an ndarray it is treated as a scalar.
carray_like
    
Array of coefficients ordered so that the coefficient of the term of multi-degree i,j,k is contained in `c[i,j,k]`. If `c` has dimension greater than 3 the remaining indices enumerate multiple sets of coefficients.
Returns:
    
valuesndarray, compatible object
    
The values of the multidimensional polynomial on points formed with triples of corresponding values from `x`, `y`, and `z`.
See also
`polyval`, `polyval2d`, `polygrid2d`, `polygrid3d`
#### Examples
    
    >>> from numpy.polynomial import polynomial as P
    >>> c = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
    >>> P.polyval3d(1, 1, 1, c)
    45.0
    
# numpy.polynomial.polynomial.polyvalfromroots
polynomial.polynomial.polyvalfromroots(x, r, tensor=True)[source]
    
Evaluate a polynomial specified by its roots at points x.
If `r` is of length `N`, this function returns the value
\\[p(x) = \prod_{n=1}^{N} (x - r_n)\\]
The parameter `x` is converted to an array only if it is a tuple or a list, otherwise it is treated as a scalar. In either case, either `x` or its elements must support multiplication and addition both with themselves and with the elements of `r`.
If `r` is a 1-D array, then `p(x)` will have the same shape as `x`. If `r` is multidimensional, then the shape of the result depends on the value of `tensor`. If `tensor` is `True` the shape will be r.shape[1:] + x.shape; that is, each polynomial is evaluated at every value of `x`. If `tensor` is `False`, the shape will be r.shape[1:]; that is, each polynomial is evaluated only for the corresponding broadcast value of `x`. Note that scalars have shape (,).
Parameters:
    
xarray_like, compatible object
    
If `x` is a list or tuple, it is converted to an ndarray, otherwise it is left unchanged and treated as a scalar. In either case, `x` or its elements must support addition and multiplication with with themselves and with the elements of `r`.
rarray_like
    
Array of roots. If `r` is multidimensional the first index is the root index, while the remaining indices enumerate multiple polynomials. For instance, in the two dimensional case the roots of each polynomial may be thought of as stored in the columns of `r`.
tensorboolean, optional
    
If True, the shape of the roots array is extended with ones on the right, one for each dimension of `x`. Scalars have dimension 0 for this action. The result is that every column of coefficients in `r` is evaluated for every element of `x`. If False, `x` is broadcast over the columns of `r` for the evaluation. This keyword is useful when `r` is multidimensional. The default value is True.
Returns:
    
valuesndarray, compatible object
    
The shape of the returned array is described above.
See also
`polyroots`, `polyfromroots`, `polyval`
#### Examples
    
    >>> from numpy.polynomial.polynomial import polyvalfromroots
    >>> polyvalfromroots(1, [1, 2, 3])
    0.0
    >>> a = np.arange(4).reshape(2, 2)
    >>> a
    array([[0, 1],
           [2, 3]])
    >>> polyvalfromroots(a, [-1, 0, 1])
    array([[-0.,   0.],
           [ 6.,  24.]])
    >>> r = np.arange(-2, 2).reshape(2,2)  # multidimensional coefficients
    >>> r # each column of r defines one polynomial
    array([[-2, -1],
           [ 0,  1]])
    >>> b = [-2, 1]
    >>> polyvalfromroots(b, r, tensor=True)
    array([[-0.,  3.],
           [ 3., 0.]])
    >>> polyvalfromroots(b, r, tensor=False)
    array([-0.,  0.])
    
# numpy.polynomial.polynomial.polyvander
polynomial.polynomial.polyvander(x, deg)[source]
    
Vandermonde matrix of given degree.
Returns the Vandermonde matrix of degree `deg` and sample points `x`. The Vandermonde matrix is defined by
\\[V[..., i] = x^i,\\]
where `0 <= i <= deg`. The leading indices of `V` index the elements of `x` and the last index is the power of `x`.
If `c` is a 1-D array of coefficients of length `n + 1` and `V` is the matrix `V = polyvander(x, n)`, then `np.dot(V, c)` and `polyval(x, c)` are the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of polynomials of the same degree and sample points.
Parameters:
    
xarray_like
    
Array of points. The dtype is converted to float64 or complex128 depending on whether any of the elements are complex. If `x` is scalar it is converted to a 1-D array.
degint
    
Degree of the resulting matrix.
Returns:
    
vanderndarray.
    
The Vandermonde matrix. The shape of the returned matrix is `x.shape + (deg + 1,)`, where the last index is the power of `x`. The dtype will be the same as the converted `x`.
See also
`polyvander2d`, `polyvander3d`
#### Examples
The Vandermonde matrix of degree `deg = 5` and sample points `x = [-1, 2, 3]` contains the element-wise powers of `x` from 0 to 5 as its columns.
    
    >>> from numpy.polynomial import polynomial as P
    >>> x, deg = [-1, 2, 3], 5
    >>> P.polyvander(x=x, deg=deg)
    array([[  1.,  -1.,   1.,  -1.,   1.,  -1.],
           [  1.,   2.,   4.,   8.,  16.,  32.],
           [  1.,   3.,   9.,  27.,  81., 243.]])
    
# numpy.polynomial.polynomial.polyvander2d
polynomial.polynomial.polyvander2d(x, y, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y)`. The pseudo-Vandermonde matrix is defined by
\\[V[..., (deg[1] + 1)*i + j] = x^i * y^j,\\]
where `0 <= i <= deg[0]` and `0 <= j <= deg[1]`. The leading indices of `V` index the points `(x, y)` and the last index encodes the powers of `x` and `y`.
If `V = polyvander2d(x, y, [xdeg, ydeg])`, then the columns of `V` correspond to the elements of a 2-D coefficient array `c` of shape (xdeg + 1, ydeg + 1) in the order
\\[c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...\\]
and `np.dot(V, c.flat)` and `polyval2d(x, y, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 2-D polynomials of the same degrees and sample points.
Parameters:
    
x, yarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg].
Returns:
    
vander2dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg([1]+1)\\). The dtype will be the same as the converted `x` and `y`.
See also
`polyvander`, `polyvander3d`, `polyval2d`, `polyval3d`
#### Examples
    
    >>> import numpy as np
    
The 2-D pseudo-Vandermonde matrix of degree `[1, 2]` and sample points `x = [-1, 2]` and `y = [1, 3]` is as follows:
    
    >>> from numpy.polynomial import polynomial as P
    >>> x = np.array([-1, 2])
    >>> y = np.array([1, 3])
    >>> m, n = 1, 2
    >>> deg = np.array([m, n])
    >>> V = P.polyvander2d(x=x, y=y, deg=deg)
    >>> V
    array([[ 1.,  1.,  1., -1., -1., -1.],
           [ 1.,  3.,  9.,  2.,  6., 18.]])
    
We can verify the columns for any `0 <= i <= m` and `0 <= j <= n`:
    
    >>> i, j = 0, 1
    >>> V[:, (deg[1]+1)*i + j] == x**i * y**j
    array([ True,  True])
    
The (1D) Vandermonde matrix of sample points `x` and degree `m` is a special case of the (2D) pseudo-Vandermonde matrix with `y` points all zero and degree `[m, 0]`.
    
    >>> P.polyvander2d(x=x, y=0*x, deg=(m, 0)) == P.polyvander(x=x, deg=m)
    array([[ True,  True],
           [ True,  True]])
    
# numpy.polynomial.polynomial.polyvander3d
polynomial.polynomial.polyvander3d(x, y, z, deg)[source]
    
Pseudo-Vandermonde matrix of given degrees.
Returns the pseudo-Vandermonde matrix of degrees `deg` and sample points `(x, y, z)`. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`, then The pseudo-Vandermonde matrix is defined by
\\[V[..., (m+1)(n+1)i + (n+1)j + k] = x^i * y^j * z^k,\\]
where `0 <= i <= l`, `0 <= j <= m`, and `0 <= j <= n`. The leading indices of `V` index the points `(x, y, z)` and the last index encodes the powers of `x`, `y`, and `z`.
If `V = polyvander3d(x, y, z, [xdeg, ydeg, zdeg])`, then the columns of `V` correspond to the elements of a 3-D coefficient array `c` of shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
\\[c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...\\]
and `np.dot(V, c.flat)` and `polyval3d(x, y, z, c)` will be the same up to roundoff. This equivalence is useful both for least squares fitting and for the evaluation of a large number of 3-D polynomials of the same degrees and sample points.
Parameters:
    
x, y, zarray_like
    
Arrays of point coordinates, all of the same shape. The dtypes will be converted to either float64 or complex128 depending on whether any of the elements are complex. Scalars are converted to 1-D arrays.
deglist of ints
    
List of maximum degrees of the form [x_deg, y_deg, z_deg].
Returns:
    
vander3dndarray
    
The shape of the returned matrix is `x.shape + (order,)`, where \\(order = (deg[0]+1)*(deg([1]+1)*(deg[2]+1)\\). The dtype will be the same as the converted `x`, `y`, and `z`.
See also
`polyvander`, `polyvander3d`, `polyval2d`, `polyval3d`
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial import polynomial as P
    >>> x = np.asarray([-1, 2, 1])
    >>> y = np.asarray([1, -2, -3])
    >>> z = np.asarray([2, 2, 5])
    >>> l, m, n = [2, 2, 1]
    >>> deg = [l, m, n]
    >>> V = P.polyvander3d(x=x, y=y, z=z, deg=deg)
    >>> V
    array([[  1.,   2.,   1.,   2.,   1.,   2.,  -1.,  -2.,  -1.,
             -2.,  -1.,  -2.,   1.,   2.,   1.,   2.,   1.,   2.],
           [  1.,   2.,  -2.,  -4.,   4.,   8.,   2.,   4.,  -4.,
             -8.,   8.,  16.,   4.,   8.,  -8., -16.,  16.,  32.],
           [  1.,   5.,  -3., -15.,   9.,  45.,   1.,   5.,  -3.,
            -15.,   9.,  45.,   1.,   5.,  -3., -15.,   9.,  45.]])
    
We can verify the columns for any `0 <= i <= l`, `0 <= j <= m`, and `0 <= k <= n`
    
    >>> i, j, k = 2, 1, 0
    >>> V[:, (m+1)*(n+1)*i + (n+1)*j + k] == x**i * y**j * z**k
    array([ True,  True,  True])
    
# numpy.polynomial.polynomial.polyx
polynomial.polynomial.polyx=array([0, 1]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.polynomial.polyzero
polynomial.polynomial.polyzero=array([0]) 
    
An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)
Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(…)`) for instantiating an array.
For more information, refer to the `numpy` module and examine the methods and attributes of an array.
Parameters:
    
(for the __new__ method; see Notes below)
shapetuple of ints
    
Shape of created array.
dtypedata-type, optional
    
Any object that can be interpreted as a numpy data type.
bufferobject exposing buffer interface, optional
    
Used to fill the array with data.
offsetint, optional
    
Offset of array data in buffer.
stridestuple of ints, optional
    
Strides of data in memory.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`array`
    
Construct an array.
`zeros`
    
Create an array, each element of which is zero.
`empty`
    
Create an array, but leave its allocated memory unchanged (i.e., it contains “garbage”).
`dtype`
    
Create a data-type.
`numpy.typing.NDArray`
    
An ndarray alias generic w.r.t. its `dtype.type`.
#### Notes
There are two modes of creating an array using `__new__`:
  1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used.
  2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted.


No `__init__` method is needed because the array is fully initialized after the `__new__` method.
#### Examples
These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray.
First mode, `buffer` is None:
    
    >>> import numpy as np
    >>> np.ndarray(shape=(2,2), dtype=float, order='F')
    array([[0.0e+000, 0.0e+000], # random
           [     nan, 2.5e-323]])
    
Second mode:
    
    >>> np.ndarray((2,), buffer=np.array([1,2,3]),
    ...            offset=np.int_().itemsize,
    ...            dtype=int) # offset = 1*itemsize, i.e. skip first element
    array([2, 3])
    
Attributes:
    
Tndarray
    
Transpose of the array.
databuffer
    
The array’s elements, in memory.
dtypedtype object
    
Describes the format of the elements in the array.
flagsdict
    
Dictionary containing information related to memory use, e.g., ‘C_CONTIGUOUS’, ‘OWNDATA’, ‘WRITEABLE’, etc.
flatnumpy.flatiter object
    
Flattened version of the array as an iterator. The iterator allows assignments, e.g., `x.flat = 3` (See `ndarray.flat` for assignment examples; TODO).
imagndarray
    
Imaginary part of the array.
realndarray
    
Real part of the array.
sizeint
    
Number of elements in the array.
itemsizeint
    
The memory use of each array element in bytes.
nbytesint
    
The total number of bytes required to store the array data, i.e., `itemsize * size`.
ndimint
    
The array’s number of dimensions.
shapetuple of ints
    
Shape of the array.
stridestuple of ints
    
The step-size required to move from one element to the next in memory. For example, a contiguous `(3, 4)` array of type `int16` in C-order has strides `(8, 2)`. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (`2 * 4`).
ctypesctypes object
    
Class containing properties of the array needed for interaction with ctypes.
basendarray
    
If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored.
# numpy.polynomial.polyutils.as_series
polynomial.polyutils.as_series(alist, trim=True)[source]
    
Return argument as a list of 1-d arrays.
The returned list contains array(s) of dtype double, complex double, or object. A 1-d argument of shape `(N,)` is parsed into `N` arrays of size one; a 2-d argument of shape `(M,N)` is parsed into `M` arrays of size `N` (i.e., is “parsed by row”); and a higher dimensional array raises a Value Error if it is not first reshaped into either a 1-d or 2-d array.
Parameters:
    
alistarray_like
    
A 1- or 2-d array_like
trimboolean, optional
    
When True, trailing zeros are removed from the inputs. When False, the inputs are passed through intact.
Returns:
    
[a1, a2,…]list of 1-D arrays
    
A copy of the input data as a list of 1-d arrays.
Raises:
    
ValueError
    
Raised when `as_series` cannot convert its input to 1-d arrays, or at least one of the resulting arrays is empty.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial import polyutils as pu
    >>> a = np.arange(4)
    >>> pu.as_series(a)
    [array([0.]), array([1.]), array([2.]), array([3.])]
    >>> b = np.arange(6).reshape((2,3))
    >>> pu.as_series(b)
    [array([0., 1., 2.]), array([3., 4., 5.])]
    
    
    >>> pu.as_series((1, np.arange(3), np.arange(2, dtype=np.float16)))
    [array([1.]), array([0., 1., 2.]), array([0., 1.])]
    
    
    >>> pu.as_series([2, [1.1, 0.]])
    [array([2.]), array([1.1])]
    
    
    >>> pu.as_series([2, [1.1, 0.]], trim=False)
    [array([2.]), array([1.1, 0. ])]
    
# numpy.polynomial.polyutils.getdomain
polynomial.polyutils.getdomain(x)[source]
    
Return a domain suitable for given abscissae.
Find a domain suitable for a polynomial or Chebyshev series defined at the values supplied.
Parameters:
    
xarray_like
    
1-d array of abscissae whose domain will be determined.
Returns:
    
domainndarray
    
1-d array containing two values. If the inputs are complex, then the two returned points are the lower left and upper right corners of the smallest rectangle (aligned with the axes) in the complex plane containing the points `x`. If the inputs are real, then the two points are the ends of the smallest interval containing the points `x`.
See also
`mapparms`, `mapdomain`
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial import polyutils as pu
    >>> points = np.arange(4)**2 - 5; points
    array([-5, -4, -1,  4])
    >>> pu.getdomain(points)
    array([-5.,  4.])
    >>> c = np.exp(complex(0,1)*np.pi*np.arange(12)/6) # unit circle
    >>> pu.getdomain(c)
    array([-1.-1.j,  1.+1.j])
    
# numpy.polynomial.polyutils.mapdomain
polynomial.polyutils.mapdomain(x, old, new)[source]
    
Apply linear map to input points.
The linear map `offset + scale*x` that maps the domain `old` to the domain `new` is applied to the points `x`.
Parameters:
    
xarray_like
    
Points to be mapped. If `x` is a subtype of ndarray the subtype will be preserved.
old, newarray_like
    
The two domains that determine the map. Each must (successfully) convert to 1-d arrays containing precisely two values.
Returns:
    
x_outndarray
    
Array of points of the same shape as `x`, after application of the linear map between the two domains.
See also
`getdomain`, `mapparms`
#### Notes
Effectively, this implements:
\\[x\\_out = new[0] + m(x - old[0])\\]
where
\\[m = \frac{new[1]-new[0]}{old[1]-old[0]}\\]
#### Examples
    
    >>> import numpy as np
    >>> from numpy.polynomial import polyutils as pu
    >>> old_domain = (-1,1)
    >>> new_domain = (0,2*np.pi)
    >>> x = np.linspace(-1,1,6); x
    array([-1. , -0.6, -0.2,  0.2,  0.6,  1. ])
    >>> x_out = pu.mapdomain(x, old_domain, new_domain); x_out
    array([ 0.        ,  1.25663706,  2.51327412,  3.76991118,  5.02654825, # may vary
            6.28318531])
    >>> x - pu.mapdomain(x_out, new_domain, old_domain)
    array([0., 0., 0., 0., 0., 0.])
    
Also works for complex numbers (and thus can be used to map any line in the complex plane to any other line therein).
    
    >>> i = complex(0,1)
    >>> old = (-1 - i, 1 + i)
    >>> new = (-1 + i, 1 - i)
    >>> z = np.linspace(old[0], old[1], 6); z
    array([-1. -1.j , -0.6-0.6j, -0.2-0.2j,  0.2+0.2j,  0.6+0.6j,  1. +1.j ])
    >>> new_z = pu.mapdomain(z, old, new); new_z
    array([-1.0+1.j , -0.6+0.6j, -0.2+0.2j,  0.2-0.2j,  0.6-0.6j,  1.0-1.j ]) # may vary
    
# numpy.polynomial.polyutils.mapparms
polynomial.polyutils.mapparms(old, new)[source]
    
Linear map parameters between domains.
Return the parameters of the linear map `offset + scale*x` that maps `old` to `new` such that `old[i] -> new[i]`, `i = 0, 1`.
Parameters:
    
old, newarray_like
    
Domains. Each domain must (successfully) convert to a 1-d array containing precisely two values.
Returns:
    
offset, scalescalars
    
The map `L(x) = offset + scale*x` maps the first domain to the second.
See also
`getdomain`, `mapdomain`
#### Notes
Also works for complex numbers, and thus can be used to calculate the parameters required to map any line in the complex plane to any other line therein.
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.mapparms((-1,1),(-1,1))
    (0.0, 1.0)
    >>> pu.mapparms((1,-1),(-1,1))
    (-0.0, -1.0)
    >>> i = complex(0,1)
    >>> pu.mapparms((-i,-1),(1,i))
    ((1+1j), (1-0j))
    
# numpy.polynomial.polyutils.trimcoef
polynomial.polyutils.trimcoef(c, tol=0)[source]
    
Remove “small” “trailing” coefficients from a polynomial.
“Small” means “small in absolute value” and is controlled by the parameter `tol`; “trailing” means highest order coefficient(s), e.g., in `[0, 1, 1, 0, 0]` (which represents `0 + x + x**2 + 0*x**3 + 0*x**4`) both the 3-rd and 4-th order coefficients would be “trimmed.”
Parameters:
    
carray_like
    
1-d array of coefficients, ordered from lowest order to highest.
tolnumber, optional
    
Trailing (i.e., highest order) elements with absolute value less than or equal to `tol` (default value is zero) are removed.
Returns:
    
trimmedndarray
    
1-d array with trailing zeros removed. If the resulting series would be empty, a series containing a single zero is returned.
Raises:
    
ValueError
    
If `tol` < 0
#### Examples
    
    >>> from numpy.polynomial import polyutils as pu
    >>> pu.trimcoef((0,0,3,0,5,0,0))
    array([0.,  0.,  3.,  0.,  5.])
    >>> pu.trimcoef((0,0,1e-3,0,1e-5,0,0),1e-3) # item == tol is trimmed
    array([0.])
    >>> i = complex(0,1) # works for complex
    >>> pu.trimcoef((3e-4,1e-3*(1-i),5e-4,2e-5*(1+i)), 1e-3)
    array([0.0003+0.j   , 0.001 -0.001j])
    
# numpy.polynomial.polyutils.trimseq
polynomial.polyutils.trimseq(seq)[source]
    
Remove small Poly series coefficients.
Parameters:
    
seqsequence
    
Sequence of Poly series coefficients.
Returns:
    
seriessequence
    
Subsequence with trailing zeros removed. If the resulting sequence would be empty, return the first element. The returned sequence may or may not be a view.
#### Notes
Do not lose the type info if the sequence contains unknown objects.
# numpy.polynomial.set_default_printstyle
polynomial.set_default_printstyle(style)[source]
    
Set the default format for the string representation of polynomials.
Values for `style` must be valid inputs to `__format__`, i.e. ‘ascii’ or ‘unicode’.
Parameters:
    
stylestr
    
Format string for default printing style. Must be either ‘ascii’ or ‘unicode’.
#### Notes
The default format depends on the platform: ‘unicode’ is used on Unix-based systems and ‘ascii’ on Windows. This determination is based on default font support for the unicode superscript and subscript ranges.
#### Examples
    
    >>> p = np.polynomial.Polynomial([1, 2, 3])
    >>> c = np.polynomial.Chebyshev([1, 2, 3])
    >>> np.polynomial.set_default_printstyle('unicode')
    >>> print(p)
    1.0 + 2.0·x + 3.0·x²
    >>> print(c)
    1.0 + 2.0·T₁(x) + 3.0·T₂(x)
    >>> np.polynomial.set_default_printstyle('ascii')
    >>> print(p)
    1.0 + 2.0 x + 3.0 x**2
    >>> print(c)
    1.0 + 2.0 T_1(x) + 3.0 T_2(x)
    >>> # Formatting supersedes all class/package-level defaults
    >>> print(f"{p:unicode}")
    1.0 + 2.0·x + 3.0·x²
    
# numpy.polysub
numpy.polysub(a1, a2)[source]
    
Difference (subtraction) of two polynomials.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
Given two polynomials `a1` and `a2`, returns `a1 - a2`. `a1` and `a2` can be either array_like sequences of the polynomials’ coefficients (including coefficients equal to zero), or `poly1d` objects.
Parameters:
    
a1, a2array_like or poly1d
    
Minuend and subtrahend polynomials, respectively.
Returns:
    
outndarray or poly1d
    
Array or `poly1d` object of the difference polynomial’s coefficients.
See also
`polyval`, `polydiv`, `polymul`, `polyadd`
#### Examples
\\[(2 x^2 + 10 x - 2) - (3 x^2 + 10 x -4) = (-x^2 + 2)\\]
    
    >>> import numpy as np
    
    
    >>> np.polysub([2, 10, -2], [3, 10, -4])
    array([-1,  0,  2])
    
# numpy.polyval
numpy.polyval(p, x)[source]
    
Evaluate a polynomial at specific values.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
If `p` is of length N, this function returns the value:
    
    p[0]*x**(N-1) + p[1]*x**(N-2) + ... + p[N-2]*x + p[N-1]
    
If `x` is a sequence, then `p(x)` is returned for each element of `x`. If `x` is another polynomial then the composite polynomial `p(x(t))` is returned.
Parameters:
    
parray_like or poly1d object
    
1D array of polynomial coefficients (including coefficients equal to zero) from highest degree to the constant term, or an instance of poly1d.
xarray_like or poly1d object
    
A number, an array of numbers, or an instance of poly1d, at which to evaluate `p`.
Returns:
    
valuesndarray or poly1d
    
If `x` is a poly1d instance, the result is the composition of the two polynomials, i.e., `x` is “substituted” in `p` and the simplified result is returned. In addition, the type of `x` \- array_like or poly1d - governs the type of the output: `x` array_like => `values` array_like, `x` a poly1d object => `values` is also.
See also
`poly1d`
    
A polynomial class.
#### Notes
Horner’s scheme [1] is used to evaluate the polynomial. Even so, for polynomials of high degree the values may be inaccurate due to rounding errors. Use carefully.
If `x` is a subtype of `ndarray` the return value will be of the same type.
#### References
[1]
I. N. Bronshtein, K. A. Semendyayev, and K. A. Hirsch (Eng. trans. Ed.), Handbook of Mathematics, New York, Van Nostrand Reinhold Co., 1985, pg. 720.
#### Examples
    
    >>> import numpy as np
    >>> np.polyval([3,0,1], 5)  # 3 * 5**2 + 0 * 5**1 + 1
    76
    >>> np.polyval([3,0,1], np.poly1d(5))
    poly1d([76])
    >>> np.polyval(np.poly1d([3,0,1]), 5)
    76
    >>> np.polyval(np.poly1d([3,0,1]), np.poly1d(5))
    poly1d([76])
    
# numpy.positive
numpy.positive(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'positive'>
    
Numerical positive, element-wise.
Parameters:
    
xarray_like or scalar
    
Input array.
Returns:
    
yndarray or scalar
    
Returned array or scalar: `y = +x`. This is a scalar if `x` is a scalar.
#### Notes
Equivalent to `x.copy()`, but only defined for types that support arithmetic.
#### Examples
    
    >>> import numpy as np
    
    
    >>> x1 = np.array(([1., -1.]))
    >>> np.positive(x1)
    array([ 1., -1.])
    
The unary `+` operator can be used as a shorthand for `np.positive` on ndarrays.
    
    >>> x1 = np.array(([1., -1.]))
    >>> +x1
    array([ 1., -1.])
    
# numpy.pow
numpy.pow(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'power'>
    
First array elements raised to powers from second array, element-wise.
Raise each base in `x1` to the positionally-corresponding power in `x2`. `x1` and `x2` must be broadcastable to the same shape.
An integer type raised to a negative integer power will raise a `ValueError`.
Negative values raised to a non-integral value will return `nan`. To get complex results, cast the input to complex, or specify the `dtype` to be `complex` (see the example below).
Parameters:
    
x1array_like
    
The bases.
x2array_like
    
The exponents. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The bases in `x1` raised to the exponents in `x2`. This is a scalar if both `x1` and `x2` are scalars.
See also
`float_power`
    
power function that promotes integers to float
#### Examples
    
    >>> import numpy as np
    
Cube each element in an array.
    
    >>> x1 = np.arange(6)
    >>> x1
    [0, 1, 2, 3, 4, 5]
    >>> np.power(x1, 3)
    array([  0,   1,   8,  27,  64, 125])
    
Raise the bases to different exponents.
    
    >>> x2 = [1.0, 2.0, 3.0, 3.0, 2.0, 1.0]
    >>> np.power(x1, x2)
    array([  0.,   1.,   8.,  27.,  16.,   5.])
    
The effect of broadcasting.
    
    >>> x2 = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]])
    >>> x2
    array([[1, 2, 3, 3, 2, 1],
           [1, 2, 3, 3, 2, 1]])
    >>> np.power(x1, x2)
    array([[ 0,  1,  8, 27, 16,  5],
           [ 0,  1,  8, 27, 16,  5]])
    
The `**` operator can be used as a shorthand for `np.power` on ndarrays.
    
    >>> x2 = np.array([1, 2, 3, 3, 2, 1])
    >>> x1 = np.arange(6)
    >>> x1 ** x2
    array([ 0,  1,  8, 27, 16,  5])
    
Negative values raised to a non-integral value will result in `nan` (and a warning will be generated).
    
    >>> x3 = np.array([-1.0, -4.0])
    >>> with np.errstate(invalid='ignore'):
    ...     p = np.power(x3, 1.5)
    ...
    >>> p
    array([nan, nan])
    
To get complex results, give the argument `dtype=complex`.
    
    >>> np.power(x3, 1.5, dtype=complex)
    array([-1.83697020e-16-1.j, -1.46957616e-15-8.j])
    
# numpy.power
numpy.power(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'power'>
    
First array elements raised to powers from second array, element-wise.
Raise each base in `x1` to the positionally-corresponding power in `x2`. `x1` and `x2` must be broadcastable to the same shape.
An integer type raised to a negative integer power will raise a `ValueError`.
Negative values raised to a non-integral value will return `nan`. To get complex results, cast the input to complex, or specify the `dtype` to be `complex` (see the example below).
Parameters:
    
x1array_like
    
The bases.
x2array_like
    
The exponents. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The bases in `x1` raised to the exponents in `x2`. This is a scalar if both `x1` and `x2` are scalars.
See also
`float_power`
    
power function that promotes integers to float
#### Examples
    
    >>> import numpy as np
    
Cube each element in an array.
    
    >>> x1 = np.arange(6)
    >>> x1
    [0, 1, 2, 3, 4, 5]
    >>> np.power(x1, 3)
    array([  0,   1,   8,  27,  64, 125])
    
Raise the bases to different exponents.
    
    >>> x2 = [1.0, 2.0, 3.0, 3.0, 2.0, 1.0]
    >>> np.power(x1, x2)
    array([  0.,   1.,   8.,  27.,  16.,   5.])
    
The effect of broadcasting.
    
    >>> x2 = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]])
    >>> x2
    array([[1, 2, 3, 3, 2, 1],
           [1, 2, 3, 3, 2, 1]])
    >>> np.power(x1, x2)
    array([[ 0,  1,  8, 27, 16,  5],
           [ 0,  1,  8, 27, 16,  5]])
    
The `**` operator can be used as a shorthand for `np.power` on ndarrays.
    
    >>> x2 = np.array([1, 2, 3, 3, 2, 1])
    >>> x1 = np.arange(6)
    >>> x1 ** x2
    array([ 0,  1,  8, 27, 16,  5])
    
Negative values raised to a non-integral value will result in `nan` (and a warning will be generated).
    
    >>> x3 = np.array([-1.0, -4.0])
    >>> with np.errstate(invalid='ignore'):
    ...     p = np.power(x3, 1.5)
    ...
    >>> p
    array([nan, nan])
    
To get complex results, give the argument `dtype=complex`.
    
    >>> np.power(x3, 1.5, dtype=complex)
    array([-1.83697020e-16-1.j, -1.46957616e-15-8.j])
    
# numpy.printoptions
numpy.printoptions(*args, **kwargs)[source]
    
Context manager for setting print options.
Set print options for the scope of the `with` block, and restore the old options at the end. See `set_printoptions` for the full description of available options.
See also
`set_printoptions`, `get_printoptions`
#### Examples
    
    >>> import numpy as np
    
    
    >>> from numpy.testing import assert_equal
    >>> with np.printoptions(precision=2):
    ...     np.array([2.0]) / 3
    array([0.67])
    
The `as`-clause of the `with`-statement gives the current print options:
    
    >>> with np.printoptions(precision=2) as opts:
    ...      assert_equal(opts, np.get_printoptions())
    
# numpy.prod
numpy.prod(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Return the product of array elements over a given axis.
Parameters:
    
aarray_like
    
Input data.
axisNone or int or tuple of ints, optional
    
Axis or axes along which a product is performed. The default, axis=None, will calculate the product of all the elements in the input array. If axis is negative it counts from the last to the first axis.
If axis is a tuple of ints, a product is performed on all of the axes specified in the tuple instead of a single axis or all the axes as before.
dtypedtype, optional
    
The type of the returned array, as well as of the accumulator in which the elements are multiplied. The dtype of `a` is used by default unless `a` has an integer dtype of less precision than the default platform integer. In that case, if `a` is signed then the platform integer is used while if `a` is unsigned then an unsigned integer of the same precision as the platform integer is used.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape as the expected output, but the type of the output values will be cast if necessary.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `prod` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
The starting value for this product. See `reduce` for details.
wherearray_like of bool, optional
    
Elements to include in the product. See `reduce` for details.
Returns:
    
product_along_axisndarray, see `dtype` parameter above.
    
An array shaped as `a` but with the specified axis removed. Returns a reference to `out` if specified.
See also
`ndarray.prod`
    
equivalent method
Output type determination
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow. That means that, on a 32-bit platform:
    
    >>> x = np.array([536870910, 536870910, 536870910, 536870910])
    >>> np.prod(x)
    16 # may vary
    
The product of an empty array is the neutral element 1:
    
    >>> np.prod([])
    1.0
    
#### Examples
By default, calculate the product of all elements:
    
    >>> import numpy as np
    >>> np.prod([1.,2.])
    2.0
    
Even when the input array is two-dimensional:
    
    >>> a = np.array([[1., 2.], [3., 4.]])
    >>> np.prod(a)
    24.0
    
But we can also specify the axis over which to multiply:
    
    >>> np.prod(a, axis=1)
    array([  2.,  12.])
    >>> np.prod(a, axis=0)
    array([3., 8.])
    
Or select specific elements to include:
    
    >>> np.prod([1., np.nan, 3.], where=[True, False, True])
    3.0
    
If the type of `x` is unsigned, then the output type is the unsigned platform integer:
    
    >>> x = np.array([1, 2, 3], dtype=np.uint8)
    >>> np.prod(x).dtype == np.uint
    True
    
If `x` is of a signed integer type, then the output type is the default platform integer:
    
    >>> x = np.array([1, 2, 3], dtype=np.int8)
    >>> np.prod(x).dtype == int
    True
    
You can also start the product with a value other than one:
    
    >>> np.prod([1, 2], initial=5)
    10
    
# numpy.promote_types
numpy.promote_types(type1, type2)
    
Returns the data type with the smallest size and smallest scalar kind to which both `type1` and `type2` may be safely cast. The returned data type is always considered “canonical”, this mainly means that the promoted dtype will always be in native byte order.
This function is symmetric, but rarely associative.
Parameters:
    
type1dtype or dtype specifier
    
First data type.
type2dtype or dtype specifier
    
Second data type.
Returns:
    
outdtype
    
The promoted data type.
See also
`result_type`, `dtype`, `can_cast`
#### Notes
Please see `numpy.result_type` for additional information about promotion.
Starting in NumPy 1.9, promote_types function now returns a valid string length when given an integer or float dtype as one argument and a string dtype as another argument. Previously it always returned the input string dtype, even if it wasn’t long enough to store the max integer/float value converted to a string.
Changed in version 1.23.0.
NumPy now supports promotion for more structured dtypes. It will now remove unnecessary padding from a structure dtype and promote included fields individually.
#### Examples
    
    >>> import numpy as np
    >>> np.promote_types('f4', 'f8')
    dtype('float64')
    
    
    >>> np.promote_types('i8', 'f4')
    dtype('float64')
    
    
    >>> np.promote_types('>i8', '<c8')
    dtype('complex128')
    
    
    >>> np.promote_types('i4', 'S8')
    dtype('S11')
    
An example of a non-associative case:
    
    >>> p = np.promote_types
    >>> p('S', p('i1', 'u1'))
    dtype('S6')
    >>> p(p('S', 'i1'), 'u1')
    dtype('S4')
    
# numpy.ptp
numpy.ptp(a, axis=None, out=None, keepdims=<no value>)[source]
    
Range of values (maximum - minimum) along an axis.
The name of the function comes from the acronym for ‘peak to peak’.
Warning
`ptp` preserves the data type of the array. This means the return value for an input of signed integers with n bits (e.g. `numpy.int8`, `numpy.int16`, etc) is also a signed integer with n bits. In that case, peak-to-peak values greater than `2**(n-1)-1` will be returned as negative values. An example with a work-around is shown below.
Parameters:
    
aarray_like
    
Input values.
axisNone or int or tuple of ints, optional
    
Axis along which to find the peaks. By default, flatten the array. `axis` may be negative, in which case it counts from the last to the first axis. If this is a tuple of ints, a reduction is performed on multiple axes, instead of a single axis or all the axes as before.
outarray_like
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type of the output values will be cast if necessary.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `ptp` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
Returns:
    
ptpndarray or scalar
    
The range of a given array - `scalar` if array is one-dimensional or a new array holding the result along the given axis
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[4, 9, 2, 10],
    ...               [6, 9, 7, 12]])
    
    
    >>> np.ptp(x, axis=1)
    array([8, 6])
    
    
    >>> np.ptp(x, axis=0)
    array([2, 0, 5, 2])
    
    
    >>> np.ptp(x)
    10
    
This example shows that a negative value can be returned when the input is an array of signed integers.
    
    >>> y = np.array([[1, 127],
    ...               [0, 127],
    ...               [-1, 127],
    ...               [-2, 127]], dtype=np.int8)
    >>> np.ptp(y, axis=1)
    array([ 126,  127, -128, -127], dtype=int8)
    
A work-around is to use the `view()` method to view the result as unsigned integers with the same bit width:
    
    >>> np.ptp(y, axis=1).view(np.uint8)
    array([126, 127, 128, 129], dtype=uint8)
    
# numpy.put
numpy.put(a, ind, v, mode='raise')[source]
    
Replaces specified elements of an array with given values.
The indexing works on the flattened target array. `put` is roughly equivalent to:
    
    a.flat[ind] = v
    
Parameters:
    
andarray
    
Target array.
indarray_like
    
Target indices, interpreted as integers.
varray_like
    
Values to place in `a` at target indices. If `v` is shorter than `ind` it will be repeated as necessary.
mode{‘raise’, ‘wrap’, ‘clip’}, optional
    
Specifies how out-of-bounds indices will behave.
  * ‘raise’ – raise an error (default)
  * ‘wrap’ – wrap around
  * ‘clip’ – clip to the range


‘clip’ mode means that all indices that are too large are replaced by the index that addresses the last element along that axis. Note that this disables indexing with negative numbers. In ‘raise’ mode, if an exception occurs the target array may still be modified.
See also
`putmask`, `place`
`put_along_axis`
    
Put elements by matching the array and the index arrays
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(5)
    >>> np.put(a, [0, 2], [-44, -55])
    >>> a
    array([-44,   1, -55,   3,   4])
    
    
    >>> a = np.arange(5)
    >>> np.put(a, 22, -5, mode='clip')
    >>> a
    array([ 0,  1,  2,  3, -5])
    
# numpy.put_along_axis
numpy.put_along_axis(arr, indices, values, axis)[source]
    
Put values into the destination array by matching 1d index and data slices.
This iterates over matching 1d slices oriented along the specified axis in the index and data arrays, and uses the former to place values into the latter. These slices can be different lengths.
Functions returning an index along an axis, like `argsort` and `argpartition`, produce suitable indices for this function.
Parameters:
    
arrndarray (Ni…, M, Nk…)
    
Destination array.
indicesndarray (Ni…, J, Nk…)
    
Indices to change along each 1d slice of `arr`. This must match the dimension of arr, but dimensions in Ni and Nj may be 1 to broadcast against `arr`.
valuesarray_like (Ni…, J, Nk…)
    
values to insert at those indices. Its shape and dimension are broadcast to match that of `indices`.
axisint
    
The axis to take 1d slices along. If axis is None, the destination array is treated as if a flattened 1d view had been created of it.
See also
`take_along_axis`
    
Take values from the input array by matching 1d index and data slices
#### Notes
This is equivalent to (but faster than) the following use of `ndindex` and `s_`, which sets each of `ii` and `kk` to a tuple of indices:
    
    Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
    J = indices.shape[axis]  # Need not equal M
    
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            a_1d       = a      [ii + s_[:,] + kk]
            indices_1d = indices[ii + s_[:,] + kk]
            values_1d  = values [ii + s_[:,] + kk]
            for j in range(J):
                a_1d[indices_1d[j]] = values_1d[j]
    
Equivalently, eliminating the inner loop, the last two lines would be:
    
    a_1d[indices_1d] = values_1d
    
#### Examples
    
    >>> import numpy as np
    
For this sample array
    
    >>> a = np.array([[10, 30, 20], [60, 40, 50]])
    
We can replace the maximum values with:
    
    >>> ai = np.argmax(a, axis=1, keepdims=True)
    >>> ai
    array([[1],
           [0]])
    >>> np.put_along_axis(a, ai, 99, axis=1)
    >>> a
    array([[10, 99, 20],
           [99, 40, 50]])
    
# numpy.putmask
numpy.putmask(a, mask, values)
    
Changes elements of an array based on conditional and input values.
Sets `a.flat[n] = values[n]` for each n where `mask.flat[n]==True`.
If `values` is not the same size as `a` and `mask` then it will repeat. This gives behavior different from `a[mask] = values`.
Parameters:
    
andarray
    
Target array.
maskarray_like
    
Boolean mask array. It has to be the same shape as `a`.
valuesarray_like
    
Values to put into `a` where `mask` is True. If `values` is smaller than `a` it will be repeated.
See also
`place`, `put`, `take`, `copyto`
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6).reshape(2, 3)
    >>> np.putmask(x, x>2, x**2)
    >>> x
    array([[ 0,  1,  2],
           [ 9, 16, 25]])
    
If `values` is smaller than `a` it is repeated:
    
    >>> x = np.arange(5)
    >>> np.putmask(x, x>1, [-33, -44])
    >>> x
    array([  0,   1, -33, -44, -33])
    
# numpy.quantile
numpy.quantile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=False, *, weights=None, interpolation=None)[source]
    
Compute the q-th quantile of the data along the specified axis.
Parameters:
    
aarray_like of real numbers
    
Input array or object that can be converted to an array.
qarray_like of float
    
Probability or sequence of probabilities of the quantiles to compute. Values must be between 0 and 1 inclusive.
axis{int, tuple of int, None}, optional
    
Axis or axes along which the quantiles are computed. The default is to compute the quantile(s) along a flattened version of the array.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary.
overwrite_inputbool, optional
    
If True, then allow the input array `a` to be modified by intermediate calculations, to save memory. In this case, the contents of the input `a` after this function completes is undefined.
methodstr, optional
    
This parameter specifies the method to use for estimating the quantile. There are many different methods, some unique to NumPy. The recommended options, numbered as they appear in [1], are:
  1. ‘inverted_cdf’
  2. ‘averaged_inverted_cdf’
  3. ‘closest_observation’
  4. ‘interpolated_inverted_cdf’
  5. ‘hazen’
  6. ‘weibull’
  7. ‘linear’ (default)
  8. ‘median_unbiased’
  9. ‘normal_unbiased’


The first three methods are discontinuous. For backward compatibility with previous versions of NumPy, the following discontinuous variations of the default ‘linear’ (7.) option are available:
  * ‘lower’
  * ‘higher’,
  * ‘midpoint’
  * ‘nearest’


See Notes for details.
Changed in version 1.22.0: This argument was previously called “interpolation” and only offered the “linear” default and last four options.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original array `a`.
weightsarray_like, optional
    
An array of weights associated with the values in `a`. Each value in `a` contributes to the quantile according to its associated weight. The weights array can either be 1-D (in which case its length must be the size of `a` along the given axis) or of the same shape as `a`. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. Only `method=”inverted_cdf”` supports weights. See the notes for more details.
New in version 2.0.0.
interpolationstr, optional
    
Deprecated name for the method keyword argument.
Deprecated since version 1.22.0.
Returns:
    
quantilescalar or ndarray
    
If `q` is a single probability and `axis=None`, then the result is a scalar. If multiple probability levels are given, first axis of the result corresponds to the quantiles. The other axes are the axes that remain after the reduction of `a`. If the input contains integers or floats smaller than `float64`, the output data-type is `float64`. Otherwise, the output data-type is the same as that of the input. If `out` is specified, that array is returned instead.
See also
`mean`
`percentile`
    
equivalent to quantile, but with q in the range [0, 100].
`median`
    
equivalent to `quantile(..., 0.5)`
`nanquantile`
#### Notes
Given a sample `a` from an underlying distribution, `quantile` provides a nonparametric estimate of the inverse cumulative distribution function.
By default, this is done by interpolating between adjacent elements in `y`, a sorted copy of `a`:
    
    (1-g)*y[j] + g*y[j+1]
    
where the index `j` and coefficient `g` are the integral and fractional components of `q * (n-1)`, and `n` is the number of elements in the sample.
This is a special case of Equation 1 of H&F [1]. More generally,
  * `j = (q*n + m - 1) // 1`, and
  * `g = (q*n + m - 1) % 1`,


where `m` may be defined according to several different conventions. The preferred convention may be selected using the `method` parameter:
`method`
number in H&F
`m`  
`interpolated_inverted_cdf`
4
`0`  
`hazen`
5
`1/2`  
`weibull`
6
`q`  
`linear` (default)
7
`1 - q`  
`median_unbiased`
8
`q/3 + 1/3`  
`normal_unbiased`
9
`q/4 + 3/8`  
Note that indices `j` and `j + 1` are clipped to the range `0` to `n - 1` when the results of the formula would be outside the allowed range of non-negative indices. The `- 1` in the formulas for `j` and `g` accounts for Python’s 0-based indexing.
The table above includes only the estimators from H&F that are continuous functions of probability `q` (estimators 4-9). NumPy also provides the three discontinuous estimators from H&F (estimators 1-3), where `j` is defined as above, `m` is defined as follows, and `g` is a function of the real-valued `index = q*n + m - 1` and `j`.
  1. `inverted_cdf`: `m = 0` and `g = int(index - j > 0)`
  2. `averaged_inverted_cdf`: `m = 0` and `g = (1 + int(index - j > 0)) / 2`
  3. `closest_observation`: `m = -1/2` and `g = 1 - int((index == j) & (j%2 == 1))`


For backward compatibility with previous versions of NumPy, `quantile` provides four additional discontinuous estimators. Like `method='linear'`, all have `m = 1 - q` so that `j = q*(n-1) // 1`, but `g` is defined as follows.
  * `lower`: `g = 0`
  * `midpoint`: `g = 0.5`
  * `higher`: `g = 1`
  * `nearest`: `g = (q*(n-1) % 1) > 0.5`


Weighted quantiles: More formally, the quantile at probability level \\(q\\) of a cumulative distribution function \\(F(y)=P(Y \leq y)\\) with probability measure \\(P\\) is defined as any number \\(x\\) that fulfills the coverage conditions
\\[P(Y < x) \leq q \quad\text{and}\quad P(Y \leq x) \geq q\\]
with random variable \\(Y\sim P\\). Sample quantiles, the result of `quantile`, provide nonparametric estimation of the underlying population counterparts, represented by the unknown \\(F\\), given a data vector `a` of length `n`.
Some of the estimators above arise when one considers \\(F\\) as the empirical distribution function of the data, i.e. \\(F(y) = \frac{1}{n} \sum_i 1_{a_i \leq y}\\). Then, different methods correspond to different choices of \\(x\\) that fulfill the above coverage conditions. Methods that follow this approach are `inverted_cdf` and `averaged_inverted_cdf`.
For weighted quantiles, the coverage conditions still hold. The empirical cumulative distribution is simply replaced by its weighted version, i.e. \\(P(Y \leq t) = \frac{1}{\sum_i w_i} \sum_i w_i 1_{x_i \leq t}\\). Only `method="inverted_cdf"` supports weights.
#### References
[1] (1,2)
R. J. Hyndman and Y. Fan, “Sample quantiles in statistical packages,” The American Statistician, 50(4), pp. 361-365, 1996
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[10, 7, 4], [3, 2, 1]])
    >>> a
    array([[10,  7,  4],
           [ 3,  2,  1]])
    >>> np.quantile(a, 0.5)
    3.5
    >>> np.quantile(a, 0.5, axis=0)
    array([6.5, 4.5, 2.5])
    >>> np.quantile(a, 0.5, axis=1)
    array([7.,  2.])
    >>> np.quantile(a, 0.5, axis=1, keepdims=True)
    array([[7.],
           [2.]])
    >>> m = np.quantile(a, 0.5, axis=0)
    >>> out = np.zeros_like(m)
    >>> np.quantile(a, 0.5, axis=0, out=out)
    array([6.5, 4.5, 2.5])
    >>> m
    array([6.5, 4.5, 2.5])
    >>> b = a.copy()
    >>> np.quantile(b, 0.5, axis=1, overwrite_input=True)
    array([7.,  2.])
    >>> assert not np.all(a == b)
    
See also `numpy.percentile` for a visualization of most methods.
# numpy.r_
numpy.r_=<numpy.lib._index_tricks_impl.RClass object>
    
Translates slice objects to concatenation along the first axis.
This is a simple way to build up arrays quickly. There are two use cases.
  1. If the index expression contains comma separated arrays, then stack them along their first axis.
  2. If the index expression contains slice notation or scalars then create a 1-D array with a range indicated by the slice notation.


If slice notation is used, the syntax `start:stop:step` is equivalent to `np.arange(start, stop, step)` inside of the brackets. However, if `step` is an imaginary number (i.e. 100j) then its integer portion is interpreted as a number-of-points desired and the start and stop are inclusive. In other words `start:stop:stepj` is interpreted as `np.linspace(start, stop, step, endpoint=1)` inside of the brackets. After expansion of slice notation, all comma separated sequences are concatenated together.
Optional character strings placed as the first element of the index expression can be used to change the output. The strings ‘r’ or ‘c’ result in matrix output. If the result is 1-D and ‘r’ is specified a 1 x N (row) matrix is produced. If the result is 1-D and ‘c’ is specified, then a N x 1 (column) matrix is produced. If the result is 2-D then both provide the same matrix result.
A string integer specifies which axis to stack multiple comma separated arrays along. A string of two comma-separated integers allows indication of the minimum number of dimensions to force each entry into as the second integer (the axis to concatenate along is still the first integer).
A string with three comma-separated integers allows specification of the axis to concatenate along, the minimum number of dimensions to force the entries to, and which axis should contain the start of the arrays which are less than the specified number of dimensions. In other words the third integer allows you to specify where the 1’s should be placed in the shape of the arrays that have their shapes upgraded. By default, they are placed in the front of the shape tuple. The third argument allows you to specify where the start of the array should be instead. Thus, a third argument of ‘0’ would place the 1’s at the end of the array shape. Negative integers specify where in the new shape tuple the last dimension of upgraded arrays should be placed, so the default is ‘-1’.
Parameters:
    
Not a function, so takes no parameters
Returns:
    
A concatenated ndarray or matrix.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`c_`
    
Translates slice objects to concatenation along the second axis.
#### Examples
    
    >>> import numpy as np
    >>> np.r_[np.array([1,2,3]), 0, 0, np.array([4,5,6])]
    array([1, 2, 3, ..., 4, 5, 6])
    >>> np.r_[-1:1:6j, [0]*3, 5, 6]
    array([-1. , -0.6, -0.2,  0.2,  0.6,  1. ,  0. ,  0. ,  0. ,  5. ,  6. ])
    
String integers specify the axis to concatenate along or the minimum number of dimensions to force entries into.
    
    >>> a = np.array([[0, 1, 2], [3, 4, 5]])
    >>> np.r_['-1', a, a] # concatenate along last axis
    array([[0, 1, 2, 0, 1, 2],
           [3, 4, 5, 3, 4, 5]])
    >>> np.r_['0,2', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=2
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> np.r_['0,2,0', [1,2,3], [4,5,6]]
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6]])
    >>> np.r_['1,2,0', [1,2,3], [4,5,6]]
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
Using ‘r’ or ‘c’ as a first string argument creates a matrix.
    
    >>> np.r_['r',[1,2,3], [4,5,6]]
    matrix([[1, 2, 3, 4, 5, 6]])
    
# numpy.rad2deg
numpy.rad2deg(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'rad2deg'>
    
Convert angles from radians to degrees.
Parameters:
    
xarray_like
    
Angle in radians.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding angle in degrees. This is a scalar if `x` is a scalar.
See also
`deg2rad`
    
Convert angles from degrees to radians.
`unwrap`
    
Remove large jumps in angle by wrapping.
#### Notes
rad2deg(x) is `180 * x / pi`.
#### Examples
    
    >>> import numpy as np
    >>> np.rad2deg(np.pi/2)
    90.0
    
# numpy.radians
numpy.radians(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'radians'>
    
Convert angles from degrees to radians.
Parameters:
    
xarray_like
    
Input array in degrees.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding radian values. This is a scalar if `x` is a scalar.
See also
`deg2rad`
    
equivalent function
#### Examples
    
    >>> import numpy as np
    
Convert a degree array to radians
    
    >>> deg = np.arange(12.) * 30.
    >>> np.radians(deg)
    array([ 0.        ,  0.52359878,  1.04719755,  1.57079633,  2.0943951 ,
            2.61799388,  3.14159265,  3.66519143,  4.1887902 ,  4.71238898,
            5.23598776,  5.75958653])
    
    
    >>> out = np.zeros((deg.shape))
    >>> ret = np.radians(deg, out)
    >>> ret is out
    True
    
# numpy.ravel
numpy.ravel(a, order='C')[source]
    
Return a contiguous flattened array.
A 1-D array, containing the elements of the input, is returned. A copy is made only if needed.
As of NumPy 1.10, the returned array will have the same type as the input array. (for example, a masked array will be returned for a masked array input)
Parameters:
    
aarray_like
    
Input array. The elements in `a` are read in the order specified by `order`, and packed as a 1-D array.
order{‘C’,’F’, ‘A’, ‘K’}, optional
    
The elements of `a` are read using this index order. ‘C’ means to index the elements in row-major, C-style order, with the last axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to index the elements in column-major, Fortran-style order, with the first index changing fastest, and the last index changing slowest. Note that the ‘C’ and ‘F’ options take no account of the memory layout of the underlying array, and only refer to the order of axis indexing. ‘A’ means to read the elements in Fortran-like index order if `a` is Fortran contiguous in memory, C-like order otherwise. ‘K’ means to read the elements in the order they occur in memory, except for reversing the data when strides are negative. By default, ‘C’ index order is used.
Returns:
    
yarray_like
    
y is a contiguous 1-D array of the same subtype as `a`, with shape `(a.size,)`. Note that matrices are special cased for backward compatibility, if `a` is a matrix, then y is a 1-D ndarray.
See also
`ndarray.flat`
    
1-D iterator over an array.
`ndarray.flatten`
    
1-D array copy of the elements of an array in row-major order.
`ndarray.reshape`
    
Change the shape of an array without changing its data.
#### Notes
In row-major, C-style order, in two dimensions, the row index varies the slowest, and the column index the quickest. This can be generalized to multiple dimensions, where row-major order implies that the index along the first axis varies slowest, and the index along the last quickest. The opposite holds for column-major, Fortran-style index ordering.
When a view is desired in as many cases as possible, `arr.reshape(-1)` may be preferable. However, `ravel` supports `K` in the optional `order` argument while `reshape` does not.
#### Examples
It is equivalent to `reshape(-1, order=order)`.
    
    >>> import numpy as np
    >>> x = np.array([[1, 2, 3], [4, 5, 6]])
    >>> np.ravel(x)
    array([1, 2, 3, 4, 5, 6])
    
    
    >>> x.reshape(-1)
    array([1, 2, 3, 4, 5, 6])
    
    
    >>> np.ravel(x, order='F')
    array([1, 4, 2, 5, 3, 6])
    
When `order` is ‘A’, it will preserve the array’s ‘C’ or ‘F’ ordering:
    
    >>> np.ravel(x.T)
    array([1, 4, 2, 5, 3, 6])
    >>> np.ravel(x.T, order='A')
    array([1, 2, 3, 4, 5, 6])
    
When `order` is ‘K’, it will preserve orderings that are neither ‘C’ nor ‘F’, but won’t reverse axes:
    
    >>> a = np.arange(3)[::-1]; a
    array([2, 1, 0])
    >>> a.ravel(order='C')
    array([2, 1, 0])
    >>> a.ravel(order='K')
    array([2, 1, 0])
    
    
    >>> a = np.arange(12).reshape(2,3,2).swapaxes(1,2); a
    array([[[ 0,  2,  4],
            [ 1,  3,  5]],
           [[ 6,  8, 10],
            [ 7,  9, 11]]])
    >>> a.ravel(order='C')
    array([ 0,  2,  4,  1,  3,  5,  6,  8, 10,  7,  9, 11])
    >>> a.ravel(order='K')
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    
# numpy.ravel_multi_index
numpy.ravel_multi_index(multi_index, dims, mode='raise', order='C')
    
Converts a tuple of index arrays into an array of flat indices, applying boundary modes to the multi-index.
Parameters:
    
multi_indextuple of array_like
    
A tuple of integer arrays, one array for each dimension.
dimstuple of ints
    
The shape of array into which the indices from `multi_index` apply.
mode{‘raise’, ‘wrap’, ‘clip’}, optional
    
Specifies how out-of-bounds indices are handled. Can specify either one mode or a tuple of modes, one mode per index.
  * ‘raise’ – raise an error (default)
  * ‘wrap’ – wrap around
  * ‘clip’ – clip to the range


In ‘clip’ mode, a negative index which would normally wrap will clip to 0 instead.
order{‘C’, ‘F’}, optional
    
Determines whether the multi-index should be viewed as indexing in row-major (C-style) or column-major (Fortran-style) order.
Returns:
    
raveled_indicesndarray
    
An array of indices into the flattened version of an array of dimensions `dims`.
See also
`unravel_index`
#### Examples
    
    >>> import numpy as np
    >>> arr = np.array([[3,6,6],[4,5,1]])
    >>> np.ravel_multi_index(arr, (7,6))
    array([22, 41, 37])
    >>> np.ravel_multi_index(arr, (7,6), order='F')
    array([31, 41, 13])
    >>> np.ravel_multi_index(arr, (4,6), mode='clip')
    array([22, 23, 19])
    >>> np.ravel_multi_index(arr, (4,4), mode=('clip','wrap'))
    array([12, 13, 13])
    
    
    >>> np.ravel_multi_index((3,1,4,1), (6,7,8,9))
    1621
    
# numpy.real
numpy.real(val)[source]
    
Return the real part of the complex argument.
Parameters:
    
valarray_like
    
Input array.
Returns:
    
outndarray or scalar
    
The real component of the complex argument. If `val` is real, the type of `val` is used for the output. If `val` has complex elements, the returned type is float.
See also
`real_if_close`, `imag`, `angle`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1+2j, 3+4j, 5+6j])
    >>> a.real
    array([1.,  3.,  5.])
    >>> a.real = 9
    >>> a
    array([9.+2.j,  9.+4.j,  9.+6.j])
    >>> a.real = np.array([9, 8, 7])
    >>> a
    array([9.+2.j,  8.+4.j,  7.+6.j])
    >>> np.real(1 + 1j)
    1.0
    
# numpy.real_if_close
numpy.real_if_close(a, tol=100)[source]
    
If input is complex with all imaginary parts close to zero, return real parts.
“Close to zero” is defined as `tol` * (machine epsilon of the type for `a`).
Parameters:
    
aarray_like
    
Input array.
tolfloat
    
Tolerance in machine epsilons for the complex part of the elements in the array. If the tolerance is <=1, then the absolute tolerance is used.
Returns:
    
outndarray
    
If `a` is real, the type of `a` is used for the output. If `a` has complex elements, the returned type is float.
See also
`real`, `imag`, `angle`
#### Notes
Machine epsilon varies from machine to machine and between data types but Python floats on most platforms have a machine epsilon equal to 2.2204460492503131e-16. You can use ‘np.finfo(float).eps’ to print out the machine epsilon for floats.
#### Examples
    
    >>> import numpy as np
    >>> np.finfo(float).eps
    2.2204460492503131e-16 # may vary
    
    
    >>> np.real_if_close([2.1 + 4e-14j, 5.2 + 3e-15j], tol=1000)
    array([2.1, 5.2])
    >>> np.real_if_close([2.1 + 4e-13j, 5.2 + 3e-15j], tol=1000)
    array([2.1+4.e-13j, 5.2 + 3e-15j])
    
# numpy.rec.array
rec.array(obj, dtype=None, shape=None, offset=0, strides=None, formats=None, names=None, titles=None, aligned=False, byteorder=None, copy=True)[source]
    
Construct a record array from a wide-variety of objects.
A general-purpose record array constructor that dispatches to the appropriate `recarray` creation function based on the inputs (see Notes).
Parameters:
    
objany
    
Input object. See Notes for details on how various input types are treated.
dtypedata-type, optional
    
Valid dtype for array.
shapeint or tuple of ints, optional
    
Shape of each array.
offsetint, optional
    
Position in the file or buffer to start reading from.
stridestuple of ints, optional
    
Buffer (`buf`) is interpreted according to these strides (strides define how many bytes each array element, row, column, etc. occupy in memory).
formats, names, titles, aligned, byteorder
    
If `dtype` is `None`, these arguments are passed to `numpy.format_parser` to construct a dtype. See that function for detailed documentation.
copybool, optional
    
Whether to copy the input object (True), or to use a reference instead. This option only applies when the input is an ndarray or recarray. Defaults to True.
Returns:
    
np.recarray
    
Record array created from the specified object.
#### Notes
If `obj` is `None`, then call the `recarray` constructor. If `obj` is a string, then call the `fromstring` constructor. If `obj` is a list or a tuple, then if the first object is an `ndarray`, call `fromarrays`, otherwise call `fromrecords`. If `obj` is a `recarray`, then make a copy of the data in the recarray (if `copy=True`) and use the new formats, names, and titles. If `obj` is a file, then call `fromfile`. Finally, if obj is an `ndarray`, then return `obj.view(recarray)`, making a copy of the data if `copy=True`.
#### Examples
    
    >>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    
    >>> np.rec.array(a)
    rec.array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]],
              dtype=int64)
    
    
    >>> b = [(1, 1), (2, 4), (3, 9)]
    >>> c = np.rec.array(b, formats = ['i2', 'f2'], names = ('x', 'y'))
    >>> c
    rec.array([(1, 1.), (2, 4.), (3, 9.)],
              dtype=[('x', '<i2'), ('y', '<f2')])
    
    
    >>> c.x
    array([1, 2, 3], dtype=int16)
    
    
    >>> c.y
    array([1.,  4.,  9.], dtype=float16)
    
    
    >>> r = np.rec.array(['abc','def'], names=['col1','col2'])
    >>> print(r.col1)
    abc
    
    
    >>> r.col1
    array('abc', dtype='<U3')
    
    
    >>> r.col2
    array('def', dtype='<U3')
    
# numpy.rec.find_duplicate
rec.find_duplicate(list)[source]
    
Find duplication in a list, return a list of duplicated elements
# numpy.rec.format_parser
classnumpy.rec.format_parser(formats, names, titles, aligned=False, byteorder=None)[source]
    
Class to convert formats, names, titles description to a dtype.
After constructing the format_parser object, the dtype attribute is the converted data-type: `dtype = format_parser(formats, names, titles).dtype`
Parameters:
    
formatsstr or list of str
    
The format description, either specified as a string with comma-separated format descriptions in the form `'f8, i4, S5'`, or a list of format description strings in the form `['f8', 'i4', 'S5']`.
namesstr or list/tuple of str
    
The field names, either specified as a comma-separated string in the form `'col1, col2, col3'`, or as a list or tuple of strings in the form `['col1', 'col2', 'col3']`. An empty list can be used, in that case default field names (‘f0’, ‘f1’, …) are used.
titlessequence
    
Sequence of title strings. An empty list can be used to leave titles out.
alignedbool, optional
    
If True, align the fields by padding as the C-compiler would. Default is False.
byteorderstr, optional
    
If specified, all the fields will be changed to the provided byte-order. Otherwise, the default byte-order is used. For all available string specifiers, see `dtype.newbyteorder`.
See also
`numpy.dtype`, `numpy.typename`
#### Examples
    
    >>> import numpy as np
    >>> np.rec.format_parser(['<f8', '<i4'], ['col1', 'col2'],
    ...                      ['T1', 'T2']).dtype
    dtype([(('T1', 'col1'), '<f8'), (('T2', 'col2'), '<i4')])
    
`names` and/or `titles` can be empty lists. If `titles` is an empty list, titles will simply not appear. If `names` is empty, default field names will be used.
    
    >>> np.rec.format_parser(['f8', 'i4', 'a5'], ['col1', 'col2', 'col3'],
    ...                      []).dtype
    dtype([('col1', '<f8'), ('col2', '<i4'), ('col3', '<S5')])
    >>> np.rec.format_parser(['<f8', '<i4', '<a5'], [], []).dtype
    dtype([('f0', '<f8'), ('f1', '<i4'), ('f2', 'S5')])
    
Attributes:
    
dtypedtype
    
The converted data-type.
# numpy.rec.fromarrays
rec.fromarrays(arrayList, dtype=None, shape=None, formats=None, names=None, titles=None, aligned=False, byteorder=None)[source]
    
Create a record array from a (flat) list of arrays
Parameters:
    
arrayListlist or tuple
    
List of array-like objects (such as lists, tuples, and ndarrays).
dtypedata-type, optional
    
valid dtype for all arrays
shapeint or tuple of ints, optional
    
Shape of the resulting array. If not provided, inferred from `arrayList[0]`.
formats, names, titles, aligned, byteorder
    
If `dtype` is `None`, these arguments are passed to `numpy.rec.format_parser` to construct a dtype. See that function for detailed documentation.
Returns:
    
np.recarray
    
Record array consisting of given arrayList columns.
#### Examples
    
    >>> x1=np.array([1,2,3,4])
    >>> x2=np.array(['a','dd','xyz','12'])
    >>> x3=np.array([1.1,2,3,4])
    >>> r = np.rec.fromarrays([x1,x2,x3],names='a,b,c')
    >>> print(r[1])
    (2, 'dd', 2.0) # may vary
    >>> x1[1]=34
    >>> r.a
    array([1, 2, 3, 4])
    
    
    >>> x1 = np.array([1, 2, 3, 4])
    >>> x2 = np.array(['a', 'dd', 'xyz', '12'])
    >>> x3 = np.array([1.1, 2, 3,4])
    >>> r = np.rec.fromarrays(
    ...     [x1, x2, x3],
    ...     dtype=np.dtype([('a', np.int32), ('b', 'S3'), ('c', np.float32)]))
    >>> r
    rec.array([(1, b'a', 1.1), (2, b'dd', 2. ), (3, b'xyz', 3. ),
               (4, b'12', 4. )],
              dtype=[('a', '<i4'), ('b', 'S3'), ('c', '<f4')])
    
# numpy.rec.fromfile
rec.fromfile(fd, dtype=None, shape=None, offset=0, formats=None, names=None, titles=None, aligned=False, byteorder=None)[source]
    
Create an array from binary file data
Parameters:
    
fdstr or file type
    
If file is a string or a path-like object then that file is opened, else it is assumed to be a file object. The file object must support random access (i.e. it must have tell and seek methods).
dtypedata-type, optional
    
valid dtype for all arrays
shapeint or tuple of ints, optional
    
shape of each array.
offsetint, optional
    
Position in the file to start reading from.
formats, names, titles, aligned, byteorder
    
If `dtype` is `None`, these arguments are passed to `numpy.format_parser` to construct a dtype. See that function for detailed documentation
Returns:
    
np.recarray
    
record array consisting of data enclosed in file.
#### Examples
    
    >>> from tempfile import TemporaryFile
    >>> a = np.empty(10,dtype='f8,i4,a5')
    >>> a[5] = (0.5,10,'abcde')
    >>>
    >>> fd=TemporaryFile()
    >>> a = a.view(a.dtype.newbyteorder('<'))
    >>> a.tofile(fd)
    >>>
    >>> _ = fd.seek(0)
    >>> r=np.rec.fromfile(fd, formats='f8,i4,a5', shape=10,
    ... byteorder='<')
    >>> print(r[5])
    (0.5, 10, b'abcde')
    >>> r.shape
    (10,)
    
# numpy.rec.fromrecords
rec.fromrecords(recList, dtype=None, shape=None, formats=None, names=None, titles=None, aligned=False, byteorder=None)[source]
    
Create a recarray from a list of records in text form.
Parameters:
    
recListsequence
    
data in the same field may be heterogeneous - they will be promoted to the highest data type.
dtypedata-type, optional
    
valid dtype for all arrays
shapeint or tuple of ints, optional
    
shape of each array.
formats, names, titles, aligned, byteorder
    
If `dtype` is `None`, these arguments are passed to `numpy.format_parser` to construct a dtype. See that function for detailed documentation.
If both `formats` and `dtype` are None, then this will auto-detect formats. Use list of tuples rather than list of lists for faster processing.
Returns:
    
np.recarray
    
record array consisting of given recList rows.
#### Examples
    
    >>> r=np.rec.fromrecords([(456,'dbe',1.2),(2,'de',1.3)],
    ... names='col1,col2,col3')
    >>> print(r[0])
    (456, 'dbe', 1.2)
    >>> r.col1
    array([456,   2])
    >>> r.col2
    array(['dbe', 'de'], dtype='<U3')
    >>> import pickle
    >>> pickle.loads(pickle.dumps(r))
    rec.array([(456, 'dbe', 1.2), (  2, 'de', 1.3)],
              dtype=[('col1', '<i8'), ('col2', '<U3'), ('col3', '<f8')])
    
# numpy.rec.fromstring
rec.fromstring(datastring, dtype=None, shape=None, offset=0, formats=None, names=None, titles=None, aligned=False, byteorder=None)[source]
    
Create a record array from binary data
Note that despite the name of this function it does not accept `str` instances.
Parameters:
    
datastringbytes-like
    
Buffer of binary data
dtypedata-type, optional
    
Valid dtype for all arrays
shapeint or tuple of ints, optional
    
Shape of each array.
offsetint, optional
    
Position in the buffer to start reading from.
formats, names, titles, aligned, byteorder
    
If `dtype` is `None`, these arguments are passed to `numpy.format_parser` to construct a dtype. See that function for detailed documentation.
Returns:
    
np.recarray
    
Record array view into the data in datastring. This will be readonly if `datastring` is readonly.
See also
`numpy.frombuffer`
#### Examples
    
    >>> a = b'\x01\x02\x03abc'
    >>> np.rec.fromstring(a, dtype='u1,u1,u1,S3')
    rec.array([(1, 2, 3, b'abc')],
            dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1'), ('f3', 'S3')])
    
    
    >>> grades_dtype = [('Name', (np.str_, 10)), ('Marks', np.float64),
    ...                 ('GradeLevel', np.int32)]
    >>> grades_array = np.array([('Sam', 33.3, 3), ('Mike', 44.4, 5),
    ...                         ('Aadi', 66.6, 6)], dtype=grades_dtype)
    >>> np.rec.fromstring(grades_array.tobytes(), dtype=grades_dtype)
    rec.array([('Sam', 33.3, 3), ('Mike', 44.4, 5), ('Aadi', 66.6, 6)],
            dtype=[('Name', '<U10'), ('Marks', '<f8'), ('GradeLevel', '<i4')])
    
    
    >>> s = '\x01\x02\x03abc'
    >>> np.rec.fromstring(s, dtype='u1,u1,u1,S3')
    Traceback (most recent call last):
       ...
    TypeError: a bytes-like object is required, not 'str'
    
# numpy.recarray.all
method
recarray.all(axis=None, out=None, keepdims=False, *, where=True)
    
Returns True if all elements evaluate to True.
Refer to `numpy.all` for full documentation.
See also
`numpy.all`
    
equivalent function
# numpy.recarray.any
method
recarray.any(axis=None, out=None, keepdims=False, *, where=True)
    
Returns True if any of the elements of `a` evaluate to True.
Refer to `numpy.any` for full documentation.
See also
`numpy.any`
    
equivalent function
# numpy.recarray.argmax
method
recarray.argmax(axis=None, out=None, *, keepdims=False)
    
Return indices of the maximum values along the given axis.
Refer to `numpy.argmax` for full documentation.
See also
`numpy.argmax`
    
equivalent function
# numpy.recarray.argmin
method
recarray.argmin(axis=None, out=None, *, keepdims=False)
    
Return indices of the minimum values along the given axis.
Refer to `numpy.argmin` for detailed documentation.
See also
`numpy.argmin`
    
equivalent function
# numpy.recarray.argpartition
method
recarray.argpartition(kth, axis=-1, kind='introselect', order=None)
    
Returns the indices that would partition this array.
Refer to `numpy.argpartition` for full documentation.
See also
`numpy.argpartition`
    
equivalent function
# numpy.recarray.argsort
method
recarray.argsort(axis=-1, kind=None, order=None)
    
Returns the indices that would sort this array.
Refer to `numpy.argsort` for full documentation.
See also
`numpy.argsort`
    
equivalent function
# numpy.recarray.astype
method
recarray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
    
Copy of the array, cast to a specified type.
Parameters:
    
dtypestr or dtype
    
Typecode or data-type to which the array is cast.
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout order of the result. ‘C’ means C order, ‘F’ means Fortran order, ‘A’ means ‘F’ order if all the arrays are Fortran contiguous, ‘C’ order otherwise, and ‘K’ means as close to the order the array elements appear in memory as possible. Default is ‘K’.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘unsafe’ for backwards compatibility.
  * ‘no’ means the data types should not be cast at all.
  * ‘equiv’ means only byte-order changes are allowed.
  * ‘safe’ means only casts which can preserve values are allowed.
  * ‘same_kind’ means only safe casts or casts within a kind, like float64 to float32, are allowed.
  * ‘unsafe’ means any data conversions may be done.


subokbool, optional
    
If True, then sub-classes will be passed-through (default), otherwise the returned array will be forced to be a base-class array.
copybool, optional
    
By default, astype always returns a newly allocated array. If this is set to false, and the `dtype`, `order`, and `subok` requirements are satisfied, the input array is returned instead of a copy.
Returns:
    
arr_tndarray
    
Unless `copy` is False and the other conditions for returning the input array are satisfied (see description for `copy` input parameter), `arr_t` is a new array of the same shape as the input array, with dtype, order given by `dtype`, `order`.
Raises:
    
ComplexWarning
    
When casting from complex to float or int. To avoid this, one should use `a.real.astype(t)`.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 2.5])
    >>> x
    array([1. ,  2. ,  2.5])
    
    
    >>> x.astype(int)
    array([1, 2, 2])
    
# numpy.recarray.base
attribute
recarray.base
    
Base object if memory is from some other object.
#### Examples
The base of an array that owns its memory is None:
    
    >>> import numpy as np
    >>> x = np.array([1,2,3,4])
    >>> x.base is None
    True
    
Slicing creates a view, whose memory is shared with x:
    
    >>> y = x[2:]
    >>> y.base is x
    True
    
# numpy.recarray.byteswap
method
recarray.byteswap(inplace=False)
    
Swap the bytes of the array elements
Toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Arrays of byte-strings are not swapped. The real and imaginary parts of a complex number are swapped individually.
Parameters:
    
inplacebool, optional
    
If `True`, swap bytes in-place, default is `False`.
Returns:
    
outndarray
    
The byteswapped array. If `inplace` is `True`, this is a view to self.
#### Examples
    
    >>> import numpy as np
    >>> A = np.array([1, 256, 8755], dtype=np.int16)
    >>> list(map(hex, A))
    ['0x1', '0x100', '0x2233']
    >>> A.byteswap(inplace=True)
    array([  256,     1, 13090], dtype=int16)
    >>> list(map(hex, A))
    ['0x100', '0x1', '0x3322']
    
Arrays of byte-strings are not swapped
    
    >>> A = np.array([b'ceg', b'fac'])
    >>> A.byteswap()
    array([b'ceg', b'fac'], dtype='|S3')
    
`A.view(A.dtype.newbyteorder()).byteswap()` produces an array with the same values but different representation in memory
    
    >>> A = np.array([1, 2, 3],dtype=np.int64)
    >>> A.view(np.uint8)
    array([1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
           0, 0], dtype=uint8)
    >>> A.view(A.dtype.newbyteorder()).byteswap(inplace=True)
    array([1, 2, 3], dtype='>i8')
    >>> A.view(np.uint8)
    array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
           0, 3], dtype=uint8)
    
# numpy.recarray.choose
method
recarray.choose(choices, out=None, mode='raise')
    
Use an index array to construct a new array from a set of choices.
Refer to `numpy.choose` for full documentation.
See also
`numpy.choose`
    
equivalent function
# numpy.recarray.clip
method
recarray.clip(min=None, max=None, out=None, **kwargs)
    
Return an array whose values are limited to `[min, max]`. One of max or min must be given.
Refer to `numpy.clip` for full documentation.
See also
`numpy.clip`
    
equivalent function
# numpy.recarray.compress
method
recarray.compress(condition, axis=None, out=None)
    
Return selected slices of this array along given axis.
Refer to `numpy.compress` for full documentation.
See also
`numpy.compress`
    
equivalent function
# numpy.recarray.conj
method
recarray.conj()
    
Complex-conjugate all elements.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.recarray.conjugate
method
recarray.conjugate()
    
Return the complex conjugate, element-wise.
Refer to `numpy.conjugate` for full documentation.
See also
`numpy.conjugate`
    
equivalent function
# numpy.recarray.copy
method
recarray.copy(order='C')
    
Return a copy of the array.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible. (Note that this function and `numpy.copy` are very similar but have different default values for their order= arguments, and this function always passes sub-classes through.)
See also
`numpy.copy`
    
Similar function with different default behavior
`numpy.copyto`
#### Notes
This function is the preferred method for creating an array copy. The function `numpy.copy` is similar, but it defaults to using order ‘K’, and will not pass sub-classes through by default.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3],[4,5,6]], order='F')
    
    
    >>> y = x.copy()
    
    
    >>> x.fill(0)
    
    
    >>> x
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> y.flags['C_CONTIGUOUS']
    True
    
For arrays containing Python objects (e.g. dtype=object), the copy is a shallow one. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):
    
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> b = a.copy()
    >>> b[2][0] = 10
    >>> a
    array([1, 'm', list([10, 3, 4])], dtype=object)
    
To ensure all elements within an `object` array are copied, use `copy.deepcopy`:
    
    >>> import copy
    >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
    >>> c = copy.deepcopy(a)
    >>> c[2][0] = 10
    >>> c
    array([1, 'm', list([10, 3, 4])], dtype=object)
    >>> a
    array([1, 'm', list([2, 3, 4])], dtype=object)
    
# numpy.recarray.ctypes
attribute
recarray.ctypes
    
An object to simplify the interaction of the array with the ctypes module.
This attribute creates an object that makes it easier to use arrays when calling shared libraries with the ctypes module. The returned object has, among others, data, shape, and strides attributes (see Notes below) which themselves return ctypes objects that can be used as arguments to a shared library.
Parameters:
    
None
Returns:
    
cPython object
    
Possessing attributes data, shape, strides, etc.
See also
`numpy.ctypeslib`
#### Notes
Below are the public attributes of this object which were documented in “Guide to NumPy” (we have omitted undocumented public attributes, as well as documented private attributes):
_ctypes.data
    
A pointer to the memory area of the array as a Python integer. This memory area may contain data that is not aligned, or not in correct byte-order. The memory area may not even be writeable. The array flags and data-type of this array should be respected when passing this attribute to arbitrary C-code to avoid trouble that can include Python crashing. User Beware! The value of this attribute is exactly the same as: `self._array_interface_['data'][0]`.
Note that unlike `data_as`, a reference won’t be kept to the array: code like `ctypes.c_void_p((a + b).ctypes.data)` will result in a pointer to a deallocated array, and should be spelt `(a + b).ctypes.data_as(ctypes.c_void_p)`
_ctypes.shape
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the C-integer corresponding to `dtype('p')` on this platform (see `c_intp`). This base-type could be `ctypes.c_int`, `ctypes.c_long`, or `ctypes.c_longlong` depending on the platform. The ctypes array contains the shape of the underlying array.
_ctypes.strides
    
(c_intp*self.ndim): A ctypes array of length self.ndim where the basetype is the same as for the shape attribute. This ctypes array contains the strides information from the underlying array. This strides information is important for showing how many bytes must be jumped to get to the next element in the array.
_ctypes.data_as(obj)[source]
    
Return the data pointer cast to a particular c-types object. For example, calling `self._as_parameter_` is equivalent to `self.data_as(ctypes.c_void_p)`. Perhaps you want to use the data as a pointer to a ctypes array of floating-point data: `self.data_as(ctypes.POINTER(ctypes.c_double))`.
The returned pointer will keep a reference to the array.
_ctypes.shape_as(obj)[source]
    
Return the shape tuple as an array of some other c-types type. For example: `self.shape_as(ctypes.c_short)`.
_ctypes.strides_as(obj)[source]
    
Return the strides tuple as an array of some other c-types type. For example: `self.strides_as(ctypes.c_longlong)`.
If the ctypes module is not available, then the ctypes attribute of array objects still returns something useful, but ctypes objects are not returned and errors may be raised instead. In particular, the object will still have the `as_parameter` attribute which will return an integer equal to the data attribute.
#### Examples
    
    >>> import numpy as np
    >>> import ctypes
    >>> x = np.array([[0, 1], [2, 3]], dtype=np.int32)
    >>> x
    array([[0, 1],
           [2, 3]], dtype=int32)
    >>> x.ctypes.data
    31962608 # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32))
    <__main__.LP_c_uint object at 0x7ff2fc1fc200> # may vary
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint32)).contents
    c_uint(0)
    >>> x.ctypes.data_as(ctypes.POINTER(ctypes.c_uint64)).contents
    c_ulong(4294967296)
    >>> x.ctypes.shape
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1fce60> # may vary
    >>> x.ctypes.strides
    <numpy._core._internal.c_long_Array_2 object at 0x7ff2fc1ff320> # may vary
    
# numpy.recarray.cumprod
method
recarray.cumprod(axis=None, dtype=None, out=None)
    
Return the cumulative product of the elements along the given axis.
Refer to `numpy.cumprod` for full documentation.
See also
`numpy.cumprod`
    
equivalent function
# numpy.recarray.cumsum
method
recarray.cumsum(axis=None, dtype=None, out=None)
    
Return the cumulative sum of the elements along the given axis.
Refer to `numpy.cumsum` for full documentation.
See also
`numpy.cumsum`
    
equivalent function
# numpy.recarray.data
attribute
recarray.data
    
Python buffer object pointing to the start of the array’s data.
# numpy.recarray.diagonal
method
recarray.diagonal(offset=0, axis1=0, axis2=1)
    
Return specified diagonals. In NumPy 1.9 the returned array is a read-only view instead of a copy as in previous NumPy versions. In a future version the read-only restriction will be removed.
Refer to `numpy.diagonal` for full documentation.
See also
`numpy.diagonal`
    
equivalent function
# numpy.recarray.dump
method
recarray.dump(file)
    
Dump a pickle of the array to the specified file. The array can be read back with pickle.load or numpy.load.
Parameters:
    
filestr or Path
    
A string naming the dump file.
# numpy.recarray.dumps
method
recarray.dumps()
    
Returns the pickle of the array as a string. pickle.loads will convert the string back to an array.
Parameters:
    
None
# numpy.recarray.fill
method
recarray.fill(value)
    
Fill the array with a scalar value.
Parameters:
    
valuescalar
    
All elements of `a` will be assigned this value.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2])
    >>> a.fill(0)
    >>> a
    array([0, 0])
    >>> a = np.empty(2)
    >>> a.fill(1)
    >>> a
    array([1.,  1.])
    
Fill expects a scalar value and always behaves the same as assigning to a single array element. The following is a rare example where this distinction is important:
    
    >>> a = np.array([None, None], dtype=object)
    >>> a[0] = np.array(3)
    >>> a
    array([array(3), None], dtype=object)
    >>> a.fill(np.array(3))
    >>> a
    array([array(3), array(3)], dtype=object)
    
Where other forms of assignments will unpack the array being assigned:
    
    >>> a[...] = np.array(3)
    >>> a
    array([3, 3], dtype=object)
    
# numpy.recarray.flags
attribute
recarray.flags
    
Information about the memory layout of the array.
#### Notes
The `flags` object can be accessed dictionary-like (as in `a.flags['WRITEABLE']`), or by using lowercased attribute names (as in `a.flags.writeable`). Short flag names are only supported in dictionary access.
Only the WRITEBACKIFCOPY, WRITEABLE, and ALIGNED flags can be changed by the user, via direct assignment to the attribute or dictionary entry, or by calling `ndarray.setflags`.
The array flags cannot be set arbitrarily:
  * WRITEBACKIFCOPY can only be set `False`.
  * ALIGNED can only be set `True` if the data is truly aligned.
  * WRITEABLE can only be set `True` if the array owns its own memory or the ultimate owner of the memory exposes a writeable buffer interface or is a string.


Arrays can be both C-style and Fortran-style contiguous simultaneously. This is clear for 1-dimensional arrays, but can also be true for higher dimensional arrays.
Even for contiguous arrays a stride for a given dimension `arr.strides[dim]` may be arbitrary if `arr.shape[dim] == 1` or the array has no elements. It does not generally hold that `self.strides[-1] == self.itemsize` for C-style contiguous arrays or `self.strides[0] == self.itemsize` for Fortran-style contiguous arrays is true.
Attributes:
    
C_CONTIGUOUS (C)
    
The data is in a single, C-style contiguous segment.
F_CONTIGUOUS (F)
    
The data is in a single, Fortran-style contiguous segment.
OWNDATA (O)
    
The array owns the memory it uses or borrows it from another object.
WRITEABLE (W)
    
The data area can be written to. Setting this to False locks the data, making it read-only. A view (slice, etc.) inherits WRITEABLE from its base array at creation time, but a view of a writeable array may be subsequently locked while the base array remains writeable. (The opposite is not true, in that a view of a locked array may not be made writeable. However, currently, locking a base object does not lock any views that already reference it, so under that circumstance it is possible to alter the contents of a locked array via a previously created writeable view onto it.) Attempting to change a non-writeable array raises a RuntimeError exception.
ALIGNED (A)
    
The data and all elements are aligned appropriately for the hardware.
WRITEBACKIFCOPY (X)
    
This array is a copy of some other array. The C-API function PyArray_ResolveWritebackIfCopy must be called before deallocating to the base array will be updated with the contents of this array.
FNC
    
F_CONTIGUOUS and not C_CONTIGUOUS.
FORC
    
F_CONTIGUOUS or C_CONTIGUOUS (one-segment test).
BEHAVED (B)
    
ALIGNED and WRITEABLE.
CARRAY (CA)
    
BEHAVED and C_CONTIGUOUS.
FARRAY (FA)
    
BEHAVED and F_CONTIGUOUS and not C_CONTIGUOUS.
# numpy.recarray.flat
attribute
recarray.flat
    
A 1-D iterator over the array.
This is a `numpy.flatiter` instance, which acts similarly to, but is not a subclass of, Python’s built-in iterator object.
See also
`flatten`
    
Return a copy of the array collapsed into one dimension.
`flatiter`
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(1, 7).reshape(2, 3)
    >>> x
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> x.flat[3]
    4
    >>> x.T
    array([[1, 4],
           [2, 5],
           [3, 6]])
    >>> x.T.flat[3]
    5
    >>> type(x.flat)
    <class 'numpy.flatiter'>
    
An assignment example:
    
    >>> x.flat = 3; x
    array([[3, 3, 3],
           [3, 3, 3]])
    >>> x.flat[[1,4]] = 1; x
    array([[3, 1, 3],
           [3, 1, 3]])
    
# numpy.recarray.flatten
method
recarray.flatten(order='C')
    
Return a copy of the array collapsed into one dimension.
Parameters:
    
order{‘C’, ‘F’, ‘A’, ‘K’}, optional
    
‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran- style) order. ‘A’ means to flatten in column-major order if `a` is Fortran contiguous in memory, row-major order otherwise. ‘K’ means to flatten `a` in the order the elements occur in memory. The default is ‘C’.
Returns:
    
yndarray
    
A copy of the input array, flattened to one dimension.
See also
`ravel`
    
Return a flattened array.
`flat`
    
A 1-D flat iterator over the array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2], [3,4]])
    >>> a.flatten()
    array([1, 2, 3, 4])
    >>> a.flatten('F')
    array([1, 3, 2, 4])
    
# numpy.recarray.getfield
method
recarray.getfield(dtype, offset=0)
    
Returns a field of the given array as a certain type.
A field is a view of the array data with a given data-type. The values in the view are determined by the given type and the offset into the current array in bytes. The offset needs to be such that the view dtype fits in the array dtype; for example an array of dtype complex128 has 16-byte elements. If taking a view with a 32-bit integer (4 bytes), the offset needs to be between 0 and 12 bytes.
Parameters:
    
dtypestr or dtype
    
The data type of the view. The dtype size of the view can not be larger than that of the array itself.
offsetint
    
Number of bytes to skip before beginning the element view.
#### Examples
    
    >>> import numpy as np
    >>> x = np.diag([1.+1.j]*2)
    >>> x[1, 1] = 2 + 4.j
    >>> x
    array([[1.+1.j,  0.+0.j],
           [0.+0.j,  2.+4.j]])
    >>> x.getfield(np.float64)
    array([[1.,  0.],
           [0.,  2.]])
    
By choosing an offset of 8 bytes we can select the complex part of the array for our view:
    
    >>> x.getfield(np.float64, offset=8)
    array([[1.,  0.],
           [0.,  4.]])
    
# numpy.recarray
classnumpy.recarray(shape, dtype=None, buf=None, offset=0, strides=None, formats=None, names=None, titles=None, byteorder=None, aligned=False, order='C')[source]
    
Construct an ndarray that allows field access using attributes.
Arrays may have a data-types containing fields, analogous to columns in a spread sheet. An example is `[(x, int), (y, float)]`, where each entry in the array is a pair of `(int, float)`. Normally, these attributes are accessed using dictionary lookups such as `arr['x']` and `arr['y']`. Record arrays allow the fields to be accessed as members of the array, using `arr.x` and `arr.y`.
Parameters:
    
shapetuple
    
Shape of output array.
dtypedata-type, optional
    
The desired data-type. By default, the data-type is determined from `formats`, `names`, `titles`, `aligned` and `byteorder`.
formatslist of data-types, optional
    
A list containing the data-types for the different columns, e.g. `['i4', 'f8', 'i4']`. `formats` does not support the new convention of using types directly, i.e. `(int, float, int)`. Note that `formats` must be a list, not a tuple. Given that `formats` is somewhat limited, we recommend specifying `dtype` instead.
namestuple of str, optional
    
The name of each column, e.g. `('x', 'y', 'z')`.
bufbuffer, optional
    
By default, a new array is created of the given shape and data-type. If `buf` is specified and is an object exposing the buffer interface, the array will use the memory from the existing buffer. In this case, the `offset` and `strides` keywords are available.
Returns:
    
recrecarray
    
Empty array of the given shape and type.
Other Parameters:
    
titlestuple of str, optional
    
Aliases for column names. For example, if `names` were `('x', 'y', 'z')` and `titles` is `('x_coordinate', 'y_coordinate', 'z_coordinate')`, then `arr['x']` is equivalent to both `arr.x` and `arr.x_coordinate`.
byteorder{‘<’, ‘>’, ‘=’}, optional
    
Byte-order for all fields.
alignedbool, optional
    
Align the fields in memory as the C-compiler would.
stridestuple of ints, optional
    
Buffer (`buf`) is interpreted according to these strides (strides define how many bytes each array element, row, column, etc. occupy in memory).
offsetint, optional
    
Start reading buffer (`buf`) from this offset onwards.
order{‘C’, ‘F’}, optional
    
Row-major (C-style) or column-major (Fortran-style) order.
See also
`numpy.rec.fromrecords`
    
Construct a record array from data.
`numpy.record`
    
fundamental data-type for `recarray`.
`numpy.rec.format_parser`
    
determine data-type from formats, names, titles.
#### Notes
This constructor can be compared to `empty`: it creates a new record array but does not fill it with data. To create a record array from data, use one of the following methods:
  1. Create a standard ndarray and convert it to a record array, using `arr.view(np.recarray)`
  2. Use the `buf` keyword.
  3. Use `np.rec.fromrecords`.


#### Examples
Create an array with two fields, `x` and `y`:
    
    >>> import numpy as np
    >>> x = np.array([(1.0, 2), (3.0, 4)], dtype=[('x', '<f8'), ('y', '<i8')])
    >>> x
    array([(1., 2), (3., 4)], dtype=[('x', '<f8'), ('y', '<i8')])
    
    
    >>> x['x']
    array([1., 3.])
    
View the array as a record array:
    
    >>> x = x.view(np.recarray)
    
    
    >>> x.x
    array([1., 3.])
    
    
    >>> x.y
    array([2, 4])
    
Create a new, empty record array:
    
    >>> np.recarray((2,),
    ... dtype=[('x', int), ('y', float), ('z', int)]) 
    rec.array([(-1073741821, 1.2249118382103472e-301, 24547520),
           (3471280, 1.2134086255804012e-316, 0)],
          dtype=[('x', '<i4'), ('y', '<f8'), ('z', '<i4')])
    
Attributes:
    
`T`
    
View of the transposed array.
`base`
    
Base object if memory is from some other object.
`ctypes`
    
An object to simplify the interaction of the array with the ctypes module.
`data`
    
Python buffer object pointing to the start of the array’s data.
device
`dtype`
    
Data-type of the array’s elements.
`flags`
    
Information about the memory layout of the array.
`flat`
    
A 1-D iterator over the array.
`imag`
    
The imaginary part of the array.
itemset
`itemsize`
    
Length of one array element in bytes.
`mT`
    
View of the matrix transposed array.
`nbytes`
    
Total bytes consumed by the elements of the array.
`ndim`
    
Number of array dimensions.
newbyteorder
ptp
`real`
    
The real part of the array.
`shape`
    
Tuple of array dimensions.
`size`
    
Number of elements in the array.
`strides`
    
Tuple of bytes to step in each dimension when traversing an array.
#### Methods
`all`([axis, out, keepdims, where])
Returns True if all elements evaluate to True.  
`any`([axis, out, keepdims, where])
Returns True if any of the elements of `a` evaluate to True.  
`argmax`([axis, out, keepdims])
Return indices of the maximum values along the given axis.  
`argmin`([axis, out, keepdims])
Return indices of the minimum values along the given axis.  
`argpartition`(kth[, axis, kind, order])
Returns the indices that would partition this array.  
`argsort`([axis, kind, order])
Returns the indices that would sort this array.  
`astype`(dtype[, order, casting, subok, copy])
Copy of the array, cast to a specified type.  
`byteswap`([inplace])
Swap the bytes of the array elements  
`choose`(choices[, out, mode])
Use an index array to construct a new array from a set of choices.  
`clip`([min, max, out])
Return an array whose values are limited to `[min, max]`.  
`compress`(condition[, axis, out])
Return selected slices of this array along given axis.  
`conj`()
Complex-conjugate all elements.  
`conjugate`()
Return the complex conjugate, element-wise.  
`copy`([order])
Return a copy of the array.  
`cumprod`([axis, dtype, out])
Return the cumulative product of the elements along the given axis.  
`cumsum`([axis, dtype, out])
Return the cumulative sum of the elements along the given axis.  
`diagonal`([offset, axis1, axis2])
Return specified diagonals.  
`dump`(file)
Dump a pickle of the array to the specified file.  
`dumps`()
Returns the pickle of the array as a string.  
`fill`(value)
Fill the array with a scalar value.  
`flatten`([order])
Return a copy of the array collapsed into one dimension.  
`getfield`(dtype[, offset])
Returns a field of the given array as a certain type.  
`item`(*args)
Copy an element of an array to a standard Python scalar and return it.  
`max`([axis, out, keepdims, initial, where])
Return the maximum along a given axis.  
`mean`([axis, dtype, out, keepdims, where])
Returns the average of the array elements along given axis.  
`min`([axis, out, keepdims, initial, where])
Return the minimum along a given axis.  
`nonzero`()
Return the indices of the elements that are non-zero.  
`partition`(kth[, axis, kind, order])
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array.  
`prod`([axis, dtype, out, keepdims, initial, ...])
Return the product of the array elements over the given axis  
`put`(indices, values[, mode])
Set `a.flat[n] = values[n]` for all `n` in indices.  
`ravel`([order])
Return a flattened array.  
`repeat`(repeats[, axis])
Repeat elements of an array.  
`reshape`(shape, /, *[, order, copy])
Returns an array containing the same data with a new shape.  
`resize`(new_shape[, refcheck])
Change shape and size of array in-place.  
`round`([decimals, out])
Return `a` with each element rounded to the given number of decimals.  
`searchsorted`(v[, side, sorter])
Find indices where elements of v should be inserted in a to maintain order.  
`setfield`(val, dtype[, offset])
Put a value into a specified place in a field defined by a data-type.  
`setflags`([write, align, uic])
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.  
`sort`([axis, kind, order])
Sort an array in-place.  
`squeeze`([axis])
Remove axes of length one from `a`.  
`std`([axis, dtype, out, ddof, keepdims, where])
Returns the standard deviation of the array elements along given axis.  
`sum`([axis, dtype, out, keepdims, initial, where])
Return the sum of the array elements over the given axis.  
`swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`take`(indices[, axis, out, mode])
Return an array formed from the elements of `a` at the given indices.  
`tobytes`([order])
Construct Python bytes containing the raw data bytes in the array.  
`tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
`tolist`()
Return the array as an `a.ndim`-levels deep nested list of Python scalars.  
`tostring`([order])
A compatibility alias for `tobytes`, with exactly the same behavior.  
`trace`([offset, axis1, axis2, dtype, out])
Return the sum along diagonals of the array.  
`transpose`(*axes)
Returns a view of the array with axes transposed.  
`var`([axis, dtype, out, ddof, keepdims, where])
Returns the variance of the array elements, along given axis.  
`view`([dtype][, type])
New view of array with the same data.  
dot  
field  
to_device  
# numpy.recarray.item
method
recarray.item(*args)
    
Copy an element of an array to a standard Python scalar and return it.
Parameters:
    
*argsArguments (variable number and type)
    
  * none: in this case, the method only works for arrays with one element (`a.size == 1`), which element is copied into a standard Python scalar object and returned.
  * int_type: this argument is interpreted as a flat index into the array, specifying which element to copy and return.
  * tuple of int_types: functions as does a single int_type argument, except that the argument is interpreted as an nd-index into the array.


Returns:
    
zStandard Python scalar object
    
A copy of the specified element of the array as a suitable Python scalar
#### Notes
When the data type of `a` is longdouble or clongdouble, item() returns a scalar array object because there is no available Python scalar that would not lose information. Void arrays return a buffer object for item(), unless fields are defined, in which case a tuple is returned.
`item` is very similar to a[args], except, instead of an array scalar, a standard Python scalar is returned. This can be useful for speeding up access to elements of the array and doing arithmetic on elements of the array using Python’s optimized math.
#### Examples
    
    >>> import numpy as np
    >>> np.random.seed(123)
    >>> x = np.random.randint(9, size=(3, 3))
    >>> x
    array([[2, 2, 6],
           [1, 3, 6],
           [1, 0, 1]])
    >>> x.item(3)
    1
    >>> x.item(7)
    0
    >>> x.item((0, 1))
    2
    >>> x.item((2, 2))
    1
    
For an array with object dtype, elements are returned as-is.
    
    >>> a = np.array([np.int64(1)], dtype=object)
    >>> a.item() #return np.int64
    np.int64(1)
    
# numpy.recarray.itemsize
attribute
recarray.itemsize
    
Length of one array element in bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1,2,3], dtype=np.float64)
    >>> x.itemsize
    8
    >>> x = np.array([1,2,3], dtype=np.complex128)
    >>> x.itemsize
    16
    
# numpy.recarray.max
method
recarray.max(axis=None, out=None, keepdims=False, initial=<no value>, where=True)
    
Return the maximum along a given axis.
Refer to `numpy.amax` for full documentation.
See also
`numpy.amax`
    
equivalent function
# numpy.recarray.mean
method
recarray.mean(axis=None, dtype=None, out=None, keepdims=False, *, where=True)
    
Returns the average of the array elements along given axis.
Refer to `numpy.mean` for full documentation.
See also
`numpy.mean`
    
equivalent function
# numpy.recarray.min
method
recarray.min(axis=None, out=None, keepdims=False, initial=<no value>, where=True)
    
Return the minimum along a given axis.
Refer to `numpy.amin` for full documentation.
See also
`numpy.amin`
    
equivalent function
# numpy.recarray.mT
attribute
recarray.mT
    
View of the matrix transposed array.
The matrix transpose is the transpose of the last two dimensions, even if the array is of higher dimension.
New in version 2.0.
Raises:
    
ValueError
    
If the array is of dimension less than 2.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.mT
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.arange(8).reshape((2, 2, 2))
    >>> a
    array([[[0, 1],
            [2, 3]],
    
           [[4, 5],
            [6, 7]]])
    >>> a.mT
    array([[[0, 2],
            [1, 3]],
    
           [[4, 6],
            [5, 7]]])
    
# numpy.recarray.nbytes
attribute
recarray.nbytes
    
Total bytes consumed by the elements of the array.
See also
`sys.getsizeof`
    
Memory consumed by the object itself without parents in case view. This does include memory consumed by non-element attributes.
#### Notes
Does not include memory consumed by non-element attributes of the array object.
#### Examples
    
    >>> import numpy as np
    >>> x = np.zeros((3,5,2), dtype=np.complex128)
    >>> x.nbytes
    480
    >>> np.prod(x.shape) * x.itemsize
    480
    
# numpy.recarray.nonzero
method
recarray.nonzero()
    
Return the indices of the elements that are non-zero.
Refer to `numpy.nonzero` for full documentation.
See also
`numpy.nonzero`
    
equivalent function
# numpy.recarray.partition
method
recarray.partition(kth, axis=-1, kind='introselect', order=None)
    
Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array. In the output array, all elements smaller than the k-th element are located to the left of this element and all equal or greater are located to its right. The ordering of the elements in the two partitions on the either side of the k-th element in the output array is undefined.
Parameters:
    
kthint or sequence of ints
    
Element index to partition by. The kth element value will be in its final sorted position and all smaller elements will be moved before it and all equal or greater elements behind it. The order of all elements in the partitions is undefined. If provided with a sequence of kth it will partition all elements indexed by kth of them into their sorted position at once.
Deprecated since version 1.22.0: Passing booleans as index is deprecated.
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘introselect’}, optional
    
Selection algorithm. Default is ‘introselect’.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need to be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.partition`
    
Return a partitioned copy of an array.
`argpartition`
    
Indirect partition.
`sort`
    
Full sort.
#### Notes
See `np.partition` for notes on the different algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([3, 4, 2, 1])
    >>> a.partition(3)
    >>> a
    array([2, 1, 3, 4]) # may vary
    
    
    >>> a.partition((1, 3))
    >>> a
    array([1, 2, 3, 4])
    
# numpy.recarray.prod
method
recarray.prod(axis=None, dtype=None, out=None, keepdims=False, initial=1, where=True)
    
Return the product of the array elements over the given axis
Refer to `numpy.prod` for full documentation.
See also
`numpy.prod`
    
equivalent function
# numpy.recarray.put
method
recarray.put(indices, values, mode='raise')
    
Set `a.flat[n] = values[n]` for all `n` in indices.
Refer to `numpy.put` for full documentation.
See also
`numpy.put`
    
equivalent function
# numpy.recarray.ravel
method
recarray.ravel([order])
    
Return a flattened array.
Refer to `numpy.ravel` for full documentation.
See also
`numpy.ravel`
    
equivalent function
`ndarray.flat`
    
a flat iterator on the array.
# numpy.recarray.repeat
method
recarray.repeat(repeats, axis=None)
    
Repeat elements of an array.
Refer to `numpy.repeat` for full documentation.
See also
`numpy.repeat`
    
equivalent function
# numpy.recarray.reshape
method
recarray.reshape(shape, /, *, order='C', copy=None)
    
Returns an array containing the same data with a new shape.
Refer to `numpy.reshape` for full documentation.
See also
`numpy.reshape`
    
equivalent function
#### Notes
Unlike the free function `numpy.reshape`, this method on `ndarray` allows the elements of the shape parameter to be passed in as separate arguments. For example, `a.reshape(10, 11)` is equivalent to `a.reshape((10, 11))`.
# numpy.recarray.resize
method
recarray.resize(new_shape, refcheck=True)
    
Change shape and size of array in-place.
Parameters:
    
new_shapetuple of ints, or `n` ints
    
Shape of resized array.
refcheckbool, optional
    
If False, reference count will not be checked. Default is True.
Returns:
    
None
Raises:
    
ValueError
    
If `a` does not own its own data or references or views to it exist, and the data memory must be changed. PyPy only: will always raise if the data memory must be changed, since there is no reliable way to determine if references or views to it exist.
SystemError
    
If the `order` keyword argument is specified. This behaviour is a bug in NumPy.
See also
`resize`
    
Return a new array with the specified shape.
#### Notes
This reallocates space for the data area if necessary.
Only contiguous arrays (data elements consecutive in memory) can be resized.
The purpose of the reference count check is to make sure you do not use this array as a buffer for another Python object and then reallocate the memory. However, reference counts can increase in other ways so if you are sure that you have not shared the memory for this array with another Python object, then you may safely set `refcheck` to False.
#### Examples
Shrinking an array: array is flattened (in the order that the data are stored in memory), resized, and reshaped:
    
    >>> import numpy as np
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='C')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [1]])
    
    
    >>> a = np.array([[0, 1], [2, 3]], order='F')
    >>> a.resize((2, 1))
    >>> a
    array([[0],
           [2]])
    
Enlarging an array: as above, but missing entries are filled with zeros:
    
    >>> b = np.array([[0, 1], [2, 3]])
    >>> b.resize(2, 3) # new_shape parameter doesn't have to be a tuple
    >>> b
    array([[0, 1, 2],
           [3, 0, 0]])
    
Referencing an array prevents resizing…
    
    >>> c = a
    >>> a.resize((1, 1))
    Traceback (most recent call last):
    ...
    ValueError: cannot resize an array that references or is referenced ...
    
Unless `refcheck` is False:
    
    >>> a.resize((1, 1), refcheck=False)
    >>> a
    array([[0]])
    >>> c
    array([[0]])
    
# numpy.recarray.round
method
recarray.round(decimals=0, out=None)
    
Return `a` with each element rounded to the given number of decimals.
Refer to `numpy.around` for full documentation.
See also
`numpy.around`
    
equivalent function
# numpy.recarray.searchsorted
method
recarray.searchsorted(v, side='left', sorter=None)
    
Find indices where elements of v should be inserted in a to maintain order.
For full documentation, see `numpy.searchsorted`
See also
`numpy.searchsorted`
    
equivalent function
# numpy.recarray.setfield
method
recarray.setfield(val, dtype, offset=0)
    
Put a value into a specified place in a field defined by a data-type.
Place `val` into `a`’s field defined by `dtype` and beginning `offset` bytes into the field.
Parameters:
    
valobject
    
Value to be placed in field.
dtypedtype object
    
Data-type of the field in which to place `val`.
offsetint, optional
    
The number of bytes into the field at which to place `val`.
Returns:
    
None
See also
`getfield`
#### Examples
    
    >>> import numpy as np
    >>> x = np.eye(3)
    >>> x.getfield(np.float64)
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    >>> x.setfield(3, np.int32)
    >>> x.getfield(np.int32)
    array([[3, 3, 3],
           [3, 3, 3],
           [3, 3, 3]], dtype=int32)
    >>> x
    array([[1.0e+000, 1.5e-323, 1.5e-323],
           [1.5e-323, 1.0e+000, 1.5e-323],
           [1.5e-323, 1.5e-323, 1.0e+000]])
    >>> x.setfield(np.eye(3), np.int32)
    >>> x
    array([[1.,  0.,  0.],
           [0.,  1.,  0.],
           [0.,  0.,  1.]])
    
# numpy.recarray.setflags
method
recarray.setflags(write=None, align=None, uic=None)
    
Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.
These Boolean-valued flags affect how numpy interprets the memory area used by `a` (see Notes below). The ALIGNED flag can only be set to True if the data is actually aligned according to the type. The WRITEBACKIFCOPY flag can never be set to True. The flag WRITEABLE can only be set to True if the array owns its own memory, or the ultimate owner of the memory exposes a writeable buffer interface, or is a string. (The exception for string is made so that unpickling can be done without copying memory.)
Parameters:
    
writebool, optional
    
Describes whether or not `a` can be written to.
alignbool, optional
    
Describes whether or not `a` is aligned properly for its type.
uicbool, optional
    
Describes whether or not `a` is a copy of another “base” array.
#### Notes
Array flags provide information about how the memory area used for the array is to be interpreted. There are 7 Boolean flags in use, only three of which can be changed by the user: WRITEBACKIFCOPY, WRITEABLE, and ALIGNED.
WRITEABLE (W) the data area can be written to;
ALIGNED (A) the data and strides are aligned appropriately for the hardware (as determined by the compiler);
WRITEBACKIFCOPY (X) this array is a copy of some other array (referenced by .base). When the C-API function PyArray_ResolveWritebackIfCopy is called, the base array will be updated with the contents of this array.
All flags can be accessed using the single (upper case) letter as well as the full name.
#### Examples
    
    >>> import numpy as np
    >>> y = np.array([[3, 1, 7],
    ...               [2, 0, 0],
    ...               [8, 5, 9]])
    >>> y
    array([[3, 1, 7],
           [2, 0, 0],
           [8, 5, 9]])
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
    >>> y.setflags(write=0, align=0)
    >>> y.flags
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : False
      ALIGNED : False
      WRITEBACKIFCOPY : False
    >>> y.setflags(uic=1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: cannot set WRITEBACKIFCOPY flag to True
    
# numpy.recarray.sort
method
recarray.sort(axis=-1, kind=None, order=None)
    
Sort an array in-place. Refer to `numpy.sort` for full documentation.
Parameters:
    
axisint, optional
    
Axis along which to sort. Default is -1, which means sort along the last axis.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort under the covers and, in general, the actual implementation will vary with datatype. The ‘mergesort’ option is retained for backwards compatibility.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
See also
`numpy.sort`
    
Return a sorted copy of an array.
`numpy.argsort`
    
Indirect sort.
`numpy.lexsort`
    
Indirect stable sort on multiple keys.
`numpy.searchsorted`
    
Find elements in sorted array.
`numpy.partition`
    
Partial sort.
#### Notes
See `numpy.sort` for notes on the different sorting algorithms.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,4], [3,1]])
    >>> a.sort(axis=1)
    >>> a
    array([[1, 4],
           [1, 3]])
    >>> a.sort(axis=0)
    >>> a
    array([[1, 3],
           [1, 4]])
    
Use the `order` keyword to specify a field to use when sorting a structured array:
    
    >>> a = np.array([('a', 2), ('c', 1)], dtype=[('x', 'S1'), ('y', int)])
    >>> a.sort(order='y')
    >>> a
    array([(b'c', 1), (b'a', 2)],
          dtype=[('x', 'S1'), ('y', '<i8')])
    
# numpy.recarray.squeeze
method
recarray.squeeze(axis=None)
    
Remove axes of length one from `a`.
Refer to `numpy.squeeze` for full documentation.
See also
`numpy.squeeze`
    
equivalent function
# numpy.recarray.std
method
recarray.std(axis=None, dtype=None, out=None, ddof=0, keepdims=False, *, where=True)
    
Returns the standard deviation of the array elements along given axis.
Refer to `numpy.std` for full documentation.
See also
`numpy.std`
    
equivalent function
# numpy.recarray.strides
attribute
recarray.strides
    
Tuple of bytes to step in each dimension when traversing an array.
The byte offset of element `(i[0], i[1], ..., i[n])` in an array `a` is:
    
    offset = sum(np.array(i) * a.strides)
    
A more detailed explanation of strides can be found in The N-dimensional array (ndarray).
Warning
Setting `arr.strides` is discouraged and may be deprecated in the future. `numpy.lib.stride_tricks.as_strided` should be preferred to create a new view of the same data in a safer way.
See also
`numpy.lib.stride_tricks.as_strided`
#### Notes
Imagine an array of 32-bit integers (each 4 bytes):
    
    x = np.array([[0, 1, 2, 3, 4],
                  [5, 6, 7, 8, 9]], dtype=np.int32)
    
This array is stored in memory as 40 bytes, one after the other (known as a contiguous block of memory). The strides of an array tell us how many bytes we have to skip in memory to move to the next position along a certain axis. For example, we have to skip 4 bytes (1 value) to move to the next column, but 20 bytes (5 values) to get to the same position in the next row. As such, the strides for the array `x` will be `(20, 4)`.
#### Examples
    
    >>> import numpy as np
    >>> y = np.reshape(np.arange(2*3*4), (2,3,4))
    >>> y
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>> y.strides
    (48, 16, 4)
    >>> y[1,1,1]
    17
    >>> offset=sum(y.strides * np.array((1,1,1)))
    >>> offset/y.itemsize
    17
    
    
    >>> x = np.reshape(np.arange(5*6*7*8), (5,6,7,8)).transpose(2,3,1,0)
    >>> x.strides
    (32, 4, 224, 1344)
    >>> i = np.array([3,5,2,2])
    >>> offset = sum(i * x.strides)
    >>> x[3,5,2,2]
    813
    >>> offset / x.itemsize
    813
    
# numpy.recarray.sum
method
recarray.sum(axis=None, dtype=None, out=None, keepdims=False, initial=0, where=True)
    
Return the sum of the array elements over the given axis.
Refer to `numpy.sum` for full documentation.
See also
`numpy.sum`
    
equivalent function
# numpy.recarray.swapaxes
method
recarray.swapaxes(axis1, axis2)
    
Return a view of the array with `axis1` and `axis2` interchanged.
Refer to `numpy.swapaxes` for full documentation.
See also
`numpy.swapaxes`
    
equivalent function
# numpy.recarray.T
attribute
recarray.T
    
View of the transposed array.
Same as `self.transpose()`.
See also
`transpose`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.T
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.T
    array([1, 2, 3, 4])
    
# numpy.recarray.take
method
recarray.take(indices, axis=None, out=None, mode='raise')
    
Return an array formed from the elements of `a` at the given indices.
Refer to `numpy.take` for full documentation.
See also
`numpy.take`
    
equivalent function
# numpy.recarray.tobytes
method
recarray.tobytes(order='C')
    
Construct Python bytes containing the raw data bytes in the array.
Constructs Python bytes showing a copy of the raw contents of data memory. The bytes object is produced in C-order by default. This behavior is controlled by the `order` parameter.
Parameters:
    
order{‘C’, ‘F’, ‘A’}, optional
    
Controls the memory layout of the bytes object. ‘C’ means C-order, ‘F’ means F-order, ‘A’ (short for Any) means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. Default is ‘C’.
Returns:
    
sbytes
    
Python bytes exhibiting a copy of `a`’s raw data.
See also
`frombuffer`
    
Inverse of this operation, construct a 1-dimensional array from Python bytes.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[0, 1], [2, 3]], dtype='<u2')
    >>> x.tobytes()
    b'\x00\x00\x01\x00\x02\x00\x03\x00'
    >>> x.tobytes('C') == x.tobytes()
    True
    >>> x.tobytes('F')
    b'\x00\x00\x02\x00\x01\x00\x03\x00'
    
# numpy.recarray.tofile
method
recarray.tofile(fid, sep='', format='%s')
    
Write array to a file as text or binary (default).
Data is always written in ‘C’ order, independent of the order of `a`. The data produced by this method can be recovered using the function fromfile().
Parameters:
    
fidfile or str or Path
    
An open file object, or a string containing a filename.
sepstr
    
Separator between array items for text output. If “” (empty), a binary file is written, equivalent to `file.write(a.tobytes())`.
formatstr
    
Format string for text file output. Each entry in the array is formatted to text by first converting it to the closest Python type, and then using “format” % item.
#### Notes
This is a convenience function for quick storage of array data. Information on endianness and precision is lost, so this method is not a good choice for files intended to archive data or transport data between machines with different endianness. Some of these problems can be overcome by outputting the data as text files, at the expense of speed and file size.
When fid is a file object, array contents are directly written to the file, bypassing the file object’s `write` method. As a result, tofile cannot be used with files objects supporting compression (e.g., GzipFile) or file-like objects that do not support `fileno()` (e.g., BytesIO).
# numpy.recarray.tolist
method
recarray.tolist()
    
Return the array as an `a.ndim`-levels deep nested list of Python scalars.
Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible builtin Python type, via the `item` function.
If `a.ndim` is 0, then since the depth of the nested list is 0, it will not be a list at all, but a simple Python scalar.
Parameters:
    
none
Returns:
    
yobject, or list of object, or list of list of object, or …
    
The possibly nested list of array elements.
#### Notes
The array may be recreated via `a = np.array(a.tolist())`, although this may sometimes lose precision.
#### Examples
For a 1D array, `a.tolist()` is almost the same as `list(a)`, except that `tolist` changes numpy scalars to Python scalars:
    
    >>> import numpy as np
    >>> a = np.uint32([1, 2])
    >>> a_list = list(a)
    >>> a_list
    [np.uint32(1), np.uint32(2)]
    >>> type(a_list[0])
    <class 'numpy.uint32'>
    >>> a_tolist = a.tolist()
    >>> a_tolist
    [1, 2]
    >>> type(a_tolist[0])
    <class 'int'>
    
Additionally, for a 2D array, `tolist` applies recursively:
    
    >>> a = np.array([[1, 2], [3, 4]])
    >>> list(a)
    [array([1, 2]), array([3, 4])]
    >>> a.tolist()
    [[1, 2], [3, 4]]
    
The base case for this recursion is a 0D array:
    
    >>> a = np.array(1)
    >>> list(a)
    Traceback (most recent call last):
      ...
    TypeError: iteration over a 0-d array
    >>> a.tolist()
    1
    
# numpy.recarray.tostring
method
recarray.tostring(order='C')
    
A compatibility alias for `tobytes`, with exactly the same behavior.
Despite its name, it returns `bytes` not `str`s.
Deprecated since version 1.19.0.
# numpy.recarray.trace
method
recarray.trace(offset=0, axis1=0, axis2=1, dtype=None, out=None)
    
Return the sum along diagonals of the array.
Refer to `numpy.trace` for full documentation.
See also
`numpy.trace`
    
equivalent function
# numpy.recarray.transpose
method
recarray.transpose(*axes)
    
Returns a view of the array with axes transposed.
Refer to `numpy.transpose` for full documentation.
Parameters:
    
axesNone, tuple of ints, or `n` ints
    
  * None or no argument: reverses the order of the axes.
  * tuple of ints: `i` in the `j`-th place in the tuple means that the array’s `i`-th axis becomes the transposed array’s `j`-th axis.
  * `n` ints: same as an n-tuple of the same ints (this form is intended simply as a “convenience” alternative to the tuple form).


Returns:
    
pndarray
    
View of the array with its axes suitably permuted.
See also
`transpose`
    
Equivalent function.
`ndarray.T`
    
Array property returning the array transposed.
`ndarray.reshape`
    
Give a new shape to an array without changing its data.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> a.transpose()
    array([[1, 3],
           [2, 4]])
    >>> a.transpose((1, 0))
    array([[1, 3],
           [2, 4]])
    >>> a.transpose(1, 0)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> a.transpose()
    array([1, 2, 3, 4])
    
# numpy.recarray.var
method
recarray.var(axis=None, dtype=None, out=None, ddof=0, keepdims=False, *, where=True)
    
Returns the variance of the array elements, along given axis.
Refer to `numpy.var` for full documentation.
See also
`numpy.var`
    
equivalent function
# numpy.recarray.view
method
recarray.view([dtype][, type])
    
New view of array with the same data.
Note
Passing None for `dtype` is different from omitting the parameter, since the former invokes `dtype(None)` which is an alias for `dtype('float64')`.
Parameters:
    
dtypedata-type or ndarray sub-class, optional
    
Data-type descriptor of the returned view, e.g., float32 or int16. Omitting it results in the view having the same data-type as `a`. This argument can also be specified as an ndarray sub-class, which then specifies the type of the returned object (this is equivalent to setting the `type` parameter).
typePython type, optional
    
Type of the returned view, e.g., ndarray or matrix. Again, omission of the parameter results in type preservation.
#### Notes
`a.view()` is used two different ways:
`a.view(some_dtype)` or `a.view(dtype=some_dtype)` constructs a view of the array’s memory with a different data-type. This can cause a reinterpretation of the bytes of memory.
`a.view(ndarray_subclass)` or `a.view(type=ndarray_subclass)` just returns an instance of `ndarray_subclass` that looks at the same array (same shape, dtype, etc.) This does not cause a reinterpretation of the memory.
For `a.view(some_dtype)`, if `some_dtype` has a different number of bytes per entry than the previous dtype (for example, converting a regular array to a structured array), then the last axis of `a` must be contiguous. This axis will be resized in the result.
Changed in version 1.23.0: Only the last axis needs to be contiguous. Previously, the entire array had to be C-contiguous.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([(-1, 2)], dtype=[('a', np.int8), ('b', np.int8)])
    
Viewing array data using a different type and dtype:
    
    >>> nonneg = np.dtype([("a", np.uint8), ("b", np.uint8)])
    >>> y = x.view(dtype=nonneg, type=np.recarray)
    >>> x["a"]
    array([-1], dtype=int8)
    >>> y.a
    array([255], dtype=uint8)
    
Creating a view on a structured array so it can be used in calculations
    
    >>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)])
    >>> xv = x.view(dtype=np.int8).reshape(-1,2)
    >>> xv
    array([[1, 2],
           [3, 4]], dtype=int8)
    >>> xv.mean(0)
    array([2.,  3.])
    
Making changes to the view changes the underlying array
    
    >>> xv[0,1] = 20
    >>> x
    array([(1, 20), (3,  4)], dtype=[('a', 'i1'), ('b', 'i1')])
    
Using a view to convert an array to a recarray:
    
    >>> z = x.view(np.recarray)
    >>> z.a
    array([1, 3], dtype=int8)
    
Views share data:
    
    >>> x[0] = (9, 10)
    >>> z[0]
    np.record((9, 10), dtype=[('a', 'i1'), ('b', 'i1')])
    
Views that change the dtype size (bytes per entry) should normally be avoided on arrays defined by slices, transposes, fortran-ordering, etc.:
    
    >>> x = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int16)
    >>> y = x[:, ::2]
    >>> y
    array([[1, 3],
           [4, 6]], dtype=int16)
    >>> y.view(dtype=[('width', np.int16), ('length', np.int16)])
    Traceback (most recent call last):
        ...
    ValueError: To change to a dtype of a different size, the last axis must be contiguous
    >>> z = y.copy()
    >>> z.view(dtype=[('width', np.int16), ('length', np.int16)])
    array([[(1, 3)],
           [(4, 6)]], dtype=[('width', '<i2'), ('length', '<i2')])
    
However, views that change dtype are totally fine for arrays with a contiguous last axis, even if the rest of the axes are not C-contiguous:
    
    >>> x = np.arange(2 * 3 * 4, dtype=np.int8).reshape(2, 3, 4)
    >>> x.transpose(1, 0, 2).view(np.int16)
    array([[[ 256,  770],
            [3340, 3854]],
    
           [[1284, 1798],
            [4368, 4882]],
    
           [[2312, 2826],
            [5396, 5910]]], dtype=int16)
    
# numpy.reciprocal
numpy.reciprocal(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'reciprocal'>
    
Return the reciprocal of the argument, element-wise.
Calculates `1/x`.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Return array. This is a scalar if `x` is a scalar.
#### Notes
Note
This function is not designed to work with integers.
For integer arguments with absolute value larger than 1 the result is always zero because of the way Python handles integer division. For integer zero the result is an overflow.
#### Examples
    
    >>> import numpy as np
    >>> np.reciprocal(2.)
    0.5
    >>> np.reciprocal([1, 2., 3.33])
    array([ 1.       ,  0.5      ,  0.3003003])
    
# numpy.record.all
method
record.all()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.all`.
# numpy.record.any
method
record.any()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.any`.
# numpy.record.argmax
method
record.argmax()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.argmax`.
# numpy.record.argmin
method
record.argmin()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.argmin`.
# numpy.record.argsort
method
record.argsort()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.argsort`.
# numpy.record.astype
method
record.astype()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.astype`.
# numpy.record.base
attribute
record.base
    
base object
# numpy.record.byteswap
method
record.byteswap()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.byteswap`.
# numpy.record.choose
method
record.choose()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.choose`.
# numpy.record.clip
method
record.clip()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.clip`.
# numpy.record.compress
method
record.compress()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.compress`.
# numpy.record.conjugate
method
record.conjugate()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.conjugate`.
# numpy.record.copy
method
record.copy()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.copy`.
# numpy.record.cumprod
method
record.cumprod()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.cumprod`.
# numpy.record.cumsum
method
record.cumsum()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.cumsum`.
# numpy.record.data
attribute
record.data
    
Pointer to start of data.
# numpy.record.diagonal
method
record.diagonal()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.diagonal`.
# numpy.record.dump
method
record.dump()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.dump`.
# numpy.record.dumps
method
record.dumps()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.dumps`.
# numpy.record.fill
method
record.fill()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.fill`.
# numpy.record.flags
attribute
record.flags
    
integer value of flags
# numpy.record.flat
attribute
record.flat
    
A 1-D view of the scalar.
# numpy.record.flatten
method
record.flatten()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.flatten`.
# numpy.record.getfield
method
record.getfield()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.getfield`.
# numpy.record
classnumpy.record[source]
    
A data-type scalar that allows field access as attribute lookup.
Attributes:
    
`T`
    
Scalar attribute identical to the corresponding array attribute.
`base`
    
base object
`data`
    
Pointer to start of data.
device
`dtype`
    
dtype object
`flags`
    
integer value of flags
`flat`
    
A 1-D view of the scalar.
`imag`
    
The imaginary part of the scalar.
itemset
`itemsize`
    
The length of one element in bytes.
nbytes
`ndim`
    
The number of array dimensions.
newbyteorder
ptp
`real`
    
The real part of the scalar.
`shape`
    
Tuple of array dimensions.
`size`
    
The number of elements in the gentype.
`strides`
    
Tuple of bytes steps in each dimension.
#### Methods
`all`
Scalar method identical to the corresponding array attribute.  
`any`
Scalar method identical to the corresponding array attribute.  
`argmax`
Scalar method identical to the corresponding array attribute.  
`argmin`
Scalar method identical to the corresponding array attribute.  
`argsort`
Scalar method identical to the corresponding array attribute.  
`astype`
Scalar method identical to the corresponding array attribute.  
`byteswap`
Scalar method identical to the corresponding array attribute.  
`choose`
Scalar method identical to the corresponding array attribute.  
`clip`
Scalar method identical to the corresponding array attribute.  
`compress`
Scalar method identical to the corresponding array attribute.  
`conjugate`
Scalar method identical to the corresponding array attribute.  
`copy`
Scalar method identical to the corresponding array attribute.  
`cumprod`
Scalar method identical to the corresponding array attribute.  
`cumsum`
Scalar method identical to the corresponding array attribute.  
`diagonal`
Scalar method identical to the corresponding array attribute.  
`dump`
Scalar method identical to the corresponding array attribute.  
`dumps`
Scalar method identical to the corresponding array attribute.  
`fill`
Scalar method identical to the corresponding array attribute.  
`flatten`
Scalar method identical to the corresponding array attribute.  
`getfield`
Scalar method identical to the corresponding array attribute.  
`item`
Scalar method identical to the corresponding array attribute.  
`max`
Scalar method identical to the corresponding array attribute.  
`mean`
Scalar method identical to the corresponding array attribute.  
`min`
Scalar method identical to the corresponding array attribute.  
`nonzero`
Scalar method identical to the corresponding array attribute.  
`pprint`()
Pretty-print all fields.  
`prod`
Scalar method identical to the corresponding array attribute.  
`put`
Scalar method identical to the corresponding array attribute.  
`ravel`
Scalar method identical to the corresponding array attribute.  
`repeat`
Scalar method identical to the corresponding array attribute.  
`reshape`
Scalar method identical to the corresponding array attribute.  
`resize`
Scalar method identical to the corresponding array attribute.  
`round`
Scalar method identical to the corresponding array attribute.  
`searchsorted`
Scalar method identical to the corresponding array attribute.  
`setfield`
Scalar method identical to the corresponding array attribute.  
`setflags`
Scalar method identical to the corresponding array attribute.  
`sort`
Scalar method identical to the corresponding array attribute.  
`squeeze`
Scalar method identical to the corresponding array attribute.  
`std`
Scalar method identical to the corresponding array attribute.  
`sum`
Scalar method identical to the corresponding array attribute.  
`swapaxes`
Scalar method identical to the corresponding array attribute.  
`take`
Scalar method identical to the corresponding array attribute.  
`tofile`
Scalar method identical to the corresponding array attribute.  
`tolist`
Scalar method identical to the corresponding array attribute.  
`tostring`
Scalar method identical to the corresponding array attribute.  
`trace`
Scalar method identical to the corresponding array attribute.  
`transpose`
Scalar method identical to the corresponding array attribute.  
`var`
Scalar method identical to the corresponding array attribute.  
`view`
Scalar method identical to the corresponding array attribute.  
conj  
to_device  
tobytes  
# numpy.record.item
method
record.item()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.item`.
# numpy.record.itemsize
attribute
record.itemsize
    
The length of one element in bytes.
# numpy.record.max
method
record.max()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.max`.
# numpy.record.mean
method
record.mean()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.mean`.
# numpy.record.min
method
record.min()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.min`.
# numpy.record.nonzero
method
record.nonzero()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.nonzero`.
# numpy.record.pprint
method
record.pprint()[source]
    
Pretty-print all fields.
# numpy.record.prod
method
record.prod()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.prod`.
# numpy.record.put
method
record.put()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.put`.
# numpy.record.ravel
method
record.ravel()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.ravel`.
# numpy.record.repeat
method
record.repeat()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.repeat`.
# numpy.record.reshape
method
record.reshape()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.reshape`.
# numpy.record.resize
method
record.resize()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.resize`.
# numpy.record.round
method
record.round()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.round`.
# numpy.record.searchsorted
method
record.searchsorted()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.searchsorted`.
# numpy.record.setfield
method
record.setfield()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.setfield`.
# numpy.record.setflags
method
record.setflags()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.setflags`.
# numpy.record.sort
method
record.sort()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.sort`.
# numpy.record.squeeze
method
record.squeeze()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.squeeze`.
# numpy.record.std
method
record.std()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.std`.
# numpy.record.strides
attribute
record.strides
    
Tuple of bytes steps in each dimension.
# numpy.record.sum
method
record.sum()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.sum`.
# numpy.record.swapaxes
method
record.swapaxes()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.swapaxes`.
# numpy.record.T
attribute
record.T
    
Scalar attribute identical to the corresponding array attribute.
Please see `ndarray.T`.
# numpy.record.take
method
record.take()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.take`.
# numpy.record.tofile
method
record.tofile()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.tofile`.
# numpy.record.tolist
method
record.tolist()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.tolist`.
# numpy.record.tostring
method
record.tostring()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.tostring`.
# numpy.record.trace
method
record.trace()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.trace`.
# numpy.record.transpose
method
record.transpose()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.transpose`.
# numpy.record.var
method
record.var()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.var`.
# numpy.record.view
method
record.view()
    
Scalar method identical to the corresponding array attribute.
Please see `ndarray.view`.
# numpy.remainder
numpy.remainder(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'remainder'>
    
Returns the element-wise remainder of division.
Computes the remainder complementary to the `floor_divide` function. It is equivalent to the Python modulus operator `x1 % x2` and has the same sign as the divisor `x2`. The MATLAB function equivalent to `np.remainder` is `mod`.
Warning
This should not be confused with:
  * Python 3.7’s `math.remainder` and C’s `remainder`, which computes the IEEE remainder, which are the complement to `round(x1 / x2)`.
  * The MATLAB `rem` function and or the C `%` operator which is the complement to `int(x1 / x2)`.


Parameters:
    
x1array_like
    
Dividend array.
x2array_like
    
Divisor array. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The element-wise remainder of the quotient `floor_divide(x1, x2)`. This is a scalar if both `x1` and `x2` are scalars.
See also
`floor_divide`
    
Equivalent of Python `//` operator.
`divmod`
    
Simultaneous floor division and remainder.
`fmod`
    
Equivalent of the MATLAB `rem` function.
`divide`, `floor`
#### Notes
Returns 0 when `x2` is 0 and both `x1` and `x2` are (arrays of) integers. `mod` is an alias of `remainder`.
#### Examples
    
    >>> import numpy as np
    >>> np.remainder([4, 7], [2, 3])
    array([0, 1])
    >>> np.remainder(np.arange(7), 5)
    array([0, 1, 2, 3, 4, 0, 1])
    
The `%` operator can be used as a shorthand for `np.remainder` on ndarrays.
    
    >>> x1 = np.arange(7)
    >>> x1 % 5
    array([0, 1, 2, 3, 4, 0, 1])
    
# numpy.repeat
numpy.repeat(a, repeats, axis=None)[source]
    
Repeat each element of an array after themselves
Parameters:
    
aarray_like
    
Input array.
repeatsint or array of ints
    
The number of repetitions for each element. `repeats` is broadcasted to fit the shape of the given axis.
axisint, optional
    
The axis along which to repeat values. By default, use the flattened input array, and return a flat output array.
Returns:
    
repeated_arrayndarray
    
Output array which has the same shape as `a`, except along the given axis.
See also
`tile`
    
Tile an array.
`unique`
    
Find the unique elements of an array.
#### Examples
    
    >>> import numpy as np
    >>> np.repeat(3, 4)
    array([3, 3, 3, 3])
    >>> x = np.array([[1,2],[3,4]])
    >>> np.repeat(x, 2)
    array([1, 1, 2, 2, 3, 3, 4, 4])
    >>> np.repeat(x, 3, axis=1)
    array([[1, 1, 1, 2, 2, 2],
           [3, 3, 3, 4, 4, 4]])
    >>> np.repeat(x, [1, 2], axis=0)
    array([[1, 2],
           [3, 4],
           [3, 4]])
    
# numpy.require
numpy.require(a, dtype=None, requirements=None, *, like=None)[source]
    
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:
    
aarray_like
    
The object to be converted to a type-and-requirement-satisfying array.
dtypedata-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.
requirementsstr 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


likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
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
    
    >>> import numpy as np
    >>> 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
    
# numpy.reshape
numpy.reshape(a, /, shape=None, order='C', *, newshape=None, copy=None)[source]
    
Gives a new shape to an array without changing its data.
Parameters:
    
aarray_like
    
Array to be reshaped.
shapeint or tuple of ints
    
The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.
order{‘C’, ‘F’, ‘A’}, optional
    
Read the elements of `a` using this index order, and place the elements into the reshaped array using this index order. ‘C’ means to read / write the elements using C-like index order, with the last axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to read / write the elements using Fortran-like index order, with the first index changing fastest, and the last index changing slowest. Note that the ‘C’ and ‘F’ options take no account of the memory layout of the underlying array, and only refer to the order of indexing. ‘A’ means to read / write the elements in Fortran-like index order if `a` is Fortran contiguous in memory, C-like order otherwise.
newshapeint or tuple of ints
    
Deprecated since version 2.1: Replaced by `shape` argument. Retained for backward compatibility.
copybool, optional
    
If `True`, then the array data is copied. If `None`, a copy will only be made if it’s required by `order`. For `False` it raises a `ValueError` if a copy cannot be avoided. Default: `None`.
Returns:
    
reshaped_arrayndarray
    
This will be a new view object if possible; otherwise, it will be a copy. Note there is no guarantee of the memory layout (C- or Fortran- contiguous) of the returned array.
See also
`ndarray.reshape`
    
Equivalent method.
#### Notes
It is not always possible to change the shape of an array without copying the data.
The `order` keyword gives the index ordering both for fetching the values from `a`, and then placing the values into the output array. For example, let’s say you have an array:
    
    >>> a = np.arange(6).reshape((3, 2))
    >>> a
    array([[0, 1],
           [2, 3],
           [4, 5]])
    
You can think of reshaping as first raveling the array (using the given index order), then inserting the elements from the raveled array into the new array using the same kind of index ordering as was used for the raveling.
    
    >>> np.reshape(a, (2, 3)) # C-like index ordering
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.reshape(np.ravel(a), (2, 3)) # equivalent to C ravel then C reshape
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.reshape(a, (2, 3), order='F') # Fortran-like index ordering
    array([[0, 4, 3],
           [2, 1, 5]])
    >>> np.reshape(np.ravel(a, order='F'), (2, 3), order='F')
    array([[0, 4, 3],
           [2, 1, 5]])
    
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2,3], [4,5,6]])
    >>> np.reshape(a, 6)
    array([1, 2, 3, 4, 5, 6])
    >>> np.reshape(a, 6, order='F')
    array([1, 4, 2, 5, 3, 6])
    
    
    >>> np.reshape(a, (3,-1))       # the unspecified value is inferred to be 2
    array([[1, 2],
           [3, 4],
           [5, 6]])
    
# numpy.resize
numpy.resize(a, new_shape)[source]
    
Return a new array with the specified shape.
If the new array is larger than the original array, then the new array is filled with repeated copies of `a`. Note that this behavior is different from a.resize(new_shape) which fills with zeros instead of repeated copies of `a`.
Parameters:
    
aarray_like
    
Array to be resized.
new_shapeint or tuple of int
    
Shape of resized array.
Returns:
    
reshaped_arrayndarray
    
The new array is formed from the data in the old array, repeated if necessary to fill out the required number of elements. The data are repeated iterating over the array in C-order.
See also
`numpy.reshape`
    
Reshape an array without changing the total size.
`numpy.pad`
    
Enlarge and pad an array.
`numpy.repeat`
    
Repeat elements of an array.
`ndarray.resize`
    
resize an array in-place.
#### Notes
When the total size of the array does not change `reshape` should be used. In most other cases either indexing (to reduce the size) or padding (to increase the size) may be a more appropriate solution.
Warning: This functionality does not consider axes separately, i.e. it does not apply interpolation/extrapolation. It fills the return array with the required number of elements, iterating over `a` in C-order, disregarding axes (and cycling back from the start if the new shape is larger). This functionality is therefore not suitable to resize images, or data where each axis represents a separate and distinct entity.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[0,1],[2,3]])
    >>> np.resize(a,(2,3))
    array([[0, 1, 2],
           [3, 0, 1]])
    >>> np.resize(a,(1,4))
    array([[0, 1, 2, 3]])
    >>> np.resize(a,(2,4))
    array([[0, 1, 2, 3],
           [0, 1, 2, 3]])
    
# numpy.result_type
numpy.result_type(*arrays_and_dtypes)
    
Returns the type that results from applying the NumPy type promotion rules to the arguments.
Type promotion in NumPy works similarly to the rules in languages like C++, with some slight differences. When both scalars and arrays are used, the array’s type takes precedence and the actual value of the scalar is taken into account.
For example, calculating 3*a, where a is an array of 32-bit floats, intuitively should result in a 32-bit float output. If the 3 is a 32-bit integer, the NumPy rules indicate it can’t convert losslessly into a 32-bit float, so a 64-bit float should be the result type. By examining the value of the constant, ‘3’, we see that it fits in an 8-bit integer, which can be cast losslessly into the 32-bit float.
Parameters:
    
arrays_and_dtypeslist of arrays and dtypes
    
The operands of some operation whose result type is needed.
Returns:
    
outdtype
    
The result type.
See also
`dtype`, `promote_types`, `min_scalar_type`, `can_cast`
#### Notes
The specific algorithm used is as follows.
Categories are determined by first checking which of boolean, integer (int/uint), or floating point (float/complex) the maximum kind of all the arrays and the scalars are.
If there are only scalars or the maximum category of the scalars is higher than the maximum category of the arrays, the data types are combined with `promote_types` to produce the return value.
Otherwise, `min_scalar_type` is called on each scalar, and the resulting data types are all combined with `promote_types` to produce the return value.
The set of int values is not a subset of the uint values for types with the same number of bits, something not reflected in `min_scalar_type`, but handled as a special case in `result_type`.
#### Examples
    
    >>> import numpy as np
    >>> np.result_type(3, np.arange(7, dtype='i1'))
    dtype('int8')
    
    
    >>> np.result_type('i4', 'c8')
    dtype('complex128')
    
    
    >>> np.result_type(3.0, -2)
    dtype('float64')
    
# numpy.right_shift
numpy.right_shift(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'right_shift'>
    
Shift the bits of an integer to the right.
Bits are shifted to the right `x2`. Because the internal representation of numbers is in binary format, this operation is equivalent to dividing `x1` by `2**x2`.
Parameters:
    
x1array_like, int
    
Input values.
x2array_like, int
    
Number of bits to remove at the right of `x1`. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray, int
    
Return `x1` with bits shifted `x2` times to the right. This is a scalar if both `x1` and `x2` are scalars.
See also
`left_shift`
    
Shift the bits of an integer to the left.
`binary_repr`
    
Return the binary representation of the input number as a string.
#### Examples
    
    >>> import numpy as np
    >>> np.binary_repr(10)
    '1010'
    >>> np.right_shift(10, 1)
    5
    >>> np.binary_repr(5)
    '101'
    
    
    >>> np.right_shift(10, [1,2,3])
    array([5, 2, 1])
    
The `>>` operator can be used as a shorthand for `np.right_shift` on ndarrays.
    
    >>> x1 = 10
    >>> x2 = np.array([1,2,3])
    >>> x1 >> x2
    array([5, 2, 1])
    
# numpy.rint
numpy.rint(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'rint'>
    
Round elements of the array to the nearest integer.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array is same shape and type as `x`. This is a scalar if `x` is a scalar.
See also
`fix`, `ceil`, `floor`, `trunc`
#### Notes
For values exactly halfway between rounded decimal values, NumPy rounds to the nearest even value. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0])
    >>> np.rint(a)
    array([-2., -2., -0.,  0.,  2.,  2.,  2.])
    
# numpy.roll
numpy.roll(a, shift, axis=None)[source]
    
Roll array elements along a given axis.
Elements that roll beyond the last position are re-introduced at the first.
Parameters:
    
aarray_like
    
Input array.
shiftint or tuple of ints
    
The number of places by which elements are shifted. If a tuple, then `axis` must be a tuple of the same size, and each of the given axes is shifted by the corresponding number. If an int while `axis` is a tuple of ints, then the same value is used for all given axes.
axisint or tuple of ints, optional
    
Axis or axes along which elements are shifted. By default, the array is flattened before shifting, after which the original shape is restored.
Returns:
    
resndarray
    
Output array, with the same shape as `a`.
See also
`rollaxis`
    
Roll the specified axis backwards, until it lies in a given position.
#### Notes
Supports rolling over multiple dimensions simultaneously.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(10)
    >>> np.roll(x, 2)
    array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
    >>> np.roll(x, -2)
    array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
    
    
    >>> x2 = np.reshape(x, (2, 5))
    >>> x2
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    >>> np.roll(x2, 1)
    array([[9, 0, 1, 2, 3],
           [4, 5, 6, 7, 8]])
    >>> np.roll(x2, -1)
    array([[1, 2, 3, 4, 5],
           [6, 7, 8, 9, 0]])
    >>> np.roll(x2, 1, axis=0)
    array([[5, 6, 7, 8, 9],
           [0, 1, 2, 3, 4]])
    >>> np.roll(x2, -1, axis=0)
    array([[5, 6, 7, 8, 9],
           [0, 1, 2, 3, 4]])
    >>> np.roll(x2, 1, axis=1)
    array([[4, 0, 1, 2, 3],
           [9, 5, 6, 7, 8]])
    >>> np.roll(x2, -1, axis=1)
    array([[1, 2, 3, 4, 0],
           [6, 7, 8, 9, 5]])
    >>> np.roll(x2, (1, 1), axis=(1, 0))
    array([[9, 5, 6, 7, 8],
           [4, 0, 1, 2, 3]])
    >>> np.roll(x2, (2, 1), axis=(1, 0))
    array([[8, 9, 5, 6, 7],
           [3, 4, 0, 1, 2]])
    
# numpy.rollaxis
numpy.rollaxis(a, axis, start=0)[source]
    
Roll the specified axis backwards, until it lies in a given position.
This function continues to be supported for backward compatibility, but you should prefer `moveaxis`. The `moveaxis` function was added in NumPy 1.11.
Parameters:
    
andarray
    
Input array.
axisint
    
The axis to be rolled. The positions of the other axes do not change relative to one another.
startint, optional
    
When `start <= axis`, the axis is rolled back until it lies in this position. When `start > axis`, the axis is rolled until it lies before this position. The default, 0, results in a “complete” roll. The following table describes how negative values of `start` are interpreted:
`start`
Normalized `start`  
`-(arr.ndim+1)`
raise `AxisError`  
`-arr.ndim`
0  
⋮
⋮  
`-1`
`arr.ndim-1`  
`0`
`0`  
⋮
⋮  
`arr.ndim`
`arr.ndim`  
`arr.ndim + 1`
raise `AxisError`  
Returns:
    
resndarray
    
For NumPy >= 1.10.0 a view of `a` is always returned. For earlier NumPy versions a view of `a` is returned only if the order of the axes is changed, otherwise the input array is returned.
See also
`moveaxis`
    
Move array axes to new positions.
`roll`
    
Roll the elements of an array by a number of positions along a given axis.
#### Examples
    
    >>> import numpy as np
    >>> a = np.ones((3,4,5,6))
    >>> np.rollaxis(a, 3, 1).shape
    (3, 6, 4, 5)
    >>> np.rollaxis(a, 2).shape
    (5, 3, 4, 6)
    >>> np.rollaxis(a, 1, 4).shape
    (3, 5, 6, 4)
    
# numpy.roots
numpy.roots(p)[source]
    
Return the roots of a polynomial with coefficients given in p.
Note
This forms part of the old polynomial API. Since version 1.4, the new polynomial API defined in `numpy.polynomial` is preferred. A summary of the differences can be found in the transition guide.
The values in the rank-1 array `p` are coefficients of a polynomial. If the length of `p` is n+1 then the polynomial is described by:
    
    p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n]
    
Parameters:
    
parray_like
    
Rank-1 array of polynomial coefficients.
Returns:
    
outndarray
    
An array containing the roots of the polynomial.
Raises:
    
ValueError
    
When `p` cannot be converted to a rank-1 array.
See also
`poly`
    
Find the coefficients of a polynomial with a given sequence of roots.
`polyval`
    
Compute polynomial values.
`polyfit`
    
Least squares polynomial fit.
`poly1d`
    
A one-dimensional polynomial class.
#### Notes
The algorithm relies on computing the eigenvalues of the companion matrix [1].
#### References
[1]
R. A. Horn & C. R. Johnson, Matrix Analysis. Cambridge, UK: Cambridge University Press, 1999, pp. 146-7.
#### Examples
    
    >>> import numpy as np
    >>> coeff = [3.2, 2, 1]
    >>> np.roots(coeff)
    array([-0.3125+0.46351241j, -0.3125-0.46351241j])
    
# numpy.rot90
numpy.rot90(m, k=1, axes=(0, 1))[source]
    
Rotate an array by 90 degrees in the plane specified by axes.
Rotation direction is from the first towards the second axis. This means for a 2D array with the default `k` and `axes`, the rotation will be counterclockwise.
Parameters:
    
marray_like
    
Array of two or more dimensions.
kinteger
    
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:
    
yndarray
    
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
    
    >>> import numpy as np
    >>> 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]]])
    
# numpy.round
numpy.round(a, decimals=0, out=None)[source]
    
Evenly round to the given number of decimals.
Parameters:
    
aarray_like
    
Input data.
decimalsint, optional
    
Number of decimal places to round to (default: 0). If decimals is negative, it specifies the number of positions to the left of the decimal point.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape as the expected output, but the type of the output values will be cast if necessary. See Output type determination for more details.
Returns:
    
rounded_arrayndarray
    
An array of the same type as `a`, containing the rounded values. Unless `out` was specified, a new array is created. A reference to the result is returned.
The real and imaginary parts of complex numbers are rounded separately. The result of rounding a float is a float.
See also
`ndarray.round`
    
equivalent method
`around`
    
an alias for this function
`ceil`, `fix`, `floor`, `rint`, `trunc`
#### Notes
For values exactly halfway between rounded decimal values, NumPy rounds to the nearest even value. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc.
`np.round` uses a fast but sometimes inexact algorithm to round floating-point datatypes. For positive `decimals` it is equivalent to `np.true_divide(np.rint(a * 10**decimals), 10**decimals)`, which has error due to the inexact representation of decimal fractions in the IEEE floating point standard [1] and errors introduced when scaling by powers of ten. For instance, note the extra “1” in the following:
    
    >>> np.round(56294995342131.5, 3)
    56294995342131.51
    
If your goal is to print such values with a fixed number of decimals, it is preferable to use numpy’s float printing routines to limit the number of printed decimals:
    
    >>> np.format_float_positional(56294995342131.5, precision=3)
    '56294995342131.5'
    
The float printing routines use an accurate but much more computationally demanding algorithm to compute the number of digits after the decimal point.
Alternatively, Python’s builtin `round` function uses a more accurate but slower algorithm for 64-bit floating point values:
    
    >>> round(56294995342131.5, 3)
    56294995342131.5
    >>> np.round(16.055, 2), round(16.055, 2)  # equals 16.0549999999999997
    (16.06, 16.05)
    
#### References
[1]
“Lecture Notes on the Status of IEEE 754”, William Kahan, https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
#### Examples
    
    >>> import numpy as np
    >>> np.round([0.37, 1.64])
    array([0., 2.])
    >>> np.round([0.37, 1.64], decimals=1)
    array([0.4, 1.6])
    >>> np.round([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even value
    array([0., 2., 2., 4., 4.])
    >>> np.round([1,2,3,11], decimals=1) # ndarray of ints is returned
    array([ 1,  2,  3, 11])
    >>> np.round([1,2,3,11], decimals=-1)
    array([ 0,  0,  0, 10])
    
# numpy.s_
numpy.s_=<numpy.lib._index_tricks_impl.IndexExpression object>
    
A nicer way to build up index tuples for arrays.
Note
Use one of the two predefined instances `index_exp` or `s_` rather than directly using `IndexExpression`.
For any index combination, including slicing and axis insertion, `a[indices]` is the same as `a[np.index_exp[indices]]` for any array `a`. However, `np.index_exp[indices]` can be used anywhere in Python code and returns a tuple of slice objects that can be used in the construction of complex index expressions.
Parameters:
    
maketuplebool
    
If True, always returns a tuple.
See also
`s_`
    
Predefined instance without tuple conversion: `s_ = IndexExpression(maketuple=False)`. The `index_exp` is another predefined instance that always returns a tuple: `index_exp = IndexExpression(maketuple=True)`.
#### Notes
You can do all this with `slice` plus a few special objects, but there’s a lot to remember and this version is simpler because it uses the standard array indexing syntax.
#### Examples
    
    >>> import numpy as np
    >>> np.s_[2::2]
    slice(2, None, 2)
    >>> np.index_exp[2::2]
    (slice(2, None, 2),)
    
    
    >>> np.array([0, 1, 2, 3, 4])[np.s_[2::2]]
    array([2, 4])
    
# numpy.save
numpy.save(file, arr, allow_pickle=True, fix_imports=<no value>)[source]
    
Save an array to a binary file in NumPy `.npy` format.
Parameters:
    
filefile, str, or pathlib.Path
    
File or filename to which the data is saved. If file is a file-object, then the filename is unchanged. If file is a string or Path, a `.npy` extension will be appended to the filename if it does not already have one.
arrarray_like
    
Array data to be saved.
allow_picklebool, optional
    
Allow saving object arrays using Python pickles. Reasons for disallowing pickles include security (loading pickled data can execute arbitrary code) and portability (pickled objects may not be loadable on different Python installations, for example if the stored objects require libraries that are not available, and not all pickled data is compatible between different versions of Python). Default: True
fix_importsbool, optional
    
The `fix_imports` flag is deprecated and has no effect.
Deprecated since version 2.1: This flag is ignored since NumPy 1.17 and was only needed to support loading some files in Python 2 written in Python 3.
See also
`savez`
    
Save several arrays into a `.npz` archive
`savetxt`, `load`
#### Notes
For a description of the `.npy` format, see `numpy.lib.format`.
Any data saved to the file is appended to the end of the file.
#### Examples
    
    >>> import numpy as np
    
    
    >>> from tempfile import TemporaryFile
    >>> outfile = TemporaryFile()
    
    
    >>> x = np.arange(10)
    >>> np.save(outfile, x)
    
    
    >>> _ = outfile.seek(0) # Only needed to simulate closing & reopening file
    >>> np.load(outfile)
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    
    >>> with open('test.npy', 'wb') as f:
    ...     np.save(f, np.array([1, 2]))
    ...     np.save(f, np.array([1, 3]))
    >>> with open('test.npy', 'rb') as f:
    ...     a = np.load(f)
    ...     b = np.load(f)
    >>> print(a, b)
    # [1 2] [1 3]
    
# numpy.savetxt
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)[source]
    
Save an array to a text file.
Parameters:
    
fnamefilename, file handle or pathlib.Path
    
If the filename ends in `.gz`, the file is automatically saved in compressed gzip format. `loadtxt` understands gzipped files transparently.
X1D or 2D array_like
    
Data to be saved to a text file.
fmtstr or sequence of strs, optional
    
A single format (%10.5f), a sequence of formats, or a multi-format string, e.g. ‘Iteration %d – %10.5f’, in which case `delimiter` is ignored. For complex `X`, the legal options for `fmt` are:
  * a single specifier, `fmt='%.4e'`, resulting in numbers formatted like `' (%s+%sj)' % (fmt, fmt)`
  * a full string specifying every real and imaginary part, e.g. `' %.4e %+.4ej %.4e %+.4ej %.4e %+.4ej'` for 3 columns
  * a list of specifiers, one per column - in this case, the real and imaginary part must have separate specifiers, e.g. `['%.3e + %.3ej', '(%.15e%+.15ej)']` for 2 columns


delimiterstr, optional
    
String or character separating columns.
newlinestr, optional
    
String or character separating lines.
headerstr, optional
    
String that will be written at the beginning of the file.
footerstr, optional
    
String that will be written at the end of the file.
commentsstr, optional
    
String that will be prepended to the `header` and `footer` strings, to mark them as comments. Default: ‘# ‘, as expected by e.g. `numpy.loadtxt`.
encoding{None, str}, optional
    
Encoding used to encode the outputfile. Does not apply to output streams. If the encoding is something other than ‘bytes’ or ‘latin1’ you will not be able to load the file in NumPy versions < 1.14. Default is ‘latin1’.
See also
`save`
    
Save an array to a binary file in NumPy `.npy` format
`savez`
    
Save several arrays into an uncompressed `.npz` archive
`savez_compressed`
    
Save several arrays into a compressed `.npz` archive
#### Notes
Further explanation of the `fmt` parameter (`%[flag]width[.precision]specifier`):
flags:
    
`-` : left justify
`+` : Forces to precede result with + or -.
`0` : Left pad the number with zeros instead of space (see width).
width:
    
Minimum number of characters to be printed. The value is not truncated if it has more characters.
precision:
    
  * For integer specifiers (eg. `d,i,o,x`), the minimum number of digits.
  * For `e, E` and `f` specifiers, the number of digits to print after the decimal point.
  * For `g` and `G`, the maximum number of significant digits.
  * For `s`, the maximum number of characters.


specifiers:
    
`c` : character
`d` or `i` : signed decimal integer
`e` or `E` : scientific notation with `e` or `E`.
`f` : decimal floating point
`g,G` : use the shorter of `e,E` or `f`
`o` : signed octal
`s` : string of characters
`u` : unsigned decimal integer
`x,X` : unsigned hexadecimal integer
This explanation of `fmt` is not complete, for an exhaustive specification see [1].
#### References
[1]
Format Specification Mini-Language, Python Documentation.
#### Examples
    
    >>> import numpy as np
    >>> x = y = z = np.arange(0.0,5.0,1.0)
    >>> np.savetxt('test.out', x, delimiter=',')   # X is an array
    >>> np.savetxt('test.out', (x,y,z))   # x,y,z equal sized 1D arrays
    >>> np.savetxt('test.out', x, fmt='%1.4e')   # use exponential notation
    
# numpy.savez
numpy.savez(file, *args, allow_pickle=True, **kwds)[source]
    
Save several arrays into a single file in uncompressed `.npz` format.
Provide arrays as keyword arguments to store them under the corresponding name in the output file: `savez(fn, x=x, y=y)`.
If arrays are specified as positional arguments, i.e., `savez(fn, x, y)`, their names will be `arr_0`, `arr_1`, etc.
Parameters:
    
filefile, str, or pathlib.Path
    
Either the filename (string) or an open file (file-like object) where the data will be saved. If file is a string or a Path, the `.npz` extension will be appended to the filename if it is not already there.
argsArguments, optional
    
Arrays to save to the file. Please use keyword arguments (see `kwds` below) to assign names to arrays. Arrays specified as args will be named “arr_0”, “arr_1”, and so on.
allow_picklebool, optional
    
Allow saving object arrays using Python pickles. Reasons for disallowing pickles include security (loading pickled data can execute arbitrary code) and portability (pickled objects may not be loadable on different Python installations, for example if the stored objects require libraries that are not available, and not all pickled data is compatible between different versions of Python). Default: True
kwdsKeyword arguments, optional
    
Arrays to save to the file. Each array will be saved to the output file with its corresponding keyword name.
Returns:
    
None
See also
`save`
    
Save a single array to a binary file in NumPy format.
`savetxt`
    
Save an array to a file as plain text.
`savez_compressed`
    
Save several arrays into a compressed `.npz` archive
#### Notes
The `.npz` file format is a zipped archive of files named after the variables they contain. The archive is not compressed and each file in the archive contains one variable in `.npy` format. For a description of the `.npy` format, see `numpy.lib.format`.
When opening the saved `.npz` file with `load` a `NpzFile` object is returned. This is a dictionary-like object which can be queried for its list of arrays (with the `.files` attribute), and for the arrays themselves.
Keys passed in `kwds` are used as filenames inside the ZIP archive. Therefore, keys should be valid filenames; e.g., avoid keys that begin with `/` or contain `.`.
When naming variables with keyword arguments, it is not possible to name a variable `file`, as this would cause the `file` argument to be defined twice in the call to `savez`.
#### Examples
    
    >>> import numpy as np
    >>> from tempfile import TemporaryFile
    >>> outfile = TemporaryFile()
    >>> x = np.arange(10)
    >>> y = np.sin(x)
    
Using `savez` with *args, the arrays are saved with default names.
    
    >>> np.savez(outfile, x, y)
    >>> _ = outfile.seek(0) # Only needed to simulate closing & reopening file
    >>> npzfile = np.load(outfile)
    >>> npzfile.files
    ['arr_0', 'arr_1']
    >>> npzfile['arr_0']
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
Using `savez` with **kwds, the arrays are saved with the keyword names.
    
    >>> outfile = TemporaryFile()
    >>> np.savez(outfile, x=x, y=y)
    >>> _ = outfile.seek(0)
    >>> npzfile = np.load(outfile)
    >>> sorted(npzfile.files)
    ['x', 'y']
    >>> npzfile['x']
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
# numpy.savez_compressed
numpy.savez_compressed(file, *args, allow_pickle=True, **kwds)[source]
    
Save several arrays into a single file in compressed `.npz` format.
Provide arrays as keyword arguments to store them under the corresponding name in the output file: `savez_compressed(fn, x=x, y=y)`.
If arrays are specified as positional arguments, i.e., `savez_compressed(fn, x, y)`, their names will be `arr_0`, `arr_1`, etc.
Parameters:
    
filefile, str, or pathlib.Path
    
Either the filename (string) or an open file (file-like object) where the data will be saved. If file is a string or a Path, the `.npz` extension will be appended to the filename if it is not already there.
argsArguments, optional
    
Arrays to save to the file. Please use keyword arguments (see `kwds` below) to assign names to arrays. Arrays specified as args will be named “arr_0”, “arr_1”, and so on.
allow_picklebool, optional
    
Allow saving object arrays using Python pickles. Reasons for disallowing pickles include security (loading pickled data can execute arbitrary code) and portability (pickled objects may not be loadable on different Python installations, for example if the stored objects require libraries that are not available, and not all pickled data is compatible between different versions of Python). Default: True
kwdsKeyword arguments, optional
    
Arrays to save to the file. Each array will be saved to the output file with its corresponding keyword name.
Returns:
    
None
See also
`numpy.save`
    
Save a single array to a binary file in NumPy format.
`numpy.savetxt`
    
Save an array to a file as plain text.
`numpy.savez`
    
Save several arrays into an uncompressed `.npz` file format
`numpy.load`
    
Load the files created by savez_compressed.
#### Notes
The `.npz` file format is a zipped archive of files named after the variables they contain. The archive is compressed with `zipfile.ZIP_DEFLATED` and each file in the archive contains one variable in `.npy` format. For a description of the `.npy` format, see `numpy.lib.format`.
When opening the saved `.npz` file with `load` a `NpzFile` object is returned. This is a dictionary-like object which can be queried for its list of arrays (with the `.files` attribute), and for the arrays themselves.
#### Examples
    
    >>> import numpy as np
    >>> test_array = np.random.rand(3, 2)
    >>> test_vector = np.random.rand(4)
    >>> np.savez_compressed('/tmp/123', a=test_array, b=test_vector)
    >>> loaded = np.load('/tmp/123.npz')
    >>> print(np.array_equal(test_array, loaded['a']))
    True
    >>> print(np.array_equal(test_vector, loaded['b']))
    True
    
# numpy.searchsorted
numpy.searchsorted(a, v, side='left', sorter=None)[source]
    
Find indices where elements should be inserted to maintain order.
Find the indices into a sorted array `a` such that, if the corresponding elements in `v` were inserted before the indices, the order of `a` would be preserved.
Assuming that `a` is sorted:
`side`
returned index `i` satisfies  
left
`a[i-1] < v <= a[i]`  
right
`a[i-1] <= v < a[i]`  
Parameters:
    
a1-D array_like
    
Input array. If `sorter` is None, then it must be sorted in ascending order, otherwise `sorter` must be an array of indices that sort it.
varray_like
    
Values to insert into `a`.
side{‘left’, ‘right’}, optional
    
If ‘left’, the index of the first suitable location found is given. If ‘right’, return the last such index. If there is no suitable index, return either 0 or N (where N is the length of `a`).
sorter1-D array_like, optional
    
Optional array of integer indices that sort array a into ascending order. They are typically the result of argsort.
Returns:
    
indicesint or array of ints
    
Array of insertion points with the same shape as `v`, or an integer if `v` is a scalar.
See also
`sort`
    
Return a sorted copy of an array.
`histogram`
    
Produce histogram from 1-D data.
#### Notes
Binary search is used to find the required insertion points.
As of NumPy 1.4.0 `searchsorted` works with real/complex arrays containing `nan` values. The enhanced sort order is documented in `sort`.
This function uses the same algorithm as the builtin python `bisect.bisect_left` (`side='left'`) and `bisect.bisect_right` (`side='right'`) functions, which is also vectorized in the `v` argument.
#### Examples
    
    >>> import numpy as np
    >>> np.searchsorted([11,12,13,14,15], 13)
    2
    >>> np.searchsorted([11,12,13,14,15], 13, side='right')
    3
    >>> np.searchsorted([11,12,13,14,15], [-10, 20, 12, 13])
    array([0, 5, 1, 2])
    
When `sorter` is used, the returned indices refer to the sorted array of `a` and not `a` itself:
    
    >>> a = np.array([40, 10, 20, 30])
    >>> sorter = np.argsort(a)
    >>> sorter
    array([1, 2, 3, 0])  # Indices that would sort the array 'a'
    >>> result = np.searchsorted(a, 25, sorter=sorter)
    >>> result
    2
    >>> a[sorter[result]]
    30  # The element at index 2 of the sorted array is 30.
    
# numpy.select
numpy.select(condlist, choicelist, default=0)[source]
    
Return an array drawn from elements in choicelist, depending on conditions.
Parameters:
    
condlistlist of bool ndarrays
    
The list of conditions which determine from which array in `choicelist` the output elements are taken. When multiple conditions are satisfied, the first one encountered in `condlist` is used.
choicelistlist of ndarrays
    
The list of arrays from which the output elements are taken. It has to be of the same length as `condlist`.
defaultscalar, optional
    
The element inserted in `output` when all conditions evaluate to False.
Returns:
    
outputndarray
    
The output at position m is the m-th element of the array in `choicelist` where the m-th element of the corresponding array in `condlist` is True.
See also
`where`
    
Return elements from one of two arrays depending on condition.
`take`, `choose`, `compress`, `diag`, `diagonal`
#### Examples
    
    >>> import numpy as np
    
Beginning with an array of integers from 0 to 5 (inclusive), elements less than `3` are negated, elements greater than `3` are squared, and elements not meeting either of these conditions (exactly `3`) are replaced with a `default` value of `42`.
    
    >>> x = np.arange(6)
    >>> condlist = [x<3, x>3]
    >>> choicelist = [x, x**2]
    >>> np.select(condlist, choicelist, 42)
    array([ 0,  1,  2, 42, 16, 25])
    
When multiple conditions are satisfied, the first one encountered in `condlist` is used.
    
    >>> condlist = [x<=4, x>3]
    >>> choicelist = [x, x**2]
    >>> np.select(condlist, choicelist, 55)
    array([ 0,  1,  2,  3,  4, 25])
    
# numpy.set_printoptions
numpy.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None, *, legacy=None, override_repr=None)[source]
    
Set printing options.
These options determine the way floating point numbers, arrays and other NumPy objects are displayed.
Parameters:
    
precisionint or None, optional
    
Number of digits of precision for floating point output (default 8). May be None if `floatmode` is not `fixed`, to print as many digits as necessary to uniquely specify the value.
thresholdint, optional
    
Total number of array elements which trigger summarization rather than full repr (default 1000). To always use the full repr without summarization, pass `sys.maxsize`.
edgeitemsint, optional
    
Number of array items in summary at beginning and end of each dimension (default 3).
linewidthint, optional
    
The number of characters per line for the purpose of inserting line breaks (default 75).
suppressbool, optional
    
If True, always print floating point numbers using fixed point notation, in which case numbers equal to zero in the current precision will print as zero. If False, then scientific notation is used when absolute value of the smallest number is < 1e-4 or the ratio of the maximum absolute value to the minimum is > 1e3. The default is False.
nanstrstr, optional
    
String representation of floating point not-a-number (default nan).
infstrstr, optional
    
String representation of floating point infinity (default inf).
signstring, either ‘-’, ‘+’, or ‘ ‘, optional
    
Controls printing of the sign of floating-point types. If ‘+’, always print the sign of positive values. If ‘ ‘, always prints a space (whitespace character) in the sign position of positive values. If ‘-’, omit the sign character of positive values. (default ‘-‘)
Changed in version 2.0: The sign parameter can now be an integer type, previously types were floating-point types.
formatterdict of callables, optional
    
If not None, the keys should indicate the type(s) that the respective formatting function applies to. Callables should return a string. Types that are not specified (by their corresponding keys) are handled by the default formatters. Individual types for which a formatter can be set are:
  * ‘bool’
  * ‘int’
  * ‘timedelta’ : a `numpy.timedelta64`
  * ‘datetime’ : a `numpy.datetime64`
  * ‘float’
  * ‘longfloat’ : 128-bit floats
  * ‘complexfloat’
  * ‘longcomplexfloat’ : composed of two 128-bit floats
  * ‘numpystr’ : types `numpy.bytes_` and `numpy.str_`
  * ‘object’ : `np.object_` arrays


Other keys that can be used to set a group of types at once are:
  * ‘all’ : sets all types
  * ‘int_kind’ : sets ‘int’
  * ‘float_kind’ : sets ‘float’ and ‘longfloat’
  * ‘complex_kind’ : sets ‘complexfloat’ and ‘longcomplexfloat’
  * ‘str_kind’ : sets ‘numpystr’


floatmodestr, optional
    
Controls the interpretation of the `precision` option for floating-point types. Can take the following values (default maxprec_equal):
  * ‘fixed’: Always print exactly `precision` fractional digits,
    
even if this would print more or fewer digits than necessary to specify the value uniquely.
  * ‘unique’: Print the minimum number of fractional digits necessary
    
to represent each value uniquely. Different elements may have a different number of digits. The value of the `precision` option is ignored.
  * ‘maxprec’: Print at most `precision` fractional digits, but if
    
an element can be uniquely represented with fewer digits only print it with that many.
  * ‘maxprec_equal’: Print at most `precision` fractional digits,
    
but if every element in the array can be uniquely represented with an equal number of fewer digits, use that many digits for all elements.


legacystring or `False`, optional
    
If set to the string `'1.13'` enables 1.13 legacy printing mode. This approximates numpy 1.13 print output by including a space in the sign position of floats and different behavior for 0d arrays. This also enables 1.21 legacy printing mode (described below).
If set to the string `'1.21'` enables 1.21 legacy printing mode. This approximates numpy 1.21 print output of complex structured dtypes by not inserting spaces after commas that separate fields and after colons.
If set to `'1.25'` approximates printing of 1.25 which mainly means that numeric scalars are printed without their type information, e.g. as `3.0` rather than `np.float64(3.0)`.
If set to `'2.1'`, shape information is not given when arrays are summarized (i.e., multiple elements replaced with `...`).
If set to `False`, disables legacy mode.
Unrecognized strings will be ignored with a warning for forward compatibility.
Changed in version 1.22.0.
Changed in version 2.2.
override_repr: callable, optional
    
If set a passed function will be used for generating arrays’ repr. Other options will be ignored.
See also
`get_printoptions`, `printoptions`, `array2string`
#### Notes
`formatter` is always reset with a call to `set_printoptions`.
Use `printoptions` as a context manager to set the values temporarily.
#### Examples
Floating point precision can be set:
    
    >>> import numpy as np
    >>> np.set_printoptions(precision=4)
    >>> np.array([1.123456789])
    [1.1235]
    
Long arrays can be summarised:
    
    >>> np.set_printoptions(threshold=5)
    >>> np.arange(10)
    array([0, 1, 2, ..., 7, 8, 9], shape=(10,))
    
Small results can be suppressed:
    
    >>> eps = np.finfo(float).eps
    >>> x = np.arange(4.)
    >>> x**2 - (x + eps)**2
    array([-4.9304e-32, -4.4409e-16,  0.0000e+00,  0.0000e+00])
    >>> np.set_printoptions(suppress=True)
    >>> x**2 - (x + eps)**2
    array([-0., -0.,  0.,  0.])
    
A custom formatter can be used to display array elements as desired:
    
    >>> np.set_printoptions(formatter={'all':lambda x: 'int: '+str(-x)})
    >>> x = np.arange(3)
    >>> x
    array([int: 0, int: -1, int: -2])
    >>> np.set_printoptions()  # formatter gets reset
    >>> x
    array([0, 1, 2])
    
To put back the default options, you can use:
    
    >>> np.set_printoptions(edgeitems=3, infstr='inf',
    ... linewidth=75, nanstr='nan', precision=8,
    ... suppress=False, threshold=1000, formatter=None)
    
Also to temporarily override options, use `printoptions` as a context manager:
    
    >>> with np.printoptions(precision=2, suppress=True, threshold=5):
    ...     np.linspace(0, 10, 10)
    array([ 0.  ,  1.11,  2.22, ...,  7.78,  8.89, 10.  ], shape=(10,))
    
# numpy.setbufsize
numpy.setbufsize(size)[source]
    
Set the size of the buffer used in ufuncs.
Changed in version 2.0: The scope of setting the buffer is tied to the `numpy.errstate` context. Exiting a `with errstate():` will also restore the bufsize.
Parameters:
    
sizeint
    
Size of buffer.
Returns:
    
bufsizeint
    
Previous size of ufunc buffer in bytes.
#### Examples
When exiting a `numpy.errstate` context manager the bufsize is restored:
    
    >>> import numpy as np
    >>> with np.errstate():
    ...     np.setbufsize(4096)
    ...     print(np.getbufsize())
    ...
    8192
    4096
    >>> np.getbufsize()
    8192
    
# numpy.setdiff1d
numpy.setdiff1d(ar1, ar2, assume_unique=False)[source]
    
Find the set difference of two arrays.
Return the unique values in `ar1` that are not in `ar2`.
Parameters:
    
ar1array_like
    
Input array.
ar2array_like
    
Input comparison array.
assume_uniquebool
    
If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False.
Returns:
    
setdiff1dndarray
    
1D array of values in `ar1` that are not in `ar2`. The result is sorted when `assume_unique=False`, but otherwise only sorted if the input is sorted.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3, 2, 4, 1])
    >>> b = np.array([3, 4, 5, 6])
    >>> np.setdiff1d(a, b)
    array([1, 2])
    
# numpy.seterr
numpy.seterr(all=None, divide=None, over=None, under=None, invalid=None)[source]
    
Set how floating-point errors are handled.
Note that operations on integer scalar types (such as `int16`) are handled like floating point, and are affected by these settings.
Parameters:
    
all{‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}, optional
    
Set treatment for all types of floating-point errors at once:
  * ignore: Take no action when the exception occurs.
  * warn: Print a `RuntimeWarning` (via the Python `warnings` module).
  * raise: Raise a `FloatingPointError`.
  * call: Call a function specified using the `seterrcall` function.
  * print: Print a warning directly to `stdout`.
  * log: Record error in a Log object specified by `seterrcall`.


The default is not to change the current behavior.
divide{‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}, optional
    
Treatment for division by zero.
over{‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}, optional
    
Treatment for floating-point overflow.
under{‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}, optional
    
Treatment for floating-point underflow.
invalid{‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}, optional
    
Treatment for invalid floating-point operation.
Returns:
    
old_settingsdict
    
Dictionary containing the old settings.
See also
`seterrcall`
    
Set a callback function for the ‘call’ mode.
`geterr`, `geterrcall`, `errstate`
#### Notes
The floating-point exceptions are defined in the IEEE 754 standard [1]:
  * Division by zero: infinite result obtained from finite numbers.
  * Overflow: result too large to be expressed.
  * Underflow: result so close to zero that some precision was lost.
  * Invalid operation: result is not an expressible number, typically indicates that a NaN was produced.


[1]
https://en.wikipedia.org/wiki/IEEE_754
#### Examples
    
    >>> import numpy as np
    >>> orig_settings = np.seterr(all='ignore')  # seterr to known value
    >>> np.int16(32000) * np.int16(3)
    np.int16(30464)
    >>> np.seterr(over='raise')
    {'divide': 'ignore', 'over': 'ignore', 'under': 'ignore', 'invalid': 'ignore'}
    >>> old_settings = np.seterr(all='warn', over='raise')
    >>> np.int16(32000) * np.int16(3)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    FloatingPointError: overflow encountered in scalar multiply
    
    
    >>> old_settings = np.seterr(all='print')
    >>> np.geterr()
    {'divide': 'print', 'over': 'print', 'under': 'print', 'invalid': 'print'}
    >>> np.int16(32000) * np.int16(3)
    np.int16(30464)
    >>> np.seterr(**orig_settings)  # restore original
    {'divide': 'print', 'over': 'print', 'under': 'print', 'invalid': 'print'}
    
# numpy.seterrcall
numpy.seterrcall(func)[source]
    
Set the floating-point error callback function or log object.
There are two ways to capture floating-point error messages. The first is to set the error-handler to ‘call’, using `seterr`. Then, set the function to call using this function.
The second is to set the error-handler to ‘log’, using `seterr`. Floating-point errors then trigger a call to the ‘write’ method of the provided object.
Parameters:
    
funccallable f(err, flag) or object with write method
    
Function to call upon floating-point errors (‘call’-mode) or object whose ‘write’ method is used to log such message (‘log’-mode).
The call function takes two arguments. The first is a string describing the type of error (such as “divide by zero”, “overflow”, “underflow”, or “invalid value”), and the second is the status flag. The flag is a byte, whose four least-significant bits indicate the type of error, one of “divide”, “over”, “under”, “invalid”:
    
    [0 0 0 0 divide over under invalid]
    
In other words, `flags = divide + 2*over + 4*under + 8*invalid`.
If an object is provided, its write method should take one argument, a string.
Returns:
    
hcallable, log instance or None
    
The old error handler.
See also
`seterr`, `geterr`, `geterrcall`
#### Examples
Callback upon error:
    
    >>> def err_handler(type, flag):
    ...     print("Floating point error (%s), with flag %s" % (type, flag))
    ...
    
    
    >>> import numpy as np
    
    
    >>> orig_handler = np.seterrcall(err_handler)
    >>> orig_err = np.seterr(all='call')
    
    
    >>> np.array([1, 2, 3]) / 0.0
    Floating point error (divide by zero), with flag 1
    array([inf, inf, inf])
    
    
    >>> np.seterrcall(orig_handler)
    <function err_handler at 0x...>
    >>> np.seterr(**orig_err)
    {'divide': 'call', 'over': 'call', 'under': 'call', 'invalid': 'call'}
    
Log error message:
    
    >>> class Log:
    ...     def write(self, msg):
    ...         print("LOG: %s" % msg)
    ...
    
    
    >>> log = Log()
    >>> saved_handler = np.seterrcall(log)
    >>> save_err = np.seterr(all='log')
    
    
    >>> np.array([1, 2, 3]) / 0.0
    LOG: Warning: divide by zero encountered in divide
    array([inf, inf, inf])
    
    
    >>> np.seterrcall(orig_handler)
    <numpy.Log object at 0x...>
    >>> np.seterr(**orig_err)
    {'divide': 'log', 'over': 'log', 'under': 'log', 'invalid': 'log'}
    
# numpy.setxor1d
numpy.setxor1d(ar1, ar2, assume_unique=False)[source]
    
Find the set exclusive-or of two arrays.
Return the sorted, unique values that are in only one (not both) of the input arrays.
Parameters:
    
ar1, ar2array_like
    
Input arrays.
assume_uniquebool
    
If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False.
Returns:
    
setxor1dndarray
    
Sorted 1D array of unique values that are in only one of the input arrays.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3, 2, 4])
    >>> b = np.array([2, 3, 5, 7, 5])
    >>> np.setxor1d(a,b)
    array([1, 4, 5, 7])
    
# numpy.shape
numpy.shape(a)[source]
    
Return the shape of an array.
Parameters:
    
aarray_like
    
Input array.
Returns:
    
shapetuple of ints
    
The elements of the shape tuple give the lengths of the corresponding array dimensions.
See also
`len`
    
`len(a)` is equivalent to `np.shape(a)[0]` for N-D arrays with `N>=1`.
`ndarray.shape`
    
Equivalent array method.
#### Examples
    
    >>> import numpy as np
    >>> np.shape(np.eye(3))
    (3, 3)
    >>> np.shape([[1, 3]])
    (1, 2)
    >>> np.shape([0])
    (1,)
    >>> np.shape(0)
    ()
    
    
    >>> a = np.array([(1, 2), (3, 4), (5, 6)],
    ...              dtype=[('x', 'i4'), ('y', 'i4')])
    >>> np.shape(a)
    (3,)
    >>> a.shape
    (3,)
    
# numpy.shares_memory
numpy.shares_memory(a, b, /, max_work=None)
    
Determine if two arrays share memory.
Warning
This function can be exponentially slow for some inputs, unless `max_work` is set to zero or a positive integer. If in doubt, use `numpy.may_share_memory` instead.
Parameters:
    
a, bndarray
    
Input arrays
max_workint, optional
    
Effort to spend on solving the overlap problem (maximum number of candidate solutions to consider). The following special values are recognized:
max_work=-1 (default)
    
The problem is solved exactly. In this case, the function returns True only if there is an element shared between the arrays. Finding the exact solution may take extremely long in some cases.
max_work=0
    
Only the memory bounds of a and b are checked. This is equivalent to using `may_share_memory()`.
Returns:
    
outbool
Raises:
    
numpy.exceptions.TooHardError
    
Exceeded max_work.
See also
`may_share_memory`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3, 4])
    >>> np.shares_memory(x, np.array([5, 6, 7]))
    False
    >>> np.shares_memory(x[::2], x)
    True
    >>> np.shares_memory(x[::2], x[1::2])
    False
    
Checking whether two arrays share memory is NP-complete, and runtime may increase exponentially in the number of dimensions. Hence, `max_work` should generally be set to a finite number, as it is possible to construct examples that take extremely long to run:
    
    >>> from numpy.lib.stride_tricks import as_strided
    >>> x = np.zeros([192163377], dtype=np.int8)
    >>> x1 = as_strided(
    ...     x, strides=(36674, 61119, 85569), shape=(1049, 1049, 1049))
    >>> x2 = as_strided(
    ...     x[64023025:], strides=(12223, 12224, 1), shape=(1049, 1049, 1))
    >>> np.shares_memory(x1, x2, max_work=1000)
    Traceback (most recent call last):
    ...
    numpy.exceptions.TooHardError: Exceeded max_work
    
Running `np.shares_memory(x1, x2)` without `max_work` set takes around 1 minute for this case. It is possible to find problems that take still significantly longer.
# numpy.show_config
numpy.show_config(mode='stdout')[source]
    
Show libraries and system information on which NumPy was built and is being used
Parameters:
    
mode{`‘stdout’`, `‘dicts’`}, optional.
    
Indicates how to display the config information. `‘stdout’` prints to console, `‘dicts’` returns a dictionary of the configuration.
Returns:
    
out{`dict`, `None`}
    
If mode is `‘dicts’`, a dict is returned, else None
See also
`get_include`
    
Returns the directory containing NumPy C header files.
#### Notes
  1. The `‘stdout’` mode will give more readable output if `pyyaml` is installed


# numpy.show_runtime
numpy.show_runtime()[source]
    
Print information about various resources in the system including available intrinsic support and BLAS/LAPACK library in use
New in version 1.24.0.
See also
`show_config`
    
Show libraries in the system on which NumPy was built.
#### Notes
  1. Information is derived with the help of threadpoolctl library if available.
  2. SIMD related information is derived from `__cpu_features__`, `__cpu_baseline__` and `__cpu_dispatch__`


# numpy.sign
numpy.sign(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'sign'>
    
Returns an element-wise indication of the sign of a number.
The `sign` function returns `-1 if x < 0, 0 if x==0, 1 if x > 0`. nan is returned for nan inputs.
For complex inputs, the `sign` function returns `x / abs(x)`, the generalization of the above (and `0 if x==0`).
Changed in version 2.0.0: Definition of complex sign changed to follow the Array API standard.
Parameters:
    
xarray_like
    
Input values.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The sign of `x`. This is a scalar if `x` is a scalar.
#### Notes
There is more than one definition of sign in common use for complex numbers. The definition used here, \\(x/|x|\\), is the more common and useful one, but is different from the one used in numpy prior to version 2.0, \\(x/\sqrt{x*x}\\), which is equivalent to `sign(x.real) + 0j if x.real != 0 else sign(x.imag) + 0j`.
#### Examples
    
    >>> import numpy as np
    >>> np.sign([-5., 4.5])
    array([-1.,  1.])
    >>> np.sign(0)
    0
    >>> np.sign([3-4j, 8j])
    array([0.6-0.8j, 0. +1.j ])
    
# numpy.signbit
numpy.signbit(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'signbit'>
    
Returns element-wise True where signbit is set (less than zero).
Parameters:
    
xarray_like
    
The input value(s).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
resultndarray of bool
    
Output array, or reference to `out` if that was supplied. This is a scalar if `x` is a scalar.
#### Examples
    
    >>> import numpy as np
    >>> np.signbit(-1.2)
    True
    >>> np.signbit(np.array([1, -2.3, 2.1]))
    array([False,  True, False])
    
# numpy.sin
numpy.sin(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'sin'>
    
Trigonometric sine, element-wise.
Parameters:
    
xarray_like
    
Angle, in radians (\\(2 \pi\\) rad equals 360 degrees).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yarray_like
    
The sine of each element of x. This is a scalar if `x` is a scalar.
See also
`arcsin`, `sinh`, `cos`
#### Notes
The sine is one of the fundamental functions of trigonometry (the mathematical study of triangles). Consider a circle of radius 1 centered on the origin. A ray comes in from the \\(+x\\) axis, makes an angle at the origin (measured counter-clockwise from that axis), and departs from the origin. The \\(y\\) coordinate of the outgoing ray’s intersection with the unit circle is the sine of that angle. It ranges from -1 for \\(x=3\pi / 2\\) to +1 for \\(\pi / 2.\\) The function has zeroes where the angle is a multiple of \\(\pi\\). Sines of angles between \\(\pi\\) and \\(2\pi\\) are negative. The numerous properties of the sine and related functions are included in any standard trigonometry text.
#### Examples
    
    >>> import numpy as np
    
Print sine of one angle:
    
    >>> np.sin(np.pi/2.)
    1.0
    
Print sines of an array of angles given in degrees:
    
    >>> np.sin(np.array((0., 30., 45., 60., 90.)) * np.pi / 180. )
    array([ 0.        ,  0.5       ,  0.70710678,  0.8660254 ,  1.        ])
    
Plot the sine function:
    
    >>> import matplotlib.pylab as plt
    >>> x = np.linspace(-np.pi, np.pi, 201)
    >>> plt.plot(x, np.sin(x))
    >>> plt.xlabel('Angle [rad]')
    >>> plt.ylabel('sin(x)')
    >>> plt.axis('tight')
    >>> plt.show()
    
# numpy.sinc
numpy.sinc(x)[source]
    
Return the normalized sinc function.
The sinc function is equal to \\(\sin(\pi x)/(\pi x)\\) for any argument \\(x\ne 0\\). `sinc(0)` takes the limit value 1, making `sinc` not only everywhere continuous but also infinitely differentiable.
Note
Note the normalization factor of `pi` used in the definition. This is the most commonly used definition in signal processing. Use `sinc(x / np.pi)` to obtain the unnormalized sinc function \\(\sin(x)/x\\) that is more common in mathematics.
Parameters:
    
xndarray
    
Array (possibly multi-dimensional) of values for which to calculate `sinc(x)`.
Returns:
    
outndarray
    
`sinc(x)`, which has the same shape as the input.
#### Notes
The name sinc is short for “sine cardinal” or “sinus cardinalis”.
The sinc function is used in various signal processing applications, including in anti-aliasing, in the construction of a Lanczos resampling filter, and in interpolation.
For bandlimited interpolation of discrete-time signals, the ideal interpolation kernel is proportional to the sinc function.
#### References
[1]
Weisstein, Eric W. “Sinc Function.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/SincFunction.html
[2]
Wikipedia, “Sinc function”, https://en.wikipedia.org/wiki/Sinc_function
#### Examples
    
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(-4, 4, 41)
    >>> np.sinc(x)
     array([-3.89804309e-17,  -4.92362781e-02,  -8.40918587e-02, # may vary
            -8.90384387e-02,  -5.84680802e-02,   3.89804309e-17,
            6.68206631e-02,   1.16434881e-01,   1.26137788e-01,
            8.50444803e-02,  -3.89804309e-17,  -1.03943254e-01,
            -1.89206682e-01,  -2.16236208e-01,  -1.55914881e-01,
            3.89804309e-17,   2.33872321e-01,   5.04551152e-01,
            7.56826729e-01,   9.35489284e-01,   1.00000000e+00,
            9.35489284e-01,   7.56826729e-01,   5.04551152e-01,
            2.33872321e-01,   3.89804309e-17,  -1.55914881e-01,
           -2.16236208e-01,  -1.89206682e-01,  -1.03943254e-01,
           -3.89804309e-17,   8.50444803e-02,   1.26137788e-01,
            1.16434881e-01,   6.68206631e-02,   3.89804309e-17,
            -5.84680802e-02,  -8.90384387e-02,  -8.40918587e-02,
            -4.92362781e-02,  -3.89804309e-17])
    
    
    >>> plt.plot(x, np.sinc(x))
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.title("Sinc Function")
    Text(0.5, 1.0, 'Sinc Function')
    >>> plt.ylabel("Amplitude")
    Text(0, 0.5, 'Amplitude')
    >>> plt.xlabel("X")
    Text(0.5, 0, 'X')
    >>> plt.show()
    
# numpy.sinh
numpy.sinh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'sinh'>
    
Hyperbolic sine, element-wise.
Equivalent to `1/2 * (np.exp(x) - np.exp(-x))` or `-1j * np.sin(1j*x)`.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding hyperbolic sine values. This is a scalar if `x` is a scalar.
#### Notes
If `out` is provided, the function writes the result into it, and returns a reference to `out`. (See Examples)
#### References
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions. New York, NY: Dover, 1972, pg. 83.
#### Examples
    
    >>> import numpy as np
    >>> np.sinh(0)
    0.0
    >>> np.sinh(np.pi*1j/2)
    1j
    >>> np.sinh(np.pi*1j) # (exact value is 0)
    1.2246063538223773e-016j
    >>> # Discrepancy due to vagaries of floating point arithmetic.
    
    
    >>> # Example of providing the optional output parameter
    >>> out1 = np.array([0], dtype='d')
    >>> out2 = np.sinh([0.1], out1)
    >>> out2 is out1
    True
    
    
    >>> # Example of ValueError due to provision of shape mis-matched `out`
    >>> np.sinh(np.zeros((3,3)),np.zeros((2,2)))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (3,3) (2,2)
    
# numpy.size
numpy.size(a, axis=None)[source]
    
Return the number of elements along a given axis.
Parameters:
    
aarray_like
    
Input data.
axisint, optional
    
Axis along which the elements are counted. By default, give the total number of elements.
Returns:
    
element_countint
    
Number of elements along the specified axis.
See also
`shape`
    
dimensions of array
`ndarray.shape`
    
dimensions of array
`ndarray.size`
    
number of elements in array
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,2,3],[4,5,6]])
    >>> np.size(a)
    6
    >>> np.size(a,1)
    3
    >>> np.size(a,0)
    2
    
# numpy.sort
numpy.sort(a, axis=-1, kind=None, order=None, *, stable=None)[source]
    
Return a sorted copy of an array.
Parameters:
    
aarray_like
    
Array to be sorted.
axisint or None, optional
    
Axis along which to sort. If None, the array is flattened before sorting. The default is -1, which sorts along the last axis.
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional
    
Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort or radix sort under the covers and, in general, the actual implementation will vary with data type. The ‘mergesort’ option is retained for backwards compatibility.
orderstr or list of str, optional
    
When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.
stablebool, optional
    
Sort stability. If `True`, the returned array will maintain the relative order of `a` values which compare as equal. If `False` or `None`, this is not guaranteed. Internally, this option selects `kind='stable'`. Default: `None`.
New in version 2.0.0.
Returns:
    
sorted_arrayndarray
    
Array of the same type and shape as `a`.
See also
`ndarray.sort`
    
Method to sort an array in-place.
`argsort`
    
Indirect sort.
`lexsort`
    
Indirect stable sort on multiple keys.
`searchsorted`
    
Find elements in a sorted array.
`partition`
    
Partial sort.
#### Notes
The various sorting algorithms are characterized by their average speed, worst case performance, work space size, and whether they are stable. A stable sort keeps items with the same key in the same relative order. The four algorithms implemented in NumPy have the following properties:
kind
speed
worst case
work space
stable  
‘quicksort’
1
O(n^2)
0
no  
‘heapsort’
3
O(n*log(n))
0
no  
‘mergesort’
2
O(n*log(n))
~n/2
yes  
‘timsort’
2
O(n*log(n))
~n/2
yes  
Note
The datatype determines which of ‘mergesort’ or ‘timsort’ is actually used, even if ‘mergesort’ is specified. User selection at a finer scale is not currently available.
For performance, `sort` makes a temporary copy if needed to make the data contiguous in memory along the sort axis. For even better performance and reduced memory consumption, ensure that the array is already contiguous along the sort axis.
The sort order for complex numbers is lexicographic. If both the real and imaginary parts are non-nan then the order is determined by the real parts except when they are equal, in which case the order is determined by the imaginary parts.
Previous to numpy 1.4.0 sorting real and complex arrays containing nan values led to undefined behaviour. In numpy versions >= 1.4.0 nan values are sorted to the end. The extended sort order is:
  * Real: [R, nan]
  * Complex: [R + Rj, R + nanj, nan + Rj, nan + nanj]


where R is a non-nan real value. Complex values with the same nan placements are sorted according to the non-nan part if it exists. Non-nan values are sorted as before.
quicksort has been changed to: introsort. When sorting does not make enough progress it switches to heapsort. This implementation makes quicksort O(n*log(n)) in the worst case.
‘stable’ automatically chooses the best stable sorting algorithm for the data type being sorted. It, along with ‘mergesort’ is currently mapped to timsort or radix sort depending on the data type. API forward compatibility currently limits the ability to select the implementation and it is hardwired for the different data types.
Timsort is added for better performance on already or nearly sorted data. On random data timsort is almost identical to mergesort. It is now used for stable sort while quicksort is still the default sort if none is chosen. For timsort details, refer to CPython listsort.txt ‘mergesort’ and ‘stable’ are mapped to radix sort for integer data types. Radix sort is an O(n) sort instead of O(n log n).
NaT now sorts to the end of arrays for consistency with NaN.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1,4],[3,1]])
    >>> np.sort(a)                # sort along the last axis
    array([[1, 4],
           [1, 3]])
    >>> np.sort(a, axis=None)     # sort the flattened array
    array([1, 1, 3, 4])
    >>> np.sort(a, axis=0)        # sort along the first axis
    array([[1, 1],
           [3, 4]])
    
Use the `order` keyword to specify a field to use when sorting a structured array:
    
    >>> dtype = [('name', 'S10'), ('height', float), ('age', int)]
    >>> values = [('Arthur', 1.8, 41), ('Lancelot', 1.9, 38),
    ...           ('Galahad', 1.7, 38)]
    >>> a = np.array(values, dtype=dtype)       # create a structured array
    >>> np.sort(a, order='height')                        
    array([('Galahad', 1.7, 38), ('Arthur', 1.8, 41),
           ('Lancelot', 1.8999999999999999, 38)],
          dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])
    
Sort by age, then height if ages are equal:
    
    >>> np.sort(a, order=['age', 'height'])               
    array([('Galahad', 1.7, 38), ('Lancelot', 1.8999999999999999, 38),
           ('Arthur', 1.8, 41)],
          dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])
    
# numpy.sort_complex
numpy.sort_complex(a)[source]
    
Sort a complex array using the real part first, then the imaginary part.
Parameters:
    
aarray_like
    
Input array
Returns:
    
outcomplex ndarray
    
Always returns a sorted complex array.
#### Examples
    
    >>> import numpy as np
    >>> np.sort_complex([5, 3, 6, 2, 1])
    array([1.+0.j, 2.+0.j, 3.+0.j, 5.+0.j, 6.+0.j])
    
    
    >>> np.sort_complex([1 + 2j, 2 - 1j, 3 - 2j, 3 - 3j, 3 + 5j])
    array([1.+2.j,  2.-1.j,  3.-3.j,  3.-2.j,  3.+5.j])
    
# numpy.spacing
numpy.spacing(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'spacing'>
    
Return the distance between x and the nearest adjacent number.
Parameters:
    
xarray_like
    
Values to find the spacing of.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
The spacing of values of `x`. This is a scalar if `x` is a scalar.
#### Notes
It can be considered as a generalization of EPS: `spacing(np.float64(1)) == np.finfo(np.float64).eps`, and there should not be any representable number between `x + spacing(x)` and x for any finite x.
Spacing of +- inf and NaN is NaN.
#### Examples
    
    >>> import numpy as np
    >>> np.spacing(1) == np.finfo(np.float64).eps
    True
    
# numpy.split
numpy.split(ary, indices_or_sections, axis=0)[source]
    
Split an array into multiple sub-arrays as views into `ary`.
Parameters:
    
aryndarray
    
Array to be divided into sub-arrays.
indices_or_sectionsint or 1-D array
    
If `indices_or_sections` is an integer, N, the array will be divided into N equal arrays along `axis`. If such a split is not possible, an error is raised.
If `indices_or_sections` is a 1-D array of sorted integers, the entries indicate where along `axis` the array is split. For example, `[2, 3]` would, for `axis=0`, result in
  * ary[:2]
  * ary[2:3]
  * ary[3:]


If an index exceeds the dimension of the array along `axis`, an empty sub-array is returned correspondingly.
axisint, optional
    
The axis along which to split, default is 0.
Returns:
    
sub-arrayslist of ndarrays
    
A list of sub-arrays as views into `ary`.
Raises:
    
ValueError
    
If `indices_or_sections` is given as an integer, but a split does not result in equal division.
See also
`array_split`
    
Split an array into multiple sub-arrays of equal or near-equal size. Does not raise an exception if an equal division cannot be made.
`hsplit`
    
Split array into multiple sub-arrays horizontally (column-wise).
`vsplit`
    
Split array into multiple sub-arrays vertically (row wise).
`dsplit`
    
Split array into multiple sub-arrays along the 3rd axis (depth).
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`vstack`
    
Stack arrays in sequence vertically (row wise).
`dstack`
    
Stack arrays in sequence depth wise (along third dimension).
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(9.0)
    >>> np.split(x, 3)
    [array([0.,  1.,  2.]), array([3.,  4.,  5.]), array([6.,  7.,  8.])]
    
    
    >>> x = np.arange(8.0)
    >>> np.split(x, [3, 5, 6, 10])
    [array([0.,  1.,  2.]),
     array([3.,  4.]),
     array([5.]),
     array([6.,  7.]),
     array([], dtype=float64)]
    
# numpy.sqrt
numpy.sqrt(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'sqrt'>
    
Return the non-negative square-root of an array, element-wise.
Parameters:
    
xarray_like
    
The values whose square-roots are required.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
An array of the same shape as `x`, containing the positive square-root of each element in `x`. If any element in `x` is complex, a complex array is returned (and the square-roots of negative reals are calculated). If all of the elements in `x` are real, so is `y`, with negative elements returning `nan`. If `out` was provided, `y` is a reference to it. This is a scalar if `x` is a scalar.
See also
`emath.sqrt`
    
A version which returns complex numbers when given negative reals. Note that 0.0 and -0.0 are handled differently for complex inputs.
#### Notes
sqrt has–consistent with common convention–as its branch cut the real “interval” [`-inf`, 0), and is continuous from above on it. A branch cut is a curve in the complex plane across which a given complex function fails to be continuous.
#### Examples
    
    >>> import numpy as np
    >>> np.sqrt([1,4,9])
    array([ 1.,  2.,  3.])
    
    
    >>> np.sqrt([4, -1, -3+4J])
    array([ 2.+0.j,  0.+1.j,  1.+2.j])
    
    
    >>> np.sqrt([4, -1, np.inf])
    array([ 2., nan, inf])
    
# numpy.square
numpy.square(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'square'>
    
Return the element-wise square of the input.
Parameters:
    
xarray_like
    
Input data.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Element-wise `x*x`, of the same shape and dtype as `x`. This is a scalar if `x` is a scalar.
See also
`numpy.linalg.matrix_power`
`sqrt`
`power`
#### Examples
    
    >>> import numpy as np
    >>> np.square([-1j, 1])
    array([-1.-0.j,  1.+0.j])
    
# numpy.squeeze
numpy.squeeze(a, axis=None)[source]
    
Remove axes of length one from `a`.
Parameters:
    
aarray_like
    
Input data.
axisNone or int or tuple of ints, optional
    
Selects a subset of the entries of length one in the shape. If an axis is selected with shape entry greater than one, an error is raised.
Returns:
    
squeezedndarray
    
The input array, but with all or a subset of the dimensions of length 1 removed. This is always `a` itself or a view into `a`. Note that if all axes are squeezed, the result is a 0d array and not a scalar.
Raises:
    
ValueError
    
If `axis` is not None, and an axis being squeezed is not of length 1
See also
`expand_dims`
    
The inverse operation, adding entries of length one
`reshape`
    
Insert, remove, and combine dimensions, and resize existing ones
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[[0], [1], [2]]])
    >>> x.shape
    (1, 3, 1)
    >>> np.squeeze(x).shape
    (3,)
    >>> np.squeeze(x, axis=0).shape
    (3, 1)
    >>> np.squeeze(x, axis=1).shape
    Traceback (most recent call last):
    ...
    ValueError: cannot select an axis to squeeze out which has size
    not equal to one
    >>> np.squeeze(x, axis=2).shape
    (1, 3)
    >>> x = np.array([[1234]])
    >>> x.shape
    (1, 1)
    >>> np.squeeze(x)
    array(1234)  # 0d array
    >>> np.squeeze(x).shape
    ()
    >>> np.squeeze(x)[()]
    1234
    
# numpy.stack
numpy.stack(arrays, axis=0, out=None, *, dtype=None, casting='same_kind')[source]
    
Join a sequence of arrays along a new axis.
The `axis` parameter specifies the index of the new axis in the dimensions of the result. For example, if `axis=0` it will be the first dimension and if `axis=-1` it will be the last dimension.
Parameters:
    
arrayssequence of ndarrays
    
Each array must have the same shape. In the case of a single ndarray array_like input, it will be treated as a sequence of arrays; i.e., each element along the zeroth axis is treated as a separate array.
axisint, optional
    
The axis in the result array along which the input arrays are stacked.
outndarray, optional
    
If provided, the destination to place the result. The shape must be correct, matching that of what stack would have returned if no out argument were specified.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.24.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’.
New in version 1.24.
Returns:
    
stackedndarray
    
The stacked array has one more dimension than the input arrays.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`split`
    
Split array into a list of multiple sub-arrays of equal size.
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Examples
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> arrays = [rng.normal(size=(3,4)) for _ in range(10)]
    >>> np.stack(arrays, axis=0).shape
    (10, 3, 4)
    
    
    >>> np.stack(arrays, axis=1).shape
    (3, 10, 4)
    
    
    >>> np.stack(arrays, axis=2).shape
    (3, 4, 10)
    
    
    >>> a = np.array([1, 2, 3])
    >>> b = np.array([4, 5, 6])
    >>> np.stack((a, b))
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> np.stack((a, b), axis=-1)
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
# numpy.std
numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>, mean=<no value>, correction=<no value>)[source]
    
Compute the standard deviation along the specified axis.
Returns the standard deviation, a measure of the spread of a distribution, of the array elements. The standard deviation is computed for the flattened array by default, otherwise over the specified axis.
Parameters:
    
aarray_like
    
Calculate the standard deviation of these values.
axisNone or int or tuple of ints, optional
    
Axis or axes along which the standard deviation is computed. The default is to compute the standard deviation of the flattened array. If this is a tuple of ints, a standard deviation is performed over multiple axes, instead of a single axis or all the axes as before.
dtypedtype, optional
    
Type to use in computing the standard deviation. For arrays of integer type the default is float64, for arrays of float types it is the same as the array type.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape as the expected output but the type (of the calculated values) will be cast if necessary. See Output type determination for more details.
ddof{int, float}, optional
    
Means Delta Degrees of Freedom. The divisor used in calculations is `N - ddof`, where `N` represents the number of elements. By default `ddof` is zero. See Notes for details about use of `ddof`.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `std` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in the standard deviation. See `reduce` for details.
New in version 1.20.0.
meanarray_like, optional
    
Provide the mean to prevent its recalculation. The mean should have a shape as if it was calculated with `keepdims=True`. The axis for the calculation of the mean should be the same as used in the call to this std function.
New in version 2.0.0.
correction{int, float}, optional
    
Array API compatible name for the `ddof` parameter. Only one of them can be provided at the same time.
New in version 2.0.0.
Returns:
    
standard_deviationndarray, see dtype parameter above.
    
If `out` is None, return a new array containing the standard deviation, otherwise return a reference to the output array.
See also
`var`, `mean`, `nanmean`, `nanstd`, `nanvar`
Output type determination
#### Notes
There are several common variants of the array standard deviation calculation. Assuming the input `a` is a one-dimensional NumPy array and `mean` is either provided as an argument or computed as `a.mean()`, NumPy computes the standard deviation of an array as:
    
    N = len(a)
    d2 = abs(a - mean)**2  # abs is for complex `a`
    var = d2.sum() / (N - ddof)  # note use of `ddof`
    std = var**0.5
    
Different values of the argument `ddof` are useful in different contexts. NumPy’s default `ddof=0` corresponds with the expression:
\\[\sqrt{\frac{\sum_i{|a_i - \bar{a}|^2 }}{N}}\\]
which is sometimes called the “population standard deviation” in the field of statistics because it applies the definition of standard deviation to `a` as if `a` were a complete population of possible observations.
Many other libraries define the standard deviation of an array differently, e.g.:
\\[\sqrt{\frac{\sum_i{|a_i - \bar{a}|^2 }}{N - 1}}\\]
In statistics, the resulting quantity is sometimes called the “sample standard deviation” because if `a` is a random sample from a larger population, this calculation provides the square root of an unbiased estimate of the variance of the population. The use of \\(N-1\\) in the denominator is often called “Bessel’s correction” because it corrects for bias (toward lower values) in the variance estimate introduced when the sample mean of `a` is used in place of the true mean of the population. The resulting estimate of the standard deviation is still biased, but less than it would have been without the correction. For this quantity, use `ddof=1`.
Note that, for complex numbers, `std` takes the absolute value before squaring, so that the result is always real and nonnegative.
For floating-point input, the standard deviation is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for float32 (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.std(a)
    1.1180339887498949 # may vary
    >>> np.std(a, axis=0)
    array([1.,  1.])
    >>> np.std(a, axis=1)
    array([0.5,  0.5])
    
In single precision, std() can be inaccurate:
    
    >>> a = np.zeros((2, 512*512), dtype=np.float32)
    >>> a[0, :] = 1.0
    >>> a[1, :] = 0.1
    >>> np.std(a)
    np.float32(0.45000005)
    
Computing the standard deviation in float64 is more accurate:
    
    >>> np.std(a, dtype=np.float64)
    0.44999999925494177 # may vary
    
Specifying a where argument:
    
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> np.std(a)
    2.614064523559687 # may vary
    >>> np.std(a, where=[[True], [True], [False]])
    2.0
    
Using the mean keyword to save computation time:
    
    >>> import numpy as np
    >>> from timeit import timeit
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> mean = np.mean(a, axis=1, keepdims=True)
    >>>
    >>> g = globals()
    >>> n = 10000
    >>> t1 = timeit("std = np.std(a, axis=1, mean=mean)", globals=g, number=n)
    >>> t2 = timeit("std = np.std(a, axis=1)", globals=g, number=n)
    >>> print(f'Percentage execution time saved {100*(t2-t1)/t2:.0f}%')
    
    Percentage execution time saved 30%
    
# numpy.strings.add
strings.add(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'add'>
    
Add arguments element-wise.
Parameters:
    
x1, x2array_like
    
The arrays to be added. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
addndarray or scalar
    
The sum of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
#### Notes
Equivalent to `x1` \+ `x2` in terms of array broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.add(1.0, 4.0)
    5.0
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.add(x1, x2)
    array([[  0.,   2.,   4.],
           [  3.,   5.,   7.],
           [  6.,   8.,  10.]])
    
The `+` operator can be used as a shorthand for `np.add` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> x1 + x2
    array([[ 0.,  2.,  4.],
           [ 3.,  5.,  7.],
           [ 6.,  8., 10.]])
    
# numpy.strings.capitalize
strings.capitalize(a)[source]
    
Return a copy of `a` with only the first character of each element capitalized.
Calls `str.capitalize` element-wise.
For byte strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array of strings to capitalize.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.capitalize`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['a1b2','1b2a','b2a1','2a1b'],'S4'); c
    array(['a1b2', '1b2a', 'b2a1', '2a1b'],
        dtype='|S4')
    >>> np.strings.capitalize(c)
    array(['A1b2', '1b2a', 'B2a1', '2a1b'],
        dtype='|S4')
    
# numpy.strings.center
strings.center(a, width, fillchar=' ')[source]
    
Return a copy of `a` with its elements centered in a string of length `width`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
The length of the resulting strings, unless `width < str_len(a)`.
fillchararray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Optional padding character to use (default is space).
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.center`
#### Notes
While it is possible for `a` and `fillchar` to have different dtypes, passing a non-ASCII character in `fillchar` when `a` is of dtype “S” is not allowed, and a `ValueError` is raised.
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['a1b2','1b2a','b2a1','2a1b']); c
    array(['a1b2', '1b2a', 'b2a1', '2a1b'], dtype='<U4')
    >>> np.strings.center(c, width=9)
    array(['   a1b2  ', '   1b2a  ', '   b2a1  ', '   2a1b  '], dtype='<U9')
    >>> np.strings.center(c, width=9, fillchar='*')
    array(['***a1b2**', '***1b2a**', '***b2a1**', '***2a1b**'], dtype='<U9')
    >>> np.strings.center(c, width=1)
    array(['a1b2', '1b2a', 'b2a1', '2a1b'], dtype='<U4')
    
# numpy.strings.count
strings.count(a, sub, start=0, end=None)[source]
    
Returns an array with the number of non-overlapping occurrences of substring `sub` in the range [`start`, `end`).
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
subarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
The substring to search for.
start, endarray_like, with any integer dtype
    
The range to look in, interpreted as in slice notation.
Returns:
    
yndarray
    
Output array of ints
See also
`str.count`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> c
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.count(c, 'A')
    array([3, 1, 1])
    >>> np.strings.count(c, 'aA')
    array([3, 1, 0])
    >>> np.strings.count(c, 'A', start=1, end=4)
    array([2, 1, 1])
    >>> np.strings.count(c, 'A', start=1, end=3)
    array([1, 0, 0])
    
# numpy.strings.decode
strings.decode(a, encoding=None, errors=None)[source]
    
Calls `bytes.decode` element-wise.
The set of available codecs comes from the Python standard library, and may be extended at runtime. For more information, see the `codecs` module.
Parameters:
    
aarray_like, with `bytes_` dtype
encodingstr, optional
    
The name of an encoding
errorsstr, optional
    
Specifies how to handle encoding errors
Returns:
    
outndarray
See also
`bytes.decode`
#### Notes
The type of the result will depend on the encoding specified.
#### Examples
    
    >>> import numpy as np
    >>> c = np.array([b'\x81\xc1\x81\xc1\x81\xc1', b'@@\x81\xc1@@',
    ...               b'\x81\x82\xc2\xc1\xc2\x82\x81'])
    >>> c
    array([b'\x81\xc1\x81\xc1\x81\xc1', b'@@\x81\xc1@@',
           b'\x81\x82\xc2\xc1\xc2\x82\x81'], dtype='|S7')
    >>> np.strings.decode(c, encoding='cp037')
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    
# numpy.strings.encode
strings.encode(a, encoding=None, errors=None)[source]
    
Calls `str.encode` element-wise.
The set of available codecs comes from the Python standard library, and may be extended at runtime. For more information, see the `codecs` module.
Parameters:
    
aarray_like, with `StringDType` or `str_` dtype
encodingstr, optional
    
The name of an encoding
errorsstr, optional
    
Specifies how to handle encoding errors
Returns:
    
outndarray
See also
`str.encode`
#### Notes
The type of the result will depend on the encoding specified.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.encode(a, encoding='cp037')
    array([b'ÁÁÁ', b'@@Á@@',
       b'ÂÁÂ'], dtype='|S7')
    
# numpy.strings.endswith
strings.endswith(a, suffix, start=0, end=None)[source]
    
Returns a boolean array which is `True` where the string element in `a` ends with `suffix`, otherwise `False`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
suffixarray-like, with `StringDType`, `bytes_`, or `str_` dtype
start, endarray_like, with any integer dtype
    
With `start`, test beginning at that position. With `end`, stop comparing at that position.
Returns:
    
outndarray
    
Output array of bools
See also
`str.endswith`
#### Examples
    
    >>> import numpy as np
    >>> s = np.array(['foo', 'bar'])
    >>> s
    array(['foo', 'bar'], dtype='<U3')
    >>> np.strings.endswith(s, 'ar')
    array([False,  True])
    >>> np.strings.endswith(s, 'a', start=1, end=2)
    array([False,  True])
    
# numpy.strings.equal
strings.equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'equal'>
    
Return (x1 == x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`not_equal`, `greater_equal`, `less_equal`, `greater`, `less`
#### Examples
    
    >>> import numpy as np
    >>> np.equal([0, 1, 3], np.arange(3))
    array([ True,  True, False])
    
What is compared are values, not types. So an int (1) and an array of length one can evaluate as True:
    
    >>> np.equal(1, np.ones(1))
    array([ True])
    
The `==` operator can be used as a shorthand for `np.equal` on ndarrays.
    
    >>> a = np.array([2, 4, 6])
    >>> b = np.array([2, 4, 2])
    >>> a == b
    array([ True,  True, False])
    
# numpy.strings.expandtabs
strings.expandtabs(a, tabsize=8)[source]
    
Return a copy of each string element where all tab characters are replaced by one or more spaces.
Calls `str.expandtabs` element-wise.
Return a copy of each string element where all tab characters are replaced by one or more spaces, depending on the current column and the given `tabsize`. The column number is reset to zero after each newline occurring in the string. This doesn’t understand other non-printing characters or escape sequences.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array
tabsizeint, optional
    
Replace tabs with `tabsize` number of spaces. If not given defaults to 8 spaces.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input type
See also
`str.expandtabs`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['         Hello   world'])
    >>> np.strings.expandtabs(a, tabsize=4)  
    array(['        Hello   world'], dtype='<U21')  
    
# numpy.strings.find
strings.find(a, sub, start=0, end=None)[source]
    
For each element, return the lowest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).
Parameters:
    
aarray_like, with `StringDType`, `bytes_` or `str_` dtype
subarray_like, with `np.bytes_` or `np.str_` dtype
    
The substring to search for.
start, endarray_like, with any integer dtype
    
The range to look in, interpreted as in slice notation.
Returns:
    
yndarray
    
Output array of ints
See also
`str.find`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["NumPy is a Python library"])
    >>> np.strings.find(a, "Python")
    array([11])
    
# numpy.strings.greater
strings.greater(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'greater'>
    
Return the truth value of (x1 > x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater_equal`, `less`, `less_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.greater([4,2],[2,2])
    array([ True, False])
    
The `>` operator can be used as a shorthand for `np.greater` on ndarrays.
    
    >>> a = np.array([4, 2])
    >>> b = np.array([2, 2])
    >>> a > b
    array([ True, False])
    
# numpy.strings.greater_equal
strings.greater_equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'greater_equal'>
    
Return the truth value of (x1 >= x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outbool or ndarray of bool
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater`, `less`, `less_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.greater_equal([4, 2, 1], [2, 2, 2])
    array([ True, True, False])
    
The `>=` operator can be used as a shorthand for `np.greater_equal` on ndarrays.
    
    >>> a = np.array([4, 2, 1])
    >>> b = np.array([2, 2, 2])
    >>> a >= b
    array([ True,  True, False])
    
# numpy.strings.index
strings.index(a, sub, start=0, end=None)[source]
    
Like `find`, but raises `ValueError` when the substring is not found.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
subarray-like, with `StringDType`, `bytes_`, or `str_` dtype
start, endarray_like, with any integer dtype, optional
Returns:
    
outndarray
    
Output array of ints.
See also
`find`, `str.index`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["Computer Science"])
    >>> np.strings.index(a, "Science", start=0, end=None)
    array([9])
    
# numpy.strings.isalnum
strings.isalnum(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isalnum'>
    
Returns true for each element if all characters in the string are alphanumeric and there is at least one character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bool This is a scalar if `x` is a scalar.
See also
`str.isalnum`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a', '1', 'a1', '(', ''])
    >>> np.strings.isalnum(a)
    array([ True,  True,  True, False, False])
    
# numpy.strings.isalpha
strings.isalpha(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isalpha'>
    
Returns true for each element if all characters in the data interpreted as a string are alphabetic and there is at least one character, false otherwise.
For byte strings (i.e. `bytes`), alphabetic characters are those byte values in the sequence b’abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’. For Unicode strings, alphabetic characters are those characters defined in the Unicode character database as “Letter”.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isalpha`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a', 'b', '0'])
    >>> np.strings.isalpha(a)
    array([ True,  True, False])
    
    
    >>> a = np.array([['a', 'b', '0'], ['c', '1', '2']])
    >>> np.strings.isalpha(a)
    array([[ True,  True, False], [ True, False, False]])
    
# numpy.strings.isdecimal
strings.isdecimal(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isdecimal'>
    
For each element, return True if there are only decimal characters in the element.
Decimal characters include digit characters, and all characters that can be used to form decimal-radix numbers, e.g. `U+0660, ARABIC-INDIC DIGIT ZERO`.
Parameters:
    
xarray_like, with `StringDType` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isdecimal`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.isdecimal(['12345', '4.99', '123ABC', ''])
    array([ True, False, False, False])
    
# numpy.strings.isdigit
strings.isdigit(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isdigit'>
    
Returns true for each element if all characters in the string are digits and there is at least one character, false otherwise.
For byte strings, digits are the byte values in the sequence b’0123456789’. For Unicode strings, digits include decimal characters and digits that need special handling, such as the compatibility superscript digits. This also covers digits which cannot be used to form numbers in base 10, like the Kharosthi numbers.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isdigit`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a', 'b', '0'])
    >>> np.strings.isdigit(a)
    array([False, False,  True])
    >>> a = np.array([['a', 'b', '0'], ['c', '1', '2']])
    >>> np.strings.isdigit(a)
    array([[False, False,  True], [False,  True,  True]])
    
# numpy.strings.islower
strings.islower(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'islower'>
    
Returns true for each element if all cased characters in the string are lowercase and there is at least one cased character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.islower`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.islower("GHC")
    array(False)
    >>> np.strings.islower("ghc")
    array(True)
    
# numpy.strings.isnumeric
strings.isnumeric(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isnumeric'>
    
For each element, return True if there are only numeric characters in the element.
Numeric characters include digit characters, and all characters that have the Unicode numeric value property, e.g. `U+2155, VULGAR FRACTION ONE FIFTH`.
Parameters:
    
xarray_like, with `StringDType` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isnumeric`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.isnumeric(['123', '123abc', '9.0', '1/4', 'VIII'])
    array([ True, False, False, False, False])
    
# numpy.strings.isspace
strings.isspace(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isspace'>
    
Returns true for each element if there are only whitespace characters in the string and there is at least one character, false otherwise.
For byte strings, whitespace characters are the ones in the sequence b’ tnrx0bf’. For Unicode strings, a character is whitespace, if, in the Unicode character database, its general category is Zs (“Separator, space”), or its bidirectional class is one of WS, B, or S.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isspace`
#### Examples
    
    >>> np.char.isspace(list("a b c"))
    array([False,  True, False,  True, False])
    >>> np.char.isspace(b'\x0a \x0b \x0c')
    np.True_
    >>> np.char.isspace(b'\x0a \x0b \x0c N')
    np.False_
    
# numpy.strings.istitle
strings.istitle(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'istitle'>
    
Returns true for each element if the element is a titlecased string and there is at least one character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.istitle`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.istitle("Numpy Is Great")
    array(True)
    
    
    >>> np.strings.istitle("Numpy is great")
    array(False)
    
# numpy.strings.isupper
strings.isupper(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'isupper'>
    
Return true for each element if all cased characters in the string are uppercase and there is at least one character, false otherwise.
Parameters:
    
xarray_like, with `StringDType`, `bytes_` or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray
    
Output array of bools This is a scalar if `x` is a scalar.
See also
`str.isupper`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.isupper("GHC")
    array(True)
    >>> a = np.array(["hello", "HELLO", "Hello"])
    >>> np.strings.isupper(a)
    array([False,  True, False])
    
# numpy.strings.less
strings.less(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'less'>
    
Return the truth value of (x1 < x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater`, `less_equal`, `greater_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.less([1, 2], [2, 2])
    array([ True, False])
    
The `<` operator can be used as a shorthand for `np.less` on ndarrays.
    
    >>> a = np.array([1, 2])
    >>> b = np.array([2, 2])
    >>> a < b
    array([ True, False])
    
# numpy.strings.less_equal
strings.less_equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'less_equal'>
    
Return the truth value of (x1 <= x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`greater`, `less`, `greater_equal`, `equal`, `not_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.less_equal([4, 2, 1], [2, 2, 2])
    array([False,  True,  True])
    
The `<=` operator can be used as a shorthand for `np.less_equal` on ndarrays.
    
    >>> a = np.array([4, 2, 1])
    >>> b = np.array([2, 2, 2])
    >>> a <= b
    array([False,  True,  True])
    
# numpy.strings.ljust
strings.ljust(a, width, fillchar=' ')[source]
    
Return an array with the elements of `a` left-justified in a string of length `width`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
The length of the resulting strings, unless `width < str_len(a)`.
fillchararray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Optional character to use for padding (default is space).
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.ljust`
#### Notes
While it is possible for `a` and `fillchar` to have different dtypes, passing a non-ASCII character in `fillchar` when `a` is of dtype “S” is not allowed, and a `ValueError` is raised.
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.ljust(c, width=3)
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.ljust(c, width=9)
    array(['aAaAaA   ', '  aA     ', 'abBABba  '], dtype='<U9')
    
# numpy.strings.lower
strings.lower(a)[source]
    
Return an array with the elements converted to lowercase.
Call `str.lower` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.lower`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['A1B C', '1BCA', 'BCA1']); c
    array(['A1B C', '1BCA', 'BCA1'], dtype='<U5')
    >>> np.strings.lower(c)
    array(['a1b c', '1bca', 'bca1'], dtype='<U5')
    
# numpy.strings.lstrip
strings.lstrip(a, chars=None)[source]
    
For each element in `a`, return a copy with the leading characters removed.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
charsscalar with the same dtype as `a`, optional
    
The `chars` argument is a string specifying the set of characters to be removed. If `None`, the `chars` argument defaults to removing whitespace. The `chars` argument is not a prefix or suffix; rather, all combinations of its values are stripped.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.lstrip`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> c
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    # The 'a' variable is unstripped from c[1] because of leading whitespace.
    >>> np.strings.lstrip(c, 'a')
    array(['AaAaA', '  aA  ', 'bBABba'], dtype='<U7')
    >>> np.strings.lstrip(c, 'A') # leaves c unchanged
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> (np.strings.lstrip(c, ' ') == np.strings.lstrip(c, '')).all()
    np.False_
    >>> (np.strings.lstrip(c, ' ') == np.strings.lstrip(c)).all()
    np.True_
    
# numpy.strings.mod
strings.mod(a, values)[source]
    
Return (a % i), that is pre-Python 2.6 string formatting (interpolation), element-wise for a pair of array_likes of str or unicode.
Parameters:
    
aarray_like, with `np.bytes_` or `np.str_` dtype
valuesarray_like of values
    
These values will be element-wise interpolated into the string.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["NumPy is a %s library"])
    >>> np.strings.mod(a, values=["Python"])
    array(['NumPy is a Python library'], dtype='<U25')
    
    
    >>> a = np.array([b'%d bytes', b'%d bits'])
    >>> values = np.array([8, 64])
    >>> np.strings.mod(a, values)
    array([b'8 bytes', b'64 bits'], dtype='|S7')
    
# numpy.strings.multiply
strings.multiply(a, i)[source]
    
Return (a * i), that is string multiple concatenation, element-wise.
Values in `i` of less than 0 are treated as 0 (which yields an empty string).
Parameters:
    
aarray_like, with `StringDType`, `bytes_` or `str_` dtype
iarray_like, with any integer dtype
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["a", "b", "c"])
    >>> np.strings.multiply(a, 3)
    array(['aaa', 'bbb', 'ccc'], dtype='<U3')
    >>> i = np.array([1, 2, 3])
    >>> np.strings.multiply(a, i)
    array(['a', 'bb', 'ccc'], dtype='<U3')
    >>> np.strings.multiply(np.array(['a']), i)
    array(['a', 'aa', 'aaa'], dtype='<U3')
    >>> a = np.array(['a', 'b', 'c', 'd', 'e', 'f']).reshape((2, 3))
    >>> np.strings.multiply(a, 3)
    array([['aaa', 'bbb', 'ccc'],
           ['ddd', 'eee', 'fff']], dtype='<U3')
    >>> np.strings.multiply(a, i)
    array([['a', 'bb', 'ccc'],
           ['d', 'ee', 'fff']], dtype='<U3')
    
# numpy.strings.not_equal
strings.not_equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'not_equal'>
    
Return (x1 != x2) element-wise.
Parameters:
    
x1, x2array_like
    
Input arrays. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
outndarray or scalar
    
Output array, element-wise comparison of `x1` and `x2`. Typically of type bool, unless `dtype=object` is passed. This is a scalar if both `x1` and `x2` are scalars.
See also
`equal`, `greater`, `greater_equal`, `less`, `less_equal`
#### Examples
    
    >>> import numpy as np
    >>> np.not_equal([1.,2.], [1., 3.])
    array([False,  True])
    >>> np.not_equal([1, 2], [[1, 3],[1, 4]])
    array([[False,  True],
           [False,  True]])
    
The `!=` operator can be used as a shorthand for `np.not_equal` on ndarrays.
    
    >>> a = np.array([1., 2.])
    >>> b = np.array([1., 3.])
    >>> a != b
    array([False,  True])
    
# numpy.strings.partition
strings.partition(a, sep)[source]
    
Partition each element in `a` around `sep`.
For each element in `a`, split the element at the first occurrence of `sep`, and return a 3-tuple containing the part before the separator, the separator itself, and the part after the separator. If the separator is not found, the first item of the tuple will contain the whole string, and the second and third ones will be the empty string.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array
separray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Separator to split each string element in `a`.
Returns:
    
out3-tuple:
    
  * array with `StringDType`, `bytes_` or `str_` dtype with the part before the separator
  * array with `StringDType`, `bytes_` or `str_` dtype with the separator
  * array with `StringDType`, `bytes_` or `str_` dtype with the part after the separator


See also
`str.partition`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array(["Numpy is nice!"])
    >>> np.strings.partition(x, " ")
    (array(['Numpy'], dtype='<U5'),
     array([' '], dtype='<U1'),
     array(['is nice!'], dtype='<U8'))
    
# numpy.strings.replace
strings.replace(a, old, new, count=-1)[source]
    
For each element in `a`, return a copy of the string with occurrences of substring `old` replaced by `new`.
Parameters:
    
aarray_like, with `bytes_` or `str_` dtype
old, newarray_like, with `bytes_` or `str_` dtype
countarray_like, with `int_` dtype
    
If the optional argument `count` is given, only the first `count` occurrences are replaced.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.replace`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["That is a mango", "Monkeys eat mangos"])
    >>> np.strings.replace(a, 'mango', 'banana')
    array(['That is a banana', 'Monkeys eat bananas'], dtype='<U19')
    
    
    >>> a = np.array(["The dish is fresh", "This is it"])
    >>> np.strings.replace(a, 'is', 'was')
    array(['The dwash was fresh', 'Thwas was it'], dtype='<U19')
    
# numpy.strings.rfind
strings.rfind(a, sub, start=0, end=None)[source]
    
For each element, return the highest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
subarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
The substring to search for.
start, endarray_like, with any integer dtype
    
The range to look in, interpreted as in slice notation.
Returns:
    
yndarray
    
Output array of ints
See also
`str.rfind`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(["Computer Science"])
    >>> np.strings.rfind(a, "Science", start=0, end=None)
    array([9])
    >>> np.strings.rfind(a, "Science", start=0, end=8)
    array([-1])
    >>> b = np.array(["Computer Science", "Science"])
    >>> np.strings.rfind(b, "Science", start=0, end=None)
    array([9, 0])
    
# numpy.strings.rindex
strings.rindex(a, sub, start=0, end=None)[source]
    
Like `rfind`, but raises `ValueError` when the substring `sub` is not found.
Parameters:
    
aarray-like, with `np.bytes_` or `np.str_` dtype
subarray-like, with `np.bytes_` or `np.str_` dtype
start, endarray-like, with any integer dtype, optional
Returns:
    
outndarray
    
Output array of ints.
See also
`rfind`, `str.rindex`
#### Examples
    
    >>> a = np.array(["Computer Science"])
    >>> np.strings.rindex(a, "Science", start=0, end=None)
    array([9])
    
# numpy.strings.rjust
strings.rjust(a, width, fillchar=' ')[source]
    
Return an array with the elements of `a` right-justified in a string of length `width`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
The length of the resulting strings, unless `width < str_len(a)`.
fillchararray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Optional padding character to use (default is space).
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.rjust`
#### Notes
While it is possible for `a` and `fillchar` to have different dtypes, passing a non-ASCII character in `fillchar` when `a` is of dtype “S” is not allowed, and a `ValueError` is raised.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.rjust(a, width=3)
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.rjust(a, width=9)
    array(['   aAaAaA', '     aA  ', '  abBABba'], dtype='<U9')
    
# numpy.strings.rpartition
strings.rpartition(a, sep)[source]
    
Partition (split) each element around the right-most separator.
For each element in `a`, split the element at the last occurrence of `sep`, and return a 3-tuple containing the part before the separator, the separator itself, and the part after the separator. If the separator is not found, the third item of the tuple will contain the whole string, and the first and second ones will be the empty string.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array
separray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Separator to split each string element in `a`.
Returns:
    
out3-tuple:
    
  * array with `StringDType`, `bytes_` or `str_` dtype with the part before the separator
  * array with `StringDType`, `bytes_` or `str_` dtype with the separator
  * array with `StringDType`, `bytes_` or `str_` dtype with the part after the separator


See also
`str.rpartition`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> np.strings.rpartition(a, 'A')
    (array(['aAaAa', '  a', 'abB'], dtype='<U5'),
     array(['A', 'A', 'A'], dtype='<U1'),
     array(['', '  ', 'Bba'], dtype='<U3'))
    
# numpy.strings.rstrip
strings.rstrip(a, chars=None)[source]
    
For each element in `a`, return a copy with the trailing characters removed.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
charsscalar with the same dtype as `a`, optional
    
The `chars` argument is a string specifying the set of characters to be removed. If `None`, the `chars` argument defaults to removing whitespace. The `chars` argument is not a prefix or suffix; rather, all combinations of its values are stripped.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.rstrip`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', 'abBABba'])
    >>> c
    array(['aAaAaA', 'abBABba'], dtype='<U7')
    >>> np.strings.rstrip(c, 'a')
    array(['aAaAaA', 'abBABb'], dtype='<U7')
    >>> np.strings.rstrip(c, 'A')
    array(['aAaAa', 'abBABba'], dtype='<U7')
    
# numpy.strings.startswith
strings.startswith(a, prefix, start=0, end=None)[source]
    
Returns a boolean array which is `True` where the string element in `a` starts with `prefix`, otherwise `False`.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
prefixarray-like, with `StringDType`, `bytes_`, or `str_` dtype
start, endarray_like, with any integer dtype
    
With `start`, test beginning at that position. With `end`, stop comparing at that position.
Returns:
    
outndarray
    
Output array of bools
See also
`str.startswith`
#### Examples
    
    >>> import numpy as np
    >>> s = np.array(['foo', 'bar'])
    >>> s
    array(['foo', 'bar'], dtype='<U3')
    >>> np.strings.startswith(s, 'fo')
    array([True,  False])
    >>> np.strings.startswith(s, 'o', start=1, end=2)
    array([True,  False])
    
# numpy.strings.str_len
strings.str_len(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'str_len'>
    
Returns the length of each element. For byte strings, this is the number of bytes, while, for Unicode strings, it is the number of Unicode code points.
Parameters:
    
xarray_like, with `StringDType`, `bytes_`, or `str_` dtype
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
Output array of ints This is a scalar if `x` is a scalar.
See also
`len`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['Grace Hopper Conference', 'Open Source Day'])
    >>> np.strings.str_len(a)
    array([23, 15])
    >>> a = np.array(['Р', 'о'])
    >>> np.strings.str_len(a)
    array([1, 1])
    >>> a = np.array([['hello', 'world'], ['Р', 'о']])
    >>> np.strings.str_len(a)
    array([[5, 5], [1, 1]])
    
# numpy.strings.strip
strings.strip(a, chars=None)[source]
    
For each element in `a`, return a copy with the leading and trailing characters removed.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
charsscalar with the same dtype as `a`, optional
    
The `chars` argument is a string specifying the set of characters to be removed. If `None`, the `chars` argument defaults to removing whitespace. The `chars` argument is not a prefix or suffix; rather, all combinations of its values are stripped.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.strip`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['aAaAaA', '  aA  ', 'abBABba'])
    >>> c
    array(['aAaAaA', '  aA  ', 'abBABba'], dtype='<U7')
    >>> np.strings.strip(c)
    array(['aAaAaA', 'aA', 'abBABba'], dtype='<U7')
    # 'a' unstripped from c[1] because of leading whitespace.
    >>> np.strings.strip(c, 'a')
    array(['AaAaA', '  aA  ', 'bBABb'], dtype='<U7')
    # 'A' unstripped from c[1] because of trailing whitespace.
    >>> np.strings.strip(c, 'A')
    array(['aAaAa', '  aA  ', 'abBABba'], dtype='<U7')
    
# numpy.strings.swapcase
strings.swapcase(a)[source]
    
Return element-wise a copy of the string with uppercase characters converted to lowercase and vice versa.
Calls `str.swapcase` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.swapcase`
#### Examples
    
    >>> import numpy as np
    >>> c=np.array(['a1B c','1b Ca','b Ca1','cA1b'],'S5'); c
    array(['a1B c', '1b Ca', 'b Ca1', 'cA1b'],
        dtype='|S5')
    >>> np.strings.swapcase(c)
    array(['A1b C', '1B cA', 'B cA1', 'Ca1B'],
        dtype='|S5')
    
# numpy.strings.title
strings.title(a)[source]
    
Return element-wise title cased version of string or unicode.
Title case words start with uppercase characters, all remaining cased characters are lowercase.
Calls `str.title` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.title`
#### Examples
    
    >>> import numpy as np
    >>> c=np.array(['a1b c','1b ca','b ca1','ca1b'],'S5'); c
    array(['a1b c', '1b ca', 'b ca1', 'ca1b'],
        dtype='|S5')
    >>> np.strings.title(c)
    array(['A1B C', '1B Ca', 'B Ca1', 'Ca1B'],
        dtype='|S5')
    
# numpy.strings.translate
strings.translate(a, table, deletechars=None)[source]
    
For each element in `a`, return a copy of the string where all characters occurring in the optional argument `deletechars` are removed, and the remaining characters have been mapped through the given translation table.
Calls `str.translate` element-wise.
Parameters:
    
aarray-like, with `np.bytes_` or `np.str_` dtype
tablestr of length 256
deletecharsstr
Returns:
    
outndarray
    
Output array of str or unicode, depending on input type
See also
`str.translate`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array(['a1b c', '1bca', 'bca1'])
    >>> table = a[0].maketrans('abc', '123')
    >>> deletechars = ' '
    >>> np.char.translate(a, table, deletechars)
    array(['112 3', '1231', '2311'], dtype='<U5')
    
# numpy.strings.upper
strings.upper(a)[source]
    
Return an array with the elements converted to uppercase.
Calls `str.upper` element-wise.
For 8-bit strings, this method is locale-dependent.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
    
Input array.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input types
See also
`str.upper`
#### Examples
    
    >>> import numpy as np
    >>> c = np.array(['a1b c', '1bca', 'bca1']); c
    array(['a1b c', '1bca', 'bca1'], dtype='<U5')
    >>> np.strings.upper(c)
    array(['A1B C', '1BCA', 'BCA1'], dtype='<U5')
    
# numpy.strings.zfill
strings.zfill(a, width)[source]
    
Return the numeric string left-filled with zeros. A leading sign prefix (`+`/`-`) is handled by inserting the padding after the sign character rather than before.
Parameters:
    
aarray-like, with `StringDType`, `bytes_`, or `str_` dtype
widtharray_like, with any integer dtype
    
Width of string to left-fill elements in `a`.
Returns:
    
outndarray
    
Output array of `StringDType`, `bytes_` or `str_` dtype, depending on input type
See also
`str.zfill`
#### Examples
    
    >>> import numpy as np
    >>> np.strings.zfill(['1', '-1', '+1'], 3)
    array(['001', '-01', '+01'], dtype='<U3')
    
# numpy.subtract
numpy.subtract(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'subtract'>
    
Subtract arguments, element-wise.
Parameters:
    
x1, x2array_like
    
The arrays to be subtracted from each other. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The difference of `x1` and `x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
#### Notes
Equivalent to `x1 - x2` in terms of array broadcasting.
#### Examples
    
    >>> import numpy as np
    >>> np.subtract(1.0, 4.0)
    -3.0
    
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.subtract(x1, x2)
    array([[ 0.,  0.,  0.],
           [ 3.,  3.,  3.],
           [ 6.,  6.,  6.]])
    
The `-` operator can be used as a shorthand for `np.subtract` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> x1 - x2
    array([[0., 0., 0.],
           [3., 3., 3.],
           [6., 6., 6.]])
    
# numpy.sum
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)[source]
    
Sum of array elements over a given axis.
Parameters:
    
aarray_like
    
Elements to sum.
axisNone or int or tuple of ints, optional
    
Axis or axes along which a sum is performed. The default, axis=None, will sum all of the elements of the input array. If axis is negative it counts from the last to the first axis. If axis is a tuple of ints, a sum is performed on all of the axes specified in the tuple instead of a single axis or all the axes as before.
dtypedtype, optional
    
The type of the returned array and of the accumulator in which the elements are summed. The dtype of `a` is used by default unless `a` has an integer dtype of less precision than the default platform integer. In that case, if `a` is signed then the platform integer is used while if `a` is unsigned then an unsigned integer of the same precision as the platform integer is used.
outndarray, optional
    
Alternative output array in which to place the result. It must have the same shape as the expected output, but the type of the output values will be cast if necessary.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `sum` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
initialscalar, optional
    
Starting value for the sum. See `reduce` for details.
wherearray_like of bool, optional
    
Elements to include in the sum. See `reduce` for details.
Returns:
    
sum_along_axisndarray
    
An array with the same shape as `a`, with the specified axis removed. If `a` is a 0-d array, or if `axis` is None, a scalar is returned. If an output array is specified, a reference to `out` is returned.
See also
`ndarray.sum`
    
Equivalent method.
`add`
    
`numpy.add.reduce` equivalent function.
`cumsum`
    
Cumulative sum of array elements.
`trapezoid`
    
Integration of array values using composite trapezoidal rule.
`mean`, `average`
#### Notes
Arithmetic is modular when using integer types, and no error is raised on overflow.
The sum of an empty array is the neutral element 0:
    
    >>> np.sum([])
    0.0
    
For floating point numbers the numerical precision of sum (and `np.add.reduce`) is in general limited by directly adding each number individually to the result causing rounding errors in every step. However, often numpy will use a numerically better approach (partial pairwise summation) leading to improved precision in many use-cases. This improved precision is always provided when no `axis` is given. When `axis` is given, it will depend on which axis is summed. Technically, to provide the best speed possible, the improved precision is only used when the summation is along the fast axis in memory. Note that the exact precision may vary depending on other parameters. In contrast to NumPy, Python’s `math.fsum` function uses a slower but more precise approach to summation. Especially when summing a large number of lower precision floating point numbers, such as `float32`, numerical errors can become significant. In such cases it can be advisable to use `dtype=”float64”` to use a higher precision for the output.
#### Examples
    
    >>> import numpy as np
    >>> np.sum([0.5, 1.5])
    2.0
    >>> np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32)
    np.int32(1)
    >>> np.sum([[0, 1], [0, 5]])
    6
    >>> np.sum([[0, 1], [0, 5]], axis=0)
    array([0, 6])
    >>> np.sum([[0, 1], [0, 5]], axis=1)
    array([1, 5])
    >>> np.sum([[0, 1], [np.nan, 5]], where=[False, True], axis=1)
    array([1., 5.])
    
If the accumulator is too small, overflow occurs:
    
    >>> np.ones(128, dtype=np.int8).sum(dtype=np.int8)
    np.int8(-128)
    
You can also start the sum with a value other than zero:
    
    >>> np.sum([10], initial=5)
    15
    
# numpy.swapaxes
numpy.swapaxes(a, axis1, axis2)[source]
    
Interchange two axes of an array.
Parameters:
    
aarray_like
    
Input array.
axis1int
    
First axis.
axis2int
    
Second axis.
Returns:
    
a_swappedndarray
    
For NumPy >= 1.10.0, if `a` is an ndarray, then a view of `a` is returned; otherwise a new array is created. For earlier NumPy versions a view of `a` is returned only if the order of the axes is changed, otherwise the input array is returned.
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([[1,2,3]])
    >>> np.swapaxes(x,0,1)
    array([[1],
           [2],
           [3]])
    
    
    >>> x = np.array([[[0,1],[2,3]],[[4,5],[6,7]]])
    >>> x
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    
    
    >>> np.swapaxes(x,0,2)
    array([[[0, 4],
            [2, 6]],
           [[1, 5],
            [3, 7]]])
    
# numpy.take
numpy.take(a, indices, axis=None, out=None, mode='raise')[source]
    
Take elements from an array along an axis.
When axis is not None, this function does the same thing as “fancy” indexing (indexing arrays using arrays); however, it can be easier to use if you need elements along a given axis. A call such as `np.take(arr, indices, axis=3)` is equivalent to `arr[:,:,:,indices,...]`.
Explained without fancy indexing, this is equivalent to the following use of `ndindex`, which sets each of `ii`, `jj`, and `kk` to a tuple of indices:
    
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    Nj = indices.shape
    for ii in ndindex(Ni):
        for jj in ndindex(Nj):
            for kk in ndindex(Nk):
                out[ii + jj + kk] = a[ii + (indices[jj],) + kk]
    
Parameters:
    
aarray_like (Ni…, M, Nk…)
    
The source array.
indicesarray_like (Nj…)
    
The indices of the values to extract. Also allow scalars for indices.
axisint, optional
    
The axis over which to select values. By default, the flattened input array is used.
outndarray, optional (Ni…, Nj…, Nk…)
    
If provided, the result will be placed in this array. It should be of the appropriate shape and dtype. Note that `out` is always buffered if `mode=’raise’`; use other modes for better performance.
mode{‘raise’, ‘wrap’, ‘clip’}, optional
    
Specifies how out-of-bounds indices will behave.
  * ‘raise’ – raise an error (default)
  * ‘wrap’ – wrap around
  * ‘clip’ – clip to the range


‘clip’ mode means that all indices that are too large are replaced by the index that addresses the last element along that axis. Note that this disables indexing with negative numbers.
Returns:
    
outndarray (Ni…, Nj…, Nk…)
    
The returned array has the same type as `a`.
See also
`compress`
    
Take elements using a boolean mask
`ndarray.take`
    
equivalent method
`take_along_axis`
    
Take elements by matching the array and the index arrays
#### Notes
By eliminating the inner loop in the description above, and using `s_` to build simple slice objects, `take` can be expressed in terms of applying fancy indexing to each 1-d slice:
    
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nj):
            out[ii + s_[...,] + kk] = a[ii + s_[:,] + kk][indices]
    
For this reason, it is equivalent to (but faster than) the following use of `apply_along_axis`:
    
    out = np.apply_along_axis(lambda a_1d: a_1d[indices], axis, a)
    
#### Examples
    
    >>> import numpy as np
    >>> a = [4, 3, 5, 7, 6, 8]
    >>> indices = [0, 1, 4]
    >>> np.take(a, indices)
    array([4, 3, 6])
    
In this example if `a` is an ndarray, “fancy” indexing can be used.
    
    >>> a = np.array(a)
    >>> a[indices]
    array([4, 3, 6])
    
If `indices` is not one dimensional, the output also has these dimensions.
    
    >>> np.take(a, [[0, 1], [2, 3]])
    array([[4, 3],
           [5, 7]])
    
# numpy.take_along_axis
numpy.take_along_axis(arr, indices, axis)[source]
    
Take values from the input array by matching 1d index and data slices.
This iterates over matching 1d slices oriented along the specified axis in the index and data arrays, and uses the former to look up values in the latter. These slices can be different lengths.
Functions returning an index along an axis, like `argsort` and `argpartition`, produce suitable indices for this function.
Parameters:
    
arrndarray (Ni…, M, Nk…)
    
Source array
indicesndarray (Ni…, J, Nk…)
    
Indices to take along each 1d slice of `arr`. This must match the dimension of arr, but dimensions Ni and Nj only need to broadcast against `arr`.
axisint
    
The axis to take 1d slices along. If axis is None, the input array is treated as if it had first been flattened to 1d, for consistency with `sort` and `argsort`.
Returns:
    
out: ndarray (Ni…, J, Nk…)
    
The indexed result.
See also
`take`
    
Take along an axis, using the same indices for every 1d slice
`put_along_axis`
    
Put values into the destination array by matching 1d index and data slices
#### Notes
This is equivalent to (but faster than) the following use of `ndindex` and `s_`, which sets each of `ii` and `kk` to a tuple of indices:
    
    Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
    J = indices.shape[axis]  # Need not equal M
    out = np.empty(Ni + (J,) + Nk)
    
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            a_1d       = a      [ii + s_[:,] + kk]
            indices_1d = indices[ii + s_[:,] + kk]
            out_1d     = out    [ii + s_[:,] + kk]
            for j in range(J):
                out_1d[j] = a_1d[indices_1d[j]]
    
Equivalently, eliminating the inner loop, the last two lines would be:
    
    out_1d[:] = a_1d[indices_1d]
    
#### Examples
    
    >>> import numpy as np
    
For this sample array
    
    >>> a = np.array([[10, 30, 20], [60, 40, 50]])
    
We can sort either by using sort directly, or argsort and this function
    
    >>> np.sort(a, axis=1)
    array([[10, 20, 30],
           [40, 50, 60]])
    >>> ai = np.argsort(a, axis=1)
    >>> ai
    array([[0, 2, 1],
           [1, 2, 0]])
    >>> np.take_along_axis(a, ai, axis=1)
    array([[10, 20, 30],
           [40, 50, 60]])
    
The same works for max and min, if you maintain the trivial dimension with `keepdims`:
    
    >>> np.max(a, axis=1, keepdims=True)
    array([[30],
           [60]])
    >>> ai = np.argmax(a, axis=1, keepdims=True)
    >>> ai
    array([[1],
           [0]])
    >>> np.take_along_axis(a, ai, axis=1)
    array([[30],
           [60]])
    
If we want to get the max and min at the same time, we can stack the indices first
    
    >>> ai_min = np.argmin(a, axis=1, keepdims=True)
    >>> ai_max = np.argmax(a, axis=1, keepdims=True)
    >>> ai = np.concatenate([ai_min, ai_max], axis=1)
    >>> ai
    array([[0, 1],
           [1, 0]])
    >>> np.take_along_axis(a, ai, axis=1)
    array([[10, 30],
           [40, 60]])
    
# numpy.tan
numpy.tan(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'tan'>
    
Compute tangent element-wise.
Equivalent to `np.sin(x)/np.cos(x)` element-wise.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding tangent values. This is a scalar if `x` is a scalar.
#### Notes
If `out` is provided, the function writes the result into it, and returns a reference to `out`. (See Examples)
#### References
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions. New York, NY: Dover, 1972.
#### Examples
    
    >>> import numpy as np
    >>> from math import pi
    >>> np.tan(np.array([-pi,pi/2,pi]))
    array([  1.22460635e-16,   1.63317787e+16,  -1.22460635e-16])
    >>>
    >>> # Example of providing the optional output parameter illustrating
    >>> # that what is returned is a reference to said parameter
    >>> out1 = np.array([0], dtype='d')
    >>> out2 = np.cos([0.1], out1)
    >>> out2 is out1
    True
    >>>
    >>> # Example of ValueError due to provision of shape mis-matched `out`
    >>> np.cos(np.zeros((3,3)),np.zeros((2,2)))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (3,3) (2,2)
    
# numpy.tanh
numpy.tanh(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'tanh'>
    
Compute hyperbolic tangent element-wise.
Equivalent to `np.sinh(x)/np.cosh(x)` or `-1j * np.tan(1j*x)`.
Parameters:
    
xarray_like
    
Input array.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The corresponding hyperbolic tangent values. This is a scalar if `x` is a scalar.
#### Notes
If `out` is provided, the function writes the result into it, and returns a reference to `out`. (See Examples)
#### References
[1]
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions. New York, NY: Dover, 1972, pg. 83. https://personal.math.ubc.ca/~cbm/aands/page_83.htm
[2]
Wikipedia, “Hyperbolic function”, https://en.wikipedia.org/wiki/Hyperbolic_function
#### Examples
    
    >>> import numpy as np
    >>> np.tanh((0, np.pi*1j, np.pi*1j/2))
    array([ 0. +0.00000000e+00j,  0. -1.22460635e-16j,  0. +1.63317787e+16j])
    
    
    >>> # Example of providing the optional output parameter illustrating
    >>> # that what is returned is a reference to said parameter
    >>> out1 = np.array([0], dtype='d')
    >>> out2 = np.tanh([0.1], out1)
    >>> out2 is out1
    True
    
    
    >>> # Example of ValueError due to provision of shape mis-matched `out`
    >>> np.tanh(np.zeros((3,3)),np.zeros((2,2)))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (3,3) (2,2)
    
# numpy.tensordot
numpy.tensordot(a, b, axes=2)[source]
    
Compute tensor dot product along specified axes.
Given two tensors, `a` and `b`, and an array_like object containing two array_like objects, `(a_axes, b_axes)`, sum the products of `a`’s and `b`’s elements (components) over the axes specified by `a_axes` and `b_axes`. The third argument can be a single non-negative integer_like scalar, `N`; if it is such, then the last `N` dimensions of `a` and the first `N` dimensions of `b` are summed over.
Parameters:
    
a, barray_like
    
Tensors to “dot”.
axesint or (2,) array_like
    
  * integer_like If an int N, sum over the last N axes of `a` and the first N axes of `b` in order. The sizes of the corresponding axes must match.
  * (2,) array_like Or, a list of axes to be summed over, first sequence applying to `a`, second to `b`. Both elements array_like must be of the same length.


Returns:
    
outputndarray
    
The tensor dot product of the input.
See also
`dot`, `einsum`
#### Notes
Three common use cases are:
    
  * `axes = 0` : tensor product \\(a\otimes b\\)
  * `axes = 1` : tensor dot product \\(a\cdot b\\)
  * `axes = 2` : (default) tensor double contraction \\(a:b\\)


When `axes` is integer_like, the sequence of axes for evaluation will be: from the -Nth axis to the -1th axis in `a`, and from the 0th axis to (N-1)th axis in `b`. For example, `axes = 2` is the equal to `axes = [[-2, -1], [0, 1]]`. When N-1 is smaller than 0, or when -N is larger than -1, the element of `a` and `b` are defined as the `axes`.
When there is more than one axis to sum over - and they are not the last (first) axes of `a` (`b`) - the argument `axes` should consist of two sequences of the same length, with the first axis to sum over given first in both sequences, the second axis second, and so forth. The calculation can be referred to `numpy.einsum`.
The shape of the result consists of the non-contracted axes of the first tensor, followed by the non-contracted axes of the second.
#### Examples
An example on integer_like:
    
    >>> a_0 = np.array([[1, 2], [3, 4]])
    >>> b_0 = np.array([[5, 6], [7, 8]])
    >>> c_0 = np.tensordot(a_0, b_0, axes=0)
    >>> c_0.shape
    (2, 2, 2, 2)
    >>> c_0
    array([[[[ 5,  6],
             [ 7,  8]],
            [[10, 12],
             [14, 16]]],
           [[[15, 18],
             [21, 24]],
            [[20, 24],
             [28, 32]]]])
    
An example on array_like:
    
    >>> a = np.arange(60.).reshape(3,4,5)
    >>> b = np.arange(24.).reshape(4,3,2)
    >>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
    >>> c.shape
    (5, 2)
    >>> c
    array([[4400., 4730.],
           [4532., 4874.],
           [4664., 5018.],
           [4796., 5162.],
           [4928., 5306.]])
    
A slower but equivalent way of computing the same…
    
    >>> d = np.zeros((5,2))
    >>> for i in range(5):
    ...   for j in range(2):
    ...     for k in range(3):
    ...       for n in range(4):
    ...         d[i,j] += a[k,n,i] * b[n,k,j]
    >>> c == d
    array([[ True,  True],
           [ True,  True],
           [ True,  True],
           [ True,  True],
           [ True,  True]])
    
An extended example taking advantage of the overloading of + and *:
    
    >>> a = np.array(range(1, 9))
    >>> a.shape = (2, 2, 2)
    >>> A = np.array(('a', 'b', 'c', 'd'), dtype=object)
    >>> A.shape = (2, 2)
    >>> a; A
    array([[[1, 2],
            [3, 4]],
           [[5, 6],
            [7, 8]]])
    array([['a', 'b'],
           ['c', 'd']], dtype=object)
    
    
    >>> np.tensordot(a, A) # third argument default is 2 for double-contraction
    array(['abbcccdddd', 'aaaaabbbbbbcccccccdddddddd'], dtype=object)
    
    
    >>> np.tensordot(a, A, 1)
    array([[['acc', 'bdd'],
            ['aaacccc', 'bbbdddd']],
           [['aaaaacccccc', 'bbbbbdddddd'],
            ['aaaaaaacccccccc', 'bbbbbbbdddddddd']]], dtype=object)
    
    
    >>> np.tensordot(a, A, 0) # tensor product (result too long to incl.)
    array([[[[['a', 'b'],
              ['c', 'd']],
              ...
    
    
    >>> np.tensordot(a, A, (0, 1))
    array([[['abbbbb', 'cddddd'],
            ['aabbbbbb', 'ccdddddd']],
           [['aaabbbbbbb', 'cccddddddd'],
            ['aaaabbbbbbbb', 'ccccdddddddd']]], dtype=object)
    
    
    >>> np.tensordot(a, A, (2, 1))
    array([[['abb', 'cdd'],
            ['aaabbbb', 'cccdddd']],
           [['aaaaabbbbbb', 'cccccdddddd'],
            ['aaaaaaabbbbbbbb', 'cccccccdddddddd']]], dtype=object)
    
    
    >>> np.tensordot(a, A, ((0, 1), (0, 1)))
    array(['abbbcccccddddddd', 'aabbbbccccccdddddddd'], dtype=object)
    
    
    >>> np.tensordot(a, A, ((2, 1), (1, 0)))
    array(['acccbbdddd', 'aaaaacccccccbbbbbbdddddddd'], dtype=object)
    
# numpy.testing.assert_
testing.assert_(val, msg='')[source]
    
Assert that works in release mode. Accepts callable msg to allow deferring evaluation until failure.
The Python built-in `assert` does not work when executing code in optimized mode (the `-O` flag) - no byte-code is generated for it.
For documentation on usage, refer to the Python documentation.
# numpy.testing.assert_allclose
testing.assert_allclose(actual, desired, rtol=1e-07, atol=0, equal_nan=True, err_msg='', verbose=True, *, strict=False)[source]
    
Raises an AssertionError if two objects are not equal up to desired tolerance.
Given two array_like objects, check that their shapes and all elements are equal (but see the Notes for the special handling of a scalar). An exception is raised if the shapes mismatch or any values conflict. In contrast to the standard usage in numpy, NaNs are compared like numbers, no assertion is raised if both objects have NaNs in the same positions.
The test is equivalent to `allclose(actual, desired, rtol, atol)` (note that `allclose` has different default values). It compares the difference between `actual` and `desired` to `atol + rtol * abs(desired)`.
Parameters:
    
actualarray_like
    
Array obtained.
desiredarray_like
    
Array desired.
rtolfloat, optional
    
Relative tolerance.
atolfloat, optional
    
Absolute tolerance.
equal_nanbool, optional.
    
If True, NaNs will compare equal.
err_msgstr, optional
    
The error message to be printed in case of failure.
verbosebool, optional
    
If True, the conflicting values are appended to the error message.
strictbool, optional
    
If True, raise an `AssertionError` when either the shape or the data type of the arguments does not match. The special handling of scalars mentioned in the Notes section is disabled.
New in version 2.0.0.
Raises:
    
AssertionError
    
If actual and desired are not equal up to specified precision.
See also
`assert_array_almost_equal_nulp`, `assert_array_max_ulp`
#### Notes
When one of `actual` and `desired` is a scalar and the other is array_like, the function performs the comparison as if the scalar were broadcasted to the shape of the array. This behaviour can be disabled with the `strict` parameter.
#### Examples
    
    >>> x = [1e-5, 1e-3, 1e-1]
    >>> y = np.arccos(np.cos(x))
    >>> np.testing.assert_allclose(x, y, rtol=1e-5, atol=0)
    
As mentioned in the Notes section, `assert_allclose` has special handling for scalars. Here, the test checks that the value of `numpy.sin` is nearly zero at integer multiples of π.
    
    >>> x = np.arange(3) * np.pi
    >>> np.testing.assert_allclose(np.sin(x), 0, atol=1e-15)
    
Use `strict` to raise an `AssertionError` when comparing an array with one or more dimensions against a scalar.
    
    >>> np.testing.assert_allclose(np.sin(x), 0, atol=1e-15, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Not equal to tolerance rtol=1e-07, atol=1e-15
    
    (shapes (3,), () mismatch)
     ACTUAL: array([ 0.000000e+00,  1.224647e-16, -2.449294e-16])
     DESIRED: array(0)
    
The `strict` parameter also ensures that the array data types match:
    
    >>> y = np.zeros(3, dtype=np.float32)
    >>> np.testing.assert_allclose(np.sin(x), y, atol=1e-15, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Not equal to tolerance rtol=1e-07, atol=1e-15
    
    (dtypes float64, float32 mismatch)
     ACTUAL: array([ 0.000000e+00,  1.224647e-16, -2.449294e-16])
     DESIRED: array([0., 0., 0.], dtype=float32)
    
# numpy.testing.assert_almost_equal
testing.assert_almost_equal(actual, desired, decimal=7, err_msg='', verbose=True)[source]
    
Raises an AssertionError if two items are not equal up to desired precision.
Note
It is recommended to use one of `assert_allclose`, `assert_array_almost_equal_nulp` or `assert_array_max_ulp` instead of this function for more consistent floating point comparisons.
The test verifies that the elements of `actual` and `desired` satisfy:
    
    abs(desired-actual) < float64(1.5 * 10**(-decimal))
    
That is a looser test than originally documented, but agrees with what the actual implementation in `assert_array_almost_equal` did up to rounding vagaries. An exception is raised at conflicting values. For ndarrays this delegates to assert_array_almost_equal
Parameters:
    
actualarray_like
    
The object to check.
desiredarray_like
    
The expected object.
decimalint, optional
    
Desired precision, default is 7.
err_msgstr, optional
    
The error message to be printed in case of failure.
verbosebool, optional
    
If True, the conflicting values are appended to the error message.
Raises:
    
AssertionError
    
If actual and desired are not equal up to specified precision.
See also
`assert_allclose`
    
Compare two array_like objects for equality with desired relative and/or absolute precision.
`assert_array_almost_equal_nulp`, `assert_array_max_ulp`, `assert_equal`
#### Examples
    
    >>> from numpy.testing import assert_almost_equal
    >>> assert_almost_equal(2.3333333333333, 2.33333334)
    >>> assert_almost_equal(2.3333333333333, 2.33333334, decimal=10)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not almost equal to 10 decimals
     ACTUAL: 2.3333333333333
     DESIRED: 2.33333334
    
    
    >>> assert_almost_equal(np.array([1.0,2.3333333333333]),
    ...                     np.array([1.0,2.33333334]), decimal=9)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not almost equal to 9 decimals
    
    Mismatched elements: 1 / 2 (50%)
    Max absolute difference among violations: 6.66669964e-09
    Max relative difference among violations: 2.85715698e-09
     ACTUAL: array([1.         , 2.333333333])
     DESIRED: array([1.        , 2.33333334])
    
# numpy.testing.assert_approx_equal
testing.assert_approx_equal(actual, desired, significant=7, err_msg='', verbose=True)[source]
    
Raises an AssertionError if two items are not equal up to significant digits.
Note
It is recommended to use one of `assert_allclose`, `assert_array_almost_equal_nulp` or `assert_array_max_ulp` instead of this function for more consistent floating point comparisons.
Given two numbers, check that they are approximately equal. Approximately equal is defined as the number of significant digits that agree.
Parameters:
    
actualscalar
    
The object to check.
desiredscalar
    
The expected object.
significantint, optional
    
Desired precision, default is 7.
err_msgstr, optional
    
The error message to be printed in case of failure.
verbosebool, optional
    
If True, the conflicting values are appended to the error message.
Raises:
    
AssertionError
    
If actual and desired are not equal up to specified precision.
See also
`assert_allclose`
    
Compare two array_like objects for equality with desired relative and/or absolute precision.
`assert_array_almost_equal_nulp`, `assert_array_max_ulp`, `assert_equal`
#### Examples
    
    >>> np.testing.assert_approx_equal(0.12345677777777e-20, 0.1234567e-20)
    >>> np.testing.assert_approx_equal(0.12345670e-20, 0.12345671e-20,
    ...                                significant=8)
    >>> np.testing.assert_approx_equal(0.12345670e-20, 0.12345672e-20,
    ...                                significant=8)
    Traceback (most recent call last):
        ...
    AssertionError:
    Items are not equal to 8 significant digits:
     ACTUAL: 1.234567e-21
     DESIRED: 1.2345672e-21
    
the evaluated condition that raises the exception is
    
    >>> abs(0.12345670e-20/1e-21 - 0.12345672e-20/1e-21) >= 10**-(8-1)
    True
    
# numpy.testing.assert_array_almost_equal
testing.assert_array_almost_equal(actual, desired, decimal=6, err_msg='', verbose=True)[source]
    
Raises an AssertionError if two objects are not equal up to desired precision.
Note
It is recommended to use one of `assert_allclose`, `assert_array_almost_equal_nulp` or `assert_array_max_ulp` instead of this function for more consistent floating point comparisons.
The test verifies identical shapes and that the elements of `actual` and `desired` satisfy:
    
    abs(desired-actual) < 1.5 * 10**(-decimal)
    
That is a looser test than originally documented, but agrees with what the actual implementation did up to rounding vagaries. An exception is raised at shape mismatch or conflicting values. In contrast to the standard usage in numpy, NaNs are compared like numbers, no assertion is raised if both objects have NaNs in the same positions.
Parameters:
    
actualarray_like
    
The actual object to check.
desiredarray_like
    
The desired, expected object.
decimalint, optional
    
Desired precision, default is 6.
err_msgstr, optional
    
The error message to be printed in case of failure.
verbosebool, optional
    
If True, the conflicting values are appended to the error message.
Raises:
    
AssertionError
    
If actual and desired are not equal up to specified precision.
See also
`assert_allclose`
    
Compare two array_like objects for equality with desired relative and/or absolute precision.
`assert_array_almost_equal_nulp`, `assert_array_max_ulp`, `assert_equal`
#### Examples
the first assert does not raise an exception
    
    >>> np.testing.assert_array_almost_equal([1.0,2.333,np.nan],
    ...                                      [1.0,2.333,np.nan])
    
    
    >>> np.testing.assert_array_almost_equal([1.0,2.33333,np.nan],
    ...                                      [1.0,2.33339,np.nan], decimal=5)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not almost equal to 5 decimals
    
    Mismatched elements: 1 / 3 (33.3%)
    Max absolute difference among violations: 6.e-05
    Max relative difference among violations: 2.57136612e-05
     ACTUAL: array([1.     , 2.33333,     nan])
     DESIRED: array([1.     , 2.33339,     nan])
    
    
    >>> np.testing.assert_array_almost_equal([1.0,2.33333,np.nan],
    ...                                      [1.0,2.33333, 5], decimal=5)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not almost equal to 5 decimals
    
    nan location mismatch:
     ACTUAL: array([1.     , 2.33333,     nan])
     DESIRED: array([1.     , 2.33333, 5.     ])
    
# numpy.testing.assert_array_almost_equal_nulp
testing.assert_array_almost_equal_nulp(x, y, nulp=1)[source]
    
Compare two arrays relatively to their spacing.
This is a relatively robust method to compare two arrays whose amplitude is variable.
Parameters:
    
x, yarray_like
    
Input arrays.
nulpint, optional
    
The maximum number of unit in the last place for tolerance (see Notes). Default is 1.
Returns:
    
None
Raises:
    
AssertionError
    
If the spacing between `x` and `y` for one or more elements is larger than `nulp`.
See also
`assert_array_max_ulp`
    
Check that all items of arrays differ in at most N Units in the Last Place.
`spacing`
    
Return the distance between x and the nearest adjacent number.
#### Notes
An assertion is raised if the following condition is not met:
    
    abs(x - y) <= nulp * spacing(maximum(abs(x), abs(y)))
    
#### Examples
    
    >>> x = np.array([1., 1e-10, 1e-20])
    >>> eps = np.finfo(x.dtype).eps
    >>> np.testing.assert_array_almost_equal_nulp(x, x*eps/2 + x)
    
    
    >>> np.testing.assert_array_almost_equal_nulp(x, x*eps + x)
    Traceback (most recent call last):
      ...
    AssertionError: Arrays are not equal to 1 ULP (max is 2)
    
# numpy.testing.assert_array_equal
testing.assert_array_equal(actual, desired, err_msg='', verbose=True, *, strict=False)[source]
    
Raises an AssertionError if two array_like objects are not equal.
Given two array_like objects, check that the shape is equal and all elements of these objects are equal (but see the Notes for the special handling of a scalar). An exception is raised at shape mismatch or conflicting values. In contrast to the standard usage in numpy, NaNs are compared like numbers, no assertion is raised if both objects have NaNs in the same positions.
The usual caution for verifying equality with floating point numbers is advised.
Note
When either `actual` or `desired` is already an instance of `numpy.ndarray` and `desired` is not a `dict`, the behavior of `assert_equal(actual, desired)` is identical to the behavior of this function. Otherwise, this function performs `np.asanyarray` on the inputs before comparison, whereas `assert_equal` defines special comparison rules for common Python types. For example, only `assert_equal` can be used to compare nested Python lists. In new code, consider using only `assert_equal`, explicitly converting either `actual` or `desired` to arrays if the behavior of `assert_array_equal` is desired.
Parameters:
    
actualarray_like
    
The actual object to check.
desiredarray_like
    
The desired, expected object.
err_msgstr, optional
    
The error message to be printed in case of failure.
verbosebool, optional
    
If True, the conflicting values are appended to the error message.
strictbool, optional
    
If True, raise an AssertionError when either the shape or the data type of the array_like objects does not match. The special handling for scalars mentioned in the Notes section is disabled.
New in version 1.24.0.
Raises:
    
AssertionError
    
If actual and desired objects are not equal.
See also
`assert_allclose`
    
Compare two array_like objects for equality with desired relative and/or absolute precision.
`assert_array_almost_equal_nulp`, `assert_array_max_ulp`, `assert_equal`
#### Notes
When one of `actual` and `desired` is a scalar and the other is array_like, the function checks that each element of the array_like object is equal to the scalar. This behaviour can be disabled with the `strict` parameter.
#### Examples
The first assert does not raise an exception:
    
    >>> np.testing.assert_array_equal([1.0,2.33333,np.nan],
    ...                               [np.exp(0),2.33333, np.nan])
    
Assert fails with numerical imprecision with floats:
    
    >>> np.testing.assert_array_equal([1.0,np.pi,np.nan],
    ...                               [1, np.sqrt(np.pi)**2, np.nan])
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not equal
    
    Mismatched elements: 1 / 3 (33.3%)
    Max absolute difference among violations: 4.4408921e-16
    Max relative difference among violations: 1.41357986e-16
     ACTUAL: array([1.      , 3.141593,      nan])
     DESIRED: array([1.      , 3.141593,      nan])
    
Use `assert_allclose` or one of the nulp (number of floating point values) functions for these cases instead:
    
    >>> np.testing.assert_allclose([1.0,np.pi,np.nan],
    ...                            [1, np.sqrt(np.pi)**2, np.nan],
    ...                            rtol=1e-10, atol=0)
    
As mentioned in the Notes section, `assert_array_equal` has special handling for scalars. Here the test checks that each value in `x` is 3:
    
    >>> x = np.full((2, 5), fill_value=3)
    >>> np.testing.assert_array_equal(x, 3)
    
Use `strict` to raise an AssertionError when comparing a scalar with an array:
    
    >>> np.testing.assert_array_equal(x, 3, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not equal
    
    (shapes (2, 5), () mismatch)
     ACTUAL: array([[3, 3, 3, 3, 3],
           [3, 3, 3, 3, 3]])
     DESIRED: array(3)
    
The `strict` parameter also ensures that the array data types match:
    
    >>> x = np.array([2, 2, 2])
    >>> y = np.array([2., 2., 2.], dtype=np.float32)
    >>> np.testing.assert_array_equal(x, y, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not equal
    
    (dtypes int64, float32 mismatch)
     ACTUAL: array([2, 2, 2])
     DESIRED: array([2., 2., 2.], dtype=float32)
    
# numpy.testing.assert_array_less
testing.assert_array_less(x, y, err_msg='', verbose=True, *, strict=False)[source]
    
Raises an AssertionError if two array_like objects are not ordered by less than.
Given two array_like objects `x` and `y`, check that the shape is equal and all elements of `x` are strictly less than the corresponding elements of `y` (but see the Notes for the special handling of a scalar). An exception is raised at shape mismatch or values that are not correctly ordered. In contrast to the standard usage in NumPy, no assertion is raised if both objects have NaNs in the same positions.
Parameters:
    
xarray_like
    
The smaller object to check.
yarray_like
    
The larger object to compare.
err_msgstring
    
The error message to be printed in case of failure.
verbosebool
    
If True, the conflicting values are appended to the error message.
strictbool, optional
    
If True, raise an AssertionError when either the shape or the data type of the array_like objects does not match. The special handling for scalars mentioned in the Notes section is disabled.
New in version 2.0.0.
Raises:
    
AssertionError
    
If x is not strictly smaller than y, element-wise.
See also
`assert_array_equal`
    
tests objects for equality
`assert_array_almost_equal`
    
test objects for equality up to precision
#### Notes
When one of `x` and `y` is a scalar and the other is array_like, the function performs the comparison as though the scalar were broadcasted to the shape of the array. This behaviour can be disabled with the `strict` parameter.
#### Examples
The following assertion passes because each finite element of `x` is strictly less than the corresponding element of `y`, and the NaNs are in corresponding locations.
    
    >>> x = [1.0, 1.0, np.nan]
    >>> y = [1.1, 2.0, np.nan]
    >>> np.testing.assert_array_less(x, y)
    
The following assertion fails because the zeroth element of `x` is no longer strictly less than the zeroth element of `y`.
    
    >>> y[0] = 1
    >>> np.testing.assert_array_less(x, y)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not strictly ordered `x < y`
    
    Mismatched elements: 1 / 3 (33.3%)
    Max absolute difference among violations: 0.
    Max relative difference among violations: 0.
     x: array([ 1.,  1., nan])
     y: array([ 1.,  2., nan])
    
Here, `y` is a scalar, so each element of `x` is compared to `y`, and the assertion passes.
    
    >>> x = [1.0, 4.0]
    >>> y = 5.0
    >>> np.testing.assert_array_less(x, y)
    
However, with `strict=True`, the assertion will fail because the shapes do not match.
    
    >>> np.testing.assert_array_less(x, y, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not strictly ordered `x < y`
    
    (shapes (2,), () mismatch)
     x: array([1., 4.])
     y: array(5.)
    
With `strict=True`, the assertion also fails if the dtypes of the two arrays do not match.
    
    >>> y = [5, 5]
    >>> np.testing.assert_array_less(x, y, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not strictly ordered `x < y`
    
    (dtypes float64, int64 mismatch)
     x: array([1., 4.])
     y: array([5, 5])
    
# numpy.testing.assert_array_max_ulp
testing.assert_array_max_ulp(a, b, maxulp=1, dtype=None)[source]
    
Check that all items of arrays differ in at most N Units in the Last Place.
Parameters:
    
a, barray_like
    
Input arrays to be compared.
maxulpint, optional
    
The maximum number of units in the last place that elements of `a` and `b` can differ. Default is 1.
dtypedtype, optional
    
Data-type to convert `a` and `b` to if given. Default is None.
Returns:
    
retndarray
    
Array containing number of representable floating point numbers between items in `a` and `b`.
Raises:
    
AssertionError
    
If one or more elements differ by more than `maxulp`.
See also
`assert_array_almost_equal_nulp`
    
Compare two arrays relatively to their spacing.
#### Notes
For computing the ULP difference, this API does not differentiate between various representations of NAN (ULP difference between 0x7fc00000 and 0xffc00000 is zero).
#### Examples
    
    >>> a = np.linspace(0., 1., 100)
    >>> res = np.testing.assert_array_max_ulp(a, np.arcsin(np.sin(a)))
    
# numpy.testing.assert_equal
testing.assert_equal(actual, desired, err_msg='', verbose=True, *, strict=False)[source]
    
Raises an AssertionError if two objects are not equal.
Given two objects (scalars, lists, tuples, dictionaries or numpy arrays), check that all elements of these objects are equal. An exception is raised at the first conflicting values.
This function handles NaN comparisons as if NaN was a “normal” number. That is, AssertionError is not raised if both objects have NaNs in the same positions. This is in contrast to the IEEE standard on NaNs, which says that NaN compared to anything must return False.
Parameters:
    
actualarray_like
    
The object to check.
desiredarray_like
    
The expected object.
err_msgstr, optional
    
The error message to be printed in case of failure.
verbosebool, optional
    
If True, the conflicting values are appended to the error message.
strictbool, optional
    
If True and either of the `actual` and `desired` arguments is an array, raise an `AssertionError` when either the shape or the data type of the arguments does not match. If neither argument is an array, this parameter has no effect.
New in version 2.0.0.
Raises:
    
AssertionError
    
If actual and desired are not equal.
See also
`assert_allclose`
`assert_array_almost_equal_nulp`
`assert_array_max_ulp`
#### Notes
By default, when one of `actual` and `desired` is a scalar and the other is an array, the function checks that each element of the array is equal to the scalar. This behaviour can be disabled by setting `strict==True`.
#### Examples
    
    >>> np.testing.assert_equal([4, 5], [4, 6])
    Traceback (most recent call last):
        ...
    AssertionError:
    Items are not equal:
    item=1
     ACTUAL: 5
     DESIRED: 6
    
The following comparison does not raise an exception. There are NaNs in the inputs, but they are in the same positions.
    
    >>> np.testing.assert_equal(np.array([1.0, 2.0, np.nan]), [1, 2, np.nan])
    
As mentioned in the Notes section, `assert_equal` has special handling for scalars when one of the arguments is an array. Here, the test checks that each value in `x` is 3:
    
    >>> x = np.full((2, 5), fill_value=3)
    >>> np.testing.assert_equal(x, 3)
    
Use `strict` to raise an AssertionError when comparing a scalar with an array of a different shape:
    
    >>> np.testing.assert_equal(x, 3, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not equal
    
    (shapes (2, 5), () mismatch)
     ACTUAL: array([[3, 3, 3, 3, 3],
           [3, 3, 3, 3, 3]])
     DESIRED: array(3)
    
The `strict` parameter also ensures that the array data types match:
    
    >>> x = np.array([2, 2, 2])
    >>> y = np.array([2., 2., 2.], dtype=np.float32)
    >>> np.testing.assert_equal(x, y, strict=True)
    Traceback (most recent call last):
        ...
    AssertionError:
    Arrays are not equal
    
    (dtypes int64, float32 mismatch)
     ACTUAL: array([2, 2, 2])
     DESIRED: array([2., 2., 2.], dtype=float32)
    
# numpy.testing.assert_no_gc_cycles
testing.assert_no_gc_cycles(*args, **kwargs)[source]
    
Fail if the given callable produces any reference cycles.
If called with all arguments omitted, may be used as a context manager:
    
    with assert_no_gc_cycles():
        do_something()
    
Parameters:
    
funccallable
    
The callable to test.
*argsArguments
    
Arguments passed to `func`.
**kwargsKwargs
    
Keyword arguments passed to `func`.
Returns:
    
Nothing. The result is deliberately discarded to ensure that all cycles
are found.
# numpy.testing.assert_no_warnings
testing.assert_no_warnings(*args, **kwargs)[source]
    
Fail if the given callable produces any warnings.
If called with all arguments omitted, may be used as a context manager:
    
    with assert_no_warnings():
        do_something()
    
The ability to be used as a context manager is new in NumPy v1.11.0.
Parameters:
    
funccallable
    
The callable to test.
*argsArguments
    
Arguments passed to `func`.
**kwargsKwargs
    
Keyword arguments passed to `func`.
Returns:
    
The value returned by `func`.
# numpy.testing.assert_raises
testing.assert_raises(exception_class, callable, *args, **kwargs) assert_raises(exception_class)[source]
testing.assert_raises(exception_class) → None
    
Fail unless an exception of class exception_class is thrown by callable when invoked with arguments args and keyword arguments kwargs. If a different type of exception is thrown, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception.
Alternatively, `assert_raises` can be used as a context manager:
    
    >>> from numpy.testing import assert_raises
    >>> with assert_raises(ZeroDivisionError):
    ...     1 / 0
    
is equivalent to
    
    >>> def div(x, y):
    ...     return x / y
    >>> assert_raises(ZeroDivisionError, div, 1, 0)
    
# numpy.testing.assert_raises_regex
testing.assert_raises_regex(exception_class, expected_regexp, callable, *args, **kwargs) assert_raises_regex(exception_class, expected_regexp)[source]
    
Fail unless an exception of class exception_class and with message that matches expected_regexp is thrown by callable when invoked with arguments args and keyword arguments kwargs.
Alternatively, can be used as a context manager like `assert_raises`.
# numpy.testing.assert_string_equal
testing.assert_string_equal(actual, desired)[source]
    
Test if two strings are equal.
If the given strings are equal, `assert_string_equal` does nothing. If they are not equal, an AssertionError is raised, and the diff between the strings is shown.
Parameters:
    
actualstr
    
The string to test for equality against the expected string.
desiredstr
    
The expected string.
#### Examples
    
    >>> np.testing.assert_string_equal('abc', 'abc')
    >>> np.testing.assert_string_equal('abc', 'abcd')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ...
    AssertionError: Differences in strings:
    - abc+ abcd?    +
    
# numpy.testing.assert_warns
testing.assert_warns(warning_class, *args, **kwargs)[source]
    
Fail unless the given callable throws the specified warning.
A warning of class warning_class should be thrown by the callable when invoked with arguments args and keyword arguments kwargs. If a different type of warning is thrown, it will not be caught.
If called with all arguments other than the warning class omitted, may be used as a context manager:
    
    with assert_warns(SomeWarning):
        do_something()
    
The ability to be used as a context manager is new in NumPy v1.11.0.
Parameters:
    
warning_classclass
    
The class defining the warning that `func` is expected to throw.
funccallable, optional
    
Callable to test
*argsArguments
    
Arguments for `func`.
**kwargsKwargs
    
Keyword arguments for `func`.
Returns:
    
The value returned by `func`.
#### Examples
    
    >>> import warnings
    >>> def deprecated_func(num):
    ...     warnings.warn("Please upgrade", DeprecationWarning)
    ...     return num*num
    >>> with np.testing.assert_warns(DeprecationWarning):
    ...     assert deprecated_func(4) == 16
    >>> # or passing a func
    >>> ret = np.testing.assert_warns(DeprecationWarning, deprecated_func, 4)
    >>> assert ret == 16
    
# numpy.testing.clear_and_catch_warnings
classnumpy.testing.clear_and_catch_warnings(record=False, modules=())[source]
    
Context manager that resets warning registry for catching warnings
Warnings can be slippery, because, whenever a warning is triggered, Python adds a `__warningregistry__` member to the calling module. This makes it impossible to retrigger the warning in this module, whatever you put in the warnings filters. This context manager accepts a sequence of `modules` as a keyword argument to its constructor and:
  * stores and removes any `__warningregistry__` entries in given `modules` on entry;
  * resets `__warningregistry__` to its previous state on exit.


This makes it possible to trigger any warning afresh inside the context manager without disturbing the state of warnings outside.
For compatibility with Python 3.0, please consider all arguments to be keyword-only.
Parameters:
    
recordbool, optional
    
Specifies whether warnings should be captured by a custom implementation of `warnings.showwarning()` and be appended to a list returned by the context manager. Otherwise None is returned by the context manager. The objects appended to the list are arguments whose attributes mirror the arguments to `showwarning()`.
modulessequence, optional
    
Sequence of modules for which to reset warnings registry on entry and restore on exit. To work correctly, all ‘ignore’ filters should filter by one of these modules.
#### Examples
    
    >>> import warnings
    >>> with np.testing.clear_and_catch_warnings(
    ...         modules=[np._core.fromnumeric]):
    ...     warnings.simplefilter('always')
    ...     warnings.filterwarnings('ignore', module='np._core.fromnumeric')
    ...     # do something that raises a warning but ignore those in
    ...     # np._core.fromnumeric
    
# numpy.testing.decorate_methods
testing.decorate_methods(cls, decorator, testmatch=None)[source]
    
Apply a decorator to all methods in a class matching a regular expression.
The given decorator is applied to all public methods of `cls` that are matched by the regular expression `testmatch` (`testmatch.search(methodname)`). Methods that are private, i.e. start with an underscore, are ignored.
Parameters:
    
clsclass
    
Class whose methods to decorate.
decoratorfunction
    
Decorator to apply to methods
testmatchcompiled regexp or str, optional
    
The regular expression. Default value is None, in which case the nose default (`re.compile(r'(?:^|[\b_\.%s-])[Tt]est' % os.sep)`) is used. If `testmatch` is a string, it is compiled to a regular expression first.
# numpy.testing.measure
testing.measure(code_str, times=1, label=None)[source]
    
Return elapsed time for executing code in the namespace of the caller.
The supplied code string is compiled with the Python builtin `compile`. The precision of the timing is 10 milli-seconds. If the code will execute fast on this timescale, it can be executed many times to get reasonable timing accuracy.
Parameters:
    
code_strstr
    
The code to be timed.
timesint, optional
    
The number of times the code is executed. Default is 1. The code is only compiled once.
labelstr, optional
    
A label to identify `code_str` with. This is passed into `compile` as the second argument (for run-time error messages).
Returns:
    
elapsedfloat
    
Total elapsed time in seconds for executing `code_str` `times` times.
#### Examples
    
    >>> times = 10
    >>> etime = np.testing.measure('for i in range(1000): np.sqrt(i**2)', times=times)
    >>> print("Time for a single execution : ", etime / times, "s")  
    Time for a single execution :  0.005 s
    
# numpy.testing.overrides.allows_array_function_override
testing.overrides.allows_array_function_override(func)[source]
    
Determine if a Numpy function can be overridden via `__array_function__`
Parameters:
    
funccallable
    
Function that may be overridable via `__array_function__`
Returns:
    
bool
    
`True` if `func` is a function in the Numpy API that is overridable via `__array_function__` and `False` otherwise.
# numpy.testing.overrides.allows_array_ufunc_override
testing.overrides.allows_array_ufunc_override(func)[source]
    
Determine if a function can be overridden via `__array_ufunc__`
Parameters:
    
funccallable
    
Function that may be overridable via `__array_ufunc__`
Returns:
    
bool
    
`True` if `func` is overridable via `__array_ufunc__` and `False` otherwise.
#### Notes
This function is equivalent to `isinstance(func, np.ufunc)` and will work correctly for ufuncs defined outside of Numpy.
# numpy.testing.overrides.get_overridable_numpy_array_functions
testing.overrides.get_overridable_numpy_array_functions()[source]
    
List all numpy functions overridable via `__array_function__`
Parameters:
    
None
Returns:
    
set
    
A set containing all functions in the public numpy API that are overridable via `__array_function__`.
# numpy.testing.overrides.get_overridable_numpy_ufuncs
testing.overrides.get_overridable_numpy_ufuncs()[source]
    
List all numpy ufuncs overridable via `__array_ufunc__`
Parameters:
    
None
Returns:
    
set
    
A set containing all overridable ufuncs in the public numpy API.
# numpy.testing.print_assert_equal
testing.print_assert_equal(test_string, actual, desired)[source]
    
Test if two objects are equal, and print an error message if test fails.
The test is performed with `actual == desired`.
Parameters:
    
test_stringstr
    
The message supplied to AssertionError.
actualobject
    
The object to test for equality against `desired`.
desiredobject
    
The expected result.
#### Examples
    
    >>> np.testing.print_assert_equal('Test XYZ of func xyz', [0, 1], [0, 1])
    >>> np.testing.print_assert_equal('Test XYZ of func xyz', [0, 1], [0, 2])
    Traceback (most recent call last):
    ...
    AssertionError: Test XYZ of func xyz failed
    ACTUAL:
    [0, 1]
    DESIRED:
    [0, 2]
    
# numpy.testing.rundocs
testing.rundocs(filename=None, raise_on_error=True)[source]
    
Run doctests found in the given file.
By default `rundocs` raises an AssertionError on failure.
Parameters:
    
filenamestr
    
The path to the file for which the doctests are run.
raise_on_errorbool
    
Whether to raise an AssertionError when a doctest fails. Default is True.
#### Notes
The doctests can be run by the user/developer by adding the `doctests` argument to the `test()` call. For example, to run all tests (including doctests) for `numpy.lib`:
    
    >>> np.lib.test(doctests=True)  
    
# numpy.testing.suppress_warnings.__call__
method
testing.suppress_warnings.__call__(func)[source]
    
Function decorator to apply certain suppressions to a whole function.
# numpy.testing.suppress_warnings.filter
method
testing.suppress_warnings.filter(category=<class 'Warning'>, message='', module=None)[source]
    
Add a new suppressing filter or apply it if the state is entered.
Parameters:
    
categoryclass, optional
    
Warning class to filter
messagestring, optional
    
Regular expression matching the warning message.
modulemodule, optional
    
Module to filter for. Note that the module (and its file) must match exactly and cannot be a submodule. This may make it unreliable for external modules.
#### Notes
When added within a context, filters are only added inside the context and will be forgotten when the context is exited.
# numpy.testing.suppress_warnings
classnumpy.testing.suppress_warnings(forwarding_rule='always')[source]
    
Context manager and decorator doing much the same as `warnings.catch_warnings`.
However, it also provides a filter mechanism to work around https://bugs.python.org/issue4180.
This bug causes Python before 3.4 to not reliably show warnings again after they have been ignored once (even within catch_warnings). It means that no “ignore” filter can be used easily, since following tests might need to see the warning. Additionally it allows easier specificity for testing warnings and can be nested.
Parameters:
    
forwarding_rulestr, optional
    
One of “always”, “once”, “module”, or “location”. Analogous to the usual warnings module filter mode, it is useful to reduce noise mostly on the outmost level. Unsuppressed and unrecorded warnings will be forwarded based on this rule. Defaults to “always”. “location” is equivalent to the warnings “default”, match by exact location the warning warning originated from.
#### Notes
Filters added inside the context manager will be discarded again when leaving it. Upon entering all filters defined outside a context will be applied automatically.
When a recording filter is added, matching warnings are stored in the `log` attribute as well as in the list returned by `record`.
If filters are added and the `module` keyword is given, the warning registry of this module will additionally be cleared when applying it, entering the context, or exiting it. This could cause warnings to appear a second time after leaving the context if they were configured to be printed once (default) and were already printed before the context was entered.
Nesting this context manager will work as expected when the forwarding rule is “always” (default). Unfiltered and unrecorded warnings will be passed out and be matched by the outer level. On the outmost level they will be printed (or caught by another warnings context). The forwarding rule argument can modify this behaviour.
Like `catch_warnings` this context manager is not threadsafe.
#### Examples
With a context manager:
    
    with np.testing.suppress_warnings() as sup:
        sup.filter(DeprecationWarning, "Some text")
        sup.filter(module=np.ma.core)
        log = sup.record(FutureWarning, "Does this occur?")
        command_giving_warnings()
        # The FutureWarning was given once, the filtered warnings were
        # ignored. All other warnings abide outside settings (may be
        # printed/error)
        assert_(len(log) == 1)
        assert_(len(sup.log) == 1)  # also stored in log attribute
    
Or as a decorator:
    
    sup = np.testing.suppress_warnings()
    sup.filter(module=np.ma.core)  # module must match exactly
    @sup
    def some_function():
        # do something which causes a warning in np.ma.core
        pass
    
#### Methods
`__call__`(func)
Function decorator to apply certain suppressions to a whole function.  
`filter`([category, message, module])
Add a new suppressing filter or apply it if the state is entered.  
`record`([category, message, module])
Append a new recording filter or apply it if the state is entered.  
# numpy.testing.suppress_warnings.record
method
testing.suppress_warnings.record(category=<class 'Warning'>, message='', module=None)[source]
    
Append a new recording filter or apply it if the state is entered.
All warnings matching will be appended to the `log` attribute.
Parameters:
    
categoryclass, optional
    
Warning class to filter
messagestring, optional
    
Regular expression matching the warning message.
modulemodule, optional
    
Module to filter for. Note that the module (and its file) must match exactly and cannot be a submodule. This may make it unreliable for external modules.
Returns:
    
loglist
    
A list which will be filled with all matched warnings.
#### Notes
When added within a context, filters are only added inside the context and will be forgotten when the context is exited.
# numpy.tile
numpy.tile(A, reps)[source]
    
Construct an array by repeating A the number of times given by reps.
If `reps` has length `d`, the result will have dimension of `max(d, A.ndim)`.
If `A.ndim < d`, `A` is promoted to be d-dimensional by prepending new axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication, or shape (1, 1, 3) for 3-D replication. If this is not the desired behavior, promote `A` to d-dimensions manually before calling this function.
If `A.ndim > d`, `reps` is promoted to `A`.ndim by prepending 1’s to it. Thus for an `A` of shape (2, 3, 4, 5), a `reps` of (2, 2) is treated as (1, 1, 2, 2).
Note : Although tile may be used for broadcasting, it is strongly recommended to use numpy’s broadcasting operations and functions.
Parameters:
    
Aarray_like
    
The input array.
repsarray_like
    
The number of repetitions of `A` along each axis.
Returns:
    
cndarray
    
The tiled output array.
See also
`repeat`
    
Repeat elements of an array.
`broadcast_to`
    
Broadcast an array to a new shape
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([0, 1, 2])
    >>> np.tile(a, 2)
    array([0, 1, 2, 0, 1, 2])
    >>> np.tile(a, (2, 2))
    array([[0, 1, 2, 0, 1, 2],
           [0, 1, 2, 0, 1, 2]])
    >>> np.tile(a, (2, 1, 2))
    array([[[0, 1, 2, 0, 1, 2]],
           [[0, 1, 2, 0, 1, 2]]])
    
    
    >>> b = np.array([[1, 2], [3, 4]])
    >>> np.tile(b, 2)
    array([[1, 2, 1, 2],
           [3, 4, 3, 4]])
    >>> np.tile(b, (2, 1))
    array([[1, 2],
           [3, 4],
           [1, 2],
           [3, 4]])
    
    
    >>> c = np.array([1,2,3,4])
    >>> np.tile(c,(4,1))
    array([[1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4]])
    
# numpy.trace
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)[source]
    
Return the sum along diagonals of the array.
If `a` is 2-D, the sum along its diagonal with the given offset is returned, i.e., the sum of elements `a[i,i+offset]` for all i.
If `a` has more than two dimensions, then the axes specified by axis1 and axis2 are used to determine the 2-D sub-arrays whose traces are returned. The shape of the resulting array is the same as that of `a` with `axis1` and `axis2` removed.
Parameters:
    
aarray_like
    
Input array, from which the diagonals are taken.
offsetint, optional
    
Offset of the diagonal from the main diagonal. Can be both positive and negative. Defaults to 0.
axis1, axis2int, optional
    
Axes to be used as the first and second axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults are the first two axes of `a`.
dtypedtype, optional
    
Determines the data-type of the returned array and of the accumulator where the elements are summed. If dtype has the value None and `a` is of integer type of precision less than the default integer precision, then the default integer precision is used. Otherwise, the precision is the same as that of `a`.
outndarray, optional
    
Array into which the output is placed. Its type is preserved and it must be of the right shape to hold the output.
Returns:
    
sum_along_diagonalsndarray
    
If `a` is 2-D, the sum along the diagonal is returned. If `a` has larger dimensions, then an array of sums along diagonals is returned.
See also
`diag`, `diagonal`, `diagflat`
#### Examples
    
    >>> import numpy as np
    >>> np.trace(np.eye(3))
    3.0
    >>> a = np.arange(8).reshape((2,2,2))
    >>> np.trace(a)
    array([6, 8])
    
    
    >>> a = np.arange(24).reshape((2,2,2,3))
    >>> np.trace(a).shape
    (2, 3)
    
# numpy.transpose
numpy.transpose(a, axes=None)[source]
    
Returns an array with axes transposed.
For a 1-D array, this returns an unchanged view of the original array, as a transposed vector is simply the same vector. To convert a 1-D array into a 2-D column vector, an additional dimension must be added, e.g., `np.atleast_2d(a).T` achieves this, as does `a[:, np.newaxis]`. For a 2-D array, this is the standard matrix transpose. For an n-D array, if axes are given, their order indicates how the axes are permuted (see Examples). If axes are not provided, then `transpose(a).shape == a.shape[::-1]`.
Parameters:
    
aarray_like
    
Input array.
axestuple or list of ints, optional
    
If specified, it must be a tuple or list which contains a permutation of [0, 1, …, N-1] where N is the number of axes of `a`. Negative indices can also be used to specify axes. The i-th axis of the returned array will correspond to the axis numbered `axes[i]` of the input. If not specified, defaults to `range(a.ndim)[::-1]`, which reverses the order of the axes.
Returns:
    
pndarray
    
`a` with its axes permuted. A view is returned whenever possible.
See also
`ndarray.transpose`
    
Equivalent method.
`moveaxis`
    
Move axes of an array to new positions.
`argsort`
    
Return the indices that would sort an array.
#### Notes
Use `transpose(a, argsort(axes))` to invert the transposition of tensors when using the `axes` keyword argument.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> a
    array([[1, 2],
           [3, 4]])
    >>> np.transpose(a)
    array([[1, 3],
           [2, 4]])
    
    
    >>> a = np.array([1, 2, 3, 4])
    >>> a
    array([1, 2, 3, 4])
    >>> np.transpose(a)
    array([1, 2, 3, 4])
    
    
    >>> a = np.ones((1, 2, 3))
    >>> np.transpose(a, (1, 0, 2)).shape
    (2, 1, 3)
    
    
    >>> a = np.ones((2, 3, 4, 5))
    >>> np.transpose(a).shape
    (5, 4, 3, 2)
    
    
    >>> a = np.arange(3*4*5).reshape((3, 4, 5))
    >>> np.transpose(a, (-1, 0, -2)).shape
    (5, 3, 4)
    
# numpy.trapezoid
numpy.trapezoid(y, x=None, dx=1.0, axis=-1)[source]
    
Integrate along the given axis using the composite trapezoidal rule.
If `x` is provided, the integration happens in sequence along its elements - they are not sorted.
Integrate `y` (`x`) along each 1d slice on the given axis, compute \\(\int y(x) dx\\). When `x` is specified, this integrates along the parametric curve, computing \\(\int_t y(t) dt = \int_t y(t) \left.\frac{dx}{dt}\right|_{x=x(t)} dt\\).
New in version 2.0.0.
Parameters:
    
yarray_like
    
Input array to integrate.
xarray_like, optional
    
The sample points corresponding to the `y` values. If `x` is None, the sample points are assumed to be evenly spaced `dx` apart. The default is None.
dxscalar, optional
    
The spacing between sample points when `x` is None. The default is 1.
axisint, optional
    
The axis along which to integrate.
Returns:
    
trapezoidfloat or ndarray
    
Definite integral of `y` = n-dimensional array as approximated along a single axis by the trapezoidal rule. If `y` is a 1-dimensional array, then the result is a float. If `n` is greater than 1, then the result is an `n`-1 dimensional array.
See also
`sum`, `cumsum`
#### Notes
Image [2] illustrates trapezoidal rule – y-axis locations of points will be taken from `y` array, by default x-axis distances between points will be 1.0, alternatively they can be provided with `x` array or with `dx` scalar. Return value will be equal to combined area under the red lines.
#### References
[1]
Wikipedia page: https://en.wikipedia.org/wiki/Trapezoidal_rule
[2]
Illustration image: https://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png
#### Examples
    
    >>> import numpy as np
    
Use the trapezoidal rule on evenly spaced points:
    
    >>> np.trapezoid([1, 2, 3])
    4.0
    
The spacing between sample points can be selected by either the `x` or `dx` arguments:
    
    >>> np.trapezoid([1, 2, 3], x=[4, 6, 8])
    8.0
    >>> np.trapezoid([1, 2, 3], dx=2)
    8.0
    
Using a decreasing `x` corresponds to integrating in reverse:
    
    >>> np.trapezoid([1, 2, 3], x=[8, 6, 4])
    -8.0
    
More generally `x` is used to integrate along a parametric curve. We can estimate the integral \\(\int_0^1 x^2 = 1/3\\) using:
    
    >>> x = np.linspace(0, 1, num=50)
    >>> y = x**2
    >>> np.trapezoid(y, x)
    0.33340274885464394
    
Or estimate the area of a circle, noting we repeat the sample which closes the curve:
    
    >>> theta = np.linspace(0, 2 * np.pi, num=1000, endpoint=True)
    >>> np.trapezoid(np.cos(theta), x=np.sin(theta))
    3.141571941375841
    
`np.trapezoid` can be applied along a specified axis to do multiple computations in one call:
    
    >>> a = np.arange(6).reshape(2, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.trapezoid(a, axis=0)
    array([1.5, 2.5, 3.5])
    >>> np.trapezoid(a, axis=1)
    array([2.,  8.])
    
# numpy.tri
numpy.tri(N, M=None, k=0, dtype=<class 'float'>, *, like=None)[source]
    
An array with ones at and below the given diagonal and zeros elsewhere.
Parameters:
    
Nint
    
Number of rows in the array.
Mint, optional
    
Number of columns in the array. By default, `M` is taken equal to `N`.
kint, optional
    
The sub-diagonal at and below which the array is filled. `k` = 0 is the main diagonal, while `k` < 0 is below it, and `k` > 0 is above. The default is 0.
dtypedtype, optional
    
Data type of the returned array. The default is float.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
trindarray of shape (N, M)
    
Array with its lower triangle filled with ones and zero elsewhere; in other words `T[i,j] == 1` for `j <= i + k`, 0 otherwise.
#### Examples
    
    >>> import numpy as np
    >>> np.tri(3, 5, 2, dtype=int)
    array([[1, 1, 1, 0, 0],
           [1, 1, 1, 1, 0],
           [1, 1, 1, 1, 1]])
    
    
    >>> np.tri(3, 5, -1)
    array([[0.,  0.,  0.,  0.,  0.],
           [1.,  0.,  0.,  0.,  0.],
           [1.,  1.,  0.,  0.,  0.]])
    
# numpy.tril
numpy.tril(m, k=0)[source]
    
Lower triangle of an array.
Return a copy of an array with elements above the `k`-th diagonal zeroed. For arrays with `ndim` exceeding 2, `tril` will apply to the final two axes.
Parameters:
    
marray_like, shape (…, M, N)
    
Input array.
kint, optional
    
Diagonal above which to zero elements. `k = 0` (the default) is the main diagonal, `k < 0` is below it and `k > 0` is above.
Returns:
    
trilndarray, shape (…, M, N)
    
Lower triangle of `m`, of same shape and data-type as `m`.
See also
`triu`
    
same thing, only for the upper triangle
#### Examples
    
    >>> import numpy as np
    >>> np.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
    array([[ 0,  0,  0],
           [ 4,  0,  0],
           [ 7,  8,  0],
           [10, 11, 12]])
    
    
    >>> np.tril(np.arange(3*4*5).reshape(3, 4, 5))
    array([[[ 0,  0,  0,  0,  0],
            [ 5,  6,  0,  0,  0],
            [10, 11, 12,  0,  0],
            [15, 16, 17, 18,  0]],
           [[20,  0,  0,  0,  0],
            [25, 26,  0,  0,  0],
            [30, 31, 32,  0,  0],
            [35, 36, 37, 38,  0]],
           [[40,  0,  0,  0,  0],
            [45, 46,  0,  0,  0],
            [50, 51, 52,  0,  0],
            [55, 56, 57, 58,  0]]])
    
# numpy.tril_indices
numpy.tril_indices(n, k=0, m=None)[source]
    
Return the indices for the lower-triangle of an (n, m) array.
Parameters:
    
nint
    
The row dimension of the arrays for which the returned indices will be valid.
kint, optional
    
Diagonal offset (see `tril` for details).
mint, optional
    
The column dimension of the arrays for which the returned arrays will be valid. By default `m` is taken equal to `n`.
Returns:
    
indstuple of arrays
    
The row and column indices, respectively. The row indices are sorted in non-decreasing order, and the correspdonding column indices are strictly increasing for each row.
See also
`triu_indices`
    
similar function, for upper-triangular.
`mask_indices`
    
generic function accepting an arbitrary mask function.
`tril`, `triu`
#### Examples
    
    >>> import numpy as np
    
Compute two different sets of indices to access 4x4 arrays, one for the lower triangular part starting at the main diagonal, and one starting two diagonals further right:
    
    >>> il1 = np.tril_indices(4)
    >>> il1
    (array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3]))
    
Note that row indices (first array) are non-decreasing, and the corresponding column indices (second array) are strictly increasing for each row. Here is how they can be used with a sample array:
    
    >>> a = np.arange(16).reshape(4, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
Both for indexing:
    
    >>> a[il1]
    array([ 0,  4,  5, ..., 13, 14, 15])
    
And for assigning values:
    
    >>> a[il1] = -1
    >>> a
    array([[-1,  1,  2,  3],
           [-1, -1,  6,  7],
           [-1, -1, -1, 11],
           [-1, -1, -1, -1]])
    
These cover almost the whole array (two diagonals right of the main one):
    
    >>> il2 = np.tril_indices(4, 2)
    >>> a[il2] = -10
    >>> a
    array([[-10, -10, -10,   3],
           [-10, -10, -10, -10],
           [-10, -10, -10, -10],
           [-10, -10, -10, -10]])
    
# numpy.tril_indices_from
numpy.tril_indices_from(arr, k=0)[source]
    
Return the indices for the lower-triangle of arr.
See `tril_indices` for full details.
Parameters:
    
arrarray_like
    
The indices will be valid for square arrays whose dimensions are the same as arr.
kint, optional
    
Diagonal offset (see `tril` for details).
See also
`tril_indices`, `tril`, `triu_indices_from`
#### Examples
    
    >>> import numpy as np
    
Create a 4 by 4 array
    
    >>> a = np.arange(16).reshape(4, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
Pass the array to get the indices of the lower triangular elements.
    
    >>> trili = np.tril_indices_from(a)
    >>> trili
    (array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3]))
    
    
    >>> a[trili]
    array([ 0,  4,  5,  8,  9, 10, 12, 13, 14, 15])
    
This is syntactic sugar for tril_indices().
    
    >>> np.tril_indices(a.shape[0])
    (array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3]))
    
Use the `k` parameter to return the indices for the lower triangular array up to the k-th diagonal.
    
    >>> trili1 = np.tril_indices_from(a, k=1)
    >>> a[trili1]
    array([ 0,  1,  4,  5,  6,  8,  9, 10, 11, 12, 13, 14, 15])
    
# numpy.trim_zeros
numpy.trim_zeros(filt, trim='fb', axis=None)[source]
    
Remove values along a dimension which are zero along all other.
Parameters:
    
filtarray_like
    
Input array.
trim{“fb”, “f”, “b”}, optional
    
A string with ‘f’ representing trim from front and ‘b’ to trim from back. By default, zeros are trimmed on both sides. Front and back refer to the edges of a dimension, with “front” refering to the side with the lowest index 0, and “back” refering to the highest index (or index -1).
axisint or sequence, optional
    
If None, `filt` is cropped such, that the smallest bounding box is returned that still contains all values which are not zero. If an axis is specified, `filt` will be sliced in that dimension only on the sides specified by `trim`. The remaining area will be the smallest that still contains all values wich are not zero.
Returns:
    
trimmedndarray or sequence
    
The result of trimming the input. The number of dimensions and the input data type are preserved.
#### Notes
For all-zero arrays, the first axis is trimmed first.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array((0, 0, 0, 1, 2, 3, 0, 2, 1, 0))
    >>> np.trim_zeros(a)
    array([1, 2, 3, 0, 2, 1])
    
    
    >>> np.trim_zeros(a, trim='b')
    array([0, 0, 0, ..., 0, 2, 1])
    
Multiple dimensions are supported.
    
    >>> b = np.array([[0, 0, 2, 3, 0, 0],
    ...               [0, 1, 0, 3, 0, 0],
    ...               [0, 0, 0, 0, 0, 0]])
    >>> np.trim_zeros(b)
    array([[0, 2, 3],
           [1, 0, 3]])
    
    
    >>> np.trim_zeros(b, axis=-1)
    array([[0, 2, 3],
           [1, 0, 3],
           [0, 0, 0]])
    
The input data type is preserved, list/tuple in means list/tuple out.
    
    >>> np.trim_zeros([0, 1, 2, 0])
    [1, 2]
    
# numpy.triu
numpy.triu(m, k=0)[source]
    
Upper triangle of an array.
Return a copy of an array with the elements below the `k`-th diagonal zeroed. For arrays with `ndim` exceeding 2, `triu` will apply to the final two axes.
Please refer to the documentation for `tril` for further details.
See also
`tril`
    
lower triangle of an array
#### Examples
    
    >>> import numpy as np
    >>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
    array([[ 1,  2,  3],
           [ 4,  5,  6],
           [ 0,  8,  9],
           [ 0,  0, 12]])
    
    
    >>> np.triu(np.arange(3*4*5).reshape(3, 4, 5))
    array([[[ 0,  1,  2,  3,  4],
            [ 0,  6,  7,  8,  9],
            [ 0,  0, 12, 13, 14],
            [ 0,  0,  0, 18, 19]],
           [[20, 21, 22, 23, 24],
            [ 0, 26, 27, 28, 29],
            [ 0,  0, 32, 33, 34],
            [ 0,  0,  0, 38, 39]],
           [[40, 41, 42, 43, 44],
            [ 0, 46, 47, 48, 49],
            [ 0,  0, 52, 53, 54],
            [ 0,  0,  0, 58, 59]]])
    
# numpy.triu_indices
numpy.triu_indices(n, k=0, m=None)[source]
    
Return the indices for the upper-triangle of an (n, m) array.
Parameters:
    
nint
    
The size of the arrays for which the returned indices will be valid.
kint, optional
    
Diagonal offset (see `triu` for details).
mint, optional
    
The column dimension of the arrays for which the returned arrays will be valid. By default `m` is taken equal to `n`.
Returns:
    
indstuple, shape(2) of ndarrays, shape(`n`)
    
The row and column indices, respectively. The row indices are sorted in non-decreasing order, and the correspdonding column indices are strictly increasing for each row.
See also
`tril_indices`
    
similar function, for lower-triangular.
`mask_indices`
    
generic function accepting an arbitrary mask function.
`triu`, `tril`
#### Examples
    
    >>> import numpy as np
    
Compute two different sets of indices to access 4x4 arrays, one for the upper triangular part starting at the main diagonal, and one starting two diagonals further right:
    
    >>> iu1 = np.triu_indices(4)
    >>> iu1
    (array([0, 0, 0, 0, 1, 1, 1, 2, 2, 3]), array([0, 1, 2, 3, 1, 2, 3, 2, 3, 3]))
    
Note that row indices (first array) are non-decreasing, and the corresponding column indices (second array) are strictly increasing for each row.
Here is how they can be used with a sample array:
    
    >>> a = np.arange(16).reshape(4, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
Both for indexing:
    
    >>> a[iu1]
    array([ 0,  1,  2, ..., 10, 11, 15])
    
And for assigning values:
    
    >>> a[iu1] = -1
    >>> a
    array([[-1, -1, -1, -1],
           [ 4, -1, -1, -1],
           [ 8,  9, -1, -1],
           [12, 13, 14, -1]])
    
These cover only a small part of the whole array (two diagonals right of the main one):
    
    >>> iu2 = np.triu_indices(4, 2)
    >>> a[iu2] = -10
    >>> a
    array([[ -1,  -1, -10, -10],
           [  4,  -1,  -1, -10],
           [  8,   9,  -1,  -1],
           [ 12,  13,  14,  -1]])
    
# numpy.triu_indices_from
numpy.triu_indices_from(arr, k=0)[source]
    
Return the indices for the upper-triangle of arr.
See `triu_indices` for full details.
Parameters:
    
arrndarray, shape(N, N)
    
The indices will be valid for square arrays.
kint, optional
    
Diagonal offset (see `triu` for details).
Returns:
    
triu_indices_fromtuple, shape(2) of ndarray, shape(N)
    
Indices for the upper-triangle of `arr`.
See also
`triu_indices`, `triu`, `tril_indices_from`
#### Examples
    
    >>> import numpy as np
    
Create a 4 by 4 array
    
    >>> a = np.arange(16).reshape(4, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
Pass the array to get the indices of the upper triangular elements.
    
    >>> triui = np.triu_indices_from(a)
    >>> triui
    (array([0, 0, 0, 0, 1, 1, 1, 2, 2, 3]), array([0, 1, 2, 3, 1, 2, 3, 2, 3, 3]))
    
    
    >>> a[triui]
    array([ 0,  1,  2,  3,  5,  6,  7, 10, 11, 15])
    
This is syntactic sugar for triu_indices().
    
    >>> np.triu_indices(a.shape[0])
    (array([0, 0, 0, 0, 1, 1, 1, 2, 2, 3]), array([0, 1, 2, 3, 1, 2, 3, 2, 3, 3]))
    
Use the `k` parameter to return the indices for the upper triangular array from the k-th diagonal.
    
    >>> triuim1 = np.triu_indices_from(a, k=1)
    >>> a[triuim1]
    array([ 1,  2,  3,  6,  7, 11])
    
# numpy.true_divide
numpy.true_divide(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'divide'>
    
Divide arguments element-wise.
Parameters:
    
x1array_like
    
Dividend array.
x2array_like
    
Divisor array. If `x1.shape != x2.shape`, they must be broadcastable to a common shape (which becomes the shape of the output).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The quotient `x1/x2`, element-wise. This is a scalar if both `x1` and `x2` are scalars.
See also
`seterr`
    
Set whether to raise or warn on overflow, underflow and division by zero.
#### Notes
Equivalent to `x1` / `x2` in terms of array-broadcasting.
The `true_divide(x1, x2)` function is an alias for `divide(x1, x2)`.
#### Examples
    
    >>> import numpy as np
    >>> np.divide(2.0, 4.0)
    0.5
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.divide(x1, x2)
    array([[nan, 1. , 1. ],
           [inf, 4. , 2.5],
           [inf, 7. , 4. ]])
    
The `/` operator can be used as a shorthand for `np.divide` on ndarrays.
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = 2 * np.ones(3)
    >>> x1 / x2
    array([[0. , 0.5, 1. ],
           [1.5, 2. , 2.5],
           [3. , 3.5, 4. ]])
    
# numpy.trunc
numpy.trunc(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature])=<ufunc 'trunc'>
    
Return the truncated value of the input, element-wise.
The truncated value of the scalar `x` is the nearest integer `i` which is closer to zero than `x` is. In short, the fractional part of the signed number `x` is discarded.
Parameters:
    
xarray_like
    
Input data.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray or scalar
    
The truncated value of each element in `x`. This is a scalar if `x` is a scalar.
See also
`ceil`, `floor`, `rint`, `fix`
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0])
    >>> np.trunc(a)
    array([-1., -1., -0.,  0.,  1.,  1.,  2.])
    
# numpy.typename
numpy.typename(char)[source]
    
Return a description for the given data type code.
Parameters:
    
charstr
    
Data type code.
Returns:
    
outstr
    
Description of the input data type code.
See also
`dtype`
#### Examples
    
    >>> import numpy as np
    >>> typechars = ['S1', '?', 'B', 'D', 'G', 'F', 'I', 'H', 'L', 'O', 'Q',
    ...              'S', 'U', 'V', 'b', 'd', 'g', 'f', 'i', 'h', 'l', 'q']
    >>> for typechar in typechars:
    ...     print(typechar, ' : ', np.typename(typechar))
    ...
    S1  :  character
    ?  :  bool
    B  :  unsigned char
    D  :  complex double precision
    G  :  complex long double precision
    F  :  complex single precision
    I  :  unsigned integer
    H  :  unsigned short
    L  :  unsigned long integer
    O  :  object
    Q  :  unsigned long long integer
    S  :  string
    U  :  unicode
    V  :  void
    b  :  signed char
    d  :  double precision
    g  :  long precision
    f  :  single precision
    i  :  integer
    h  :  short
    l  :  long integer
    q  :  long long integer
    
# numpy.ufunc.__call__
method
ufunc.__call__(*args, **kwargs)
    
Call self as a function.
# numpy.ufunc.accumulate
method
ufunc.accumulate(array, axis=0, dtype=None, out=None)
    
Accumulate the result of applying the operator to all elements.
For a one-dimensional array, accumulate produces results equivalent to:
    
    r = np.empty(len(A))
    t = op.identity        # op = the ufunc being applied to A's  elements
    for i in range(len(A)):
        t = op(t, A[i])
        r[i] = t
    return r
    
For example, add.accumulate() is equivalent to np.cumsum().
For a multi-dimensional array, accumulate is applied along only one axis (axis zero by default; see Examples below) so repeated use is necessary if one wants to accumulate over multiple axes.
Parameters:
    
arrayarray_like
    
The array to act on.
axisint, optional
    
The axis along which to apply the accumulation; default is zero.
dtypedata-type code, optional
    
The data-type used to represent the intermediate results. Defaults to the data-type of the output array if such is provided, or the data-type of the input array if no output array is provided.
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If not provided or None, a freshly-allocated array is returned. For consistency with `ufunc.__call__`, if given as a keyword, this may be wrapped in a 1-element tuple.
Returns:
    
rndarray
    
The accumulated values. If `out` was supplied, `r` is a reference to `out`.
#### Examples
1-D array examples:
    
    >>> import numpy as np
    >>> np.add.accumulate([2, 3, 5])
    array([ 2,  5, 10])
    >>> np.multiply.accumulate([2, 3, 5])
    array([ 2,  6, 30])
    
2-D array examples:
    
    >>> I = np.eye(2)
    >>> I
    array([[1.,  0.],
           [0.,  1.]])
    
Accumulate along axis 0 (rows), down columns:
    
    >>> np.add.accumulate(I, 0)
    array([[1.,  0.],
           [1.,  1.]])
    >>> np.add.accumulate(I) # no axis specified = axis zero
    array([[1.,  0.],
           [1.,  1.]])
    
Accumulate along axis 1 (columns), through rows:
    
    >>> np.add.accumulate(I, 1)
    array([[1.,  1.],
           [0.,  1.]])
    
# numpy.ufunc.at
method
ufunc.at(a, indices, b=None, /)
    
Performs unbuffered in place operation on operand ‘a’ for elements specified by ‘indices’. For addition ufunc, this method is equivalent to `a[indices] += b`, except that results are accumulated for elements that are indexed more than once. For example, `a[[0,0]] += 1` will only increment the first element once because of buffering, whereas `add.at(a, [0,0], 1)` will increment the first element twice.
Parameters:
    
aarray_like
    
The array to perform in place operation on.
indicesarray_like or tuple
    
Array like index object or slice object for indexing into first operand. If first operand has multiple dimensions, indices can be a tuple of array like index objects or slice objects.
barray_like
    
Second operand for ufuncs requiring two operands. Operand must be broadcastable over first operand after indexing or slicing.
#### Examples
Set items 0 and 1 to their negative values:
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3, 4])
    >>> np.negative.at(a, [0, 1])
    >>> a
    array([-1, -2,  3,  4])
    
Increment items 0 and 1, and increment item 2 twice:
    
    >>> a = np.array([1, 2, 3, 4])
    >>> np.add.at(a, [0, 1, 2, 2], 1)
    >>> a
    array([2, 3, 5, 4])
    
Add items 0 and 1 in first array to second array, and store results in first array:
    
    >>> a = np.array([1, 2, 3, 4])
    >>> b = np.array([1, 2])
    >>> np.add.at(a, [0, 1], b)
    >>> a
    array([2, 4, 3, 4])
    
# numpy.ufunc
classnumpy.ufunc[source]
    
Functions that operate element by element on whole arrays.
To see the documentation for a specific ufunc, use `info`. For example, `np.info(np.sin)`. Because ufuncs are written in C (for speed) and linked into Python with NumPy’s ufunc facility, Python’s help() function finds this page whenever help() is called on a ufunc.
A detailed explanation of ufuncs can be found in the docs for Universal functions (ufunc).
Calling ufuncs: `op(*x[, out], where=True, **kwargs)`
Apply `op` to the arguments `*x` elementwise, broadcasting the arguments.
The broadcasting rules are:
  * Dimensions of length 1 may be prepended to either array.
  * Arrays may be repeated along dimensions of length 1.


Parameters:
    
*xarray_like
    
Input arrays.
outndarray, None, or tuple of ndarray and None, optional
    
Alternate array object(s) in which to put the result; if provided, it must have a shape that the inputs broadcast to. A tuple of arrays (possible only as a keyword argument) must have length equal to the number of outputs; use None for uninitialized outputs to be allocated by the ufunc.
wherearray_like, optional
    
This condition is broadcast over the input. At locations where the condition is True, the `out` array will be set to the ufunc result. Elsewhere, the `out` array will retain its original value. Note that if an uninitialized `out` array is created via the default `out=None`, locations within it where the condition is False will remain uninitialized.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
rndarray or tuple of ndarray
    
`r` will have the shape that the arrays in `x` broadcast to; if `out` is provided, it will be returned. If not, `r` will be allocated and may contain uninitialized values. If the function has more than one output, then the result will be a tuple of arrays.
Attributes:
    
`identity`
    
The identity value.
`nargs`
    
The number of arguments.
`nin`
    
The number of inputs.
`nout`
    
The number of outputs.
`ntypes`
    
The number of types.
`signature`
    
Definition of the core elements a generalized ufunc operates on.
`types`
    
Returns a list with types grouped input->output.
#### Methods
`__call__`(*args, **kwargs)
Call self as a function.  
`accumulate`(array[, axis, dtype, out])
Accumulate the result of applying the operator to all elements.  
`at`(a, indices[, b])
Performs unbuffered in place operation on operand 'a' for elements specified by 'indices'.  
`outer`(A, B, /, **kwargs)
Apply the ufunc `op` to all pairs (a, b) with a in `A` and b in `B`.  
`reduce`(array[, axis, dtype, out, keepdims, ...])
Reduces `array`'s dimension by one, by applying ufunc along one axis.  
`reduceat`(array, indices[, axis, dtype, out])
Performs a (local) reduce with specified slices over a single axis.  
`resolve_dtypes`(dtypes, *[, signature, ...])
Find the dtypes NumPy will use for the operation.  
# numpy.ufunc.identity
attribute
ufunc.identity
    
The identity value.
Data attribute containing the identity element for the ufunc, if it has one. If it does not, the attribute value is None.
#### Examples
    
    >>> import numpy as np
    >>> np.add.identity
    0
    >>> np.multiply.identity
    1
    >>> np.power.identity
    1
    >>> print(np.exp.identity)
    None
    
# numpy.ufunc.nargs
attribute
ufunc.nargs
    
The number of arguments.
Data attribute containing the number of arguments the ufunc takes, including optional ones.
#### Notes
Typically this value will be one more than what you might expect because all ufuncs take the optional “out” argument.
#### Examples
    
    >>> import numpy as np
    >>> np.add.nargs
    3
    >>> np.multiply.nargs
    3
    >>> np.power.nargs
    3
    >>> np.exp.nargs
    2
    
# numpy.ufunc.nin
attribute
ufunc.nin
    
The number of inputs.
Data attribute containing the number of arguments the ufunc treats as input.
#### Examples
    
    >>> import numpy as np
    >>> np.add.nin
    2
    >>> np.multiply.nin
    2
    >>> np.power.nin
    2
    >>> np.exp.nin
    1
    
# numpy.ufunc.nout
attribute
ufunc.nout
    
The number of outputs.
Data attribute containing the number of arguments the ufunc treats as output.
#### Notes
Since all ufuncs can take output arguments, this will always be at least 1.
#### Examples
    
    >>> import numpy as np
    >>> np.add.nout
    1
    >>> np.multiply.nout
    1
    >>> np.power.nout
    1
    >>> np.exp.nout
    1
    
# numpy.ufunc.ntypes
attribute
ufunc.ntypes
    
The number of types.
The number of numerical NumPy types - of which there are 18 total - on which the ufunc can operate.
See also
`numpy.ufunc.types`
#### Examples
    
    >>> import numpy as np
    >>> np.add.ntypes
    18
    >>> np.multiply.ntypes
    18
    >>> np.power.ntypes
    17
    >>> np.exp.ntypes
    7
    >>> np.remainder.ntypes
    14
    
# numpy.ufunc.outer
method
ufunc.outer(A, B, /, **kwargs)
    
Apply the ufunc `op` to all pairs (a, b) with a in `A` and b in `B`.
Let `M = A.ndim`, `N = B.ndim`. Then the result, `C`, of `op.outer(A, B)` is an array of dimension M + N such that:
\\[C[i_0, ..., i_{M-1}, j_0, ..., j_{N-1}] = op(A[i_0, ..., i_{M-1}], B[j_0, ..., j_{N-1}])\\]
For `A` and `B` one-dimensional, this is equivalent to:
    
    r = empty(len(A),len(B))
    for i in range(len(A)):
        for j in range(len(B)):
            r[i,j] = op(A[i], B[j])  # op = ufunc in question
    
Parameters:
    
Aarray_like
    
First array
Barray_like
    
Second array
kwargsany
    
Arguments to pass on to the ufunc. Typically `dtype` or `out`. See `ufunc` for a comprehensive overview of all available arguments.
Returns:
    
rndarray
    
Output array
See also
`numpy.outer`
    
A less powerful version of `np.multiply.outer` that `ravel`s all inputs to 1D. This exists primarily for compatibility with old code.
`tensordot`
    
`np.tensordot(a, b, axes=((), ()))` and `np.multiply.outer(a, b)` behave same for all dimensions of a and b.
#### Examples
    
    >>> np.multiply.outer([1, 2, 3], [4, 5, 6])
    array([[ 4,  5,  6],
           [ 8, 10, 12],
           [12, 15, 18]])
    
A multi-dimensional example:
    
    >>> A = np.array([[1, 2, 3], [4, 5, 6]])
    >>> A.shape
    (2, 3)
    >>> B = np.array([[1, 2, 3, 4]])
    >>> B.shape
    (1, 4)
    >>> C = np.multiply.outer(A, B)
    >>> C.shape; C
    (2, 3, 1, 4)
    array([[[[ 1,  2,  3,  4]],
            [[ 2,  4,  6,  8]],
            [[ 3,  6,  9, 12]]],
           [[[ 4,  8, 12, 16]],
            [[ 5, 10, 15, 20]],
            [[ 6, 12, 18, 24]]]])
    
# numpy.ufunc.reduce
method
ufunc.reduce(array, axis=0, dtype=None, out=None, keepdims=False, initial=<no value>, where=True)
    
Reduces `array`’s dimension by one, by applying ufunc along one axis.
Let \\(array.shape = (N_0, ..., N_i, ..., N_{M-1})\\). Then \\(ufunc.reduce(array, axis=i)[k_0, ..,k_{i-1}, k_{i+1}, .., k_{M-1}]\\) = the result of iterating `j` over \\(range(N_i)\\), cumulatively applying ufunc to each \\(array[k_0, ..,k_{i-1}, j, k_{i+1}, .., k_{M-1}]\\). For a one-dimensional array, reduce produces results equivalent to:
    
    r = op.identity # op = ufunc
    for i in range(len(A)):
      r = op(r, A[i])
    return r
    
For example, add.reduce() is equivalent to sum().
Parameters:
    
arrayarray_like
    
The array to act on.
axisNone or int or tuple of ints, optional
    
Axis or axes along which a reduction is performed. The default (`axis` = 0) is perform a reduction over the first dimension of the input array. `axis` may be negative, in which case it counts from the last to the first axis.
If this is None, a reduction is performed over all the axes. If this is a tuple of ints, a reduction is performed on multiple axes, instead of a single axis or all the axes as before.
For operations which are either not commutative or not associative, doing a reduction over multiple axes is not well-defined. The ufuncs do not currently raise an exception in this case, but will likely do so in the future.
dtypedata-type code, optional
    
The data type used to perform the operation. Defaults to that of `out` if given, and the data type of `array` otherwise (though upcast to conserve precision for some cases, such as `numpy.add.reduce` for integer or boolean input).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If not provided or None, a freshly-allocated array is returned. For consistency with `ufunc.__call__`, if given as a keyword, this may be wrapped in a 1-element tuple.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the original `array`.
initialscalar, optional
    
The value with which to start the reduction. If the ufunc has no identity or the dtype is object, this defaults to None - otherwise it defaults to ufunc.identity. If `None` is given, the first element of the reduction is used, and an error is thrown if the reduction is empty.
wherearray_like of bool, optional
    
A boolean array which is broadcasted to match the dimensions of `array`, and selects elements to include in the reduction. Note that for ufuncs like `minimum` that do not have an identity defined, one has to pass in also `initial`.
Returns:
    
rndarray
    
The reduced array. If `out` was supplied, `r` is a reference to it.
#### Examples
    
    >>> import numpy as np
    >>> np.multiply.reduce([2,3,5])
    30
    
A multi-dimensional array example:
    
    >>> X = np.arange(8).reshape((2,2,2))
    >>> X
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    >>> np.add.reduce(X, 0)
    array([[ 4,  6],
           [ 8, 10]])
    >>> np.add.reduce(X) # confirm: default axis value is 0
    array([[ 4,  6],
           [ 8, 10]])
    >>> np.add.reduce(X, 1)
    array([[ 2,  4],
           [10, 12]])
    >>> np.add.reduce(X, 2)
    array([[ 1,  5],
           [ 9, 13]])
    
You can use the `initial` keyword argument to initialize the reduction with a different value, and `where` to select specific elements to include:
    
    >>> np.add.reduce([10], initial=5)
    15
    >>> np.add.reduce(np.ones((2, 2, 2)), axis=(0, 2), initial=10)
    array([14., 14.])
    >>> a = np.array([10., np.nan, 10])
    >>> np.add.reduce(a, where=~np.isnan(a))
    20.0
    
Allows reductions of empty arrays where they would normally fail, i.e. for ufuncs without an identity.
    
    >>> np.minimum.reduce([], initial=np.inf)
    inf
    >>> np.minimum.reduce([[1., 2.], [3., 4.]], initial=10., where=[True, False])
    array([ 1., 10.])
    >>> np.minimum.reduce([])
    Traceback (most recent call last):
        ...
    ValueError: zero-size array to reduction operation minimum which has no identity
    
# numpy.ufunc.reduceat
method
ufunc.reduceat(array, indices, axis=0, dtype=None, out=None)
    
Performs a (local) reduce with specified slices over a single axis.
For i in `range(len(indices))`, `reduceat` computes `ufunc.reduce(array[indices[i]:indices[i+1]])`, which becomes the i-th generalized “row” parallel to `axis` in the final result (i.e., in a 2-D array, for example, if `axis = 0`, it becomes the i-th row, but if `axis = 1`, it becomes the i-th column). There are three exceptions to this:
  * when `i = len(indices) - 1` (so for the last index), `indices[i+1] = array.shape[axis]`.
  * if `indices[i] >= indices[i + 1]`, the i-th generalized “row” is simply `array[indices[i]]`.
  * if `indices[i] >= len(array)` or `indices[i] < 0`, an error is raised.


The shape of the output depends on the size of `indices`, and may be larger than `array` (this happens if `len(indices) > array.shape[axis]`).
Parameters:
    
arrayarray_like
    
The array to act on.
indicesarray_like
    
Paired indices, comma separated (not colon), specifying slices to reduce.
axisint, optional
    
The axis along which to apply the reduceat.
dtypedata-type code, optional
    
The data type used to perform the operation. Defaults to that of `out` if given, and the data type of `array` otherwise (though upcast to conserve precision for some cases, such as `numpy.add.reduce` for integer or boolean input).
outndarray, None, or tuple of ndarray and None, optional
    
A location into which the result is stored. If not provided or None, a freshly-allocated array is returned. For consistency with `ufunc.__call__`, if given as a keyword, this may be wrapped in a 1-element tuple.
Returns:
    
rndarray
    
The reduced values. If `out` was supplied, `r` is a reference to `out`.
#### Notes
A descriptive example:
If `array` is 1-D, the function `ufunc.accumulate(array)` is the same as `ufunc.reduceat(array, indices)[::2]` where `indices` is `range(len(array) - 1)` with a zero placed in every other element: `indices = zeros(2 * len(array) - 1)`, `indices[1::2] = range(1, len(array))`.
Don’t be fooled by this attribute’s name: `reduceat(array)` is not necessarily smaller than `array`.
#### Examples
To take the running sum of four successive values:
    
    >>> import numpy as np
    >>> np.add.reduceat(np.arange(8),[0,4, 1,5, 2,6, 3,7])[::2]
    array([ 6, 10, 14, 18])
    
A 2-D example:
    
    >>> x = np.linspace(0, 15, 16).reshape(4,4)
    >>> x
    array([[ 0.,   1.,   2.,   3.],
           [ 4.,   5.,   6.,   7.],
           [ 8.,   9.,  10.,  11.],
           [12.,  13.,  14.,  15.]])
    
    
    # reduce such that the result has the following five rows:
    # [row1 + row2 + row3]
    # [row4]
    # [row2]
    # [row3]
    # [row1 + row2 + row3 + row4]
    
    
    >>> np.add.reduceat(x, [0, 3, 1, 2, 0])
    array([[12.,  15.,  18.,  21.],
           [12.,  13.,  14.,  15.],
           [ 4.,   5.,   6.,   7.],
           [ 8.,   9.,  10.,  11.],
           [24.,  28.,  32.,  36.]])
    
    
    # reduce such that result has the following two columns:
    # [col1 * col2 * col3, col4]
    
    
    >>> np.multiply.reduceat(x, [0, 3], 1)
    array([[   0.,     3.],
           [ 120.,     7.],
           [ 720.,    11.],
           [2184.,    15.]])
    
# numpy.ufunc.resolve_dtypes
method
ufunc.resolve_dtypes(dtypes, *, signature=None, casting=None, reduction=False)
    
Find the dtypes NumPy will use for the operation. Both input and output dtypes are returned and may differ from those provided.
Note
This function always applies NEP 50 rules since it is not provided any actual values. The Python types `int`, `float`, and `complex` thus behave weak and should be passed for “untyped” Python input.
Parameters:
    
dtypestuple of dtypes, None, or literal int, float, complex
    
The input dtypes for each operand. Output operands can be None, indicating that the dtype must be found.
signaturetuple of DTypes or None, optional
    
If given, enforces exact DType (classes) of the specific operand. The ufunc `dtype` argument is equivalent to passing a tuple with only output dtypes set.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
The casting mode when casting is necessary. This is identical to the ufunc call casting modes.
reductionboolean
    
If given, the resolution assumes a reduce operation is happening which slightly changes the promotion and type resolution rules. `dtypes` is usually something like `(None, np.dtype("i2"), None)` for reductions (first input is also the output).
Note
The default casting mode is “same_kind”, however, as of NumPy 1.24, NumPy uses “unsafe” for reductions.
Returns:
    
dtypestuple of dtypes
    
The dtypes which NumPy would use for the calculation. Note that dtypes may not match the passed in ones (casting is necessary).
#### Examples
This API requires passing dtypes, define them for convenience:
    
    >>> import numpy as np
    >>> int32 = np.dtype("int32")
    >>> float32 = np.dtype("float32")
    
The typical ufunc call does not pass an output dtype. `numpy.add` has two inputs and one output, so leave the output as `None` (not provided):
    
    >>> np.add.resolve_dtypes((int32, float32, None))
    (dtype('float64'), dtype('float64'), dtype('float64'))
    
The loop found uses “float64” for all operands (including the output), the first input would be cast.
`resolve_dtypes` supports “weak” handling for Python scalars by passing `int`, `float`, or `complex`:
    
    >>> np.add.resolve_dtypes((float32, float, None))
    (dtype('float32'), dtype('float32'), dtype('float32'))
    
Where the Python `float` behaves similar to a Python value `0.0` in a ufunc call. (See NEP 50 for details.)
# numpy.ufunc.signature
attribute
ufunc.signature
    
Definition of the core elements a generalized ufunc operates on.
The signature determines how the dimensions of each input/output array are split into core and loop dimensions:
  1. Each dimension in the signature is matched to a dimension of the corresponding passed-in array, starting from the end of the shape tuple.
  2. Core dimensions assigned to the same label in the signature must have exactly matching sizes, no broadcasting is performed.
  3. The core dimensions are removed from all inputs and the remaining dimensions are broadcast together, defining the loop dimensions.


#### Notes
Generalized ufuncs are used internally in many linalg functions, and in the testing suite; the examples below are taken from these. For ufuncs that operate on scalars, the signature is None, which is equivalent to ‘()’ for every argument.
#### Examples
    
    >>> import numpy as np
    >>> np.linalg._umath_linalg.det.signature
    '(m,m)->()'
    >>> np.matmul.signature
    '(n?,k),(k,m?)->(n?,m?)'
    >>> np.add.signature is None
    True  # equivalent to '(),()->()'
    
# numpy.ufunc.types
attribute
ufunc.types
    
Returns a list with types grouped input->output.
Data attribute listing the data-type “Domain-Range” groupings the ufunc can deliver. The data-types are given using the character codes.
See also
`numpy.ufunc.ntypes`
#### Examples
    
    >>> import numpy as np
    >>> np.add.types
    ['??->?', 'bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l',
    'LL->L', 'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D',
    'GG->G', 'OO->O']
    
    
    >>> np.multiply.types
    ['??->?', 'bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l',
    'LL->L', 'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D',
    'GG->G', 'OO->O']
    
    
    >>> np.power.types
    ['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L',
    'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G',
    'OO->O']
    
    
    >>> np.exp.types
    ['f->f', 'd->d', 'g->g', 'F->F', 'D->D', 'G->G', 'O->O']
    
    
    >>> np.remainder.types
    ['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L',
    'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'OO->O']
    
# numpy.union1d
numpy.union1d(ar1, ar2)[source]
    
Find the union of two arrays.
Return the unique, sorted array of values that are in either of the two input arrays.
Parameters:
    
ar1, ar2array_like
    
Input arrays. They are flattened if they are not already 1D.
Returns:
    
union1dndarray
    
Unique, sorted union of the input arrays.
#### Examples
    
    >>> import numpy as np
    >>> np.union1d([-1, 0, 1], [-2, 0, 2])
    array([-2, -1,  0,  1,  2])
    
To find the union of more than two arrays, use functools.reduce:
    
    >>> from functools import reduce
    >>> reduce(np.union1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
    array([1, 2, 3, 4, 6])
    
# numpy.unique
numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None, *, equal_nan=True)[source]
    
Find the unique elements of an array.
Returns the sorted unique elements of an array. There are three optional outputs in addition to the unique elements:
  * the indices of the input array that give the unique values
  * the indices of the unique array that reconstruct the input array
  * the number of times each unique value comes up in the input array


Parameters:
    
ararray_like
    
Input array. Unless `axis` is specified, this will be flattened if it is not already 1-D.
return_indexbool, optional
    
If True, also return the indices of `ar` (along the specified axis, if provided, or in the flattened array) that result in the unique array.
return_inversebool, optional
    
If True, also return the indices of the unique array (for the specified axis, if provided) that can be used to reconstruct `ar`.
return_countsbool, optional
    
If True, also return the number of times each unique item appears in `ar`.
axisint or None, optional
    
The axis to operate on. If None, `ar` will be flattened. If an integer, the subarrays indexed by the given axis will be flattened and treated as the elements of a 1-D array with the dimension of the given axis, see the notes for more details. Object arrays or structured arrays that contain objects are not supported if the `axis` kwarg is used. The default is None.
equal_nanbool, optional
    
If True, collapses multiple NaN values in the return array into one.
New in version 1.24.
Returns:
    
uniquendarray
    
The sorted unique values.
unique_indicesndarray, optional
    
The indices of the first occurrences of the unique values in the original array. Only provided if `return_index` is True.
unique_inversendarray, optional
    
The indices to reconstruct the original array from the unique array. Only provided if `return_inverse` is True.
unique_countsndarray, optional
    
The number of times each of the unique values comes up in the original array. Only provided if `return_counts` is True.
See also
`repeat`
    
Repeat elements of an array.
`sort`
    
Return a sorted copy of an array.
#### Notes
When an axis is specified the subarrays indexed by the axis are sorted. This is done by making the specified axis the first dimension of the array (move the axis to the first dimension to keep the order of the other axes) and then flattening the subarrays in C order. The flattened subarrays are then viewed as a structured type with each element given a label, with the effect that we end up with a 1-D array of structured types that can be treated in the same way as any other 1-D array. The result is that the flattened subarrays are sorted in lexicographic order starting with the first element.
Changed in version 1.21: Like np.sort, NaN will sort to the end of the values. For complex arrays all NaN values are considered equivalent (no matter whether the NaN is in the real or imaginary part). As the representant for the returned array the smallest one in the lexicographical order is chosen - see np.sort for how the lexicographical order is defined for complex arrays.
Changed in version 2.0: For multi-dimensional inputs, `unique_inverse` is reshaped such that the input can be reconstructed using `np.take(unique, unique_inverse, axis=axis)`. The result is now not 1-dimensional when `axis=None`.
Note that in NumPy 2.0.0 a higher dimensional array was returned also when `axis` was not `None`. This was reverted, but `inverse.reshape(-1)` can be used to ensure compatibility with both versions.
#### Examples
    
    >>> import numpy as np
    >>> np.unique([1, 1, 2, 2, 3, 3])
    array([1, 2, 3])
    >>> a = np.array([[1, 1], [2, 3]])
    >>> np.unique(a)
    array([1, 2, 3])
    
Return the unique rows of a 2D array
    
    >>> a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
    >>> np.unique(a, axis=0)
    array([[1, 0, 0], [2, 3, 4]])
    
Return the indices of the original array that give the unique values:
    
    >>> a = np.array(['a', 'b', 'b', 'c', 'a'])
    >>> u, indices = np.unique(a, return_index=True)
    >>> u
    array(['a', 'b', 'c'], dtype='<U1')
    >>> indices
    array([0, 1, 3])
    >>> a[indices]
    array(['a', 'b', 'c'], dtype='<U1')
    
Reconstruct the input array from the unique values and inverse:
    
    >>> a = np.array([1, 2, 6, 4, 2, 3, 2])
    >>> u, indices = np.unique(a, return_inverse=True)
    >>> u
    array([1, 2, 3, 4, 6])
    >>> indices
    array([0, 1, 4, 3, 1, 2, 1])
    >>> u[indices]
    array([1, 2, 6, 4, 2, 3, 2])
    
Reconstruct the input values from the unique values and counts:
    
    >>> a = np.array([1, 2, 6, 4, 2, 3, 2])
    >>> values, counts = np.unique(a, return_counts=True)
    >>> values
    array([1, 2, 3, 4, 6])
    >>> counts
    array([1, 3, 1, 1, 1])
    >>> np.repeat(values, counts)
    array([1, 2, 2, 2, 3, 4, 6])    # original order not preserved
    
# numpy.unique_all
numpy.unique_all(x)[source]
    
Find the unique elements of an array, and counts, inverse, and indices.
This function is an Array API compatible alternative to:
    
    np.unique(x, return_index=True, return_inverse=True,
              return_counts=True, equal_nan=False)
    
but returns a namedtuple for easier access to each output.
Parameters:
    
xarray_like
    
Input array. It will be flattened if it is not already 1-D.
Returns:
    
outnamedtuple
    
The result containing:
  * values - The unique elements of an input array.
  * indices - The first occurring indices for each unique element.
  * inverse_indices - The indices from the set of unique elements that reconstruct `x`.
  * counts - The corresponding counts for each unique element.


See also
`unique`
    
Find the unique elements of an array.
#### Examples
    
    >>> import numpy as np
    >>> x = [1, 1, 2]
    >>> uniq = np.unique_all(x)
    >>> uniq.values
    array([1, 2])
    >>> uniq.indices
    array([0, 2])
    >>> uniq.inverse_indices
    array([0, 0, 1])
    >>> uniq.counts
    array([2, 1])
    
# numpy.unique_counts
numpy.unique_counts(x)[source]
    
Find the unique elements and counts of an input array `x`.
This function is an Array API compatible alternative to:
    
    np.unique(x, return_counts=True, equal_nan=False)
    
but returns a namedtuple for easier access to each output.
Parameters:
    
xarray_like
    
Input array. It will be flattened if it is not already 1-D.
Returns:
    
outnamedtuple
    
The result containing:
  * values - The unique elements of an input array.
  * counts - The corresponding counts for each unique element.


See also
`unique`
    
Find the unique elements of an array.
#### Examples
    
    >>> import numpy as np
    >>> x = [1, 1, 2]
    >>> uniq = np.unique_counts(x)
    >>> uniq.values
    array([1, 2])
    >>> uniq.counts
    array([2, 1])
    
# numpy.unique_inverse
numpy.unique_inverse(x)[source]
    
Find the unique elements of `x` and indices to reconstruct `x`.
This function is an Array API compatible alternative to:
    
    np.unique(x, return_inverse=True, equal_nan=False)
    
but returns a namedtuple for easier access to each output.
Parameters:
    
xarray_like
    
Input array. It will be flattened if it is not already 1-D.
Returns:
    
outnamedtuple
    
The result containing:
  * values - The unique elements of an input array.
  * inverse_indices - The indices from the set of unique elements that reconstruct `x`.


See also
`unique`
    
Find the unique elements of an array.
#### Examples
    
    >>> import numpy as np
    >>> x = [1, 1, 2]
    >>> uniq = np.unique_inverse(x)
    >>> uniq.values
    array([1, 2])
    >>> uniq.inverse_indices
    array([0, 0, 1])
    
# numpy.unique_values
numpy.unique_values(x)[source]
    
Returns the unique elements of an input array `x`.
This function is an Array API compatible alternative to:
    
    np.unique(x, equal_nan=False)
    
Parameters:
    
xarray_like
    
Input array. It will be flattened if it is not already 1-D.
Returns:
    
outndarray
    
The unique elements of an input array.
See also
`unique`
    
Find the unique elements of an array.
#### Examples
    
    >>> import numpy as np
    >>> np.unique_values([1, 1, 2])
    array([1, 2])
    
# numpy.unpackbits
numpy.unpackbits(a, /, axis=None, count=None, bitorder='big')
    
Unpacks elements of a uint8 array into a binary-valued output array.
Each element of `a` represents a bit-field that should be unpacked into a binary-valued output array. The shape of the output array is either 1-D (if `axis` is `None`) or the same shape as the input array with unpacking done along the axis specified.
Parameters:
    
andarray, uint8 type
    
Input array.
axisint, optional
    
The dimension over which bit-unpacking is done. `None` implies unpacking the flattened array.
countint or None, optional
    
The number of elements to unpack along `axis`, provided as a way of undoing the effect of packing a size that is not a multiple of eight. A non-negative number means to only unpack `count` bits. A negative number means to trim off that many bits from the end. `None` means to unpack the entire array (the default). Counts larger than the available number of bits will add zero padding to the output. Negative counts must not exceed the available number of bits.
bitorder{‘big’, ‘little’}, optional
    
The order of the returned bits. ‘big’ will mimic bin(val), `3 = 0b00000011 => [0, 0, 0, 0, 0, 0, 1, 1]`, ‘little’ will reverse the order to `[1, 1, 0, 0, 0, 0, 0, 0]`. Defaults to ‘big’.
Returns:
    
unpackedndarray, uint8 type
    
The elements are binary-valued (0 or 1).
See also
`packbits`
    
Packs the elements of a binary-valued array into bits in a uint8 array.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[2], [7], [23]], dtype=np.uint8)
    >>> a
    array([[ 2],
           [ 7],
           [23]], dtype=uint8)
    >>> b = np.unpackbits(a, axis=1)
    >>> b
    array([[0, 0, 0, 0, 0, 0, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1],
           [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
    >>> c = np.unpackbits(a, axis=1, count=-3)
    >>> c
    array([[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 1, 0]], dtype=uint8)
    
    
    >>> p = np.packbits(b, axis=0)
    >>> np.unpackbits(p, axis=0)
    array([[0, 0, 0, 0, 0, 0, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1],
           [0, 0, 0, 1, 0, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
    >>> np.array_equal(b, np.unpackbits(p, axis=0, count=b.shape[0]))
    True
    
# numpy.unravel_index
numpy.unravel_index(indices, shape, order='C')
    
Converts a flat index or array of flat indices into a tuple of coordinate arrays.
Parameters:
    
indicesarray_like
    
An integer array whose elements are indices into the flattened version of an array of dimensions `shape`. Before version 1.6.0, this function accepted just one index value.
shapetuple of ints
    
The shape of the array to use for unraveling `indices`.
order{‘C’, ‘F’}, optional
    
Determines whether the indices should be viewed as indexing in row-major (C-style) or column-major (Fortran-style) order.
Returns:
    
unraveled_coordstuple of ndarray
    
Each array in the tuple has the same shape as the `indices` array.
See also
`ravel_multi_index`
#### Examples
    
    >>> import numpy as np
    >>> np.unravel_index([22, 41, 37], (7,6))
    (array([3, 6, 6]), array([4, 5, 1]))
    >>> np.unravel_index([31, 41, 13], (7,6), order='F')
    (array([3, 6, 6]), array([4, 5, 1]))
    
    
    >>> np.unravel_index(1621, (6,7,8,9))
    (3, 1, 4, 1)
    
# numpy.unstack
numpy.unstack(x, /, *, axis=0)[source]
    
Split an array into a sequence of arrays along the given axis.
The `axis` parameter specifies the dimension along which the array will be split. For example, if `axis=0` (the default) it will be the first dimension and if `axis=-1` it will be the last dimension.
The result is a tuple of arrays split along `axis`.
New in version 2.1.0.
Parameters:
    
xndarray
    
The array to be unstacked.
axisint, optional
    
Axis along which the array will be split. Default: `0`.
Returns:
    
unstackedtuple of ndarrays
    
The unstacked arrays.
See also
`stack`
    
Join a sequence of arrays along a new axis.
`concatenate`
    
Join a sequence of arrays along an existing axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`split`
    
Split array into a list of multiple sub-arrays of equal size.
#### Notes
`unstack` serves as the reverse operation of `stack`, i.e., `stack(unstack(x, axis=axis), axis=axis) == x`.
This function is equivalent to `tuple(np.moveaxis(x, axis, 0))`, since iterating on an array iterates along the first axis.
#### Examples
    
    >>> arr = np.arange(24).reshape((2, 3, 4))
    >>> np.unstack(arr)
    (array([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]]),
     array([[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]))
    >>> np.unstack(arr, axis=1)
    (array([[ 0,  1,  2,  3],
            [12, 13, 14, 15]]),
     array([[ 4,  5,  6,  7],
            [16, 17, 18, 19]]),
     array([[ 8,  9, 10, 11],
            [20, 21, 22, 23]]))
    >>> arr2 = np.stack(np.unstack(arr, axis=1), axis=1)
    >>> arr2.shape
    (2, 3, 4)
    >>> np.all(arr == arr2)
    np.True_
    
# numpy.unwrap
numpy.unwrap(p, discont=None, axis=-1, *, period=6.283185307179586)[source]
    
Unwrap by taking the complement of large deltas with respect to the period.
This unwraps a signal `p` by changing elements which have an absolute difference from their predecessor of more than `max(discont, period/2)` to their `period`-complementary values.
For the default case where `period` is \\(2\pi\\) and `discont` is \\(\pi\\), this unwraps a radian phase `p` such that adjacent differences are never greater than \\(\pi\\) by adding \\(2k\pi\\) for some integer \\(k\\).
Parameters:
    
parray_like
    
Input array.
discontfloat, optional
    
Maximum discontinuity between values, default is `period/2`. Values below `period/2` are treated as if they were `period/2`. To have an effect different from the default, `discont` should be larger than `period/2`.
axisint, optional
    
Axis along which unwrap will operate, default is the last axis.
periodfloat, optional
    
Size of the range over which the input wraps. By default, it is `2 pi`.
New in version 1.21.0.
Returns:
    
outndarray
    
Output array.
See also
`rad2deg`, `deg2rad`
#### Notes
If the discontinuity in `p` is smaller than `period/2`, but larger than `discont`, no unwrapping is done because taking the complement would only make the discontinuity larger.
#### Examples
    
    >>> import numpy as np
    >>> phase = np.linspace(0, np.pi, num=5)
    >>> phase[3:] += np.pi
    >>> phase
    array([ 0.        ,  0.78539816,  1.57079633,  5.49778714,  6.28318531]) # may vary
    >>> np.unwrap(phase)
    array([ 0.        ,  0.78539816,  1.57079633, -0.78539816,  0.        ]) # may vary
    >>> np.unwrap([0, 1, 2, -1, 0], period=4)
    array([0, 1, 2, 3, 4])
    >>> np.unwrap([ 1, 2, 3, 4, 5, 6, 1, 2, 3], period=6)
    array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.unwrap([2, 3, 4, 5, 2, 3, 4, 5], period=4)
    array([2, 3, 4, 5, 6, 7, 8, 9])
    >>> phase_deg = np.mod(np.linspace(0 ,720, 19), 360) - 180
    >>> np.unwrap(phase_deg, period=360)
    array([-180., -140., -100.,  -60.,  -20.,   20.,   60.,  100.,  140.,
            180.,  220.,  260.,  300.,  340.,  380.,  420.,  460.,  500.,
            540.])
    
# numpy.vander
numpy.vander(x, N=None, increasing=False)[source]
    
Generate a Vandermonde matrix.
The columns of the output matrix are powers of the input vector. The order of the powers is determined by the `increasing` boolean argument. Specifically, when `increasing` is False, the `i`-th output column is the input vector raised element-wise to the power of `N - i - 1`. Such a matrix with a geometric progression in each row is named for Alexandre- Theophile Vandermonde.
Parameters:
    
xarray_like
    
1-D input array.
Nint, optional
    
Number of columns in the output. If `N` is not specified, a square array is returned (`N = len(x)`).
increasingbool, optional
    
Order of the powers of the columns. If True, the powers increase from left to right, if False (the default) they are reversed.
Returns:
    
outndarray
    
Vandermonde matrix. If `increasing` is False, the first column is `x^(N-1)`, the second `x^(N-2)` and so forth. If `increasing` is True, the columns are `x^0, x^1, ..., x^(N-1)`.
See also
`polynomial.polynomial.polyvander`
#### Examples
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 3, 5])
    >>> N = 3
    >>> np.vander(x, N)
    array([[ 1,  1,  1],
           [ 4,  2,  1],
           [ 9,  3,  1],
           [25,  5,  1]])
    
    
    >>> np.column_stack([x**(N-1-i) for i in range(N)])
    array([[ 1,  1,  1],
           [ 4,  2,  1],
           [ 9,  3,  1],
           [25,  5,  1]])
    
    
    >>> x = np.array([1, 2, 3, 5])
    >>> np.vander(x)
    array([[  1,   1,   1,   1],
           [  8,   4,   2,   1],
           [ 27,   9,   3,   1],
           [125,  25,   5,   1]])
    >>> np.vander(x, increasing=True)
    array([[  1,   1,   1,   1],
           [  1,   2,   4,   8],
           [  1,   3,   9,  27],
           [  1,   5,  25, 125]])
    
The determinant of a square Vandermonde matrix is the product of the differences between the values of the input vector:
    
    >>> np.linalg.det(np.vander(x))
    48.000000000000043 # may vary
    >>> (5-3)*(5-2)*(5-1)*(3-2)*(3-1)*(2-1)
    48
    
# numpy.var
numpy.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>, mean=<no value>, correction=<no value>)[source]
    
Compute the variance along the specified axis.
Returns the variance of the array elements, a measure of the spread of a distribution. The variance is computed for the flattened array by default, otherwise over the specified axis.
Parameters:
    
aarray_like
    
Array containing numbers whose variance is desired. If `a` is not an array, a conversion is attempted.
axisNone or int or tuple of ints, optional
    
Axis or axes along which the variance is computed. The default is to compute the variance of the flattened array. If this is a tuple of ints, a variance is performed over multiple axes, instead of a single axis or all the axes as before.
dtypedata-type, optional
    
Type to use in computing the variance. For arrays of integer type the default is `float64`; for arrays of float types it is the same as the array type.
outndarray, optional
    
Alternate output array in which to place the result. It must have the same shape as the expected output, but the type is cast if necessary.
ddof{int, float}, optional
    
“Delta Degrees of Freedom”: the divisor used in the calculation is `N - ddof`, where `N` represents the number of elements. By default `ddof` is zero. See notes for details about use of `ddof`.
keepdimsbool, optional
    
If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array.
If the default value is passed, then `keepdims` will not be passed through to the `var` method of sub-classes of `ndarray`, however any non-default value will be. If the sub-class’ method does not implement `keepdims` any exceptions will be raised.
wherearray_like of bool, optional
    
Elements to include in the variance. See `reduce` for details.
New in version 1.20.0.
meanarray like, optional
    
Provide the mean to prevent its recalculation. The mean should have a shape as if it was calculated with `keepdims=True`. The axis for the calculation of the mean should be the same as used in the call to this var function.
New in version 2.0.0.
correction{int, float}, optional
    
Array API compatible name for the `ddof` parameter. Only one of them can be provided at the same time.
New in version 2.0.0.
Returns:
    
variancendarray, see dtype parameter above
    
If `out=None`, returns a new array containing the variance; otherwise, a reference to the output array is returned.
See also
`std`, `mean`, `nanmean`, `nanstd`, `nanvar`
Output type determination
#### Notes
There are several common variants of the array variance calculation. Assuming the input `a` is a one-dimensional NumPy array and `mean` is either provided as an argument or computed as `a.mean()`, NumPy computes the variance of an array as:
    
    N = len(a)
    d2 = abs(a - mean)**2  # abs is for complex `a`
    var = d2.sum() / (N - ddof)  # note use of `ddof`
    
Different values of the argument `ddof` are useful in different contexts. NumPy’s default `ddof=0` corresponds with the expression:
\\[\frac{\sum_i{|a_i - \bar{a}|^2 }}{N}\\]
which is sometimes called the “population variance” in the field of statistics because it applies the definition of variance to `a` as if `a` were a complete population of possible observations.
Many other libraries define the variance of an array differently, e.g.:
\\[\frac{\sum_i{|a_i - \bar{a}|^2}}{N - 1}\\]
In statistics, the resulting quantity is sometimes called the “sample variance” because if `a` is a random sample from a larger population, this calculation provides an unbiased estimate of the variance of the population. The use of \\(N-1\\) in the denominator is often called “Bessel’s correction” because it corrects for bias (toward lower values) in the variance estimate introduced when the sample mean of `a` is used in place of the true mean of the population. For this quantity, use `ddof=1`.
Note that for complex numbers, the absolute value is taken before squaring, so that the result is always real and nonnegative.
For floating-point input, the variance is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.var(a)
    1.25
    >>> np.var(a, axis=0)
    array([1.,  1.])
    >>> np.var(a, axis=1)
    array([0.25,  0.25])
    
In single precision, var() can be inaccurate:
    
    >>> a = np.zeros((2, 512*512), dtype=np.float32)
    >>> a[0, :] = 1.0
    >>> a[1, :] = 0.1
    >>> np.var(a)
    np.float32(0.20250003)
    
Computing the variance in float64 is more accurate:
    
    >>> np.var(a, dtype=np.float64)
    0.20249999932944759 # may vary
    >>> ((1-0.55)**2 + (0.1-0.55)**2)/2
    0.2025
    
Specifying a where argument:
    
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> np.var(a)
    6.833333333333333 # may vary
    >>> np.var(a, where=[[True], [True], [False]])
    4.0
    
Using the mean keyword to save computation time:
    
    >>> import numpy as np
    >>> from timeit import timeit
    >>>
    >>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
    >>> mean = np.mean(a, axis=1, keepdims=True)
    >>>
    >>> g = globals()
    >>> n = 10000
    >>> t1 = timeit("var = np.var(a, axis=1, mean=mean)", globals=g, number=n)
    >>> t2 = timeit("var = np.var(a, axis=1)", globals=g, number=n)
    >>> print(f'Percentage execution time saved {100*(t2-t1)/t2:.0f}%')
    
    Percentage execution time saved 32%
    
# numpy.vdot
numpy.vdot(a, b, /)
    
Return the dot product of two vectors.
The `vdot` function handles complex numbers differently than `dot`: if the first argument is complex, it is replaced by its complex conjugate in the dot product calculation. `vdot` also handles multidimensional arrays differently than `dot`: it does not perform a matrix product, but flattens the arguments to 1-D arrays before taking a vector dot product.
Consequently, when the arguments are 2-D arrays of the same shape, this function effectively returns their Frobenius inner product (also known as the trace inner product or the standard inner product on a vector space of matrices).
Parameters:
    
aarray_like
    
If `a` is complex the complex conjugate is taken before calculation of the dot product.
barray_like
    
Second argument to the dot product.
Returns:
    
outputndarray
    
Dot product of `a` and `b`. Can be an int, float, or complex depending on the types of `a` and `b`.
See also
`dot`
    
Return the dot product without using the complex conjugate of the first argument.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1+2j,3+4j])
    >>> b = np.array([5+6j,7+8j])
    >>> np.vdot(a, b)
    (70-8j)
    >>> np.vdot(b, a)
    (70+8j)
    
Note that higher-dimensional arrays are flattened!
    
    >>> a = np.array([[1, 4], [5, 6]])
    >>> b = np.array([[4, 1], [2, 2]])
    >>> np.vdot(a, b)
    30
    >>> np.vdot(b, a)
    30
    >>> 1*4 + 4*1 + 5*2 + 6*2
    30
    
# numpy.vecdot
numpy.vecdot(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, signature, axes, axis])=<ufunc 'vecdot'>
    
Vector dot product of two arrays.
Let \\(\mathbf{a}\\) be a vector in `x1` and \\(\mathbf{b}\\) be a corresponding vector in `x2`. The dot product is defined as:
\\[\mathbf{a} \cdot \mathbf{b} = \sum_{i=0}^{n-1} \overline{a_i}b_i\\]
where the sum is over the last dimension (unless `axis` is specified) and where \\(\overline{a_i}\\) denotes the complex conjugate if \\(a_i\\) is complex and the identity otherwise.
New in version 2.0.0.
Parameters:
    
x1, x2array_like
    
Input arrays, scalars not allowed.
outndarray, optional
    
A location into which the result is stored. If provided, it must have the broadcasted shape of `x1` and `x2` with the last axis removed. If not provided or None, a freshly-allocated array is used.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The vector dot product of the inputs. This is a scalar only when both x1, x2 are 1-d vectors.
Raises:
    
ValueError
    
If the last dimension of `x1` is not the same size as the last dimension of `x2`.
If a scalar value is passed in.
See also
`vdot`
    
same but flattens arguments first
`matmul`
    
Matrix-matrix product.
`vecmat`
    
Vector-matrix product.
`matvec`
    
Matrix-vector product.
`einsum`
    
Einstein summation convention.
#### Examples
    
    >>> import numpy as np
    
Get the projected size along a given normal for an array of vectors.
    
    >>> v = np.array([[0., 5., 0.], [0., 0., 10.], [0., 6., 8.]])
    >>> n = np.array([0., 0.6, 0.8])
    >>> np.vecdot(v, n)
    array([ 3.,  8., 10.])
    
# numpy.vecmat
numpy.vecmat(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, signature, axes, axis])=<ufunc 'vecmat'>
    
Vector-matrix dot product of two arrays.
Given a vector (or stack of vector) \\(\mathbf{v}\\) in `x1` and a matrix (or stack of matrices) \\(\mathbf{A}\\) in `x2`, the vector-matrix product is defined as:
\\[\mathbf{b} \cdot \mathbf{A} = \sum_{i=0}^{n-1} \overline{v_i}A_{ij}\\]
where the sum is over the last dimension of `x1` and the one-but-last dimensions in `x2` (unless `axes` is specified) and where \\(\overline{v_i}\\) denotes the complex conjugate if \\(v\\) is complex and the identity otherwise. (For a non-conjugated vector-matrix product, use `np.matvec(x2.mT, x1)`.)
New in version 2.2.0.
Parameters:
    
x1, x2array_like
    
Input arrays, scalars not allowed.
outndarray, optional
    
A location into which the result is stored. If provided, it must have the broadcasted shape of `x1` and `x2` with the summation axis removed. If not provided or None, a freshly-allocated array is used.
**kwargs
    
For other keyword-only arguments, see the ufunc docs.
Returns:
    
yndarray
    
The vector-matrix product of the inputs.
Raises:
    
ValueError
    
If the last dimensions of `x1` and the one-but-last dimension of `x2` are not the same size.
If a scalar value is passed in.
See also
`vecdot`
    
Vector-vector product.
`matvec`
    
Matrix-vector product.
`matmul`
    
Matrix-matrix product.
`einsum`
    
Einstein summation convention.
#### Examples
Project a vector along X and Y.
    
    >>> v = np.array([0., 4., 2.])
    >>> a = np.array([[1., 0., 0.],
    ...               [0., 1., 0.],
    ...               [0., 0., 0.]])
    >>> np.vecmat(v, a)
    array([ 0.,  4., 0.])
    
# numpy.vectorize.__call__
method
vectorize.__call__(*args, **kwargs)[source]
    
Call self as a function.
# numpy.vectorize
classnumpy.vectorize(pyfunc=np._NoValue, otypes=None, doc=None, excluded=None, cache=False, signature=None)[source]
    
Returns an object that acts like pyfunc, but takes arrays as input.
Define a vectorized function which takes a nested sequence of objects or numpy arrays as inputs and returns a single numpy array or a tuple of numpy arrays. The vectorized function evaluates `pyfunc` over successive tuples of the input arrays like the python map function, except it uses the broadcasting rules of numpy.
The data type of the output of `vectorized` is determined by calling the function with the first element of the input. This can be avoided by specifying the `otypes` argument.
Parameters:
    
pyfunccallable, optional
    
A python function or method. Can be omitted to produce a decorator with keyword arguments.
otypesstr or list of dtypes, optional
    
The output data type. It must be specified as either a string of typecode characters or a list of data type specifiers. There should be one data type specifier for each output.
docstr, optional
    
The docstring for the function. If None, the docstring will be the `pyfunc.__doc__`.
excludedset, optional
    
Set of strings or integers representing the positional or keyword arguments for which the function will not be vectorized. These will be passed directly to `pyfunc` unmodified.
cachebool, optional
    
If `True`, then cache the first function call that determines the number of outputs if `otypes` is not provided.
signaturestring, optional
    
Generalized universal function signature, e.g., `(m,n),(n)->(m)` for vectorized matrix-vector multiplication. If provided, `pyfunc` will be called with (and expected to return) arrays with shapes given by the size of corresponding core dimensions. By default, `pyfunc` is assumed to take scalars as input and output.
Returns:
    
outcallable
    
A vectorized function if `pyfunc` was provided, a decorator otherwise.
See also
`frompyfunc`
    
Takes an arbitrary Python function and returns a ufunc
#### Notes
The `vectorize` function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.
If `otypes` is not specified, then a call to the function with the first argument will be used to determine the number of outputs. The results of this call will be cached if `cache` is `True` to prevent calling the function twice. However, to implement the cache, the original function must be wrapped which will slow down subsequent calls, so only do this if your function is expensive.
The new keyword argument interface and `excluded` argument support further degrades performance.
#### References
[1]
Generalized universal function API
#### Examples
    
    >>> import numpy as np
    >>> def myfunc(a, b):
    ...     "Return a-b if a>b, otherwise return a+b"
    ...     if a > b:
    ...         return a - b
    ...     else:
    ...         return a + b
    
    
    >>> vfunc = np.vectorize(myfunc)
    >>> vfunc([1, 2, 3, 4], 2)
    array([3, 4, 1, 2])
    
The docstring is taken from the input function to `vectorize` unless it is specified:
    
    >>> vfunc.__doc__
    'Return a-b if a>b, otherwise return a+b'
    >>> vfunc = np.vectorize(myfunc, doc='Vectorized `myfunc`')
    >>> vfunc.__doc__
    'Vectorized `myfunc`'
    
The output type is determined by evaluating the first element of the input, unless it is specified:
    
    >>> out = vfunc([1, 2, 3, 4], 2)
    >>> type(out[0])
    <class 'numpy.int64'>
    >>> vfunc = np.vectorize(myfunc, otypes=[float])
    >>> out = vfunc([1, 2, 3, 4], 2)
    >>> type(out[0])
    <class 'numpy.float64'>
    
The `excluded` argument can be used to prevent vectorizing over certain arguments. This can be useful for array-like arguments of a fixed length such as the coefficients for a polynomial as in `polyval`:
    
    >>> def mypolyval(p, x):
    ...     _p = list(p)
    ...     res = _p.pop(0)
    ...     while _p:
    ...         res = res*x + _p.pop(0)
    ...     return res
    
Here, we exclude the zeroth argument from vectorization whether it is passed by position or keyword.
    
    >>> vpolyval = np.vectorize(mypolyval, excluded={0, 'p'})
    >>> vpolyval([1, 2, 3], x=[0, 1])
    array([3, 6])
    >>> vpolyval(p=[1, 2, 3], x=[0, 1])
    array([3, 6])
    
The `signature` argument allows for vectorizing functions that act on non-scalar arrays of fixed length. For example, you can use it for a vectorized calculation of Pearson correlation coefficient and its p-value:
    
    >>> import scipy.stats
    >>> pearsonr = np.vectorize(scipy.stats.pearsonr,
    ...                 signature='(n),(n)->(),()')
    >>> pearsonr([[0, 1, 2, 3]], [[1, 2, 3, 4], [4, 3, 2, 1]])
    (array([ 1., -1.]), array([ 0.,  0.]))
    
Or for a vectorized convolution:
    
    >>> convolve = np.vectorize(np.convolve, signature='(n),(m)->(k)')
    >>> convolve(np.eye(4), [1, 2, 1])
    array([[1., 2., 1., 0., 0., 0.],
           [0., 1., 2., 1., 0., 0.],
           [0., 0., 1., 2., 1., 0.],
           [0., 0., 0., 1., 2., 1.]])
    
Decorator syntax is supported. The decorator can be called as a function to provide keyword arguments:
    
    >>> @np.vectorize
    ... def identity(x):
    ...     return x
    ...
    >>> identity([0, 1, 2])
    array([0, 1, 2])
    >>> @np.vectorize(otypes=[float])
    ... def as_float(x):
    ...     return x
    ...
    >>> as_float([0, 1, 2])
    array([0., 1., 2.])
    
#### Methods
`__call__`(*args, **kwargs)
Call self as a function.  
# numpy.vsplit
numpy.vsplit(ary, indices_or_sections)[source]
    
Split an array into multiple sub-arrays vertically (row-wise).
Please refer to the `split` documentation. `vsplit` is equivalent to `split` with `axis=0` (default), the array is always split along the first axis regardless of the array dimension.
See also
`split`
    
Split an array into multiple sub-arrays of equal size.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(16.0).reshape(4, 4)
    >>> x
    array([[ 0.,   1.,   2.,   3.],
           [ 4.,   5.,   6.,   7.],
           [ 8.,   9.,  10.,  11.],
           [12.,  13.,  14.,  15.]])
    >>> np.vsplit(x, 2)
    [array([[0., 1., 2., 3.],
            [4., 5., 6., 7.]]),
     array([[ 8.,  9., 10., 11.],
            [12., 13., 14., 15.]])]
    >>> np.vsplit(x, np.array([3, 6]))
    [array([[ 0.,  1.,  2.,  3.],
            [ 4.,  5.,  6.,  7.],
            [ 8.,  9., 10., 11.]]),
     array([[12., 13., 14., 15.]]),
     array([], shape=(0, 4), dtype=float64)]
    
With a higher dimensional array the split is still along the first axis.
    
    >>> x = np.arange(8.0).reshape(2, 2, 2)
    >>> x
    array([[[0.,  1.],
            [2.,  3.]],
           [[4.,  5.],
            [6.,  7.]]])
    >>> np.vsplit(x, 2)
    [array([[[0., 1.],
             [2., 3.]]]),
     array([[[4., 5.],
             [6., 7.]]])]
    
# numpy.vstack
numpy.vstack(tup, *, dtype=None, casting='same_kind')[source]
    
Stack arrays in sequence vertically (row wise).
This is equivalent to concatenation along the first axis after 1-D arrays of shape `(N,)` have been reshaped to `(1,N)`. Rebuilds arrays divided by `vsplit`.
This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations.
Parameters:
    
tupsequence of ndarrays
    
The arrays must have the same shape along all but the first axis. 1-D arrays must have the same length. In the case of a single array_like input, it will be treated as a sequence of arrays; i.e., each element along the zeroth axis is treated as a separate array.
dtypestr or dtype
    
If provided, the destination array will have this dtype. Cannot be provided together with `out`.
New in version 1.24.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
Controls what kind of data casting may occur. Defaults to ‘same_kind’.
New in version 1.24.
Returns:
    
stackedndarray
    
The array formed by stacking the given arrays, will be at least 2-D.
See also
`concatenate`
    
Join a sequence of arrays along an existing axis.
`stack`
    
Join a sequence of arrays along a new axis.
`block`
    
Assemble an nd-array from nested lists of blocks.
`hstack`
    
Stack arrays in sequence horizontally (column wise).
`dstack`
    
Stack arrays in sequence depth wise (along third axis).
`column_stack`
    
Stack 1-D arrays as columns into a 2-D array.
`vsplit`
    
Split an array into multiple sub-arrays vertically (row-wise).
`unstack`
    
Split an array into a tuple of sub-arrays along an axis.
#### Examples
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3])
    >>> b = np.array([4, 5, 6])
    >>> np.vstack((a,b))
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> a = np.array([[1], [2], [3]])
    >>> b = np.array([[4], [5], [6]])
    >>> np.vstack((a,b))
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6]])
    
# numpy.where
numpy.where(condition, [x, y, ]/)
    
Return elements chosen from `x` or `y` depending on `condition`.
Note
When only `condition` is provided, this function is a shorthand for `np.asarray(condition).nonzero()`. Using `nonzero` directly should be preferred, as it behaves correctly for subclasses. The rest of this documentation covers only the case where all three arguments are provided.
Parameters:
    
conditionarray_like, bool
    
Where True, yield `x`, otherwise yield `y`.
x, yarray_like
    
Values from which to choose. `x`, `y` and `condition` need to be broadcastable to some shape.
Returns:
    
outndarray
    
An array with elements from `x` where `condition` is True, and elements from `y` elsewhere.
See also
`choose`
`nonzero`
    
The function that is called when x and y are omitted
#### Notes
If all the arrays are 1-D, `where` is equivalent to:
    
    [xv if c else yv
     for c, xv, yv in zip(condition, x, y)]
    
#### Examples
    
    >>> import numpy as np
    >>> a = np.arange(10)
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.where(a < 5, a, 10*a)
    array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])
    
This can be used on multidimensional arrays too:
    
    >>> np.where([[True, False], [True, True]],
    ...          [[1, 2], [3, 4]],
    ...          [[9, 8], [7, 6]])
    array([[1, 8],
           [3, 4]])
    
The shapes of x, y, and the condition are broadcast together:
    
    >>> x, y = np.ogrid[:3, :4]
    >>> np.where(x < y, x, 10 + y)  # both x and 10+y are broadcast
    array([[10,  0,  0,  0],
           [10, 11,  1,  1],
           [10, 11, 12,  2]])
    
    
    >>> a = np.array([[0, 1, 2],
    ...               [0, 2, 4],
    ...               [0, 3, 6]])
    >>> np.where(a < 4, a, -1)  # -1 is broadcast
    array([[ 0,  1,  2],
           [ 0,  2, -1],
           [ 0,  3, -1]])
    
# numpy.zeros
numpy.zeros(shape, dtype=float, order='C', *, like=None)
    
Return a new array of given shape and type, filled with zeros.
Parameters:
    
shapeint or tuple of ints
    
Shape of the new array, e.g., `(2, 3)` or `2`.
dtypedata-type, optional
    
The desired data-type for the array, e.g., `numpy.int8`. Default is `numpy.float64`.
order{‘C’, ‘F’}, optional, default: ‘C’
    
Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory.
likearray_like, optional
    
Reference object to allow the creation of arrays which are not NumPy arrays. If an array-like passed in as `like` supports the `__array_function__` protocol, the result will be defined by it. In this case, it ensures the creation of an array object compatible with that passed in via this argument.
New in version 1.20.0.
Returns:
    
outndarray
    
Array of zeros with the given shape, dtype, and order.
See also
`zeros_like`
    
Return an array of zeros with shape and type of input.
`empty`
    
Return a new uninitialized array.
`ones`
    
Return a new array setting values to one.
`full`
    
Return a new array of given shape filled with value.
#### Examples
    
    >>> import numpy as np
    >>> np.zeros(5)
    array([ 0.,  0.,  0.,  0.,  0.])
    
    
    >>> np.zeros((5,), dtype=int)
    array([0, 0, 0, 0, 0])
    
    
    >>> np.zeros((2, 1))
    array([[ 0.],
           [ 0.]])
    
    
    >>> s = (2,2)
    >>> np.zeros(s)
    array([[ 0.,  0.],
           [ 0.,  0.]])
    
    
    >>> np.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')]) # custom dtype
    array([(0, 0), (0, 0)],
          dtype=[('x', '<i4'), ('y', '<i4')])
    
# numpy.zeros_like
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None, *, device=None)[source]
    
Return an array of zeros with the same shape and type as a given array.
Parameters:
    
aarray_like
    
The shape and data-type of `a` define these same attributes of the returned array.
dtypedata-type, optional
    
Overrides the data type of the result.
order{‘C’, ‘F’, ‘A’, or ‘K’}, optional
    
Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if `a` is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of `a` as closely as possible.
subokbool, optional.
    
If True, then the newly created array will use the sub-class type of `a`, otherwise it will be a base-class array. Defaults to True.
shapeint or sequence of ints, optional.
    
Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.
devicestr, optional
    
The device on which to place the created array. Default: None. For Array-API interoperability only, so must be `"cpu"` if passed.
New in version 2.0.0.
Returns:
    
outndarray
    
Array of zeros with the same shape and type as `a`.
See also
`empty_like`
    
Return an empty array with shape and type of input.
`ones_like`
    
Return an array of ones with shape and type of input.
`full_like`
    
Return a new array with shape of input filled with value.
`zeros`
    
Return a new array setting values to zero.
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(6)
    >>> x = x.reshape((2, 3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.zeros_like(x)
    array([[0, 0, 0],
           [0, 0, 0]])
    
    
    >>> y = np.arange(3, dtype=float)
    >>> y
    array([0., 1., 2.])
    >>> np.zeros_like(y)
    array([0.,  0.,  0.])
    
# Global Configuration Options
NumPy has a few import-time, compile-time, or runtime configuration options which change the global behaviour. Most of these are related to performance or for debugging purposes and will not be interesting to the vast majority of users.
## Performance-related options
### Number of threads used for linear algebra
NumPy itself is normally intentionally limited to a single thread during function calls, however it does support multiple Python threads running at the same time. Note that for performant linear algebra NumPy uses a BLAS backend such as OpenBLAS or MKL, which may use multiple threads that may be controlled by environment variables such as `OMP_NUM_THREADS` depending on what is used. One way to control the number of threads is the package threadpoolctl
### madvise hugepage on Linux
When working with very large arrays on modern Linux kernels, you can experience a significant speedup when transparent hugepage is used. The current system policy for transparent hugepages can be seen by:
    
    cat /sys/kernel/mm/transparent_hugepage/enabled
    
When set to `madvise` NumPy will typically use hugepages for a performance boost. This behaviour can be modified by setting the environment variable:
    
    NUMPY_MADVISE_HUGEPAGE=0
    
or setting it to `1` to always enable it. When not set, the default is to use madvise on Kernels 4.6 and newer. These kernels presumably experience a large speedup with hugepage support. This flag is checked at import time.
### SIMD feature selection
Setting `NPY_DISABLE_CPU_FEATURES` will exclude simd features at runtime. See Runtime dispatch.
## Debugging-related options
### Warn if no memory allocation policy when deallocating data
Some users might pass ownership of the data pointer to the `ndarray` by setting the `OWNDATA` flag. If they do this without setting (manually) a memory allocation policy, the default will be to call `free`. If `NUMPY_WARN_IF_NO_MEM_POLICY` is set to `"1"`, a `RuntimeWarning` will be emitted. A better alternative is to use a `PyCapsule` with a deallocator and set the `ndarray.base`.
Changed in version 1.25.2: This variable is only checked on the first import.
# NumPy reference
Release:
    
2.2
Date:
    
December 14, 2024
This reference manual details functions, modules, and objects included in NumPy, describing what they are and what they do. For learning how to use NumPy, see the complete documentation.
## Python API
  * NumPy’s module structure


  * Array objects
    * The N-dimensional array (`ndarray`)
    * Scalars
    * Data type objects (`dtype`)
    * Data type promotion in NumPy
    * Iterating over arrays
    * Standard array subclasses
    * Masked arrays
    * The array interface protocol
    * Datetimes and timedeltas


  * Universal functions (`ufunc`)


  * Routines and objects by topic
    * Constants
    * Array creation routines
    * Array manipulation routines
    * Bit-wise operations
    * String functionality
    * Datetime support functions
    * Data type routines
    * Mathematical functions with automatic domain
    * Floating point error handling
    * Exceptions and Warnings (`numpy.exceptions`)
    * Discrete Fourier Transform (`numpy.fft`)
    * Functional programming
    * Input and output
    * Indexing routines
    * Linear algebra (`numpy.linalg`)
    * Logic functions
    * Masked array operations
    * Mathematical functions
    * Miscellaneous routines
    * Polynomials
    * Random sampling (`numpy.random`)
    * Set routines
    * Sorting, searching, and counting
    * Statistics
    * Test support (`numpy.testing`)
    * Window functions


  * Typing (`numpy.typing`)
  * Packaging (`numpy.distutils`)


## C API
  * NumPy C-API
    * Python types and C-structures
    * System configuration
    * Data type API
    * Array API
    * Array iterator API
    * ufunc API
    * Generalized universal function API
    * NpyString API
    * NumPy core math library
    * Datetime API
    * C API deprecations
    * Memory management in NumPy


## Other topics
  * Array API standard compatibility
  * CPU/SIMD optimizations
  * Thread Safety
  * Global Configuration Options
  * NumPy security
  * Status of `numpy.distutils` and migration advice
  * `numpy.distutils` user guide
  * NumPy and SWIG


## Acknowledgements
Large parts of this manual originate from Travis E. Oliphant’s book Guide to NumPy (which generously entered Public Domain in August 2008). The reference documentation for many of the functions are written by numerous contributors and developers of NumPy.
# Constants of the numpy.ma module
In addition to the `MaskedArray` class, the `numpy.ma` module defines several constants.
numpy.ma.masked
    
The `masked` constant is a special case of `MaskedArray`, with a float datatype and a null shape. It is used to test whether a specific entry of a masked array is masked, or to mask one or several entries of a masked array:
    
    >>> import numpy as np
    
    >>> x = ma.array([1, 2, 3], mask=[0, 1, 0])
    >>> x[1] is ma.masked
    True
    >>> x[-1] = ma.masked
    >>> x
    masked_array(data=[1, --, --],
                 mask=[False,  True,  True],
           fill_value=999999)
    
numpy.ma.nomask
    
Value indicating that a masked array has no invalid entry. `nomask` is used internally to speed up computations when the mask is not needed. It is represented internally as `np.False_`.
numpy.ma.masked_print_option
    
String used in lieu of missing data when a masked array is printed. By default, this string is `'--'`.
Use `set_display()` to change the default string. Example usage: `numpy.ma.masked_print_option.set_display('X')` replaces missing data with `'X'`.
# The MaskedArray class
classnumpy.ma.MaskedArray[source]
A subclass of `ndarray` designed to manipulate numerical arrays with missing data.
An instance of `MaskedArray` can be thought as the combination of several elements:
  * The `data`, as a regular `numpy.ndarray` of any shape or datatype (the data).
  * A boolean `mask` with the same shape as the data, where a `True` value indicates that the corresponding element of the data is invalid. The special value `nomask` is also acceptable for arrays without named fields, and indicates that no data is invalid.
  * A `fill_value`, a value that may be used to replace the invalid entries in order to return a standard `numpy.ndarray`.


## Attributes and properties of masked arrays
See also
Array Attributes
ma.MaskedArray.data
    
Returns the underlying data, as a view of the masked array.
If the underlying data is a subclass of `numpy.ndarray`, it is returned as such.
    
    >>> x = np.ma.array(np.matrix([[1, 2], [3, 4]]), mask=[[0, 1], [1, 0]])
    >>> x.data
    matrix([[1, 2],
            [3, 4]])
    
The type of the data can be accessed through the `baseclass` attribute.
ma.MaskedArray.mask
    
Current mask.
ma.MaskedArray.recordmask
    
Get or set the mask of the array if it has no named fields. For structured arrays, returns a ndarray of booleans where entries are `True` if all the fields are masked, `False` otherwise:
    
    >>> x = np.ma.array([(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)],
    ...         mask=[(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)],
    ...        dtype=[('a', int), ('b', int)])
    >>> x.recordmask
    array([False, False,  True, False, False])
    
ma.MaskedArray.fill_value
    
The filling value of the masked array is a scalar. When setting, None will set to a default based on the data type.
#### Examples
    
    >>> import numpy as np
    >>> for dt in [np.int32, np.int64, np.float64, np.complex128]:
    ...     np.ma.array([0, 1], dtype=dt).get_fill_value()
    ...
    np.int64(999999)
    np.int64(999999)
    np.float64(1e+20)
    np.complex128(1e+20+0j)
    
    
    >>> x = np.ma.array([0, 1.], fill_value=-np.inf)
    >>> x.fill_value
    np.float64(-inf)
    >>> x.fill_value = np.pi
    >>> x.fill_value
    np.float64(3.1415926535897931)
    
Reset to default:
    
    >>> x.fill_value = None
    >>> x.fill_value
    np.float64(1e+20)
    
ma.MaskedArray.baseclass
    
Class of the underlying data (read-only).
ma.MaskedArray.sharedmask
    
Share status of the mask (read-only).
ma.MaskedArray.hardmask
    
Specifies whether values can be unmasked through assignments.
By default, assigning definite values to masked array entries will unmask them. When `hardmask` is `True`, the mask will not change through assignments.
See also
`ma.MaskedArray.harden_mask`
`ma.MaskedArray.soften_mask`
#### Examples
    
    >>> import numpy as np
    >>> x = np.arange(10)
    >>> m = np.ma.masked_array(x, x>5)
    >>> assert not m.hardmask
    
Since `m` has a soft mask, assigning an element value unmasks that element:
    
    >>> m[8] = 42
    >>> m
    masked_array(data=[0, 1, 2, 3, 4, 5, --, --, 42, --],
                 mask=[False, False, False, False, False, False,
                       True, True, False, True],
           fill_value=999999)
    
After hardening, the mask is not affected by assignments:
    
    >>> hardened = np.ma.harden_mask(m)
    >>> assert m.hardmask and hardened is m
    >>> m[:] = 23
    >>> m
    masked_array(data=[23, 23, 23, 23, 23, 23, --, --, 23, --],
                 mask=[False, False, False, False, False, False,
                       True, True, False, True],
           fill_value=999999)
    
As `MaskedArray` is a subclass of `ndarray`, a masked array also inherits all the attributes and properties of a `ndarray` instance.
`MaskedArray.base`
Base object if memory is from some other object.  
`MaskedArray.ctypes`
An object to simplify the interaction of the array with the ctypes module.  
`MaskedArray.dtype`
Data-type of the array's elements.  
`MaskedArray.flags`
Information about the memory layout of the array.  
`MaskedArray.itemsize`
Length of one array element in bytes.  
`MaskedArray.nbytes`
Total bytes consumed by the elements of the array.  
`MaskedArray.ndim`
Number of array dimensions.  
`MaskedArray.shape`
Tuple of array dimensions.  
`MaskedArray.size`
Number of elements in the array.  
`MaskedArray.strides`
Tuple of bytes to step in each dimension when traversing an array.  
`MaskedArray.imag`
The imaginary part of the masked array.  
`MaskedArray.real`
The real part of the masked array.  
`MaskedArray.flat`
Return a flat iterator, or set a flattened version of self to value.  
`MaskedArray.__array_priority__`  
# MaskedArray methods
See also
Array methods
## Conversion
`MaskedArray.__float__`()
Convert to float.  
`MaskedArray.__int__`()
Convert to int.  
`MaskedArray.view`([dtype, type, fill_value])
Return a view of the MaskedArray data.  
`MaskedArray.astype`(dtype[, order, casting, ...])
Copy of the array, cast to a specified type.  
`MaskedArray.byteswap`([inplace])
Swap the bytes of the array elements  
`MaskedArray.compressed`()
Return all the non-masked data as a 1-D array.  
`MaskedArray.filled`([fill_value])
Return a copy of self, with masked values filled with a given value.  
`MaskedArray.tofile`(fid[, sep, format])
Save a masked array to a file in binary format.  
`MaskedArray.toflex`()
Transforms a masked array into a flexible-type array.  
`MaskedArray.tolist`([fill_value])
Return the data portion of the masked array as a hierarchical Python list.  
`MaskedArray.torecords`()
Transforms a masked array into a flexible-type array.  
`MaskedArray.tostring`([fill_value, order])
A compatibility alias for `tobytes`, with exactly the same behavior.  
`MaskedArray.tobytes`([fill_value, order])
Return the array data as a string containing the raw bytes in the array.  
## Shape manipulation
For reshape, resize, and transpose, the single tuple argument may be replaced with `n` integers which will be interpreted as an n-tuple.
`MaskedArray.flatten`([order])
Return a copy of the array collapsed into one dimension.  
`MaskedArray.ravel`([order])
Returns a 1D version of self, as a view.  
`MaskedArray.reshape`(*s, **kwargs)
Give a new shape to the array without changing its data.  
`MaskedArray.resize`(newshape[, refcheck, order])  
`MaskedArray.squeeze`([axis])
Remove axes of length one from `a`.  
`MaskedArray.swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`MaskedArray.transpose`(*axes)
Returns a view of the array with axes transposed.  
`MaskedArray.T`
View of the transposed array.  
## Item selection and manipulation
For array methods that take an `axis` keyword, it defaults to None. If axis is None, then the array is treated as a 1-D array. Any other value for `axis` represents the dimension along which the operation should proceed.
`MaskedArray.argmax`([axis, fill_value, out, ...])
Returns array of indices of the maximum values along the given axis.  
`MaskedArray.argmin`([axis, fill_value, out, ...])
Return array of indices to the minimum values along the given axis.  
`MaskedArray.argsort`([axis, kind, order, ...])
Return an ndarray of indices that sort the array along the specified axis.  
`MaskedArray.choose`(choices[, out, mode])
Use an index array to construct a new array from a set of choices.  
`MaskedArray.compress`(condition[, axis, out])
Return `a` where condition is `True`.  
`MaskedArray.diagonal`([offset, axis1, axis2])
Return specified diagonals.  
`MaskedArray.fill`(value)
Fill the array with a scalar value.  
`MaskedArray.item`(*args)
Copy an element of an array to a standard Python scalar and return it.  
`MaskedArray.nonzero`()
Return the indices of unmasked elements that are not zero.  
`MaskedArray.put`(indices, values[, mode])
Set storage-indexed locations to corresponding values.  
`MaskedArray.repeat`(repeats[, axis])
Repeat elements of an array.  
`MaskedArray.searchsorted`(v[, side, sorter])
Find indices where elements of v should be inserted in a to maintain order.  
`MaskedArray.sort`([axis, kind, order, ...])
Sort the array, in-place  
`MaskedArray.take`(indices[, axis, out, mode])
Take elements from a masked array along an axis.  
## Pickling and copy
`MaskedArray.copy`([order])
Return a copy of the array.  
`MaskedArray.dump`(file)
Dump a pickle of the array to the specified file.  
`MaskedArray.dumps`()
Returns the pickle of the array as a string.  
## Calculations
`MaskedArray.all`([axis, out, keepdims])
Returns True if all elements evaluate to True.  
`MaskedArray.anom`([axis, dtype])
Compute the anomalies (deviations from the arithmetic mean) along the given axis.  
`MaskedArray.any`([axis, out, keepdims])
Returns True if any of the elements of `a` evaluate to True.  
`MaskedArray.clip`([min, max, out])
Return an array whose values are limited to `[min, max]`.  
`MaskedArray.conj`()
Complex-conjugate all elements.  
`MaskedArray.conjugate`()
Return the complex conjugate, element-wise.  
`MaskedArray.cumprod`([axis, dtype, out])
Return the cumulative product of the array elements over the given axis.  
`MaskedArray.cumsum`([axis, dtype, out])
Return the cumulative sum of the array elements over the given axis.  
`MaskedArray.max`([axis, out, fill_value, ...])
Return the maximum along a given axis.  
`MaskedArray.mean`([axis, dtype, out, keepdims])
Returns the average of the array elements along given axis.  
`MaskedArray.min`([axis, out, fill_value, ...])
Return the minimum along a given axis.  
`MaskedArray.prod`([axis, dtype, out, keepdims])
Return the product of the array elements over the given axis.  
`MaskedArray.product`([axis, dtype, out, keepdims])
Return the product of the array elements over the given axis.  
`MaskedArray.ptp`([axis, out, fill_value, ...])
Return (maximum - minimum) along the given dimension (i.e. peak-to-peak value).  
`MaskedArray.round`([decimals, out])
Return each element rounded to the given number of decimals.  
`MaskedArray.std`([axis, dtype, out, ddof, ...])
Returns the standard deviation of the array elements along given axis.  
`MaskedArray.sum`([axis, dtype, out, keepdims])
Return the sum of the array elements over the given axis.  
`MaskedArray.trace`([offset, axis1, axis2, ...])
Return the sum along diagonals of the array.  
`MaskedArray.var`([axis, dtype, out, ddof, ...])
Compute the variance along the specified axis.  
## Arithmetic and comparison operations
### Comparison operators:
`MaskedArray.__lt__`(other)
Return self<value.  
`MaskedArray.__le__`(other)
Return self<=value.  
`MaskedArray.__gt__`(other)
Return self>value.  
`MaskedArray.__ge__`(other)
Return self>=value.  
`MaskedArray.__eq__`(other)
Check whether other equals self elementwise.  
`MaskedArray.__ne__`(other)
Check whether other does not equal self elementwise.  
### Truth value of an array (`bool()`):
`MaskedArray.__bool__`(/)
True if self else False  
### Arithmetic:
`MaskedArray.__abs__`(self)  
`MaskedArray.__add__`(other)
Add self to other, and return a new masked array.  
`MaskedArray.__radd__`(other)
Add other to self, and return a new masked array.  
`MaskedArray.__sub__`(other)
Subtract other from self, and return a new masked array.  
`MaskedArray.__rsub__`(other)
Subtract self from other, and return a new masked array.  
`MaskedArray.__mul__`(other)
Multiply self by other, and return a new masked array.  
`MaskedArray.__rmul__`(other)
Multiply other by self, and return a new masked array.  
`MaskedArray.__div__`(other)
Divide other into self, and return a new masked array.  
`MaskedArray.__truediv__`(other)
Divide other into self, and return a new masked array.  
`MaskedArray.__rtruediv__`(other)
Divide self into other, and return a new masked array.  
`MaskedArray.__floordiv__`(other)
Divide other into self, and return a new masked array.  
`MaskedArray.__rfloordiv__`(other)
Divide self into other, and return a new masked array.  
`MaskedArray.__mod__`(value, /)
Return self%value.  
`MaskedArray.__rmod__`(value, /)
Return value%self.  
`MaskedArray.__divmod__`(value, /)
Return divmod(self, value).  
`MaskedArray.__rdivmod__`(value, /)
Return divmod(value, self).  
`MaskedArray.__pow__`(other)
Raise self to the power other, masking the potential NaNs/Infs  
`MaskedArray.__rpow__`(other)
Raise other to the power self, masking the potential NaNs/Infs  
`MaskedArray.__lshift__`(value, /)
Return self<<value.  
`MaskedArray.__rlshift__`(value, /)
Return value<<self.  
`MaskedArray.__rshift__`(value, /)
Return self>>value.  
`MaskedArray.__rrshift__`(value, /)
Return value>>self.  
`MaskedArray.__and__`(value, /)
Return self&value.  
`MaskedArray.__rand__`(value, /)
Return value&self.  
`MaskedArray.__or__`(value, /)
Return self|value.  
`MaskedArray.__ror__`(value, /)
Return value|self.  
`MaskedArray.__xor__`(value, /)
Return self^value.  
`MaskedArray.__rxor__`(value, /)
Return value^self.  
### Arithmetic, in-place:
`MaskedArray.__iadd__`(other)
Add other to self in-place.  
`MaskedArray.__isub__`(other)
Subtract other from self in-place.  
`MaskedArray.__imul__`(other)
Multiply self by other in-place.  
`MaskedArray.__idiv__`(other)
Divide self by other in-place.  
`MaskedArray.__itruediv__`(other)
True divide self by other in-place.  
`MaskedArray.__ifloordiv__`(other)
Floor divide self by other in-place.  
`MaskedArray.__imod__`(value, /)
Return self%=value.  
`MaskedArray.__ipow__`(other)
Raise self to the power other, in place.  
`MaskedArray.__ilshift__`(value, /)
Return self<<=value.  
`MaskedArray.__irshift__`(value, /)
Return self>>=value.  
`MaskedArray.__iand__`(value, /)
Return self&=value.  
`MaskedArray.__ior__`(value, /)
Return self|=value.  
`MaskedArray.__ixor__`(value, /)
Return self^=value.  
## Representation
`MaskedArray.__repr__`()
Literal string representation.  
`MaskedArray.__str__`()
Return str(self).  
`MaskedArray.ids`()
Return the addresses of the data and mask areas.  
`MaskedArray.iscontiguous`()
Return a boolean indicating whether the data is contiguous.  
## Special methods
For standard library functions:
`MaskedArray.__copy__`()
Used if `copy.copy` is called on an array.  
`MaskedArray.__deepcopy__`(memo, /)
Used if `copy.deepcopy` is called on an array.  
`MaskedArray.__getstate__`()
Return the internal state of the masked array, for pickling purposes.  
`MaskedArray.__reduce__`()
Return a 3-tuple for pickling a MaskedArray.  
`MaskedArray.__setstate__`(state)
Restore the internal state of the masked array, for pickling purposes.  
Basic customization:
`MaskedArray.__new__`(cls[, data, mask, ...])
Create a new masked array from scratch.  
`MaskedArray.__array__`([dtype], *[, copy])
For `dtype` parameter it returns a new reference to self if `dtype` is not given or it matches array's data type.  
`MaskedArray.__array_wrap__`(obj[, context, ...])
Special hook for ufuncs.  
Container customization: (see Indexing)
`MaskedArray.__len__`(/)
Return len(self).  
`MaskedArray.__getitem__`(indx)
x.__getitem__(y) <==> x[y]  
`MaskedArray.__setitem__`(indx, value)
x.__setitem__(i, y) <==> x[i]=y  
`MaskedArray.__delitem__`(key, /)
Delete self[key].  
`MaskedArray.__contains__`(key, /)
Return key in self.  
## Specific methods
### Handling the mask
The following methods can be used to access information about the mask or to manipulate the mask.
`MaskedArray.__setmask__`(mask[, copy])
Set the mask.  
`MaskedArray.harden_mask`()
Force the mask to hard, preventing unmasking by assignment.  
`MaskedArray.soften_mask`()
Force the mask to soft (default), allowing unmasking by assignment.  
`MaskedArray.unshare_mask`()
Copy the mask and set the `sharedmask` flag to `False`.  
`MaskedArray.shrink_mask`()
Reduce a mask to nomask when possible.  
### Handling the `fill_value`
`MaskedArray.get_fill_value`()
The filling value of the masked array is a scalar.  
`MaskedArray.set_fill_value`([value])  
### Counting the missing elements
`MaskedArray.count`([axis, keepdims])
Count the non-masked elements of the array along the given axis.  
# The numpy.ma module
## Rationale
Masked arrays are arrays that may have missing or invalid entries. The `numpy.ma` module provides a nearly work-alike replacement for numpy that supports data arrays with masks.
## What is a masked array?
In many circumstances, datasets can be incomplete or tainted by the presence of invalid data. For example, a sensor may have failed to record a data, or recorded an invalid value. The `numpy.ma` module provides a convenient way to address this issue, by introducing masked arrays.
A masked array is the combination of a standard `numpy.ndarray` and a mask. A mask is either `nomask`, indicating that no value of the associated array is invalid, or an array of booleans that determines for each element of the associated array whether the value is valid or not. When an element of the mask is `False`, the corresponding element of the associated array is valid and is said to be unmasked. When an element of the mask is `True`, the corresponding element of the associated array is said to be masked (invalid).
The package ensures that masked entries are not used in computations.
As an illustration, let’s consider the following dataset:
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> x = np.array([1, 2, 3, -1, 5])
    
We wish to mark the fourth entry as invalid. The easiest is to create a masked array:
    
    >>> mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])
    
We can now compute the mean of the dataset, without taking the invalid data into account:
    
    >>> mx.mean()
    2.75
    
## The numpy.ma module
The main feature of the `numpy.ma` module is the `MaskedArray` class, which is a subclass of `numpy.ndarray`. The class, its attributes and methods are described in more details in the MaskedArray class section.
The `numpy.ma` module can be used as an addition to `numpy`:
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    
To create an array with the second element invalid, we would do:
    
    >>> y = ma.array([1, 2, 3], mask = [0, 1, 0])
    
To create a masked array where all values close to 1.e20 are invalid, we would do:
    
    >>> z = ma.masked_values([1.0, 1.e20, 3.0, 4.0], 1.e20)
    
For a complete discussion of creation methods for masked arrays please see section Constructing masked arrays.
# Using numpy.ma
## Constructing masked arrays
There are several ways to construct a masked array.
  * A first possibility is to directly invoke the `MaskedArray` class.
  * A second possibility is to use the two masked array constructors, `array` and `masked_array`.
`array`(data[, dtype, copy, order, mask, ...])
An array class with possibly masked values.  
`masked_array`
alias of `MaskedArray`  
  * A third option is to take the view of an existing array. In that case, the mask of the view is set to `nomask` if the array has no named fields, or an array of boolean with the same structure as the array otherwise.
        >>> import numpy as np
        >>> x = np.array([1, 2, 3])
        >>> x.view(ma.MaskedArray)
        masked_array(data=[1, 2, 3],
                    mask=False,
              fill_value=999999)
        >>> x = np.array([(1, 1.), (2, 2.)], dtype=[('a',int), ('b', float)])
        >>> x.view(ma.MaskedArray)
        masked_array(data=[(1, 1.0), (2, 2.0)],
                    mask=[(False, False), (False, False)],
              fill_value=(999999, 1e+20),
                    dtype=[('a', '<i8'), ('b', '<f8')])
        
  * Yet another possibility is to use any of the following functions:
`asarray`(a[, dtype, order])
Convert the input to a masked array of the given data-type.  
`asanyarray`(a[, dtype])
Convert the input to a masked array, conserving subclasses.  
`fix_invalid`(a[, mask, copy, fill_value])
Return input with invalid data masked and replaced by a fill value.  
`masked_equal`(x, value[, copy])
Mask an array where equal to a given value.  
`masked_greater`(x, value[, copy])
Mask an array where greater than a given value.  
`masked_greater_equal`(x, value[, copy])
Mask an array where greater than or equal to a given value.  
`masked_inside`(x, v1, v2[, copy])
Mask an array inside a given interval.  
`masked_invalid`(a[, copy])
Mask an array where invalid values occur (NaNs or infs).  
`masked_less`(x, value[, copy])
Mask an array where less than a given value.  
`masked_less_equal`(x, value[, copy])
Mask an array where less than or equal to a given value.  
`masked_not_equal`(x, value[, copy])
Mask an array where not equal to a given value.  
`masked_object`(x, value[, copy, shrink])
Mask the array `x` where the data are exactly equal to value.  
`masked_outside`(x, v1, v2[, copy])
Mask an array outside a given interval.  
`masked_values`(x, value[, rtol, atol, copy, ...])
Mask using floating point equality.  
`masked_where`(condition, a[, copy])
Mask an array where a condition is met.  


## Accessing the data
The underlying data of a masked array can be accessed in several ways:
  * through the `data` attribute. The output is a view of the array as a `numpy.ndarray` or one of its subclasses, depending on the type of the underlying data at the masked array creation.
  * through the `__array__` method. The output is then a `numpy.ndarray`.
  * by directly taking a view of the masked array as a `numpy.ndarray` or one of its subclass (which is actually what using the `data` attribute does).
  * by using the `getdata` function.


None of these methods is completely satisfactory if some entries have been marked as invalid. As a general rule, where a representation of the array is required without any masked entries, it is recommended to fill the array with the `filled` method.
## Accessing the mask
The mask of a masked array is accessible through its `mask` attribute. We must keep in mind that a `True` entry in the mask indicates an invalid data.
Another possibility is to use the `getmask` and `getmaskarray` functions. `getmask(x)` outputs the mask of `x` if `x` is a masked array, and the special value `nomask` otherwise. `getmaskarray(x)` outputs the mask of `x` if `x` is a masked array. If `x` has no invalid entry or is not a masked array, the function outputs a boolean array of `False` with as many elements as `x`.
## Accessing only the valid entries
To retrieve only the valid entries, we can use the inverse of the mask as an index. The inverse of the mask can be calculated with the `numpy.logical_not` function or simply with the `~` operator:
    
    >>> import numpy as np
    >>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
    >>> x[~x.mask]
    masked_array(data=[1, 4],
                   mask=[False, False],
             fill_value=999999)
    
Another way to retrieve the valid data is to use the `compressed` method, which returns a one-dimensional `ndarray` (or one of its subclasses, depending on the value of the `baseclass` attribute):
    
    >>> x.compressed()
    array([1, 4])
    
Note that the output of `compressed` is always 1D.
## Modifying the mask
### Masking an entry
The recommended way to mark one or several specific entries of a masked array as invalid is to assign the special value `masked` to them:
    
    >>> x = ma.array([1, 2, 3])
    >>> x[0] = ma.masked
    >>> x
    masked_array(data=[--, 2, 3],
                 mask=[ True, False, False],
           fill_value=999999)
    >>> y = ma.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    >>> y[(0, 1, 2), (1, 2, 0)] = ma.masked
    >>> y
    masked_array(
      data=[[1, --, 3],
            [4, 5, --],
            [--, 8, 9]],
      mask=[[False,  True, False],
            [False, False,  True],
            [ True, False, False]],
      fill_value=999999)
    >>> z = ma.array([1, 2, 3, 4])
    >>> z[:-2] = ma.masked
    >>> z
    masked_array(data=[--, --, 3, 4],
                 mask=[ True,  True, False, False],
           fill_value=999999)
    
A second possibility is to modify the `mask` directly, but this usage is discouraged.
Note
When creating a new masked array with a simple, non-structured datatype, the mask is initially set to the special value `nomask`, that corresponds roughly to the boolean `False`. Trying to set an element of `nomask` will fail with a `TypeError` exception, as a boolean does not support item assignment.
All the entries of an array can be masked at once by assigning `True` to the mask:
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
    >>> x.mask = True
    >>> x
    masked_array(data=[--, --, --],
                 mask=[ True,  True,  True],
           fill_value=999999,
                dtype=int64)
    
Finally, specific entries can be masked and/or unmasked by assigning to the mask a sequence of booleans:
    
    >>> x = ma.array([1, 2, 3])
    >>> x.mask = [0, 1, 0]
    >>> x
    masked_array(data=[1, --, 3],
                 mask=[False,  True, False],
           fill_value=999999)
    
### Unmasking an entry
To unmask one or several specific entries, we can just assign one or several new valid values to them:
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
    >>> x
    masked_array(data=[1, 2, --],
                 mask=[False, False,  True],
           fill_value=999999)
    >>> x[-1] = 5
    >>> x
    masked_array(data=[1, 2, 5],
                 mask=[False, False, False],
           fill_value=999999)
    
Note
Unmasking an entry by direct assignment will silently fail if the masked array has a hard mask, as shown by the `hardmask` attribute. This feature was introduced to prevent overwriting the mask. To force the unmasking of an entry where the array has a hard mask, the mask must first to be softened using the `soften_mask` method before the allocation. It can be re-hardened with `harden_mask` as follows:
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1, 2, 3], mask=[0, 0, 1], hard_mask=True)
    >>> x
    masked_array(data=[1, 2, --],
                   mask=[False, False,  True],
             fill_value=999999)
    >>> x[-1] = 5
    >>> x
    masked_array(data=[1, 2, --],
                   mask=[False, False,  True],
             fill_value=999999)
    >>> x.soften_mask()
    masked_array(data=[1, 2, --],
                   mask=[False, False,  True],
             fill_value=999999)
    >>> x[-1] = 5
    >>> x
    masked_array(data=[1, 2, 5],
                   mask=[False, False, False],
             fill_value=999999)
    >>> x.harden_mask()
    masked_array(data=[1, 2, 5],
                   mask=[False, False, False],
             fill_value=999999)
    
To unmask all masked entries of a masked array (provided the mask isn’t a hard mask), the simplest solution is to assign the constant `nomask` to the mask:
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
    >>> x
    masked_array(data=[1, 2, --],
                 mask=[False, False,  True],
           fill_value=999999)
    >>> x.mask = ma.nomask
    >>> x
    masked_array(data=[1, 2, 3],
                 mask=[False, False, False],
           fill_value=999999)
    
## Indexing and slicing
As a `MaskedArray` is a subclass of `numpy.ndarray`, it inherits its mechanisms for indexing and slicing.
When accessing a single entry of a masked array with no named fields, the output is either a scalar (if the corresponding entry of the mask is `False`) or the special value `masked` (if the corresponding entry of the mask is `True`):
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1, 2, 3], mask=[0, 0, 1])
    >>> x[0]
    1
    >>> x[-1]
    masked
    >>> x[-1] is ma.masked
    True
    
If the masked array has named fields, accessing a single entry returns a `numpy.void` object if none of the fields are masked, or a 0d masked array with the same dtype as the initial array if at least one of the fields is masked.
    
    >>> import numpy.ma as ma
    >>> y = ma.masked_array([(1,2), (3, 4)],
    ...                mask=[(0, 0), (0, 1)],
    ...               dtype=[('a', int), ('b', int)])
    >>> y[0]
    (1, 2)
    >>> y[-1]
    (3, --)
    
When accessing a slice, the output is a masked array whose `data` attribute is a view of the original data, and whose mask is either `nomask` (if there was no invalid entries in the original array) or a view of the corresponding slice of the original mask. The view is required to ensure propagation of any modification of the mask to the original.
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1, 2, 3, 4, 5], mask=[0, 1, 0, 0, 1])
    >>> mx = x[:3]
    >>> mx
    masked_array(data=[1, --, 3],
                 mask=[False,  True, False],
           fill_value=999999)
    >>> mx[1] = -1
    >>> mx
    masked_array(data=[1, -1, 3],
                 mask=[False, False, False],
           fill_value=999999)
    >>> x.mask
    array([False, False, False, False,  True])
    >>> x.data
    array([ 1, -1,  3,  4,  5])
    
Accessing a field of a masked array with structured datatype returns a `MaskedArray`.
## Operations on masked arrays
Arithmetic and comparison operations are supported by masked arrays. As much as possible, invalid entries of a masked array are not processed, meaning that the corresponding `data` entries should be the same before and after the operation.
Warning
We need to stress that this behavior may not be systematic, that masked data may be affected by the operation in some cases and therefore users should not rely on this data remaining unchanged.
The `numpy.ma` module comes with a specific implementation of most ufuncs. Unary and binary functions that have a validity domain (such as `log` or `divide`) return the `masked` constant whenever the input is masked or falls outside the validity domain:
    
    >>> import numpy.ma as ma
    >>> ma.log([-1, 0, 1, 2])
    masked_array(data=[--, --, 0.0, 0.6931471805599453],
                 mask=[ True,  True, False, False],
           fill_value=1e+20)
    
Masked arrays also support standard numpy ufuncs. The output is then a masked array. The result of a unary ufunc is masked wherever the input is masked. The result of a binary ufunc is masked wherever any of the input is masked. If the ufunc also returns the optional context output (a 3-element tuple containing the name of the ufunc, its arguments and its domain), the context is processed and entries of the output masked array are masked wherever the corresponding input fall outside the validity domain:
    
    >>> import numpy.ma as ma
    >>> x = ma.array([-1, 1, 0, 2, 3], mask=[0, 0, 0, 0, 1])
    >>> np.log(x)
    masked_array(data=[--, 0.0, --, 0.6931471805599453, --],
                 mask=[ True, False,  True, False,  True],
           fill_value=1e+20)
    
# Examples
## Data with a given value representing missing data
Let’s consider a list of elements, `x`, where values of -9999. represent missing data. We wish to compute the average value of the data and the vector of anomalies (deviations from the average):
    
    >>> import numpy.ma as ma
    >>> x = [0.,1.,-9999.,3.,4.]
    >>> mx = ma.masked_values (x, -9999.)
    >>> print(mx.mean())
    2.0
    >>> print(mx - mx.mean())
    [-2.0 -1.0 -- 1.0 2.0]
    >>> print(mx.anom())
    [-2.0 -1.0 -- 1.0 2.0]
    
## Filling in the missing data
Suppose now that we wish to print that same data, but with the missing values replaced by the average value.
    
    >>> import numpy.ma as ma
    >>> mx = ma.masked_values (x, -9999.)
    >>> print(mx.filled(mx.mean()))
    [0.  1.  2.  3.  4.]
    
## Numerical operations
Numerical operations can be easily performed without worrying about missing values, dividing by zero, square roots of negative numbers, etc.:
    
    >>> import numpy.ma as ma
    >>> x = ma.array([1., -1., 3., 4., 5., 6.], mask=[0,0,0,0,1,0])
    >>> y = ma.array([1., 2., 0., 4., 5., 6.], mask=[0,0,0,0,0,1])
    >>> print(ma.sqrt(x/y))
    [1.0 -- -- 1.0 -- --]
    
Four values of the output are invalid: the first one comes from taking the square root of a negative number, the second from the division by zero, and the last two where the inputs were masked.
## Ignoring extreme values
Let’s consider an array `d` of floats between 0 and 1. We wish to compute the average of the values of `d` while ignoring any data outside the range `[0.2, 0.9]`:
    
    >>> import numpy as np
    >>> import numpy.ma as ma
    >>> d = np.linspace(0, 1, 20)
    >>> print(d.mean() - ma.masked_outside(d, 0.2, 0.9).mean())
    -0.05263157894736836
    
# Masked arrays
Masked arrays are arrays that may have missing or invalid entries. The `numpy.ma` module provides a nearly work-alike replacement for numpy that supports data arrays with masks.
  * The `numpy.ma` module
    * Rationale
    * What is a masked array?
    * The `numpy.ma` module
  * Using numpy.ma
    * Constructing masked arrays
    * Accessing the data
    * Accessing the mask
    * Accessing only the valid entries
    * Modifying the mask
    * Indexing and slicing
    * Operations on masked arrays
  * Examples
    * Data with a given value representing missing data
    * Filling in the missing data
    * Numerical operations
    * Ignoring extreme values
  * Constants of the `numpy.ma` module
    * `masked`
    * `nomask`
    * `masked_print_option`
  * The `MaskedArray` class
    * `MaskedArray`
    * Attributes and properties of masked arrays
  * `MaskedArray` methods
    * Conversion
    * Shape manipulation
    * Item selection and manipulation
    * Pickling and copy
    * Calculations
    * Arithmetic and comparison operations
    * Representation
    * Special methods
    * Specific methods
  * Masked array operations
    * Constants
    * Creation
    * Inspecting the array
    * Manipulating a MaskedArray
    * Operations on masks
    * Conversion operations
    * Masked arrays arithmetic


# NumPy’s module structure
NumPy has a large number of submodules. Most regular usage of NumPy requires only the main namespace and a smaller set of submodules. The rest either either special-purpose or niche namespaces.
## Main namespaces
Regular/recommended user-facing namespaces for general use:
  * numpy
  * numpy.exceptions
  * numpy.fft
  * numpy.linalg
  * numpy.polynomial
  * numpy.random
  * numpy.strings
  * numpy.testing
  * numpy.typing


## Special-purpose namespaces
  * numpy.ctypeslib \- interacting with NumPy objects with `ctypes`
  * numpy.dtypes \- dtype classes (typically not used directly by end users)
  * numpy.emath \- mathematical functions with automatic domain
  * numpy.lib \- utilities & functionality which do not fit the main namespace
  * numpy.rec \- record arrays (largely superseded by dataframe libraries)
  * numpy.version \- small module with more detailed version info


## Legacy namespaces
Prefer not to use these namespaces for new code. There are better alternatives and/or this code is deprecated or isn’t reliable.
  * numpy.char \- legacy string functionality, only for fixed-width strings
  * numpy.distutils (deprecated) - build system support
  * numpy.f2py \- Fortran binding generation (usually used from the command line only)
  * numpy.ma \- masked arrays (not very reliable, needs an overhaul)
  * numpy.matlib (pending deprecation) - functions supporting `matrix` instances


# numpy.random.BitGenerator.cffi
attribute
random.BitGenerator.cffi
    
CFFI interface
Returns:
    
interfacenamedtuple
    
Named tuple containing CFFI wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.BitGenerator
classnumpy.random.BitGenerator(seed=None)
    
Base Class for generic BitGenerators, which provide a stream of random bits based on different algorithms. Must be overridden.
Parameters:
    
seed{None, int, array_like[ints], SeedSequence}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then it will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance. All integer values must be non-negative.
See also
`SeedSequence`
Attributes:
    
lockthreading.Lock
    
Lock instance that is shared so that the same BitGenerator can be used in multiple Generators without corrupting the state. Code that generates values from a bit generator should hold the bit generator’s lock.
#### Methods
`random_raw`(self[, size])
Return randoms as generated by the underlying BitGenerator  
`spawn`(n_children)
Create new independent child bit generators.  
# numpy.random.BitGenerator.random_raw
method
random.BitGenerator.random_raw(self, size=None)
    
Return randoms as generated by the underlying BitGenerator
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
outputbool, optional
    
Output values. Used for performance testing since the generated values are not returned.
Returns:
    
outuint or ndarray
    
Drawn samples.
#### Notes
This method directly exposes the raw underlying pseudo-random number generator. All values are returned as unsigned 64-bit values irrespective of the number of bits produced by the PRNG.
See the class docstring for the number of bits returned.
# numpy.random.BitGenerator.spawn
method
random.BitGenerator.spawn(n_children)
    
Create new independent child bit generators.
See SeedSequence spawning for additional notes on spawning children. Some bit generators also implement `jumped` as a different approach for creating independent streams.
New in version 1.25.0.
Parameters:
    
n_childrenint
Returns:
    
child_bit_generatorslist of BitGenerators
Raises:
    
TypeError
    
When the underlying SeedSequence does not implement spawning.
See also
`random.Generator.spawn`, `random.SeedSequence.spawn`
    
Equivalent method on the generator and seed sequence.
# numpy.random.MT19937.cffi
attribute
random.MT19937.cffi
    
CFFI interface
Returns:
    
interfacenamedtuple
    
Named tuple containing CFFI wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.MT19937.ctypes
attribute
random.MT19937.ctypes
    
ctypes interface
Returns:
    
interfacenamedtuple
    
Named tuple containing ctypes wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.MT19937.jumped
method
random.MT19937.jumped(jumps=1)
    
Returns a new bit generator with the state jumped
The state of the returned bit generator is jumped as-if 2**(128 * jumps) random numbers have been generated.
Parameters:
    
jumpsinteger, positive
    
Number of times to jump the state of the bit generator returned
Returns:
    
bit_generatorMT19937
    
New instance of generator jumped iter times
#### Notes
The jump step is computed using a modified version of Matsumoto’s implementation of Horner’s method. The step polynomial is precomputed to perform 2**128 steps. The jumped state has been verified to match the state produced using Matsumoto’s original code.
#### References
[1]
Matsumoto, M, Generating multiple disjoint streams of pseudorandom number sequences. Accessed on: May 6, 2020. http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/JUMP/
[2]
Hiroshi Haramoto, Makoto Matsumoto, Takuji Nishimura, François Panneton, Pierre L’Ecuyer, “Efficient Jump Ahead for F2-Linear Random Number Generators”, INFORMS JOURNAL ON COMPUTING, Vol. 20, No. 3, Summer 2008, pp. 385-390.
# numpy.random.MT19937.state
attribute
random.MT19937.state
    
Get or set the PRNG state
Returns:
    
statedict
    
Dictionary containing the information required to describe the state of the PRNG
# numpy.random.PCG64.advance
method
random.PCG64.advance(delta)
    
Advance the underlying RNG as-if delta draws have occurred.
Parameters:
    
deltainteger, positive
    
Number of draws to advance the RNG. Must be less than the size state variable in the underlying RNG.
Returns:
    
selfPCG64
    
RNG advanced delta steps
#### Notes
Advancing a RNG updates the underlying RNG state as-if a given number of calls to the underlying RNG have been made. In general there is not a one-to-one relationship between the number output random values from a particular distribution and the number of draws from the core RNG. This occurs for two reasons:
  * The random values are simulated using a rejection-based method and so, on average, more than one value from the underlying RNG is required to generate an single draw.
  * The number of bits required to generate a simulated value differs from the number of bits generated by the underlying RNG. For example, two 16-bit integer values can be simulated from a single draw of a 32-bit RNG.


Advancing the RNG state resets any pre-computed random numbers. This is required to ensure exact reproducibility.
# numpy.random.PCG64.cffi
attribute
random.PCG64.cffi
    
CFFI interface
Returns:
    
interfacenamedtuple
    
Named tuple containing CFFI wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.PCG64.ctypes
attribute
random.PCG64.ctypes
    
ctypes interface
Returns:
    
interfacenamedtuple
    
Named tuple containing ctypes wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.PCG64.jumped
method
random.PCG64.jumped(jumps=1)
    
Returns a new bit generator with the state jumped.
Jumps the state as-if jumps * 210306068529402873165736369884012333109 random numbers have been generated.
Parameters:
    
jumpsinteger, positive
    
Number of times to jump the state of the bit generator returned
Returns:
    
bit_generatorPCG64
    
New instance of generator jumped iter times
#### Notes
The step size is phi-1 when multiplied by 2**128 where phi is the golden ratio.
# numpy.random.PCG64.state
attribute
random.PCG64.state
    
Get or set the PRNG state
Returns:
    
statedict
    
Dictionary containing the information required to describe the state of the PRNG
# numpy.random.PCG64DXSM.advance
method
random.PCG64DXSM.advance(delta)
    
Advance the underlying RNG as-if delta draws have occurred.
Parameters:
    
deltainteger, positive
    
Number of draws to advance the RNG. Must be less than the size state variable in the underlying RNG.
Returns:
    
selfPCG64
    
RNG advanced delta steps
#### Notes
Advancing a RNG updates the underlying RNG state as-if a given number of calls to the underlying RNG have been made. In general there is not a one-to-one relationship between the number output random values from a particular distribution and the number of draws from the core RNG. This occurs for two reasons:
  * The random values are simulated using a rejection-based method and so, on average, more than one value from the underlying RNG is required to generate an single draw.
  * The number of bits required to generate a simulated value differs from the number of bits generated by the underlying RNG. For example, two 16-bit integer values can be simulated from a single draw of a 32-bit RNG.


Advancing the RNG state resets any pre-computed random numbers. This is required to ensure exact reproducibility.
# numpy.random.PCG64DXSM.cffi
attribute
random.PCG64DXSM.cffi
    
CFFI interface
Returns:
    
interfacenamedtuple
    
Named tuple containing CFFI wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.PCG64DXSM.ctypes
attribute
random.PCG64DXSM.ctypes
    
ctypes interface
Returns:
    
interfacenamedtuple
    
Named tuple containing ctypes wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.PCG64DXSM.jumped
method
random.PCG64DXSM.jumped(jumps=1)
    
Returns a new bit generator with the state jumped.
Jumps the state as-if jumps * 210306068529402873165736369884012333109 random numbers have been generated.
Parameters:
    
jumpsinteger, positive
    
Number of times to jump the state of the bit generator returned
Returns:
    
bit_generatorPCG64DXSM
    
New instance of generator jumped iter times
#### Notes
The step size is phi-1 when multiplied by 2**128 where phi is the golden ratio.
# numpy.random.PCG64DXSM.state
attribute
random.PCG64DXSM.state
    
Get or set the PRNG state
Returns:
    
statedict
    
Dictionary containing the information required to describe the state of the PRNG
# numpy.random.Philox.advance
method
random.Philox.advance(delta)
    
Advance the underlying RNG as-if delta draws have occurred.
Parameters:
    
deltainteger, positive
    
Number of draws to advance the RNG. Must be less than the size state variable in the underlying RNG.
Returns:
    
selfPhilox
    
RNG advanced delta steps
#### Notes
Advancing a RNG updates the underlying RNG state as-if a given number of calls to the underlying RNG have been made. In general there is not a one-to-one relationship between the number output random values from a particular distribution and the number of draws from the core RNG. This occurs for two reasons:
  * The random values are simulated using a rejection-based method and so, on average, more than one value from the underlying RNG is required to generate an single draw.
  * The number of bits required to generate a simulated value differs from the number of bits generated by the underlying RNG. For example, two 16-bit integer values can be simulated from a single draw of a 32-bit RNG.


Advancing the RNG state resets any pre-computed random numbers. This is required to ensure exact reproducibility.
# numpy.random.Philox.cffi
attribute
random.Philox.cffi
    
CFFI interface
Returns:
    
interfacenamedtuple
    
Named tuple containing CFFI wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.Philox.ctypes
attribute
random.Philox.ctypes
    
ctypes interface
Returns:
    
interfacenamedtuple
    
Named tuple containing ctypes wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.Philox.jumped
method
random.Philox.jumped(jumps=1)
    
Returns a new bit generator with the state jumped
The state of the returned bit generator is jumped as-if (2**128) * jumps random numbers have been generated.
Parameters:
    
jumpsinteger, positive
    
Number of times to jump the state of the bit generator returned
Returns:
    
bit_generatorPhilox
    
New instance of generator jumped iter times
# numpy.random.Philox.state
attribute
random.Philox.state
    
Get or set the PRNG state
Returns:
    
statedict
    
Dictionary containing the information required to describe the state of the PRNG
# numpy.random.SeedSequence.entropy
attribute
random.SeedSequence.entropy
# numpy.random.SeedSequence.generate_state
method
random.SeedSequence.generate_state(n_words, dtype=np.uint32)
    
Return the requested number of words for PRNG seeding.
A BitGenerator should call this method in its constructor with an appropriate `n_words` parameter to properly seed itself.
Parameters:
    
n_wordsint
dtypenp.uint32 or np.uint64, optional
    
The size of each word. This should only be either `uint32` or `uint64`. Strings (`‘uint32’`, `‘uint64’`) are fine. Note that requesting `uint64` will draw twice as many bits as `uint32` for the same `n_words`. This is a convenience for `BitGenerator`s that express their states as `uint64` arrays.
Returns:
    
stateuint32 or uint64 array, shape=(n_words,)
# numpy.random.SeedSequence
classnumpy.random.SeedSequence(entropy=None, *, spawn_key=(), pool_size=4)
    
SeedSequence mixes sources of entropy in a reproducible way to set the initial state for independent and very probably non-overlapping BitGenerators.
Once the SeedSequence is instantiated, you can call the `generate_state` method to get an appropriately sized seed. Calling `spawn(n)` will create `n` SeedSequences that can be used to seed independent BitGenerators, i.e. for different threads.
Parameters:
    
entropy{None, int, sequence[int]}, optional
    
The entropy for creating a `SeedSequence`. All integer values must be non-negative.
spawn_key{(), sequence[int]}, optional
    
An additional source of entropy based on the position of this `SeedSequence` in the tree of such objects created with the `SeedSequence.spawn` method. Typically, only `SeedSequence.spawn` will set this, and users will not.
pool_size{int}, optional
    
Size of the pooled entropy to store. Default is 4 to give a 128-bit entropy pool. 8 (for 256 bits) is another reasonable choice if working with larger PRNGs, but there is very little to be gained by selecting another value.
n_children_spawned{int}, optional
    
The number of children already spawned. Only pass this if reconstructing a `SeedSequence` from a serialized form.
#### Notes
Best practice for achieving reproducible bit streams is to use the default `None` for the initial entropy, and then use `SeedSequence.entropy` to log/pickle the `entropy` for reproducibility:
    
    >>> sq1 = np.random.SeedSequence()
    >>> sq1.entropy
    243799254704924441050048792905230269161  # random
    >>> sq2 = np.random.SeedSequence(sq1.entropy)
    >>> np.all(sq1.generate_state(10) == sq2.generate_state(10))
    True
    
Attributes:
    
entropy
n_children_spawned
pool
pool_size
spawn_key
state
#### Methods
`generate_state`(n_words[, dtype])
Return the requested number of words for PRNG seeding.  
`spawn`(n_children)
Spawn a number of child `SeedSequence` s by extending the `spawn_key`.  
# numpy.random.SeedSequence.spawn
method
random.SeedSequence.spawn(n_children)
    
Spawn a number of child `SeedSequence` s by extending the `spawn_key`.
See SeedSequence spawning for additional notes on spawning children.
Parameters:
    
n_childrenint
Returns:
    
seqslist of `SeedSequence` s
See also
`random.Generator.spawn`, `random.BitGenerator.spawn`
    
Equivalent method on the generator and bit generator.
# numpy.random.SeedSequence.spawn_key
attribute
random.SeedSequence.spawn_key
# numpy.random.SFC64.cffi
attribute
random.SFC64.cffi
    
CFFI interface
Returns:
    
interfacenamedtuple
    
Named tuple containing CFFI wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.SFC64.ctypes
attribute
random.SFC64.ctypes
    
ctypes interface
Returns:
    
interfacenamedtuple
    
Named tuple containing ctypes wrapper
  * state_address - Memory address of the state struct
  * state - pointer to the state struct
  * next_uint64 - function pointer to produce 64 bit integers
  * next_uint32 - function pointer to produce 32 bit integers
  * next_double - function pointer to produce doubles
  * bitgen - pointer to the bit generator struct


# numpy.random.SFC64.state
attribute
random.SFC64.state
    
Get or set the PRNG state
Returns:
    
statedict
    
Dictionary containing the information required to describe the state of the PRNG
# Bit generators
The random values produced by `Generator` originate in a BitGenerator. The BitGenerators do not directly provide random numbers and only contains methods used for seeding, getting or setting the state, jumping or advancing the state, and for accessing low-level wrappers for consumption by code that can efficiently access the functions provided, e.g., numba.
## Supported BitGenerators
The included BitGenerators are:
  * PCG-64 - The default. A fast generator that can be advanced by an arbitrary amount. See the documentation for `advance`. PCG-64 has a period of \\(2^{128}\\). See the PCG author’s page for more details about this class of PRNG.
  * PCG-64 DXSM - An upgraded version of PCG-64 with better statistical properties in parallel contexts. See Upgrading PCG64 with PCG64DXSM for more information on these improvements.
  * MT19937 - The standard Python BitGenerator. Adds a `MT19937.jumped` function that returns a new generator with state as-if \\(2^{128}\\) draws have been made.
  * Philox - A counter-based generator capable of being advanced an arbitrary number of steps or generating independent streams. See the Random123 page for more details about this class of bit generators.
  * SFC64 - A fast generator based on random invertible mappings. Usually the fastest generator of the four. See the SFC author’s page for (a little) more detail.


`BitGenerator`([seed])
Base Class for generic BitGenerators, which provide a stream of random bits based on different algorithms.  
  * MT19937
  * PCG64
  * PCG64DXSM
  * Philox
  * SFC64


# Seeding and entropy
A BitGenerator provides a stream of random values. In order to generate reproducible streams, BitGenerators support setting their initial state via a seed. All of the provided BitGenerators will take an arbitrary-sized non-negative integer, or a list of such integers, as a seed. BitGenerators need to take those inputs and process them into a high-quality internal state for the BitGenerator. All of the BitGenerators in numpy delegate that task to `SeedSequence`, which uses hashing techniques to ensure that even low-quality seeds generate high-quality initial states.
    
    from numpy.random import PCG64
    
    bg = PCG64(12345678903141592653589793)
    
`SeedSequence` is designed to be convenient for implementing best practices. We recommend that a stochastic program defaults to using entropy from the OS so that each run is different. The program should print out or log that entropy. In order to reproduce a past value, the program should allow the user to provide that value through some mechanism, a command-line argument is common, so that the user can then re-enter that entropy to reproduce the result. `SeedSequence` can take care of everything except for communicating with the user, which is up to you.
    
    from numpy.random import PCG64, SeedSequence
    
    # Get the user's seed somehow, maybe through `argparse`.
    # If the user did not provide a seed, it should return `None`.
    seed = get_user_seed()
    ss = SeedSequence(seed)
    print('seed = {}'.format(ss.entropy))
    bg = PCG64(ss)
    
We default to using a 128-bit integer using entropy gathered from the OS. This is a good amount of entropy to initialize all of the generators that we have in numpy. We do not recommend using small seeds below 32 bits for general use. Using just a small set of seeds to instantiate larger state spaces means that there are some initial states that are impossible to reach. This creates some biases if everyone uses such values.
There will not be anything wrong with the results, per se; even a seed of 0 is perfectly fine thanks to the processing that `SeedSequence` does. If you just need some fixed value for unit tests or debugging, feel free to use whatever seed you like. But if you want to make inferences from the results or publish them, drawing from a larger set of seeds is good practice.
If you need to generate a good seed “offline”, then `SeedSequence().entropy` or using `secrets.randbits(128)` from the standard library are both convenient ways.
If you need to run several stochastic simulations in parallel, best practice is to construct a random generator instance for each simulation. To make sure that the random streams have distinct initial states, you can use the `spawn` method of `SeedSequence`. For instance, here we construct a list of 12 instances:
    
    from numpy.random import PCG64, SeedSequence
    
    # High quality initial entropy
    entropy = 0x87351080e25cb0fad77a44a3be03b491
    base_seq = SeedSequence(entropy)
    child_seqs = base_seq.spawn(12)    # a list of 12 SeedSequences
    generators = [PCG64(seq) for seq in child_seqs]
    
If you already have an initial random generator instance, you can shorten the above by using the `spawn` method:
    
    from numpy.random import PCG64, SeedSequence
    # High quality initial entropy
    entropy = 0x87351080e25cb0fad77a44a3be03b491
    base_bitgen = PCG64(entropy)
    generators = base_bitgen.spawn(12)
    
An alternative way is to use the fact that a `SeedSequence` can be initialized by a tuple of elements. Here we use a base entropy value and an integer `worker_id`
    
    from numpy.random import PCG64, SeedSequence
    
    # High quality initial entropy
    entropy = 0x87351080e25cb0fad77a44a3be03b491
    sequences = [SeedSequence((entropy, worker_id)) for worker_id in range(12)]
    generators = [PCG64(seq) for seq in sequences]
    
Note that the sequences produced by the latter method will be distinct from those constructed via `spawn`.
`SeedSequence`([entropy, spawn_key, pool_size])
SeedSequence mixes sources of entropy in a reproducible way to set the initial state for independent and very probably non-overlapping BitGenerators.  
# Mersenne Twister (MT19937)
classnumpy.random.MT19937(seed=None)
    
Container for the Mersenne Twister pseudo-random number generator.
Parameters:
    
seed{None, int, array_like[ints], SeedSequence}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then it will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance.
#### Notes
`MT19937` provides a capsule containing function pointers that produce doubles, and unsigned 32 and 64- bit integers [1]. These are not directly consumable in Python and must be consumed by a `Generator` or similar object that supports low-level access.
The Python stdlib module “random” also contains a Mersenne Twister pseudo-random number generator.
State and Seeding
The `MT19937` state vector consists of a 624-element array of 32-bit unsigned integers plus a single integer value between 0 and 624 that indexes the current position within the main array.
The input seed is processed by `SeedSequence` to fill the whole state. The first element is reset such that only its most significant bit is set.
Parallel Features
The preferred way to use a BitGenerator in parallel applications is to use the `SeedSequence.spawn` method to obtain entropy values, and to use these to generate new BitGenerators:
    
    >>> from numpy.random import Generator, MT19937, SeedSequence
    >>> sg = SeedSequence(1234)
    >>> rg = [Generator(MT19937(s)) for s in sg.spawn(10)]
    
Another method is to use `MT19937.jumped` which advances the state as-if \\(2^{128}\\) random numbers have been generated ([1], [2]). This allows the original sequence to be split so that distinct segments can be used in each worker process. All generators should be chained to ensure that the segments come from the same sequence.
    
    >>> from numpy.random import Generator, MT19937, SeedSequence
    >>> sg = SeedSequence(1234)
    >>> bit_generator = MT19937(sg)
    >>> rg = []
    >>> for _ in range(10):
    ...    rg.append(Generator(bit_generator))
    ...    # Chain the BitGenerators
    ...    bit_generator = bit_generator.jumped()
    
Compatibility Guarantee
`MT19937` makes a guarantee that a fixed seed will always produce the same random integer stream.
#### References
[1] (1,2)
Hiroshi Haramoto, Makoto Matsumoto, and Pierre L’Ecuyer, “A Fast Jump Ahead Algorithm for Linear Recurrences in a Polynomial Space”, Sequences and Their Applications - SETA, 290–298, 2008.
[2]
Hiroshi Haramoto, Makoto Matsumoto, Takuji Nishimura, François Panneton, Pierre L’Ecuyer, “Efficient Jump Ahead for F2-Linear Random Number Generators”, INFORMS JOURNAL ON COMPUTING, Vol. 20, No. 3, Summer 2008, pp. 385-390.
Attributes:
    
lock: threading.Lock
    
Lock instance that is shared so that the same bit git generator can be used in multiple Generators without corrupting the state. Code that generates values from a bit generator should hold the bit generator’s lock.
## State
`state`
Get or set the PRNG state  
## Parallel generation
`jumped`([jumps])
Returns a new bit generator with the state jumped  
## Extending
`cffi`
CFFI interface  
`ctypes`
ctypes interface  
# Permuted congruential generator (64-bit, PCG64)
classnumpy.random.PCG64(seed=None)
    
BitGenerator for the PCG-64 pseudo-random number generator.
Parameters:
    
seed{None, int, array_like[ints], SeedSequence}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then it will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance.
#### Notes
PCG-64 is a 128-bit implementation of O’Neill’s permutation congruential generator ([1], [2]). PCG-64 has a period of \\(2^{128}\\) and supports advancing an arbitrary number of steps as well as \\(2^{127}\\) streams. The specific member of the PCG family that we use is PCG XSL RR 128/64 as described in the paper ([2]).
`PCG64` provides a capsule containing function pointers that produce doubles, and unsigned 32 and 64- bit integers. These are not directly consumable in Python and must be consumed by a `Generator` or similar object that supports low-level access.
Supports the method `advance` to advance the RNG an arbitrary number of steps. The state of the PCG-64 RNG is represented by 2 128-bit unsigned integers.
State and Seeding
The `PCG64` state vector consists of 2 unsigned 128-bit values, which are represented externally as Python ints. One is the state of the PRNG, which is advanced by a linear congruential generator (LCG). The second is a fixed odd increment used in the LCG.
The input seed is processed by `SeedSequence` to generate both values. The increment is not independently settable.
Parallel Features
The preferred way to use a BitGenerator in parallel applications is to use the `SeedSequence.spawn` method to obtain entropy values, and to use these to generate new BitGenerators:
    
    >>> from numpy.random import Generator, PCG64, SeedSequence
    >>> sg = SeedSequence(1234)
    >>> rg = [Generator(PCG64(s)) for s in sg.spawn(10)]
    
Compatibility Guarantee
`PCG64` makes a guarantee that a fixed seed will always produce the same random integer stream.
#### References
[1]
“PCG, A Family of Better Random Number Generators”
[2] (1,2)
O’Neill, Melissa E. “PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation”
## State
`state`
Get or set the PRNG state  
## Parallel generation
`advance`(delta)
Advance the underlying RNG as-if delta draws have occurred.  
`jumped`([jumps])
Returns a new bit generator with the state jumped.  
## Extending
`cffi`
CFFI interface  
`ctypes`
ctypes interface  
# Permuted congruential generator (64-bit, PCG64 DXSM)
classnumpy.random.PCG64DXSM(seed=None)
    
BitGenerator for the PCG-64 DXSM pseudo-random number generator.
Parameters:
    
seed{None, int, array_like[ints], SeedSequence}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then it will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance.
#### Notes
PCG-64 DXSM is a 128-bit implementation of O’Neill’s permutation congruential generator ([1], [2]). PCG-64 DXSM has a period of \\(2^{128}\\) and supports advancing an arbitrary number of steps as well as \\(2^{127}\\) streams. The specific member of the PCG family that we use is PCG CM DXSM 128/64. It differs from `PCG64` in that it uses the stronger DXSM output function, a 64-bit “cheap multiplier” in the LCG, and outputs from the state before advancing it rather than advance-then-output.
`PCG64DXSM` provides a capsule containing function pointers that produce doubles, and unsigned 32 and 64- bit integers. These are not directly consumable in Python and must be consumed by a `Generator` or similar object that supports low-level access.
Supports the method `advance` to advance the RNG an arbitrary number of steps. The state of the PCG-64 DXSM RNG is represented by 2 128-bit unsigned integers.
State and Seeding
The `PCG64DXSM` state vector consists of 2 unsigned 128-bit values, which are represented externally as Python ints. One is the state of the PRNG, which is advanced by a linear congruential generator (LCG). The second is a fixed odd increment used in the LCG.
The input seed is processed by `SeedSequence` to generate both values. The increment is not independently settable.
Parallel Features
The preferred way to use a BitGenerator in parallel applications is to use the `SeedSequence.spawn` method to obtain entropy values, and to use these to generate new BitGenerators:
    
    >>> from numpy.random import Generator, PCG64DXSM, SeedSequence
    >>> sg = SeedSequence(1234)
    >>> rg = [Generator(PCG64DXSM(s)) for s in sg.spawn(10)]
    
Compatibility Guarantee
`PCG64DXSM` makes a guarantee that a fixed seed will always produce the same random integer stream.
#### References
[1]
“PCG, A Family of Better Random Number Generators”
[2]
O’Neill, Melissa E. “PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation”
## State
`state`
Get or set the PRNG state  
## Parallel generation
`advance`(delta)
Advance the underlying RNG as-if delta draws have occurred.  
`jumped`([jumps])
Returns a new bit generator with the state jumped.  
## Extending
`cffi`
CFFI interface  
`ctypes`
ctypes interface  
# Philox counter-based RNG
classnumpy.random.Philox(seed=None, counter=None, key=None)
    
Container for the Philox (4x64) pseudo-random number generator.
Parameters:
    
seed{None, int, array_like[ints], SeedSequence}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then it will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance.
counter{None, int, array_like}, optional
    
Counter to use in the Philox state. Can be either a Python int (long in 2.x) in [0, 2**256) or a 4-element uint64 array. If not provided, the RNG is initialized at 0.
key{None, int, array_like}, optional
    
Key to use in the Philox state. Unlike `seed`, the value in key is directly set. Can be either a Python int in [0, 2**128) or a 2-element uint64 array. `key` and `seed` cannot both be used.
#### Notes
Philox is a 64-bit PRNG that uses a counter-based design based on weaker (and faster) versions of cryptographic functions [1]. Instances using different values of the key produce independent sequences. Philox has a period of \\(2^{256} - 1\\) and supports arbitrary advancing and jumping the sequence in increments of \\(2^{128}\\). These features allow multiple non-overlapping sequences to be generated.
`Philox` provides a capsule containing function pointers that produce doubles, and unsigned 32 and 64- bit integers. These are not directly consumable in Python and must be consumed by a `Generator` or similar object that supports low-level access.
State and Seeding
The `Philox` state vector consists of a 256-bit value encoded as a 4-element uint64 array and a 128-bit value encoded as a 2-element uint64 array. The former is a counter which is incremented by 1 for every 4 64-bit randoms produced. The second is a key which determined the sequence produced. Using different keys produces independent sequences.
The input `seed` is processed by `SeedSequence` to generate the key. The counter is set to 0.
Alternately, one can omit the `seed` parameter and set the `key` and `counter` directly.
Parallel Features
The preferred way to use a BitGenerator in parallel applications is to use the `SeedSequence.spawn` method to obtain entropy values, and to use these to generate new BitGenerators:
    
    >>> from numpy.random import Generator, Philox, SeedSequence
    >>> sg = SeedSequence(1234)
    >>> rg = [Generator(Philox(s)) for s in sg.spawn(10)]
    
`Philox` can be used in parallel applications by calling the `jumped` method to advance the state as-if \\(2^{128}\\) random numbers have been generated. Alternatively, `advance` can be used to advance the counter for any positive step in [0, 2**256). When using `jumped`, all generators should be chained to ensure that the segments come from the same sequence.
    
    >>> from numpy.random import Generator, Philox
    >>> bit_generator = Philox(1234)
    >>> rg = []
    >>> for _ in range(10):
    ...    rg.append(Generator(bit_generator))
    ...    bit_generator = bit_generator.jumped()
    
Alternatively, `Philox` can be used in parallel applications by using a sequence of distinct keys where each instance uses different key.
    
    >>> key = 2**96 + 2**33 + 2**17 + 2**9
    >>> rg = [Generator(Philox(key=key+i)) for i in range(10)]
    
Compatibility Guarantee
`Philox` makes a guarantee that a fixed `seed` will always produce the same random integer stream.
#### References
[1]
John K. Salmon, Mark A. Moraes, Ron O. Dror, and David E. Shaw, “Parallel Random Numbers: As Easy as 1, 2, 3,” Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC11), New York, NY: ACM, 2011.
#### Examples
    
    >>> from numpy.random import Generator, Philox
    >>> rg = Generator(Philox(1234))
    >>> rg.standard_normal()
    0.123  # random
    
Attributes:
    
lock: threading.Lock
    
Lock instance that is shared so that the same bit git generator can be used in multiple Generators without corrupting the state. Code that generates values from a bit generator should hold the bit generator’s lock.
## State
`state`
Get or set the PRNG state  
## Parallel generation
`advance`(delta)
Advance the underlying RNG as-if delta draws have occurred.  
`jumped`([jumps])
Returns a new bit generator with the state jumped  
## Extending
`cffi`
CFFI interface  
`ctypes`
ctypes interface  
# SFC64 Small Fast Chaotic PRNG
classnumpy.random.SFC64(seed=None)
    
BitGenerator for Chris Doty-Humphrey’s Small Fast Chaotic PRNG.
Parameters:
    
seed{None, int, array_like[ints], SeedSequence}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then it will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance.
#### Notes
`SFC64` is a 256-bit implementation of Chris Doty-Humphrey’s Small Fast Chaotic PRNG ([1]). `SFC64` has a few different cycles that one might be on, depending on the seed; the expected period will be about \\(2^{255}\\) ([2]). `SFC64` incorporates a 64-bit counter which means that the absolute minimum cycle length is \\(2^{64}\\) and that distinct seeds will not run into each other for at least \\(2^{64}\\) iterations.
`SFC64` provides a capsule containing function pointers that produce doubles, and unsigned 32 and 64- bit integers. These are not directly consumable in Python and must be consumed by a `Generator` or similar object that supports low-level access.
State and Seeding
The `SFC64` state vector consists of 4 unsigned 64-bit values. The last is a 64-bit counter that increments by 1 each iteration.
The input seed is processed by `SeedSequence` to generate the first 3 values, then the `SFC64` algorithm is iterated a small number of times to mix.
Compatibility Guarantee
`SFC64` makes a guarantee that a fixed seed will always produce the same random integer stream.
#### References
[1]
“PractRand”
[2]
“Random Invertible Mapping Statistics”
## State
`state`
Get or set the PRNG state  
## Extending
`cffi`
CFFI interface  
`ctypes`
ctypes interface  
# C API for random
Access to various distributions below is available via Cython or C-wrapper libraries like CFFI. All the functions accept a `bitgen_t` as their first argument. To access these from Cython or C, you must link with the `npyrandom` static library which is part of the NumPy distribution, located in `numpy/random/lib`. Note that you must also link with `npymath`, see Linking against the core math library in an extension.
typebitgen_t  

    
The `bitgen_t` holds the current state of the BitGenerator and pointers to functions that return standard C types while advancing the state.
    
    struct bitgen:
        void *state
        npy_uint64 (*next_uint64)(void *st) nogil
        uint32_t (*next_uint32)(void *st) nogil
        double (*next_double)(void *st) nogil
        npy_uint64 (*next_raw)(void *st) nogil
    
    ctypedef bitgen bitgen_t
    
See Extending for examples of using these functions.
The functions are named with the following conventions:
  * “standard” refers to the reference values for any parameters. For instance “standard_uniform” means a uniform distribution on the interval `0.0` to `1.0`
  * “fill” functions will fill the provided `out` with `cnt` values.
  * The functions without “standard” in their name require additional parameters to describe the distributions.
  * Functions with `inv` in their name are based on the slower inverse method instead of a ziggurat lookup algorithm, which is significantly faster. The non-ziggurat variants are used in corner cases and for legacy compatibility.


doublerandom_standard_uniform(bitgen_t*bitgen_state)  

voidrandom_standard_uniform_fill(bitgen_t*bitgen_state, npy_intpcnt, double*out)  

doublerandom_standard_exponential(bitgen_t*bitgen_state)  

voidrandom_standard_exponential_fill(bitgen_t*bitgen_state, npy_intpcnt, double*out)  

voidrandom_standard_exponential_inv_fill(bitgen_t*bitgen_state, npy_intpcnt, double*out)  

doublerandom_standard_normal(bitgen_t*bitgen_state)  

voidrandom_standard_normal_fill(bitgen_t*bitgen_state, npy_intpcount, double*out)  

voidrandom_standard_normal_fill_f(bitgen_t*bitgen_state, npy_intpcount, float*out)  

doublerandom_standard_gamma(bitgen_t*bitgen_state, doubleshape)  

floatrandom_standard_uniform_f(bitgen_t*bitgen_state)  

voidrandom_standard_uniform_fill_f(bitgen_t*bitgen_state, npy_intpcnt, float*out)  

floatrandom_standard_exponential_f(bitgen_t*bitgen_state)  

voidrandom_standard_exponential_fill_f(bitgen_t*bitgen_state, npy_intpcnt, float*out)  

voidrandom_standard_exponential_inv_fill_f(bitgen_t*bitgen_state, npy_intpcnt, float*out)  

floatrandom_standard_normal_f(bitgen_t*bitgen_state)  

floatrandom_standard_gamma_f(bitgen_t*bitgen_state, floatshape)  

doublerandom_normal(bitgen_t*bitgen_state, doubleloc, doublescale)  

doublerandom_gamma(bitgen_t*bitgen_state, doubleshape, doublescale)  

floatrandom_gamma_f(bitgen_t*bitgen_state, floatshape, floatscale)  

doublerandom_exponential(bitgen_t*bitgen_state, doublescale)  

doublerandom_uniform(bitgen_t*bitgen_state, doublelower, doublerange)  

doublerandom_beta(bitgen_t*bitgen_state, doublea, doubleb)  

doublerandom_chisquare(bitgen_t*bitgen_state, doubledf)  

doublerandom_f(bitgen_t*bitgen_state, doubledfnum, doubledfden)  

doublerandom_standard_cauchy(bitgen_t*bitgen_state)  

doublerandom_pareto(bitgen_t*bitgen_state, doublea)  

doublerandom_weibull(bitgen_t*bitgen_state, doublea)  

doublerandom_power(bitgen_t*bitgen_state, doublea)  

doublerandom_laplace(bitgen_t*bitgen_state, doubleloc, doublescale)  

doublerandom_gumbel(bitgen_t*bitgen_state, doubleloc, doublescale)  

doublerandom_logistic(bitgen_t*bitgen_state, doubleloc, doublescale)  

doublerandom_lognormal(bitgen_t*bitgen_state, doublemean, doublesigma)  

doublerandom_rayleigh(bitgen_t*bitgen_state, doublemode)  

doublerandom_standard_t(bitgen_t*bitgen_state, doubledf)  

doublerandom_noncentral_chisquare(bitgen_t*bitgen_state, doubledf, doublenonc)  

doublerandom_noncentral_f(bitgen_t*bitgen_state, doubledfnum, doubledfden, doublenonc)  

doublerandom_wald(bitgen_t*bitgen_state, doublemean, doublescale)  

doublerandom_vonmises(bitgen_t*bitgen_state, doublemu, doublekappa)  

doublerandom_triangular(bitgen_t*bitgen_state, doubleleft, doublemode, doubleright)  

npy_int64random_poisson(bitgen_t*bitgen_state, doublelam)  

npy_int64random_negative_binomial(bitgen_t*bitgen_state, doublen, doublep)  

typebinomial_t  

    
    
    typedef struct s_binomial_t {
      int has_binomial; /* !=0: following parameters initialized for binomial */
      double psave;
      RAND_INT_TYPE nsave;
      double r;
      double q;
      double fm;
      RAND_INT_TYPE m;
      double p1;
      double xm;
      double xl;
      double xr;
      double c;
      double laml;
      double lamr;
      double p2;
      double p3;
      double p4;
    } binomial_t;
    
npy_int64random_binomial(bitgen_t*bitgen_state, doublep, npy_int64n, binomial_t*binomial)  

npy_int64random_logseries(bitgen_t*bitgen_state, doublep)  

npy_int64random_geometric_search(bitgen_t*bitgen_state, doublep)  

npy_int64random_geometric_inversion(bitgen_t*bitgen_state, doublep)  

npy_int64random_geometric(bitgen_t*bitgen_state, doublep)  

npy_int64random_zipf(bitgen_t*bitgen_state, doublea)  

npy_int64random_hypergeometric(bitgen_t*bitgen_state, npy_int64good, npy_int64bad, npy_int64sample)  

npy_uint64random_interval(bitgen_t*bitgen_state, npy_uint64max)  

voidrandom_multinomial(bitgen_t*bitgen_state, npy_int64n, npy_int64*mnix, double*pix, npy_intpd, binomial_t*binomial)  

intrandom_multivariate_hypergeometric_count(bitgen_t*bitgen_state, npy_int64total, size_tnum_colors, npy_int64*colors, npy_int64nsample, size_tnum_variates, npy_int64*variates)  

voidrandom_multivariate_hypergeometric_marginals(bitgen_t*bitgen_state, npy_int64total, size_tnum_colors, npy_int64*colors, npy_int64nsample, size_tnum_variates, npy_int64*variates)  

Generate a single integer
npy_int64random_positive_int64(bitgen_t*bitgen_state)  

npy_int32random_positive_int32(bitgen_t*bitgen_state)  

npy_int64random_positive_int(bitgen_t*bitgen_state)  

npy_uint64random_uint(bitgen_t*bitgen_state)  

Generate random uint64 numbers in closed interval [off, off + rng].
npy_uint64random_bounded_uint64(bitgen_t*bitgen_state, npy_uint64off, npy_uint64rng, npy_uint64mask, booluse_masked)  

# Compatibility policy
`numpy.random` has a somewhat stricter compatibility policy than the rest of NumPy. Users of pseudorandomness often have use cases for being able to reproduce runs in fine detail given the same seed (so-called “stream compatibility”), and so we try to balance those needs with the flexibility to enhance our algorithms. NEP 19 describes the evolution of this policy.
The main kind of compatibility that we enforce is stream-compatibility from run to run under certain conditions. If you create a `Generator` with the same `BitGenerator`, with the same seed, perform the same sequence of method calls with the same arguments, on the same build of `numpy`, in the same environment, on the same machine, you should get the same stream of numbers. Note that these conditions are very strict. There are a number of factors outside of NumPy’s control that limit our ability to guarantee much more than this. For example, different CPUs implement floating point arithmetic differently, and this can cause differences in certain edge cases that cascade to the rest of the stream. `Generator.multivariate_normal`, for another example, uses a matrix decomposition from `numpy.linalg`. Even on the same platform, a different build of `numpy` may use a different version of this matrix decomposition algorithm from the LAPACK that it links to, causing `Generator.multivariate_normal` to return completely different (but equally valid!) results. We strive to prefer algorithms that are more resistant to these effects, but this is always imperfect.
Note
Most of the `Generator` methods allow you to draw multiple values from a distribution as arrays. The requested size of this array is a parameter, for the purposes of the above policy. Calling `rng.random()` 5 times is not guaranteed to give the same numbers as `rng.random(5)`. We reserve the ability to decide to use different algorithms for different-sized blocks. In practice, this happens rarely.
Like the rest of NumPy, we generally maintain API source compatibility from version to version. If we must make an API-breaking change, then we will only do so with an appropriate deprecation period and warnings, according to general NumPy policy.
Breaking stream-compatibility in order to introduce new features or improve performance in `Generator` or `default_rng` will be allowed with caution. Such changes will be considered features, and as such will be no faster than the standard release cadence of features (i.e. on `X.Y` releases, never `X.Y.Z`). Slowness will not be considered a bug for this purpose. Correctness bug fixes that break stream-compatibility can happen on bugfix releases, per usual, but developers should consider if they can wait until the next feature release. We encourage developers to strongly weight user’s pain from the break in stream-compatibility against the improvements. One example of a worthwhile improvement would be to change algorithms for a significant increase in performance, for example, moving from the Box-Muller transform method of Gaussian variate generation to the faster Ziggurat algorithm. An example of a discouraged improvement would be tweaking the Ziggurat tables just a little bit for a small performance improvement.
Note
In particular, `default_rng` is allowed to change the default `BitGenerator` that it uses (again, with caution and plenty of advance warning).
In general, `BitGenerator` classes have stronger guarantees of version-to-version stream compatibility. This allows them to be a firmer building block for downstream users that need it. Their limited API surface makes it easier for them to maintain this compatibility from version to version. See the docstrings of each `BitGenerator` class for their individual compatibility guarantees.
The legacy `RandomState` and the associated convenience functions have a stricter version-to-version compatibility guarantee. For reasons outlined in NEP 19, we had made stronger promises about their version-to-version stability early in NumPy’s development. There are still some limited use cases for this kind of compatibility (like generating data for tests), so we maintain as much compatibility as we can. There will be no more modifications to `RandomState`, not even to fix correctness bugs. There are a few gray areas where we can make minor fixes to keep `RandomState` working without segfaulting as NumPy’s internals change, and some docstring fixes. However, the previously-mentioned caveats about the variability from machine to machine and build to build still apply to `RandomState` just as much as it does to `Generator`.
# Extending via CFFI
    
    """
    Use cffi to access any of the underlying C functions from distributions.h
    """
    import os
    import numpy as np
    import cffi
    from .parse import parse_distributions_h
    ffi = cffi.FFI()
    
    inc_dir = os.path.join(np.get_include(), 'numpy')
    
    # Basic numpy types
    ffi.cdef('''
        typedef intptr_t npy_intp;
        typedef unsigned char npy_bool;
    
    ''')
    
    parse_distributions_h(ffi, inc_dir)
    
    lib = ffi.dlopen(np.random._generator.__file__)
    
    # Compare the distributions.h random_standard_normal_fill to
    # Generator.standard_random
    bit_gen = np.random.PCG64()
    rng = np.random.Generator(bit_gen)
    state = bit_gen.state
    
    interface = rng.bit_generator.cffi
    n = 100
    vals_cffi = ffi.new('double[%d]' % n)
    lib.random_standard_normal_fill(interface.bit_generator, n, vals_cffi)
    
    # reset the state
    bit_gen.state = state
    
    vals = rng.standard_normal(n)
    
    for i in range(n):
        assert vals[i] == vals_cffi[i]
    
# extending.pyx
    
    #cython: language_level=3
    
    from libc.stdint cimport uint32_t
    from cpython.pycapsule cimport PyCapsule_IsValid, PyCapsule_GetPointer
    
    import numpy as np
    cimport numpy as np
    cimport cython
    
    from numpy.random cimport bitgen_t
    from numpy.random import PCG64
    
    np.import_array()
    
    
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def uniform_mean(Py_ssize_t n):
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef double[::1] random_values
        cdef np.ndarray randoms
    
        x = PCG64()
        capsule = x.capsule
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
        random_values = np.empty(n)
        # Best practice is to acquire the lock whenever generating random values.
        # This prevents other threads from modifying the state. Acquiring the lock
        # is only necessary if the GIL is also released, as in this example.
        with x.lock, nogil:
            for i in range(n):
                random_values[i] = rng.next_double(rng.state)
        randoms = np.asarray(random_values)
        return randoms.mean()
    
    
    # This function is declared nogil so it can be used without the GIL below
    cdef uint32_t bounded_uint(uint32_t lb, uint32_t ub, bitgen_t *rng) nogil:
        cdef uint32_t mask, delta, val
        mask = delta = ub - lb
        mask |= mask >> 1
        mask |= mask >> 2
        mask |= mask >> 4
        mask |= mask >> 8
        mask |= mask >> 16
    
        val = rng.next_uint32(rng.state) & mask
        while val > delta:
            val = rng.next_uint32(rng.state) & mask
    
        return lb + val
    
    
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def bounded_uints(uint32_t lb, uint32_t ub, Py_ssize_t n):
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef uint32_t[::1] out
        cdef const char *capsule_name = "BitGenerator"
    
        x = PCG64()
        out = np.empty(n, dtype=np.uint32)
        capsule = x.capsule
    
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        rng = <bitgen_t *>PyCapsule_GetPointer(capsule, capsule_name)
    
        with x.lock, nogil:
            for i in range(n):
                out[i] = bounded_uint(lb, ub, rng)
        return np.asarray(out)
    
# extending_distributions.pyx
    
    #cython: language_level=3
    """
    This file shows how the to use a BitGenerator to create a distribution.
    """
    import numpy as np
    cimport numpy as np
    cimport cython
    from cpython.pycapsule cimport PyCapsule_IsValid, PyCapsule_GetPointer
    from libc.stdint cimport uint16_t, uint64_t
    from numpy.random cimport bitgen_t
    from numpy.random import PCG64
    from numpy.random.c_distributions cimport (
          random_standard_uniform_fill, random_standard_uniform_fill_f)
    
    
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def uniforms(Py_ssize_t n):
        """
        Create an array of `n` uniformly distributed doubles.
        A 'real' distribution would want to process the values into
        some non-uniform distribution
        """
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef double[::1] random_values
    
        x = PCG64()
        capsule = x.capsule
        # Optional check that the capsule if from a BitGenerator
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        # Cast the pointer
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
        random_values = np.empty(n, dtype='float64')
        with x.lock, nogil:
            for i in range(n):
                # Call the function
                random_values[i] = rng.next_double(rng.state)
        randoms = np.asarray(random_values)
    
        return randoms
    
    # cython example 2
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def uint10_uniforms(Py_ssize_t n):
        """Uniform 10 bit integers stored as 16-bit unsigned integers"""
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef uint16_t[::1] random_values
        cdef int bits_remaining
        cdef int width = 10
        cdef uint64_t buff, mask = 0x3FF
    
        x = PCG64()
        capsule = x.capsule
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
        random_values = np.empty(n, dtype='uint16')
        # Best practice is to release GIL and acquire the lock
        bits_remaining = 0
        with x.lock, nogil:
            for i in range(n):
                if bits_remaining < width:
                    buff = rng.next_uint64(rng.state)
                random_values[i] = buff & mask
                buff >>= width
    
        randoms = np.asarray(random_values)
        return randoms
    
    # cython example 3
    def uniforms_ex(bit_generator, Py_ssize_t n, dtype=np.float64):
        """
        Create an array of `n` uniformly distributed doubles via a "fill" function.
    
        A 'real' distribution would want to process the values into
        some non-uniform distribution
    
        Parameters
        ----------
        bit_generator: BitGenerator instance
        n: int
            Output vector length
        dtype: {str, dtype}, optional
            Desired dtype, either 'd' (or 'float64') or 'f' (or 'float32'). The
            default dtype value is 'd'
        """
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef np.ndarray randoms
    
        capsule = bit_generator.capsule
        # Optional check that the capsule if from a BitGenerator
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        # Cast the pointer
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
    
        _dtype = np.dtype(dtype)
        randoms = np.empty(n, dtype=_dtype)
        if _dtype == np.float32:
            with bit_generator.lock:
                random_standard_uniform_fill_f(rng, n, <float*>np.PyArray_DATA(randoms))
        elif _dtype == np.float64:
            with bit_generator.lock:
                random_standard_uniform_fill(rng, n, <double*>np.PyArray_DATA(randoms))
        else:
            raise TypeError('Unsupported dtype %r for random' % _dtype)
        return randoms
    
# Extending numpy.random via Cython
Starting with NumPy 1.26.0, Meson is the default build system for NumPy. See Status of numpy.distutils and migration advice.
  * meson.build
  * extending.pyx
  * extending_distributions.pyx


# meson.build
    
    project('random-build-examples', 'c', 'cpp', 'cython')
    
    py_mod = import('python')
    py3 = py_mod.find_installation(pure: false)
    
    cc = meson.get_compiler('c')
    cy = meson.get_compiler('cython')
    
    # Keep synced with pyproject.toml
    if not cy.version().version_compare('>=3.0.6')
      error('tests requires Cython >= 3.0.6')
    endif
    
    base_cython_args = []
    if cy.version().version_compare('>=3.1.0')
      base_cython_args += ['-Xfreethreading_compatible=True']
    endif
    
    _numpy_abs = run_command(py3, ['-c',
                   'import os; os.chdir(".."); import numpy; print(os.path.abspath(numpy.get_include() + "../../.."))'],
                             check: true).stdout().strip()
    
    npymath_path = _numpy_abs / '_core' / 'lib'
    npy_include_path = _numpy_abs / '_core' / 'include'
    npyrandom_path = _numpy_abs / 'random' / 'lib'
    npymath_lib = cc.find_library('npymath', dirs: npymath_path)
    npyrandom_lib = cc.find_library('npyrandom', dirs: npyrandom_path)
    
    py3.extension_module(
        'extending_distributions',
        'extending_distributions.pyx',
        install: false,
        include_directories: [npy_include_path],
        dependencies: [npyrandom_lib, npymath_lib],
        cython_args: base_cython_args,
    )
    py3.extension_module(
        'extending',
        'extending.pyx',
        install: false,
        include_directories: [npy_include_path],
        dependencies: [npyrandom_lib, npymath_lib],
        cython_args: base_cython_args,
    )
    py3.extension_module(
        'extending_cpp',
        'extending_distributions.pyx',
        install: false,
        override_options : ['cython_language=cpp'],
        cython_args: base_cython_args + ['--module-name', 'extending_cpp'],
        include_directories: [npy_include_path],
        dependencies: [npyrandom_lib, npymath_lib],
    )
    
# Extending via Numba
    
    import numpy as np
    import numba as nb
    
    from numpy.random import PCG64
    from timeit import timeit
    
    bit_gen = PCG64()
    next_d = bit_gen.cffi.next_double
    state_addr = bit_gen.cffi.state_address
    
    def normals(n, state):
        out = np.empty(n)
        for i in range((n + 1) // 2):
            x1 = 2.0 * next_d(state) - 1.0
            x2 = 2.0 * next_d(state) - 1.0
            r2 = x1 * x1 + x2 * x2
            while r2 >= 1.0 or r2 == 0.0:
                x1 = 2.0 * next_d(state) - 1.0
                x2 = 2.0 * next_d(state) - 1.0
                r2 = x1 * x1 + x2 * x2
            f = np.sqrt(-2.0 * np.log(r2) / r2)
            out[2 * i] = f * x1
            if 2 * i + 1 < n:
                out[2 * i + 1] = f * x2
        return out
    
    # Compile using Numba
    normalsj = nb.jit(normals, nopython=True)
    # Must use state address not state with numba
    n = 10000
    
    def numbacall():
        return normalsj(n, state_addr)
    
    rg = np.random.Generator(PCG64())
    
    def numpycall():
        return rg.normal(size=n)
    
    # Check that the functions work
    r1 = numbacall()
    r2 = numpycall()
    assert r1.shape == (n,)
    assert r1.shape == r2.shape
    
    t1 = timeit(numbacall, number=1000)
    print(f'{t1:.2f} secs for {n} PCG64 (Numba/PCG64) gaussian randoms')
    t2 = timeit(numpycall, number=1000)
    print(f'{t2:.2f} secs for {n} PCG64 (NumPy/PCG64) gaussian randoms')
    
    # example 2
    
    next_u32 = bit_gen.ctypes.next_uint32
    ctypes_state = bit_gen.ctypes.state
    
    @nb.jit(nopython=True)
    def bounded_uint(lb, ub, state):
        mask = delta = ub - lb
        mask |= mask >> 1
        mask |= mask >> 2
        mask |= mask >> 4
        mask |= mask >> 8
        mask |= mask >> 16
    
        val = next_u32(state) & mask
        while val > delta:
            val = next_u32(state) & mask
    
        return lb + val
    
    
    print(bounded_uint(323, 2394691, ctypes_state.value))
    
    
    @nb.jit(nopython=True)
    def bounded_uints(lb, ub, n, state):
        out = np.empty(n, dtype=np.uint32)
        for i in range(n):
            out[i] = bounded_uint(lb, ub, state)
    
    
    bounded_uints(323, 2394691, 10000000, ctypes_state.value)
    
    
    
# Extending via Numba and CFFI
    
    r"""
    Building the required library in this example requires a source distribution
    of NumPy or clone of the NumPy git repository since distributions.c is not
    included in binary distributions.
    
    On *nix, execute in numpy/random/src/distributions
    
    export ${PYTHON_VERSION}=3.8 # Python version
    export PYTHON_INCLUDE=#path to Python's include folder, usually \
        ${PYTHON_HOME}/include/python${PYTHON_VERSION}m
    export NUMPY_INCLUDE=#path to numpy's include folder, usually \
        ${PYTHON_HOME}/lib/python${PYTHON_VERSION}/site-packages/numpy/_core/include
    gcc -shared -o libdistributions.so -fPIC distributions.c \
        -I${NUMPY_INCLUDE} -I${PYTHON_INCLUDE}
    mv libdistributions.so ../../_examples/numba/
    
    On Windows
    
    rem PYTHON_HOME and PYTHON_VERSION are setup dependent, this is an example
    set PYTHON_HOME=c:\Anaconda
    set PYTHON_VERSION=38
    cl.exe /LD .\distributions.c -DDLL_EXPORT \
        -I%PYTHON_HOME%\lib\site-packages\numpy\_core\include \
        -I%PYTHON_HOME%\include %PYTHON_HOME%\libs\python%PYTHON_VERSION%.lib
    move distributions.dll ../../_examples/numba/
    """
    import os
    
    import numba as nb
    import numpy as np
    from cffi import FFI
    
    from numpy.random import PCG64
    
    ffi = FFI()
    if os.path.exists('./distributions.dll'):
        lib = ffi.dlopen('./distributions.dll')
    elif os.path.exists('./libdistributions.so'):
        lib = ffi.dlopen('./libdistributions.so')
    else:
        raise RuntimeError('Required DLL/so file was not found.')
    
    ffi.cdef("""
    double random_standard_normal(void *bitgen_state);
    """)
    x = PCG64()
    xffi = x.cffi
    bit_generator = xffi.bit_generator
    
    random_standard_normal = lib.random_standard_normal
    
    
    def normals(n, bit_generator):
        out = np.empty(n)
        for i in range(n):
            out[i] = random_standard_normal(bit_generator)
        return out
    
    
    normalsj = nb.jit(normals, nopython=True)
    
    # Numba requires a memory address for void *
    # Can also get address from x.ctypes.bit_generator.value
    bit_generator_address = int(ffi.cast('uintptr_t', bit_generator))
    
    norm = normalsj(1000, bit_generator_address)
    print(norm[:12])
    
# Extending
The `BitGenerator`s have been designed to be extendable using standard tools for high-performance Python – numba and Cython. The `Generator` object can also be used with user-provided `BitGenerator`s as long as these export a small set of required functions.
## Numba
Numba can be used with either CTypes or CFFI. The current iteration of the `BitGenerator`s all export a small set of functions through both interfaces.
This example shows how numba can be used to produce gaussian samples using a pure Python implementation which is then compiled. The random numbers are provided by `ctypes.next_double`.
    
    import numpy as np
    import numba as nb
    
    from numpy.random import PCG64
    from timeit import timeit
    
    bit_gen = PCG64()
    next_d = bit_gen.cffi.next_double
    state_addr = bit_gen.cffi.state_address
    
    def normals(n, state):
        out = np.empty(n)
        for i in range((n + 1) // 2):
            x1 = 2.0 * next_d(state) - 1.0
            x2 = 2.0 * next_d(state) - 1.0
            r2 = x1 * x1 + x2 * x2
            while r2 >= 1.0 or r2 == 0.0:
                x1 = 2.0 * next_d(state) - 1.0
                x2 = 2.0 * next_d(state) - 1.0
                r2 = x1 * x1 + x2 * x2
            f = np.sqrt(-2.0 * np.log(r2) / r2)
            out[2 * i] = f * x1
            if 2 * i + 1 < n:
                out[2 * i + 1] = f * x2
        return out
    
    # Compile using Numba
    normalsj = nb.jit(normals, nopython=True)
    # Must use state address not state with numba
    n = 10000
    
    def numbacall():
        return normalsj(n, state_addr)
    
    rg = np.random.Generator(PCG64())
    
    def numpycall():
        return rg.normal(size=n)
    
    # Check that the functions work
    r1 = numbacall()
    r2 = numpycall()
    assert r1.shape == (n,)
    assert r1.shape == r2.shape
    
    t1 = timeit(numbacall, number=1000)
    print(f'{t1:.2f} secs for {n} PCG64 (Numba/PCG64) gaussian randoms')
    t2 = timeit(numpycall, number=1000)
    print(f'{t2:.2f} secs for {n} PCG64 (NumPy/PCG64) gaussian randoms')
    
    
Both CTypes and CFFI allow the more complicated distributions to be used directly in Numba after compiling the file distributions.c into a `DLL` or `so`. An example showing the use of a more complicated distribution is in the Examples section below.
## Cython
Cython can be used to unpack the `PyCapsule` provided by a `BitGenerator`. This example uses `PCG64` and the example from above. The usual caveats for writing high-performance code using Cython – removing bounds checks and wrap around, providing array alignment information – still apply.
    
    #cython: language_level=3
    """
    This file shows how the to use a BitGenerator to create a distribution.
    """
    import numpy as np
    cimport numpy as np
    cimport cython
    from cpython.pycapsule cimport PyCapsule_IsValid, PyCapsule_GetPointer
    from libc.stdint cimport uint16_t, uint64_t
    from numpy.random cimport bitgen_t
    from numpy.random import PCG64
    from numpy.random.c_distributions cimport (
          random_standard_uniform_fill, random_standard_uniform_fill_f)
    
    
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def uniforms(Py_ssize_t n):
        """
        Create an array of `n` uniformly distributed doubles.
        A 'real' distribution would want to process the values into
        some non-uniform distribution
        """
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef double[::1] random_values
    
        x = PCG64()
        capsule = x.capsule
        # Optional check that the capsule if from a BitGenerator
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        # Cast the pointer
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
        random_values = np.empty(n, dtype='float64')
        with x.lock, nogil:
            for i in range(n):
                # Call the function
                random_values[i] = rng.next_double(rng.state)
        randoms = np.asarray(random_values)
    
        return randoms
    
The `BitGenerator` can also be directly accessed using the members of the `bitgen_t` struct.
    
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def uint10_uniforms(Py_ssize_t n):
        """Uniform 10 bit integers stored as 16-bit unsigned integers"""
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef uint16_t[::1] random_values
        cdef int bits_remaining
        cdef int width = 10
        cdef uint64_t buff, mask = 0x3FF
    
        x = PCG64()
        capsule = x.capsule
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
        random_values = np.empty(n, dtype='uint16')
        # Best practice is to release GIL and acquire the lock
        bits_remaining = 0
        with x.lock, nogil:
            for i in range(n):
                if bits_remaining < width:
                    buff = rng.next_uint64(rng.state)
                random_values[i] = buff & mask
                buff >>= width
    
        randoms = np.asarray(random_values)
        return randoms
    
Cython can be used to directly access the functions in `numpy/random/c_distributions.pxd`. This requires linking with the `npyrandom` library located in `numpy/random/lib`.
    
    def uniforms_ex(bit_generator, Py_ssize_t n, dtype=np.float64):
        """
        Create an array of `n` uniformly distributed doubles via a "fill" function.
    
        A 'real' distribution would want to process the values into
        some non-uniform distribution
    
        Parameters
        ----------
        bit_generator: BitGenerator instance
        n: int
            Output vector length
        dtype: {str, dtype}, optional
            Desired dtype, either 'd' (or 'float64') or 'f' (or 'float32'). The
            default dtype value is 'd'
        """
        cdef Py_ssize_t i
        cdef bitgen_t *rng
        cdef const char *capsule_name = "BitGenerator"
        cdef np.ndarray randoms
    
        capsule = bit_generator.capsule
        # Optional check that the capsule if from a BitGenerator
        if not PyCapsule_IsValid(capsule, capsule_name):
            raise ValueError("Invalid pointer to anon_func_state")
        # Cast the pointer
        rng = <bitgen_t *> PyCapsule_GetPointer(capsule, capsule_name)
    
        _dtype = np.dtype(dtype)
        randoms = np.empty(n, dtype=_dtype)
        if _dtype == np.float32:
            with bit_generator.lock:
                random_standard_uniform_fill_f(rng, n, <float*>np.PyArray_DATA(randoms))
        elif _dtype == np.float64:
            with bit_generator.lock:
                random_standard_uniform_fill(rng, n, <double*>np.PyArray_DATA(randoms))
        else:
            raise TypeError('Unsupported dtype %r for random' % _dtype)
        return randoms
    
See Extending numpy.random via Cython for the complete listings of these examples and a minimal `setup.py` to build the c-extension modules.
## CFFI
CFFI can be used to directly access the functions in `include/numpy/random/distributions.h`. Some “massaging” of the header file is required:
    
    """
    Use cffi to access any of the underlying C functions from distributions.h
    """
    import os
    import numpy as np
    import cffi
    from .parse import parse_distributions_h
    ffi = cffi.FFI()
    
    inc_dir = os.path.join(np.get_include(), 'numpy')
    
    # Basic numpy types
    ffi.cdef('''
        typedef intptr_t npy_intp;
        typedef unsigned char npy_bool;
    
    ''')
    
    parse_distributions_h(ffi, inc_dir)
    
    
Once the header is parsed by `ffi.cdef`, the functions can be accessed directly from the `_generator` shared object, using the `BitGenerator.cffi` interface.
    
    # Compare the distributions.h random_standard_normal_fill to
    # Generator.standard_random
    bit_gen = np.random.PCG64()
    rng = np.random.Generator(bit_gen)
    state = bit_gen.state
    
    interface = rng.bit_generator.cffi
    n = 100
    vals_cffi = ffi.new('double[%d]' % n)
    lib.random_standard_normal_fill(interface.bit_generator, n, vals_cffi)
    
    # reset the state
    bit_gen.state = state
    
    vals = rng.standard_normal(n)
    
    for i in range(n):
        assert vals[i] == vals_cffi[i]
    
## New BitGenerators
`Generator` can be used with user-provided `BitGenerator`s. The simplest way to write a new `BitGenerator` is to examine the pyx file of one of the existing `BitGenerator`s. The key structure that must be provided is the `capsule` which contains a `PyCapsule` to a struct pointer of type `bitgen_t`,
    
    typedef struct bitgen {
      void *state;
      uint64_t (*next_uint64)(void *st);
      uint32_t (*next_uint32)(void *st);
      double (*next_double)(void *st);
      uint64_t (*next_raw)(void *st);
    } bitgen_t;
    
which provides 5 pointers. The first is an opaque pointer to the data structure used by the `BitGenerator`s. The next three are function pointers which return the next 64- and 32-bit unsigned integers, the next random double and the next raw value. This final function is used for testing and so can be set to the next 64-bit unsigned integer function if not needed. Functions inside `Generator` use this structure as in
    
    bitgen_state->next_uint64(bitgen_state->state)
    
## Examples
  * Numba
  * CFFI + Numba
  * Cython
    * meson.build
    * extending.pyx
    * extending_distributions.pyx
  * CFFI


# numpy.random.beta
random.beta(a, b, size=None)
    
Draw samples from a Beta distribution.
The Beta distribution is a special case of the Dirichlet distribution, and is related to the Gamma distribution. It has the probability distribution function
\\[f(x; a,b) = \frac{1}{B(\alpha, \beta)} x^{\alpha - 1} (1 - x)^{\beta - 1},\\]
where the normalization, B, is the beta function,
\\[B(\alpha, \beta) = \int_0^1 t^{\alpha - 1} (1 - t)^{\beta - 1} dt.\\]
It is often seen in Bayesian inference and order statistics.
Note
New code should use the `beta` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Alpha, positive (>0).
bfloat or array_like of floats
    
Beta, positive (>0).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` and `b` are both scalars. Otherwise, `np.broadcast(a, b).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized beta distribution.
See also
`random.Generator.beta`
    
which should be used for new code.
# numpy.random.binomial
random.binomial(n, p, size=None)
    
Draw samples from a binomial distribution.
Samples are drawn from a binomial distribution with specified parameters, n trials and p probability of success where n an integer >= 0 and p is in the interval [0,1]. (n may be input as a float, but it is truncated to an integer in use)
Note
New code should use the `binomial` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
nint or array_like of ints
    
Parameter of the distribution, >= 0. Floats are also accepted, but they will be truncated to integers.
pfloat or array_like of floats
    
Parameter of the distribution, >= 0 and <=1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `n` and `p` are both scalars. Otherwise, `np.broadcast(n, p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized binomial distribution, where each sample is equal to the number of successes over the n trials.
See also
`scipy.stats.binom`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.binomial`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) for the binomial distribution is
\\[P(N) = \binom{n}{N}p^N(1-p)^{n-N},\\]
where \\(n\\) is the number of trials, \\(p\\) is the probability of success, and \\(N\\) is the number of successes.
When estimating the standard error of a proportion in a population by using a random sample, the normal distribution works well unless the product p*n <=5, where p = population proportion estimate, and n = number of samples, in which case the binomial distribution is used instead. For example, a sample of 15 people shows 4 who are left handed, and 11 who are right handed. Then p = 4/15 = 27%. 0.27*15 = 4, so the binomial distribution should be used in this case.
#### References
[1]
Dalgaard, Peter, “Introductory Statistics with R”, Springer-Verlag, 2002.
[2]
Glantz, Stanton A. “Primer of Biostatistics.”, McGraw-Hill, Fifth Edition, 2002.
[3]
Lentner, Marvin, “Elementary Applied Statistics”, Bogden and Quigley, 1972.
[4]
Weisstein, Eric W. “Binomial Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/BinomialDistribution.html
[5]
Wikipedia, “Binomial distribution”, https://en.wikipedia.org/wiki/Binomial_distribution
#### Examples
Draw samples from the distribution:
    
    >>> n, p = 10, .5  # number of trials, probability of each trial
    >>> s = np.random.binomial(n, p, 1000)
    # result of flipping a coin 10 times, tested 1000 times.
    
A real world example. A company drills 9 wild-cat oil exploration wells, each with an estimated probability of success of 0.1. All nine wells fail. What is the probability of that happening?
Let’s do 20,000 trials of the model, and count the number that generate zero positive results.
    
    >>> sum(np.random.binomial(9, 0.1, 20000) == 0)/20000.
    # answer = 0.38885, or 38%.
    
# numpy.random.bytes
random.bytes(length)
    
Return random bytes.
Note
New code should use the `bytes` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lengthint
    
Number of random bytes.
Returns:
    
outbytes
    
String of length `length`.
See also
`random.Generator.bytes`
    
which should be used for new code.
#### Examples
    
    >>> np.random.bytes(10)
    b' eh\x85\x022SZ\xbf\xa4' #random
    
# numpy.random.chisquare
random.chisquare(df, size=None)
    
Draw samples from a chi-square distribution.
When `df` independent random variables, each with standard normal distributions (mean 0, variance 1), are squared and summed, the resulting distribution is chi-square (see Notes). This distribution is often used in hypothesis testing.
Note
New code should use the `chisquare` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dffloat or array_like of floats
    
Number of degrees of freedom, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` is a scalar. Otherwise, `np.array(df).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized chi-square distribution.
Raises:
    
ValueError
    
When `df` <= 0 or when an inappropriate `size` (e.g. `size=-1`) is given.
See also
`random.Generator.chisquare`
    
which should be used for new code.
#### Notes
The variable obtained by summing the squares of `df` independent, standard normally distributed random variables:
\\[Q = \sum_{i=1}^{\mathtt{df}} X^2_i\\]
is chi-square distributed, denoted
\\[Q \sim \chi^2_k.\\]
The probability density function of the chi-squared distribution is
\\[p(x) = \frac{(1/2)^{k/2}}{\Gamma(k/2)} x^{k/2 - 1} e^{-x/2},\\]
where \\(\Gamma\\) is the gamma function,
\\[\Gamma(x) = \int_0^{-\infty} t^{x - 1} e^{-t} dt.\\]
#### References
[1]
NIST “Engineering Statistics Handbook” https://www.itl.nist.gov/div898/handbook/eda/section3/eda3666.htm
#### Examples
    
    >>> np.random.chisquare(2,4)
    array([ 1.89920014,  9.00867716,  3.13710533,  5.62318272]) # random
    
# numpy.random.choice
random.choice(a, size=None, replace=True, p=None)
    
Generates a random sample from a given 1-D array
Note
New code should use the `choice` method of a `Generator` instance instead; please see the Quick start.
Warning
This function uses the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms.
Parameters:
    
a1-D array-like or int
    
If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if it were `np.arange(a)`
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
replaceboolean, optional
    
Whether the sample is with or without replacement. Default is True, meaning that a value of `a` can be selected multiple times.
p1-D array-like, optional
    
The probabilities associated with each entry in a. If not given, the sample assumes a uniform distribution over all entries in `a`.
Returns:
    
samplessingle item or ndarray
    
The generated random samples
Raises:
    
ValueError
    
If a is an int and less than zero, if a or p are not 1-dimensional, if a is an array-like of size 0, if p is not a vector of probabilities, if a and p have different lengths, or if replace=False and the sample size is greater than the population size
See also
`randint`, `shuffle`, `permutation`
`random.Generator.choice`
    
which should be used in new code
#### Notes
Setting user-specified probabilities through `p` uses a more general but less efficient sampler than the default. The general sampler produces a different sample than the optimized sampler even if each element of `p` is 1 / len(a).
Sampling random rows from a 2-D array is not possible with this function, but is possible with `Generator.choice` through its `axis` keyword.
#### Examples
Generate a uniform random sample from np.arange(5) of size 3:
    
    >>> np.random.choice(5, 3)
    array([0, 3, 4]) # random
    >>> #This is equivalent to np.random.randint(0,5,3)
    
Generate a non-uniform random sample from np.arange(5) of size 3:
    
    >>> np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
    array([3, 3, 0]) # random
    
Generate a uniform random sample from np.arange(5) of size 3 without replacement:
    
    >>> np.random.choice(5, 3, replace=False)
    array([3,1,0]) # random
    >>> #This is equivalent to np.random.permutation(np.arange(5))[:3]
    
Generate a non-uniform random sample from np.arange(5) of size 3 without replacement:
    
    >>> np.random.choice(5, 3, replace=False, p=[0.1, 0, 0.3, 0.6, 0])
    array([2, 3, 0]) # random
    
Any of the above can be repeated with an arbitrary array-like instead of just integers. For instance:
    
    >>> aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']
    >>> np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
    array(['pooh', 'pooh', 'pooh', 'Christopher', 'piglet'], # random
          dtype='<U11')
    
# numpy.random.dirichlet
random.dirichlet(alpha, size=None)
    
Draw samples from the Dirichlet distribution.
Draw `size` samples of dimension k from a Dirichlet distribution. A Dirichlet-distributed random variable can be seen as a multivariate generalization of a Beta distribution. The Dirichlet distribution is a conjugate prior of a multinomial distribution in Bayesian inference.
Note
New code should use the `dirichlet` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
alphasequence of floats, length k
    
Parameter of the distribution (length `k` for sample of length `k`).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n)`, then `m * n * k` samples are drawn. Default is None, in which case a vector of length `k` is returned.
Returns:
    
samplesndarray,
    
The drawn samples, of shape `(size, k)`.
Raises:
    
ValueError
    
If any value in `alpha` is less than or equal to zero
See also
`random.Generator.dirichlet`
    
which should be used for new code.
#### Notes
The Dirichlet distribution is a distribution over vectors \\(x\\) that fulfil the conditions \\(x_i>0\\) and \\(\sum_{i=1}^k x_i = 1\\).
The probability density function \\(p\\) of a Dirichlet-distributed random vector \\(X\\) is proportional to
\\[p(x) \propto \prod_{i=1}^{k}{x^{\alpha_i-1}_i},\\]
where \\(\alpha\\) is a vector containing the positive concentration parameters.
The method uses the following property for computation: let \\(Y\\) be a random vector which has components that follow a standard gamma distribution, then \\(X = \frac{1}{\sum_{i=1}^k{Y_i}} Y\\) is Dirichlet-distributed
#### References
[1]
David McKay, “Information Theory, Inference and Learning Algorithms,” chapter 23, https://www.inference.org.uk/mackay/itila/
[2]
Wikipedia, “Dirichlet distribution”, https://en.wikipedia.org/wiki/Dirichlet_distribution
#### Examples
Taking an example cited in Wikipedia, this distribution can be used if one wanted to cut strings (each of initial length 1.0) into K pieces with different lengths, where each piece had, on average, a designated average length, but allowing some variation in the relative sizes of the pieces.
    
    >>> s = np.random.dirichlet((10, 5, 3), 20).transpose()
    
    
    >>> import matplotlib.pyplot as plt
    >>> plt.barh(range(20), s[0])
    >>> plt.barh(range(20), s[1], left=s[0], color='g')
    >>> plt.barh(range(20), s[2], left=s[0]+s[1], color='r')
    >>> plt.title("Lengths of Strings")
    
# numpy.random.exponential
random.exponential(scale=1.0, size=None)
    
Draw samples from an exponential distribution.
Its probability density function is
\\[f(x; \frac{1}{\beta}) = \frac{1}{\beta} \exp(-\frac{x}{\beta}),\\]
for `x > 0` and 0 elsewhere. \\(\beta\\) is the scale parameter, which is the inverse of the rate parameter \\(\lambda = 1/\beta\\). The rate parameter is an alternative, widely used parameterization of the exponential distribution [3].
The exponential distribution is a continuous analogue of the geometric distribution. It describes many common situations, such as the size of raindrops measured over many rainstorms [1], or the time between page requests to Wikipedia [2].
Note
New code should use the `exponential` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
scalefloat or array_like of floats
    
The scale parameter, \\(\beta = 1/\lambda\\). Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `scale` is a scalar. Otherwise, `np.array(scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized exponential distribution.
See also
`random.Generator.exponential`
    
which should be used for new code.
#### References
[1]
Peyton Z. Peebles Jr., “Probability, Random Variables and Random Signal Principles”, 4th ed, 2001, p. 57.
[2]
Wikipedia, “Poisson process”, https://en.wikipedia.org/wiki/Poisson_process
[3]
Wikipedia, “Exponential distribution”, https://en.wikipedia.org/wiki/Exponential_distribution
#### Examples
A real world example: Assume a company has 10000 customer support agents and the average time between customer calls is 4 minutes.
    
    >>> n = 10000
    >>> time_between_calls = np.random.default_rng().exponential(scale=4, size=n)
    
What is the probability that a customer will call in the next 4 to 5 minutes?
    
    >>> x = ((time_between_calls < 5).sum())/n 
    >>> y = ((time_between_calls < 4).sum())/n
    >>> x-y
    0.08 # may vary
    
# numpy.random.f
random.f(dfnum, dfden, size=None)
    
Draw samples from an F distribution.
Samples are drawn from an F distribution with specified parameters, `dfnum` (degrees of freedom in numerator) and `dfden` (degrees of freedom in denominator), where both parameters must be greater than zero.
The random variate of the F distribution (also known as the Fisher distribution) is a continuous probability distribution that arises in ANOVA tests, and is the ratio of two chi-square variates.
Note
New code should use the `f` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dfnumfloat or array_like of floats
    
Degrees of freedom in numerator, must be > 0.
dfdenfloat or array_like of float
    
Degrees of freedom in denominator, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `dfnum` and `dfden` are both scalars. Otherwise, `np.broadcast(dfnum, dfden).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Fisher distribution.
See also
`scipy.stats.f`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.f`
    
which should be used for new code.
#### Notes
The F statistic is used to compare in-group variances to between-group variances. Calculating the distribution depends on the sampling, and so it is a function of the respective degrees of freedom in the problem. The variable `dfnum` is the number of samples minus one, the between-groups degrees of freedom, while `dfden` is the within-groups degrees of freedom, the sum of the number of samples in each group minus the number of groups.
#### References
[1]
Glantz, Stanton A. “Primer of Biostatistics.”, McGraw-Hill, Fifth Edition, 2002.
[2]
Wikipedia, “F-distribution”, https://en.wikipedia.org/wiki/F-distribution
#### Examples
An example from Glantz[1], pp 47-40:
Two groups, children of diabetics (25 people) and children from people without diabetes (25 controls). Fasting blood glucose was measured, case group had a mean value of 86.1, controls had a mean value of 82.2. Standard deviations were 2.09 and 2.49 respectively. Are these data consistent with the null hypothesis that the parents diabetic status does not affect their children’s blood glucose levels? Calculating the F statistic from the data gives a value of 36.01.
Draw samples from the distribution:
    
    >>> dfnum = 1. # between group degrees of freedom
    >>> dfden = 48. # within groups degrees of freedom
    >>> s = np.random.f(dfnum, dfden, 1000)
    
The lower bound for the top 1% of the samples is :
    
    >>> np.sort(s)[-10]
    7.61988120985 # random
    
So there is about a 1% chance that the F statistic will exceed 7.62, the measured value is 36, so the null hypothesis is rejected at the 1% level.
# numpy.random.gamma
random.gamma(shape, scale=1.0, size=None)
    
Draw samples from a Gamma distribution.
Samples are drawn from a Gamma distribution with specified parameters, `shape` (sometimes designated “k”) and `scale` (sometimes designated “theta”), where both parameters are > 0.
Note
New code should use the `gamma` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
shapefloat or array_like of floats
    
The shape of the gamma distribution. Must be non-negative.
scalefloat or array_like of floats, optional
    
The scale of the gamma distribution. Must be non-negative. Default is equal to 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `shape` and `scale` are both scalars. Otherwise, `np.broadcast(shape, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized gamma distribution.
See also
`scipy.stats.gamma`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.gamma`
    
which should be used for new code.
#### Notes
The probability density for the Gamma distribution is
\\[p(x) = x^{k-1}\frac{e^{-x/\theta}}{\theta^k\Gamma(k)},\\]
where \\(k\\) is the shape and \\(\theta\\) the scale, and \\(\Gamma\\) is the Gamma function.
The Gamma distribution is often used to model the times to failure of electronic components, and arises naturally in processes for which the waiting times between Poisson distributed events are relevant.
#### References
[1]
Weisstein, Eric W. “Gamma Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/GammaDistribution.html
[2]
Wikipedia, “Gamma distribution”, https://en.wikipedia.org/wiki/Gamma_distribution
#### Examples
Draw samples from the distribution:
    
    >>> shape, scale = 2., 2.  # mean=4, std=2*sqrt(2)
    >>> s = np.random.gamma(shape, scale, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.special as sps  
    >>> count, bins, ignored = plt.hist(s, 50, density=True)
    >>> y = bins**(shape-1)*(np.exp(-bins/scale) /  
    ...                      (sps.gamma(shape)*scale**shape))
    >>> plt.plot(bins, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.Generator.beta
method
random.Generator.beta(a, b, size=None)
    
Draw samples from a Beta distribution.
The Beta distribution is a special case of the Dirichlet distribution, and is related to the Gamma distribution. It has the probability distribution function
\\[f(x; a,b) = \frac{1}{B(\alpha, \beta)} x^{\alpha - 1} (1 - x)^{\beta - 1},\\]
where the normalization, B, is the beta function,
\\[B(\alpha, \beta) = \int_0^1 t^{\alpha - 1} (1 - t)^{\beta - 1} dt.\\]
It is often seen in Bayesian inference and order statistics.
Parameters:
    
afloat or array_like of floats
    
Alpha, positive (>0).
bfloat or array_like of floats
    
Beta, positive (>0).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` and `b` are both scalars. Otherwise, `np.broadcast(a, b).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized beta distribution.
#### References
[1]
Wikipedia, “Beta distribution”, https://en.wikipedia.org/wiki/Beta_distribution
#### Examples
The beta distribution has mean a/(a+b). If `a == b` and both are > 1, the distribution is symmetric with mean 0.5.
    
    >>> rng = np.random.default_rng()
    >>> a, b, size = 2.0, 2.0, 10000
    >>> sample = rng.beta(a=a, b=b, size=size)
    >>> np.mean(sample)
    0.5047328775385895  # may vary
    
Otherwise the distribution is skewed left or right according to whether `a` or `b` is greater. The distribution is mirror symmetric. See for example:
    
    >>> a, b, size = 2, 7, 10000
    >>> sample_left = rng.beta(a=a, b=b, size=size)
    >>> sample_right = rng.beta(a=b, b=a, size=size)
    >>> m_left, m_right = np.mean(sample_left), np.mean(sample_right)
    >>> print(m_left, m_right)
    0.2238596793678923 0.7774613834041182  # may vary
    >>> print(m_left - a/(a+b))
    0.001637457145670096  # may vary
    >>> print(m_right - b/(a+b))
    -0.0003163943736596009  # may vary
    
Display the histogram of the two samples:
    
    >>> import matplotlib.pyplot as plt
    >>> plt.hist([sample_left, sample_right], 
    ...          50, density=True, histtype='bar')
    >>> plt.show()
    
# numpy.random.Generator.binomial
method
random.Generator.binomial(n, p, size=None)
    
Draw samples from a binomial distribution.
Samples are drawn from a binomial distribution with specified parameters, n trials and p probability of success where n an integer >= 0 and p is in the interval [0,1]. (n may be input as a float, but it is truncated to an integer in use)
Parameters:
    
nint or array_like of ints
    
Parameter of the distribution, >= 0. Floats are also accepted, but they will be truncated to integers.
pfloat or array_like of floats
    
Parameter of the distribution, >= 0 and <=1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `n` and `p` are both scalars. Otherwise, `np.broadcast(n, p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized binomial distribution, where each sample is equal to the number of successes over the n trials.
See also
`scipy.stats.binom`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability mass function (PMF) for the binomial distribution is
\\[P(N) = \binom{n}{N}p^N(1-p)^{n-N},\\]
where \\(n\\) is the number of trials, \\(p\\) is the probability of success, and \\(N\\) is the number of successes.
When estimating the standard error of a proportion in a population by using a random sample, the normal distribution works well unless the product p*n <=5, where p = population proportion estimate, and n = number of samples, in which case the binomial distribution is used instead. For example, a sample of 15 people shows 4 who are left handed, and 11 who are right handed. Then p = 4/15 = 27%. 0.27*15 = 4, so the binomial distribution should be used in this case.
#### References
[1]
Dalgaard, Peter, “Introductory Statistics with R”, Springer-Verlag, 2002.
[2]
Glantz, Stanton A. “Primer of Biostatistics.”, McGraw-Hill, Fifth Edition, 2002.
[3]
Lentner, Marvin, “Elementary Applied Statistics”, Bogden and Quigley, 1972.
[4]
Weisstein, Eric W. “Binomial Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/BinomialDistribution.html
[5]
Wikipedia, “Binomial distribution”, https://en.wikipedia.org/wiki/Binomial_distribution
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> n, p, size = 10, .5, 10000  
    >>> s = rng.binomial(n, p, 10000)
    
Assume a company drills 9 wild-cat oil exploration wells, each with an estimated probability of success of `p=0.1`. All nine wells fail. What is the probability of that happening?
Over `size = 20,000` trials the probability of this happening is on average:
    
    >>> n, p, size = 9, 0.1, 20000
    >>> np.sum(rng.binomial(n=n, p=p, size=size) == 0)/size
    0.39015  # may vary
    
The following can be used to visualize a sample with `n=100`, `p=0.4` and the corresponding probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.stats import binom
    >>> n, p, size = 100, 0.4, 10000
    >>> sample = rng.binomial(n, p, size=size)
    >>> count, bins, _ = plt.hist(sample, 30, density=True)
    >>> x = np.arange(n)
    >>> y = binom.pmf(x, n, p)
    >>> plt.plot(x, y, linewidth=2, color='r')
    
# numpy.random.Generator.bit_generator
attribute
random.Generator.bit_generator
    
Gets the bit generator instance used by the generator
Returns:
    
bit_generatorBitGenerator
    
The bit generator instance used by the generator
# numpy.random.Generator.bytes
method
random.Generator.bytes(length)
    
Return random bytes.
Parameters:
    
lengthint
    
Number of random bytes.
Returns:
    
outbytes
    
String of length `length`.
#### Notes
This function generates random bytes from a discrete uniform distribution. The generated bytes are independent from the CPU’s native endianness.
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> rng.bytes(10)
    b'\xfeC\x9b\x86\x17\xf2\xa1\xafcp'  # random
    
# numpy.random.Generator.chisquare
method
random.Generator.chisquare(df, size=None)
    
Draw samples from a chi-square distribution.
When `df` independent random variables, each with standard normal distributions (mean 0, variance 1), are squared and summed, the resulting distribution is chi-square (see Notes). This distribution is often used in hypothesis testing.
Parameters:
    
dffloat or array_like of floats
    
Number of degrees of freedom, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` is a scalar. Otherwise, `np.array(df).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized chi-square distribution.
Raises:
    
ValueError
    
When `df` <= 0 or when an inappropriate `size` (e.g. `size=-1`) is given.
#### Notes
The variable obtained by summing the squares of `df` independent, standard normally distributed random variables:
\\[Q = \sum_{i=1}^{\mathtt{df}} X^2_i\\]
is chi-square distributed, denoted
\\[Q \sim \chi^2_k.\\]
The probability density function of the chi-squared distribution is
\\[p(x) = \frac{(1/2)^{k/2}}{\Gamma(k/2)} x^{k/2 - 1} e^{-x/2},\\]
where \\(\Gamma\\) is the gamma function,
\\[\Gamma(x) = \int_0^{-\infty} t^{x - 1} e^{-t} dt.\\]
#### References
[1]
NIST “Engineering Statistics Handbook” https://www.itl.nist.gov/div898/handbook/eda/section3/eda3666.htm
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> rng.chisquare(2,4)
    array([ 1.89920014,  9.00867716,  3.13710533,  5.62318272]) # random
    
The distribution of a chi-square random variable with 20 degrees of freedom looks as follows:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.stats as stats
    >>> s = rng.chisquare(20, 10000)
    >>> count, bins, _ = plt.hist(s, 30, density=True)
    >>> x = np.linspace(0, 60, 1000)
    >>> plt.plot(x, stats.chi2.pdf(x, df=20))
    >>> plt.xlim([0, 60])
    >>> plt.show()
    
# numpy.random.Generator.choice
method
random.Generator.choice(a, size=None, replace=True, p=None, axis=0, shuffle=True)
    
Generates a random sample from a given array
Parameters:
    
a{array_like, int}
    
If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated from np.arange(a).
size{int, tuple[int]}, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn from the 1-d `a`. If `a` has more than one dimension, the `size` shape will be inserted into the `axis` dimension, so the output `ndim` will be `a.ndim - 1 + len(size)`. Default is None, in which case a single value is returned.
replacebool, optional
    
Whether the sample is with or without replacement. Default is True, meaning that a value of `a` can be selected multiple times.
p1-D array_like, optional
    
The probabilities associated with each entry in a. If not given, the sample assumes a uniform distribution over all entries in `a`.
axisint, optional
    
The axis along which the selection is performed. The default, 0, selects by row.
shufflebool, optional
    
Whether the sample is shuffled when sampling without replacement. Default is True, False provides a speedup.
Returns:
    
samplessingle item or ndarray
    
The generated random samples
Raises:
    
ValueError
    
If a is an int and less than zero, if p is not 1-dimensional, if a is array-like with a size 0, if p is not a vector of probabilities, if a and p have different lengths, or if replace=False and the sample size is greater than the population size.
See also
`integers`, `shuffle`, `permutation`
#### Notes
Setting user-specified probabilities through `p` uses a more general but less efficient sampler than the default. The general sampler produces a different sample than the optimized sampler even if each element of `p` is 1 / len(a).
`p` must sum to 1 when cast to `float64`. To ensure this, you may wish to normalize using `p = p / np.sum(p, dtype=float)`.
When passing `a` as an integer type and `size` is not specified, the return type is a native Python `int`.
#### Examples
Generate a uniform random sample from np.arange(5) of size 3:
    
    >>> rng = np.random.default_rng()
    >>> rng.choice(5, 3)
    array([0, 3, 4]) # random
    >>> #This is equivalent to rng.integers(0,5,3)
    
Generate a non-uniform random sample from np.arange(5) of size 3:
    
    >>> rng.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
    array([3, 3, 0]) # random
    
Generate a uniform random sample from np.arange(5) of size 3 without replacement:
    
    >>> rng.choice(5, 3, replace=False)
    array([3,1,0]) # random
    >>> #This is equivalent to rng.permutation(np.arange(5))[:3]
    
Generate a uniform random sample from a 2-D array along the first axis (the default), without replacement:
    
    >>> rng.choice([[0, 1, 2], [3, 4, 5], [6, 7, 8]], 2, replace=False)
    array([[3, 4, 5], # random
           [0, 1, 2]])
    
Generate a non-uniform random sample from np.arange(5) of size 3 without replacement:
    
    >>> rng.choice(5, 3, replace=False, p=[0.1, 0, 0.3, 0.6, 0])
    array([2, 3, 0]) # random
    
Any of the above can be repeated with an arbitrary array-like instead of just integers. For instance:
    
    >>> aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']
    >>> rng.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
    array(['pooh', 'pooh', 'pooh', 'Christopher', 'piglet'], # random
          dtype='<U11')
    
# numpy.random.Generator.dirichlet
method
random.Generator.dirichlet(alpha, size=None)
    
Draw samples from the Dirichlet distribution.
Draw `size` samples of dimension k from a Dirichlet distribution. A Dirichlet-distributed random variable can be seen as a multivariate generalization of a Beta distribution. The Dirichlet distribution is a conjugate prior of a multinomial distribution in Bayesian inference.
Parameters:
    
alphasequence of floats, length k
    
Parameter of the distribution (length `k` for sample of length `k`).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n)`, then `m * n * k` samples are drawn. Default is None, in which case a vector of length `k` is returned.
Returns:
    
samplesndarray,
    
The drawn samples, of shape `(size, k)`.
Raises:
    
ValueError
    
If any value in `alpha` is less than zero
#### Notes
The Dirichlet distribution is a distribution over vectors \\(x\\) that fulfil the conditions \\(x_i>0\\) and \\(\sum_{i=1}^k x_i = 1\\).
The probability density function \\(p\\) of a Dirichlet-distributed random vector \\(X\\) is proportional to
\\[p(x) \propto \prod_{i=1}^{k}{x^{\alpha_i-1}_i},\\]
where \\(\alpha\\) is a vector containing the positive concentration parameters.
The method uses the following property for computation: let \\(Y\\) be a random vector which has components that follow a standard gamma distribution, then \\(X = \frac{1}{\sum_{i=1}^k{Y_i}} Y\\) is Dirichlet-distributed
#### References
[1]
David McKay, “Information Theory, Inference and Learning Algorithms,” chapter 23, https://www.inference.org.uk/mackay/itila/
[2]
Wikipedia, “Dirichlet distribution”, https://en.wikipedia.org/wiki/Dirichlet_distribution
#### Examples
Taking an example cited in Wikipedia, this distribution can be used if one wanted to cut strings (each of initial length 1.0) into K pieces with different lengths, where each piece had, on average, a designated average length, but allowing some variation in the relative sizes of the pieces.
    
    >>> rng = np.random.default_rng()
    >>> s = rng.dirichlet((10, 5, 3), 20).transpose()
    
    
    >>> import matplotlib.pyplot as plt
    >>> plt.barh(range(20), s[0])
    >>> plt.barh(range(20), s[1], left=s[0], color='g')
    >>> plt.barh(range(20), s[2], left=s[0]+s[1], color='r')
    >>> plt.title("Lengths of Strings")
    
# numpy.random.Generator.exponential
method
random.Generator.exponential(scale=1.0, size=None)
    
Draw samples from an exponential distribution.
Its probability density function is
\\[f(x; \frac{1}{\beta}) = \frac{1}{\beta} \exp(-\frac{x}{\beta}),\\]
for `x > 0` and 0 elsewhere. \\(\beta\\) is the scale parameter, which is the inverse of the rate parameter \\(\lambda = 1/\beta\\). The rate parameter is an alternative, widely used parameterization of the exponential distribution [3].
The exponential distribution is a continuous analogue of the geometric distribution. It describes many common situations, such as the size of raindrops measured over many rainstorms [1], or the time between page requests to Wikipedia [2].
Parameters:
    
scalefloat or array_like of floats
    
The scale parameter, \\(\beta = 1/\lambda\\). Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `scale` is a scalar. Otherwise, `np.array(scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized exponential distribution.
#### References
[1]
Peyton Z. Peebles Jr., “Probability, Random Variables and Random Signal Principles”, 4th ed, 2001, p. 57.
[2]
Wikipedia, “Poisson process”, https://en.wikipedia.org/wiki/Poisson_process
[3]
Wikipedia, “Exponential distribution”, https://en.wikipedia.org/wiki/Exponential_distribution
#### Examples
Assume a company has 10000 customer support agents and the time between customer calls is exponentially distributed and that the average time between customer calls is 4 minutes.
    
    >>> scale, size = 4, 10000
    >>> rng = np.random.default_rng()
    >>> time_between_calls = rng.exponential(scale=scale, size=size)
    
What is the probability that a customer will call in the next 4 to 5 minutes?
    
    >>> x = ((time_between_calls < 5).sum())/size
    >>> y = ((time_between_calls < 4).sum())/size
    >>> x - y
    0.08  # may vary
    
The corresponding distribution can be visualized as follows:
    
    >>> import matplotlib.pyplot as plt
    >>> scale, size = 4, 10000
    >>> rng = np.random.default_rng()
    >>> sample = rng.exponential(scale=scale, size=size)
    >>> count, bins, _ = plt.hist(sample, 30, density=True)
    >>> plt.plot(bins, scale**(-1)*np.exp(-scale**-1*bins), linewidth=2, color='r')
    >>> plt.show()
    
# numpy.random.Generator.f
method
random.Generator.f(dfnum, dfden, size=None)
    
Draw samples from an F distribution.
Samples are drawn from an F distribution with specified parameters, `dfnum` (degrees of freedom in numerator) and `dfden` (degrees of freedom in denominator), where both parameters must be greater than zero.
The random variate of the F distribution (also known as the Fisher distribution) is a continuous probability distribution that arises in ANOVA tests, and is the ratio of two chi-square variates.
Parameters:
    
dfnumfloat or array_like of floats
    
Degrees of freedom in numerator, must be > 0.
dfdenfloat or array_like of float
    
Degrees of freedom in denominator, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `dfnum` and `dfden` are both scalars. Otherwise, `np.broadcast(dfnum, dfden).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Fisher distribution.
See also
`scipy.stats.f`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The F statistic is used to compare in-group variances to between-group variances. Calculating the distribution depends on the sampling, and so it is a function of the respective degrees of freedom in the problem. The variable `dfnum` is the number of samples minus one, the between-groups degrees of freedom, while `dfden` is the within-groups degrees of freedom, the sum of the number of samples in each group minus the number of groups.
#### References
[1]
Glantz, Stanton A. “Primer of Biostatistics.”, McGraw-Hill, Fifth Edition, 2002.
[2]
Wikipedia, “F-distribution”, https://en.wikipedia.org/wiki/F-distribution
#### Examples
An example from Glantz[1], pp 47-40:
Two groups, children of diabetics (25 people) and children from people without diabetes (25 controls). Fasting blood glucose was measured, case group had a mean value of 86.1, controls had a mean value of 82.2. Standard deviations were 2.09 and 2.49 respectively. Are these data consistent with the null hypothesis that the parents diabetic status does not affect their children’s blood glucose levels? Calculating the F statistic from the data gives a value of 36.01.
Draw samples from the distribution:
    
    >>> dfnum = 1. # between group degrees of freedom
    >>> dfden = 48. # within groups degrees of freedom
    >>> rng = np.random.default_rng()
    >>> s = rng.f(dfnum, dfden, 1000)
    
The lower bound for the top 1% of the samples is :
    
    >>> np.sort(s)[-10]
    7.61988120985 # random
    
So there is about a 1% chance that the F statistic will exceed 7.62, the measured value is 36, so the null hypothesis is rejected at the 1% level.
The corresponding probability density function for `n = 20` and `m = 20` is:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy import stats
    >>> dfnum, dfden, size = 20, 20, 10000
    >>> s = rng.f(dfnum=dfnum, dfden=dfden, size=size)
    >>> bins, density, _ = plt.hist(s, 30, density=True)
    >>> x = np.linspace(0, 5, 1000)
    >>> plt.plot(x, stats.f.pdf(x, dfnum, dfden))
    >>> plt.xlim([0, 5])
    >>> plt.show()
    
# numpy.random.Generator.gamma
method
random.Generator.gamma(shape, scale=1.0, size=None)
    
Draw samples from a Gamma distribution.
Samples are drawn from a Gamma distribution with specified parameters, `shape` (sometimes designated “k”) and `scale` (sometimes designated “theta”), where both parameters are > 0.
Parameters:
    
shapefloat or array_like of floats
    
The shape of the gamma distribution. Must be non-negative.
scalefloat or array_like of floats, optional
    
The scale of the gamma distribution. Must be non-negative. Default is equal to 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `shape` and `scale` are both scalars. Otherwise, `np.broadcast(shape, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized gamma distribution.
See also
`scipy.stats.gamma`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability density for the Gamma distribution is
\\[p(x) = x^{k-1}\frac{e^{-x/\theta}}{\theta^k\Gamma(k)},\\]
where \\(k\\) is the shape and \\(\theta\\) the scale, and \\(\Gamma\\) is the Gamma function.
The Gamma distribution is often used to model the times to failure of electronic components, and arises naturally in processes for which the waiting times between Poisson distributed events are relevant.
#### References
[1]
Weisstein, Eric W. “Gamma Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/GammaDistribution.html
[2]
Wikipedia, “Gamma distribution”, https://en.wikipedia.org/wiki/Gamma_distribution
#### Examples
Draw samples from the distribution:
    
    >>> shape, scale = 2., 2.  # mean=4, std=2*sqrt(2)
    >>> rng = np.random.default_rng()
    >>> s = rng.gamma(shape, scale, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.special as sps  
    >>> count, bins, _ = plt.hist(s, 50, density=True)
    >>> y = bins**(shape-1)*(np.exp(-bins/scale) /  
    ...                      (sps.gamma(shape)*scale**shape))
    >>> plt.plot(bins, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.Generator.geometric
method
random.Generator.geometric(p, size=None)
    
Draw samples from the geometric distribution.
Bernoulli trials are experiments with one of two outcomes: success or failure (an example of such an experiment is flipping a coin). The geometric distribution models the number of trials that must be run in order to achieve success. It is therefore supported on the positive integers, `k = 1, 2, ...`.
The probability mass function of the geometric distribution is
\\[f(k) = (1 - p)^{k - 1} p\\]
where `p` is the probability of success of an individual trial.
Parameters:
    
pfloat or array_like of floats
    
The probability of success of an individual trial.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `p` is a scalar. Otherwise, `np.array(p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized geometric distribution.
#### References
[1]
Wikipedia, “Geometric distribution”, https://en.wikipedia.org/wiki/Geometric_distribution
#### Examples
Draw 10,000 values from the geometric distribution, with the probability of an individual success equal to `p = 0.35`:
    
    >>> p, size = 0.35, 10000
    >>> rng = np.random.default_rng()
    >>> sample = rng.geometric(p=p, size=size)
    
What proportion of trials succeeded after a single run?
    
    >>> (sample == 1).sum()/size
    0.34889999999999999  # may vary
    
The geometric distribution with `p=0.35` looks as follows:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(sample, bins=30, density=True)
    >>> plt.plot(bins, (1-p)**(bins-1)*p)
    >>> plt.xlim([0, 25])
    >>> plt.show()
    
# numpy.random.Generator.gumbel
method
random.Generator.gumbel(loc=0.0, scale=1.0, size=None)
    
Draw samples from a Gumbel distribution.
Draw samples from a Gumbel distribution with specified location and scale. For more information on the Gumbel distribution, see Notes and References below.
Parameters:
    
locfloat or array_like of floats, optional
    
The location of the mode of the distribution. Default is 0.
scalefloat or array_like of floats, optional
    
The scale parameter of the distribution. Default is 1. Must be non- negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Gumbel distribution.
See also
`scipy.stats.gumbel_l`
`scipy.stats.gumbel_r`
`scipy.stats.genextreme`
`weibull`
#### Notes
The Gumbel (or Smallest Extreme Value (SEV) or the Smallest Extreme Value Type I) distribution is one of a class of Generalized Extreme Value (GEV) distributions used in modeling extreme value problems. The Gumbel is a special case of the Extreme Value Type I distribution for maximums from distributions with “exponential-like” tails.
The probability density for the Gumbel distribution is
\\[p(x) = \frac{e^{-(x - \mu)/ \beta}}{\beta} e^{ -e^{-(x - \mu)/ \beta}},\\]
where \\(\mu\\) is the mode, a location parameter, and \\(\beta\\) is the scale parameter.
The Gumbel (named for German mathematician Emil Julius Gumbel) was used very early in the hydrology literature, for modeling the occurrence of flood events. It is also used for modeling maximum wind speed and rainfall rates. It is a “fat-tailed” distribution - the probability of an event in the tail of the distribution is larger than if one used a Gaussian, hence the surprisingly frequent occurrence of 100-year floods. Floods were initially modeled as a Gaussian process, which underestimated the frequency of extreme events.
It is one of a class of extreme value distributions, the Generalized Extreme Value (GEV) distributions, which also includes the Weibull and Frechet.
The function has a mean of \\(\mu + 0.57721\beta\\) and a variance of \\(\frac{\pi^2}{6}\beta^2\\).
#### References
[1]
Gumbel, E. J., “Statistics of Extremes,” New York: Columbia University Press, 1958.
[2]
Reiss, R.-D. and Thomas, M., “Statistical Analysis of Extreme Values from Insurance, Finance, Hydrology and Other Fields,” Basel: Birkhauser Verlag, 2001.
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> mu, beta = 0, 0.1 # location and scale
    >>> s = rng.gumbel(mu, beta, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 30, density=True)
    >>> plt.plot(bins, (1/beta)*np.exp(-(bins - mu)/beta)
    ...          * np.exp( -np.exp( -(bins - mu) /beta) ),
    ...          linewidth=2, color='r')
    >>> plt.show()
    
Show how an extreme value distribution can arise from a Gaussian process and compare to a Gaussian:
    
    >>> means = []
    >>> maxima = []
    >>> for i in range(0,1000) :
    ...    a = rng.normal(mu, beta, 1000)
    ...    means.append(a.mean())
    ...    maxima.append(a.max())
    >>> count, bins, _ = plt.hist(maxima, 30, density=True)
    >>> beta = np.std(maxima) * np.sqrt(6) / np.pi
    >>> mu = np.mean(maxima) - 0.57721*beta
    >>> plt.plot(bins, (1/beta)*np.exp(-(bins - mu)/beta)
    ...          * np.exp(-np.exp(-(bins - mu)/beta)),
    ...          linewidth=2, color='r')
    >>> plt.plot(bins, 1/(beta * np.sqrt(2 * np.pi))
    ...          * np.exp(-(bins - mu)**2 / (2 * beta**2)),
    ...          linewidth=2, color='g')
    >>> plt.show()
    
# numpy.random.Generator.hypergeometric
method
random.Generator.hypergeometric(ngood, nbad, nsample, size=None)
    
Draw samples from a Hypergeometric distribution.
Samples are drawn from a hypergeometric distribution with specified parameters, `ngood` (ways to make a good selection), `nbad` (ways to make a bad selection), and `nsample` (number of items sampled, which is less than or equal to the sum `ngood + nbad`).
Parameters:
    
ngoodint or array_like of ints
    
Number of ways to make a good selection. Must be nonnegative and less than 10**9.
nbadint or array_like of ints
    
Number of ways to make a bad selection. Must be nonnegative and less than 10**9.
nsampleint or array_like of ints
    
Number of items sampled. Must be nonnegative and less than `ngood + nbad`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `ngood`, `nbad`, and `nsample` are all scalars. Otherwise, `np.broadcast(ngood, nbad, nsample).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized hypergeometric distribution. Each sample is the number of good items within a randomly selected subset of size `nsample` taken from a set of `ngood` good items and `nbad` bad items.
See also
`multivariate_hypergeometric`
    
Draw samples from the multivariate hypergeometric distribution.
`scipy.stats.hypergeom`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability mass function (PMF) for the Hypergeometric distribution is
\\[P(x) = \frac{\binom{g}{x}\binom{b}{n-x}}{\binom{g+b}{n}},\\]
where \\(0 \le x \le n\\) and \\(n-b \le x \le g\\)
for P(x) the probability of `x` good results in the drawn sample, g = `ngood`, b = `nbad`, and n = `nsample`.
Consider an urn with black and white marbles in it, `ngood` of them are black and `nbad` are white. If you draw `nsample` balls without replacement, then the hypergeometric distribution describes the distribution of black balls in the drawn sample.
Note that this distribution is very similar to the binomial distribution, except that in this case, samples are drawn without replacement, whereas in the Binomial case samples are drawn with replacement (or the sample space is infinite). As the sample space becomes large, this distribution approaches the binomial.
The arguments `ngood` and `nbad` each must be less than `10**9`. For extremely large arguments, the algorithm that is used to compute the samples [4] breaks down because of loss of precision in floating point calculations. For such large values, if `nsample` is not also large, the distribution can be approximated with the binomial distribution, `binomial(n=nsample, p=ngood/(ngood + nbad))`.
#### References
[1]
Lentner, Marvin, “Elementary Applied Statistics”, Bogden and Quigley, 1972.
[2]
Weisstein, Eric W. “Hypergeometric Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/HypergeometricDistribution.html
[3]
Wikipedia, “Hypergeometric distribution”, https://en.wikipedia.org/wiki/Hypergeometric_distribution
[4]
Stadlober, Ernst, “The ratio of uniforms approach for generating discrete random variates”, Journal of Computational and Applied Mathematics, 31, pp. 181-189 (1990).
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> ngood, nbad, nsamp = 100, 2, 10
    # number of good, number of bad, and number of samples
    >>> s = rng.hypergeometric(ngood, nbad, nsamp, 1000)
    >>> from matplotlib.pyplot import hist
    >>> hist(s)
    #   note that it is very unlikely to grab both bad items
    
Suppose you have an urn with 15 white and 15 black marbles. If you pull 15 marbles at random, how likely is it that 12 or more of them are one color?
    
    >>> s = rng.hypergeometric(15, 15, 15, 100000)
    >>> sum(s>=12)/100000. + sum(s<=3)/100000.
    #   answer = 0.003 ... pretty unlikely!
    
# numpy.random.Generator.integers
method
random.Generator.integers(low, high=None, size=None, dtype=np.int64, endpoint=False)
    
Return random integers from `low` (inclusive) to `high` (exclusive), or if endpoint=True, `low` (inclusive) to `high` (inclusive). Replaces `RandomState.randint` (with endpoint=False) and `RandomState.random_integers` (with endpoint=True)
Return random integers from the “discrete uniform” distribution of the specified dtype. If `high` is None (the default), then results are from 0 to `low`.
Parameters:
    
lowint or array-like of ints
    
Lowest (signed) integers to be drawn from the distribution (unless `high=None`, in which case this parameter is 0 and this value is used for `high`).
highint or array-like of ints, optional
    
If provided, one above the largest (signed) integer to be drawn from the distribution (see above for behavior if `high=None`). If array-like, must contain integer values
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
dtypedtype, optional
    
Desired dtype of the result. Byteorder must be native. The default value is np.int64.
endpointbool, optional
    
If true, sample from the interval [low, high] instead of the default [low, high) Defaults to False
Returns:
    
outint or ndarray of ints
    
`size`-shaped array of random integers from the appropriate distribution, or a single such random int if `size` not provided.
#### Notes
When using broadcasting with uint64 dtypes, the maximum value (2**64) cannot be represented as a standard integer type. The high array (or low if high is None) must have object dtype, e.g., array([2**64]).
#### References
[1]
Daniel Lemire., “Fast Random Integer Generation in an Interval”, ACM Transactions on Modeling and Computer Simulation 29 (1), 2019, https://arxiv.org/abs/1805.10941.
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> rng.integers(2, size=10)
    array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])  # random
    >>> rng.integers(1, size=10)
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    
Generate a 2 x 4 array of ints between 0 and 4, inclusive:
    
    >>> rng.integers(5, size=(2, 4))
    array([[4, 0, 2, 1],
           [3, 2, 2, 0]])  # random
    
Generate a 1 x 3 array with 3 different upper bounds
    
    >>> rng.integers(1, [3, 5, 10])
    array([2, 2, 9])  # random
    
Generate a 1 by 3 array with 3 different lower bounds
    
    >>> rng.integers([1, 5, 7], 10)
    array([9, 8, 7])  # random
    
Generate a 2 by 4 array using broadcasting with dtype of uint8
    
    >>> rng.integers([1, 3, 5, 7], [[10], [20]], dtype=np.uint8)
    array([[ 8,  6,  9,  7],
           [ 1, 16,  9, 12]], dtype=uint8)  # random
    
# numpy.random.Generator.laplace
method
random.Generator.laplace(loc=0.0, scale=1.0, size=None)
    
Draw samples from the Laplace or double exponential distribution with specified location (or mean) and scale (decay).
The Laplace distribution is similar to the Gaussian/normal distribution, but is sharper at the peak and has fatter tails. It represents the difference between two independent, identically distributed exponential random variables.
Parameters:
    
locfloat or array_like of floats, optional
    
The position, \\(\mu\\), of the distribution peak. Default is 0.
scalefloat or array_like of floats, optional
    
\\(\lambda\\), the exponential decay. Default is 1. Must be non- negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Laplace distribution.
#### Notes
It has the probability density function
\\[f(x; \mu, \lambda) = \frac{1}{2\lambda} \exp\left(-\frac{|x - \mu|}{\lambda}\right).\\]
The first law of Laplace, from 1774, states that the frequency of an error can be expressed as an exponential function of the absolute magnitude of the error, which leads to the Laplace distribution. For many problems in economics and health sciences, this distribution seems to model the data better than the standard Gaussian distribution.
#### References
[1]
Abramowitz, M. and Stegun, I. A. (Eds.). “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing,” New York: Dover, 1972.
[2]
Kotz, Samuel, et. al. “The Laplace Distribution and Generalizations, “ Birkhauser, 2001.
[3]
Weisstein, Eric W. “Laplace Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/LaplaceDistribution.html
[4]
Wikipedia, “Laplace distribution”, https://en.wikipedia.org/wiki/Laplace_distribution
#### Examples
Draw samples from the distribution
    
    >>> loc, scale = 0., 1.
    >>> rng = np.random.default_rng()
    >>> s = rng.laplace(loc, scale, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 30, density=True)
    >>> x = np.arange(-8., 8., .01)
    >>> pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
    >>> plt.plot(x, pdf)
    
Plot Gaussian for comparison:
    
    >>> g = (1/(scale * np.sqrt(2 * np.pi)) *
    ...      np.exp(-(x - loc)**2 / (2 * scale**2)))
    >>> plt.plot(x,g)
    
# numpy.random.Generator.logistic
method
random.Generator.logistic(loc=0.0, scale=1.0, size=None)
    
Draw samples from a logistic distribution.
Samples are drawn from a logistic distribution with specified parameters, loc (location or mean, also median), and scale (>0).
Parameters:
    
locfloat or array_like of floats, optional
    
Parameter of the distribution. Default is 0.
scalefloat or array_like of floats, optional
    
Parameter of the distribution. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized logistic distribution.
See also
`scipy.stats.logistic`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability density for the Logistic distribution is
\\[P(x) = \frac{e^{-(x-\mu)/s}}{s(1+e^{-(x-\mu)/s})^2},\\]
where \\(\mu\\) = location and \\(s\\) = scale.
The Logistic distribution is used in Extreme Value problems where it can act as a mixture of Gumbel distributions, in Epidemiology, and by the World Chess Federation (FIDE) where it is used in the Elo ranking system, assuming the performance of each player is a logistically distributed random variable.
#### References
[1]
Reiss, R.-D. and Thomas M. (2001), “Statistical Analysis of Extreme Values, from Insurance, Finance, Hydrology and Other Fields,” Birkhauser Verlag, Basel, pp 132-133.
[2]
Weisstein, Eric W. “Logistic Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/LogisticDistribution.html
[3]
Wikipedia, “Logistic-distribution”, https://en.wikipedia.org/wiki/Logistic_distribution
#### Examples
Draw samples from the distribution:
    
    >>> loc, scale = 10, 1
    >>> rng = np.random.default_rng()
    >>> s = rng.logistic(loc, scale, 10000)
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, bins=50, label='Sampled data')
    
# plot sampled data against the exact distribution
    
    >>> def logistic(x, loc, scale):
    ...     return np.exp((loc-x)/scale)/(scale*(1+np.exp((loc-x)/scale))**2)
    >>> logistic_values  = logistic(bins, loc, scale)
    >>> bin_spacing = np.mean(np.diff(bins))
    >>> plt.plot(bins, logistic_values  * bin_spacing * s.size, label='Logistic PDF')
    >>> plt.legend()
    >>> plt.show()
    
# numpy.random.Generator.lognormal
method
random.Generator.lognormal(mean=0.0, sigma=1.0, size=None)
    
Draw samples from a log-normal distribution.
Draw samples from a log-normal distribution with specified mean, standard deviation, and array shape. Note that the mean and standard deviation are not the values for the distribution itself, but of the underlying normal distribution it is derived from.
Parameters:
    
meanfloat or array_like of floats, optional
    
Mean value of the underlying normal distribution. Default is 0.
sigmafloat or array_like of floats, optional
    
Standard deviation of the underlying normal distribution. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mean` and `sigma` are both scalars. Otherwise, `np.broadcast(mean, sigma).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized log-normal distribution.
See also
`scipy.stats.lognorm`
    
probability density function, distribution, cumulative density function, etc.
#### Notes
A variable `x` has a log-normal distribution if `log(x)` is normally distributed. The probability density function for the log-normal distribution is:
\\[p(x) = \frac{1}{\sigma x \sqrt{2\pi}} e^{(-\frac{(ln(x)-\mu)^2}{2\sigma^2})}\\]
where \\(\mu\\) is the mean and \\(\sigma\\) is the standard deviation of the normally distributed logarithm of the variable. A log-normal distribution results if a random variable is the product of a large number of independent, identically-distributed variables in the same way that a normal distribution results if the variable is the sum of a large number of independent, identically-distributed variables.
#### References
[1]
Limpert, E., Stahel, W. A., and Abbt, M., “Log-normal Distributions across the Sciences: Keys and Clues,” BioScience, Vol. 51, No. 5, May, 2001. https://stat.ethz.ch/~stahel/lognormal/bioscience.pdf
[2]
Reiss, R.D. and Thomas, M., “Statistical Analysis of Extreme Values,” Basel: Birkhauser Verlag, 2001, pp. 31-32.
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> mu, sigma = 3., 1. # mean and standard deviation
    >>> s = rng.lognormal(mu, sigma, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 100, density=True, align='mid')
    
    
    >>> x = np.linspace(min(bins), max(bins), 10000)
    >>> pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
    ...        / (x * sigma * np.sqrt(2 * np.pi)))
    
    
    >>> plt.plot(x, pdf, linewidth=2, color='r')
    >>> plt.axis('tight')
    >>> plt.show()
    
Demonstrate that taking the products of random samples from a uniform distribution can be fit well by a log-normal probability density function.
    
    >>> # Generate a thousand samples: each is the product of 100 random
    >>> # values, drawn from a normal distribution.
    >>> rng = rng
    >>> b = []
    >>> for i in range(1000):
    ...    a = 10. + rng.standard_normal(100)
    ...    b.append(np.prod(a))
    
    
    >>> b = np.array(b) / np.min(b) # scale values to be positive
    >>> count, bins, _ = plt.hist(b, 100, density=True, align='mid')
    >>> sigma = np.std(np.log(b))
    >>> mu = np.mean(np.log(b))
    
    
    >>> x = np.linspace(min(bins), max(bins), 10000)
    >>> pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
    ...        / (x * sigma * np.sqrt(2 * np.pi)))
    
    
    >>> plt.plot(x, pdf, color='r', linewidth=2)
    >>> plt.show()
    
# numpy.random.Generator.logseries
method
random.Generator.logseries(p, size=None)
    
Draw samples from a logarithmic series distribution.
Samples are drawn from a log series distribution with specified shape parameter, 0 <= `p` < 1.
Parameters:
    
pfloat or array_like of floats
    
Shape parameter for the distribution. Must be in the range [0, 1).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `p` is a scalar. Otherwise, `np.array(p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized logarithmic series distribution.
See also
`scipy.stats.logser`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability mass function for the Log Series distribution is
\\[P(k) = \frac{-p^k}{k \ln(1-p)},\\]
where p = probability.
The log series distribution is frequently used to represent species richness and occurrence, first proposed by Fisher, Corbet, and Williams in 1943 [2]. It may also be used to model the numbers of occupants seen in cars [3].
#### References
[1]
Buzas, Martin A.; Culver, Stephen J., Understanding regional species diversity through the log series distribution of occurrences: BIODIVERSITY RESEARCH Diversity & Distributions, Volume 5, Number 5, September 1999 , pp. 187-195(9).
[2]
Fisher, R.A,, A.S. Corbet, and C.B. Williams. 1943. The relation between the number of species and the number of individuals in a random sample of an animal population. Journal of Animal Ecology, 12:42-58.
[3]
D. J. Hand, F. Daly, D. Lunn, E. Ostrowski, A Handbook of Small Data Sets, CRC Press, 1994.
[4]
Wikipedia, “Logarithmic distribution”, https://en.wikipedia.org/wiki/Logarithmic_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a = .6
    >>> rng = np.random.default_rng()
    >>> s = rng.logseries(a, 10000)
    >>> import matplotlib.pyplot as plt
    >>> bins = np.arange(-.5, max(s) + .5 )
    >>> count, bins, _ = plt.hist(s, bins=bins, label='Sample count')
    
# plot against distribution
    
    >>> def logseries(k, p):
    ...     return -p**k/(k*np.log(1-p))
    >>> centres = np.arange(1, max(s) + 1)
    >>> plt.plot(centres, logseries(centres, a) * s.size, 'r', label='logseries PMF')
    >>> plt.legend()
    >>> plt.show()
    
# numpy.random.Generator.multinomial
method
random.Generator.multinomial(n, pvals, size=None)
    
Draw samples from a multinomial distribution.
The multinomial distribution is a multivariate generalization of the binomial distribution. Take an experiment with one of `p` possible outcomes. An example of such an experiment is throwing a dice, where the outcome can be 1 through 6. Each sample drawn from the distribution represents `n` such experiments. Its values, `X_i = [X_0, X_1, ..., X_p]`, represent the number of times the outcome was `i`.
Parameters:
    
nint or array-like of ints
    
Number of experiments.
pvalsarray-like of floats
    
Probabilities of each of the `p` different outcomes with shape `(k0, k1, ..., kn, p)`. Each element `pvals[i,j,...,:]` must sum to 1 (however, the last element is always assumed to account for the remaining probability, as long as `sum(pvals[..., :-1], axis=-1) <= 1.0`. Must have at least 1 dimension where pvals.shape[-1] > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn each with `p` elements. Default is None where the output size is determined by the broadcast shape of `n` and all by the final dimension of `pvals`, which is denoted as `b=(b0, b1, ..., bq)`. If size is not None, then it must be compatible with the broadcast shape `b`. Specifically, size must have `q` or more elements and size[-(q-j):] must equal `bj`.
Returns:
    
outndarray
    
The drawn samples, of shape size, if provided. When size is provided, the output shape is size + (p,) If not specified, the shape is determined by the broadcast shape of `n` and `pvals`, `(b0, b1, ..., bq)` augmented with the dimension of the multinomial, `p`, so that that output shape is `(b0, b1, ..., bq, p)`.
Each entry `out[i,j,...,:]` is a `p`-dimensional value drawn from the distribution.
#### Examples
Throw a dice 20 times:
    
    >>> rng = np.random.default_rng()
    >>> rng.multinomial(20, [1/6.]*6, size=1)
    array([[4, 1, 7, 5, 2, 1]])  # random
    
It landed 4 times on 1, once on 2, etc.
Now, throw the dice 20 times, and 20 times again:
    
    >>> rng.multinomial(20, [1/6.]*6, size=2)
    array([[3, 4, 3, 3, 4, 3],
           [2, 4, 3, 4, 0, 7]])  # random
    
For the first run, we threw 3 times 1, 4 times 2, etc. For the second, we threw 2 times 1, 4 times 2, etc.
Now, do one experiment throwing the dice 10 time, and 10 times again, and another throwing the dice 20 times, and 20 times again:
    
    >>> rng.multinomial([[10], [20]], [1/6.]*6, size=(2, 2))
    array([[[2, 4, 0, 1, 2, 1],
            [1, 3, 0, 3, 1, 2]],
           [[1, 4, 4, 4, 4, 3],
            [3, 3, 2, 5, 5, 2]]])  # random
    
The first array shows the outcomes of throwing the dice 10 times, and the second shows the outcomes from throwing the dice 20 times.
A loaded die is more likely to land on number 6:
    
    >>> rng.multinomial(100, [1/7.]*5 + [2/7.])
    array([11, 16, 14, 17, 16, 26])  # random
    
Simulate 10 throws of a 4-sided die and 20 throws of a 6-sided die
    
    >>> rng.multinomial([10, 20],[[1/4]*4 + [0]*2, [1/6]*6])
    array([[2, 1, 4, 3, 0, 0],
           [3, 3, 3, 6, 1, 4]], dtype=int64)  # random
    
Generate categorical random variates from two categories where the first has 3 outcomes and the second has 2.
    
    >>> rng.multinomial(1, [[.1, .5, .4 ], [.3, .7, .0]])
    array([[0, 0, 1],
           [0, 1, 0]], dtype=int64)  # random
    
`argmax(axis=-1)` is then used to return the categories.
    
    >>> pvals = [[.1, .5, .4 ], [.3, .7, .0]]
    >>> rvs = rng.multinomial(1, pvals, size=(4,2))
    >>> rvs.argmax(axis=-1)
    array([[0, 1],
           [2, 0],
           [2, 1],
           [2, 0]], dtype=int64)  # random
    
The same output dimension can be produced using broadcasting.
    
    >>> rvs = rng.multinomial([[1]] * 4, pvals)
    >>> rvs.argmax(axis=-1)
    array([[0, 1],
           [2, 0],
           [2, 1],
           [2, 0]], dtype=int64)  # random
    
The probability inputs should be normalized. As an implementation detail, the value of the last entry is ignored and assumed to take up any leftover probability mass, but this should not be relied on. A biased coin which has twice as much weight on one side as on the other should be sampled like so:
    
    >>> rng.multinomial(100, [1.0 / 3, 2.0 / 3])  # RIGHT
    array([38, 62])  # random
    
not like:
    
    >>> rng.multinomial(100, [1.0, 2.0])  # WRONG
    Traceback (most recent call last):
    ValueError: pvals < 0, pvals > 1 or pvals contains NaNs
    
# numpy.random.Generator.multivariate_hypergeometric
method
random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')
    
Generate variates from a multivariate hypergeometric distribution.
The multivariate hypergeometric distribution is a generalization of the hypergeometric distribution.
Choose `nsample` items at random without replacement from a collection with `N` distinct types. `N` is the length of `colors`, and the values in `colors` are the number of occurrences of that type in the collection. The total number of items in the collection is `sum(colors)`. Each random variate generated by this function is a vector of length `N` holding the counts of the different types that occurred in the `nsample` items.
The name `colors` comes from a common description of the distribution: it is the probability distribution of the number of marbles of each color selected without replacement from an urn containing marbles of different colors; `colors[i]` is the number of marbles in the urn with color `i`.
Parameters:
    
colorssequence of integers
    
The number of each type of item in the collection from which a sample is drawn. The values in `colors` must be nonnegative. To avoid loss of precision in the algorithm, `sum(colors)` must be less than `10**9` when `method` is “marginals”.
nsampleint
    
The number of items selected. `nsample` must not be greater than `sum(colors)`.
sizeint or tuple of ints, optional
    
The number of variates to generate, either an integer or a tuple holding the shape of the array of variates. If the given size is, e.g., `(k, m)`, then `k * m` variates are drawn, where one variate is a vector of length `len(colors)`, and the return value has shape `(k, m, len(colors))`. If `size` is an integer, the output has shape `(size, len(colors))`. Default is None, in which case a single variate is returned as an array with shape `(len(colors),)`.
methodstring, optional
    
Specify the algorithm that is used to generate the variates. Must be ‘count’ or ‘marginals’ (the default). See the Notes for a description of the methods.
Returns:
    
variatesndarray
    
Array of variates drawn from the multivariate hypergeometric distribution.
See also
`hypergeometric`
    
Draw samples from the (univariate) hypergeometric distribution.
#### Notes
The two methods do not return the same sequence of variates.
The “count” algorithm is roughly equivalent to the following numpy code:
    
    choices = np.repeat(np.arange(len(colors)), colors)
    selection = np.random.choice(choices, nsample, replace=False)
    variate = np.bincount(selection, minlength=len(colors))
    
The “count” algorithm uses a temporary array of integers with length `sum(colors)`.
The “marginals” algorithm generates a variate by using repeated calls to the univariate hypergeometric sampler. It is roughly equivalent to:
    
    variate = np.zeros(len(colors), dtype=np.int64)
    # `remaining` is the cumulative sum of `colors` from the last
    # element to the first; e.g. if `colors` is [3, 1, 5], then
    # `remaining` is [9, 6, 5].
    remaining = np.cumsum(colors[::-1])[::-1]
    for i in range(len(colors)-1):
        if nsample < 1:
            break
        variate[i] = hypergeometric(colors[i], remaining[i+1],
                                   nsample)
        nsample -= variate[i]
    variate[-1] = nsample
    
The default method is “marginals”. For some cases (e.g. when `colors` contains relatively small integers), the “count” method can be significantly faster than the “marginals” method. If performance of the algorithm is important, test the two methods with typical inputs to decide which works best.
#### Examples
    
    >>> colors = [16, 8, 4]
    >>> seed = 4861946401452
    >>> gen = np.random.Generator(np.random.PCG64(seed))
    >>> gen.multivariate_hypergeometric(colors, 6)
    array([5, 0, 1])
    >>> gen.multivariate_hypergeometric(colors, 6, size=3)
    array([[5, 0, 1],
           [2, 2, 2],
           [3, 3, 0]])
    >>> gen.multivariate_hypergeometric(colors, 6, size=(2, 2))
    array([[[3, 2, 1],
            [3, 2, 1]],
           [[4, 1, 1],
            [3, 2, 1]]])
    
# numpy.random.Generator.multivariate_normal
method
random.Generator.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8, *, method='svd')
    
Draw random samples from a multivariate normal distribution.
The multivariate normal, multinormal or Gaussian distribution is a generalization of the one-dimensional normal distribution to higher dimensions. Such a distribution is specified by its mean and covariance matrix. These parameters are analogous to the mean (average or “center”) and variance (the squared standard deviation, or “width”) of the one-dimensional normal distribution.
Parameters:
    
mean1-D array_like, of length N
    
Mean of the N-dimensional distribution.
cov2-D array_like, of shape (N, N)
    
Covariance matrix of the distribution. It must be symmetric and positive-semidefinite for proper sampling.
sizeint or tuple of ints, optional
    
Given a shape of, for example, `(m,n,k)`, `m*n*k` samples are generated, and packed in an `m`-by-`n`-by-`k` arrangement. Because each sample is `N`-dimensional, the output shape is `(m,n,k,N)`. If no shape is specified, a single (`N`-D) sample is returned.
check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, optional
    
Behavior when the covariance matrix is not positive semidefinite.
tolfloat, optional
    
Tolerance when checking the singular values in covariance matrix. cov is cast to double before the check.
method{ ‘svd’, ‘eigh’, ‘cholesky’}, optional
    
The cov input is used to compute a factor matrix A such that `A @ A.T = cov`. This argument is used to select the method used to compute the factor matrix A. The default method ‘svd’ is the slowest, while ‘cholesky’ is the fastest but less robust than the slowest method. The method `eigh` uses eigen decomposition to compute A and is faster than svd but slower than cholesky.
Returns:
    
outndarray
    
The drawn samples, of shape size, if that was provided. If not, the shape is `(N,)`.
In other words, each entry `out[i,j,...,:]` is an N-dimensional value drawn from the distribution.
#### Notes
The mean is a coordinate in N-dimensional space, which represents the location where samples are most likely to be generated. This is analogous to the peak of the bell curve for the one-dimensional or univariate normal distribution.
Covariance indicates the level to which two variables vary together. From the multivariate normal distribution, we draw N-dimensional samples, \\(X = [x_1, x_2, ... x_N]\\). The covariance matrix element \\(C_{ij}\\) is the covariance of \\(x_i\\) and \\(x_j\\). The element \\(C_{ii}\\) is the variance of \\(x_i\\) (i.e. its “spread”).
Instead of specifying the full covariance matrix, popular approximations include:
  * Spherical covariance (`cov` is a multiple of the identity matrix)
  * Diagonal covariance (`cov` has non-negative elements, and only on the diagonal)


This geometrical property can be seen in two dimensions by plotting generated data-points:
    
    >>> mean = [0, 0]
    >>> cov = [[1, 0], [0, 100]]  # diagonal covariance
    
Diagonal covariance means that points are oriented along x or y-axis:
    
    >>> import matplotlib.pyplot as plt
    >>> rng = np.random.default_rng()
    >>> x, y = rng.multivariate_normal(mean, cov, 5000).T
    >>> plt.plot(x, y, 'x')
    >>> plt.axis('equal')
    >>> plt.show()
    
Note that the covariance matrix must be positive semidefinite (a.k.a. nonnegative-definite). Otherwise, the behavior of this method is undefined and backwards compatibility is not guaranteed.
This function internally uses linear algebra routines, and thus results may not be identical (even up to precision) across architectures, OSes, or even builds. For example, this is likely if `cov` has multiple equal singular values and `method` is `'svd'` (default). In this case, `method='cholesky'` may be more robust.
#### References
[1]
Papoulis, A., “Probability, Random Variables, and Stochastic Processes,” 3rd ed., New York: McGraw-Hill, 1991.
[2]
Duda, R. O., Hart, P. E., and Stork, D. G., “Pattern Classification,” 2nd ed., New York: Wiley, 2001.
#### Examples
    
    >>> mean = (1, 2)
    >>> cov = [[1, 0], [0, 1]]
    >>> rng = np.random.default_rng()
    >>> x = rng.multivariate_normal(mean, cov, (3, 3))
    >>> x.shape
    (3, 3, 2)
    
We can use a different method other than the default to factorize cov:
    
    >>> y = rng.multivariate_normal(mean, cov, (3, 3), method='cholesky')
    >>> y.shape
    (3, 3, 2)
    
Here we generate 800 samples from the bivariate normal distribution with mean [0, 0] and covariance matrix [[6, -3], [-3, 3.5]]. The expected variances of the first and second components of the sample are 6 and 3.5, respectively, and the expected correlation coefficient is -3/sqrt(6*3.5) ≈ -0.65465.
    
    >>> cov = np.array([[6, -3], [-3, 3.5]])
    >>> pts = rng.multivariate_normal([0, 0], cov, size=800)
    
Check that the mean, covariance, and correlation coefficient of the sample are close to the expected values:
    
    >>> pts.mean(axis=0)
    array([ 0.0326911 , -0.01280782])  # may vary
    >>> np.cov(pts.T)
    array([[ 5.96202397, -2.85602287],
           [-2.85602287,  3.47613949]])  # may vary
    >>> np.corrcoef(pts.T)[0, 1]
    -0.6273591314603949  # may vary
    
We can visualize this data with a scatter plot. The orientation of the point cloud illustrates the negative correlation of the components of this sample.
    
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(pts[:, 0], pts[:, 1], '.', alpha=0.5)
    >>> plt.axis('equal')
    >>> plt.grid()
    >>> plt.show()
    
# numpy.random.Generator.negative_binomial
method
random.Generator.negative_binomial(n, p, size=None)
    
Draw samples from a negative binomial distribution.
Samples are drawn from a negative binomial distribution with specified parameters, `n` successes and `p` probability of success where `n` is > 0 and `p` is in the interval (0, 1].
Parameters:
    
nfloat or array_like of floats
    
Parameter of the distribution, > 0.
pfloat or array_like of floats
    
Parameter of the distribution. Must satisfy 0 < p <= 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `n` and `p` are both scalars. Otherwise, `np.broadcast(n, p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized negative binomial distribution, where each sample is equal to N, the number of failures that occurred before a total of n successes was reached.
#### Notes
The probability mass function of the negative binomial distribution is
\\[P(N;n,p) = \frac{\Gamma(N+n)}{N!\Gamma(n)}p^{n}(1-p)^{N},\\]
where \\(n\\) is the number of successes, \\(p\\) is the probability of success, \\(N+n\\) is the number of trials, and \\(\Gamma\\) is the gamma function. When \\(n\\) is an integer, \\(\frac{\Gamma(N+n)}{N!\Gamma(n)} = \binom{N+n-1}{N}\\), which is the more common form of this term in the pmf. The negative binomial distribution gives the probability of N failures given n successes, with a success on the last trial.
If one throws a die repeatedly until the third time a “1” appears, then the probability distribution of the number of non-“1”s that appear before the third “1” is a negative binomial distribution.
Because this method internally calls `Generator.poisson` with an intermediate random value, a ValueError is raised when the choice of \\(n\\) and \\(p\\) would result in the mean + 10 sigma of the sampled intermediate distribution exceeding the max acceptable value of the `Generator.poisson` method. This happens when \\(p\\) is too low (a lot of failures happen for every success) and \\(n\\) is too big ( a lot of successes are allowed). Therefore, the \\(n\\) and \\(p\\) values must satisfy the constraint:
\\[n\frac{1-p}{p}+10n\sqrt{n}\frac{1-p}{p}<2^{63}-1-10\sqrt{2^{63}-1},\\]
Where the left side of the equation is the derived mean + 10 sigma of a sample from the gamma distribution internally used as the \\(lam\\) parameter of a poisson sample, and the right side of the equation is the constraint for maximum value of \\(lam\\) in `Generator.poisson`.
#### References
[1]
Weisstein, Eric W. “Negative Binomial Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/NegativeBinomialDistribution.html
[2]
Wikipedia, “Negative binomial distribution”, https://en.wikipedia.org/wiki/Negative_binomial_distribution
#### Examples
Draw samples from the distribution:
A real world example. A company drills wild-cat oil exploration wells, each with an estimated probability of success of 0.1. What is the probability of having one success for each successive well, that is what is the probability of a single success after drilling 5 wells, after 6 wells, etc.?
    
    >>> rng = np.random.default_rng()
    >>> s = rng.negative_binomial(1, 0.1, 100000)
    >>> for i in range(1, 11): 
    ...    probability = sum(s<i) / 100000.
    ...    print(i, "wells drilled, probability of one success =", probability)
    
# numpy.random.Generator.noncentral_chisquare
method
random.Generator.noncentral_chisquare(df, nonc, size=None)
    
Draw samples from a noncentral chi-square distribution.
The noncentral \\(\chi^2\\) distribution is a generalization of the \\(\chi^2\\) distribution.
Parameters:
    
dffloat or array_like of floats
    
Degrees of freedom, must be > 0.
noncfloat or array_like of floats
    
Non-centrality, must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` and `nonc` are both scalars. Otherwise, `np.broadcast(df, nonc).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized noncentral chi-square distribution.
#### Notes
The probability density function for the noncentral Chi-square distribution is
\\[P(x;df,nonc) = \sum^{\infty}_{i=0} \frac{e^{-nonc/2}(nonc/2)^{i}}{i!} P_{Y_{df+2i}}(x),\\]
where \\(Y_{q}\\) is the Chi-square with q degrees of freedom.
#### References
[1]
Wikipedia, “Noncentral chi-squared distribution” https://en.wikipedia.org/wiki/Noncentral_chi-squared_distribution
#### Examples
Draw values from the distribution and plot the histogram
    
    >>> rng = np.random.default_rng()
    >>> import matplotlib.pyplot as plt
    >>> values = plt.hist(rng.noncentral_chisquare(3, 20, 100000),
    ...                   bins=200, density=True)
    >>> plt.show()
    
Draw values from a noncentral chisquare with very small noncentrality, and compare to a chisquare.
    
    >>> plt.figure()
    >>> values = plt.hist(rng.noncentral_chisquare(3, .0000001, 100000),
    ...                   bins=np.arange(0., 25, .1), density=True)
    >>> values2 = plt.hist(rng.chisquare(3, 100000),
    ...                    bins=np.arange(0., 25, .1), density=True)
    >>> plt.plot(values[1][0:-1], values[0]-values2[0], 'ob')
    >>> plt.show()
    
Demonstrate how large values of non-centrality lead to a more symmetric distribution.
    
    >>> plt.figure()
    >>> values = plt.hist(rng.noncentral_chisquare(3, 20, 100000),
    ...                   bins=200, density=True)
    >>> plt.show()
    
# numpy.random.Generator.noncentral_f
method
random.Generator.noncentral_f(dfnum, dfden, nonc, size=None)
    
Draw samples from the noncentral F distribution.
Samples are drawn from an F distribution with specified parameters, `dfnum` (degrees of freedom in numerator) and `dfden` (degrees of freedom in denominator), where both parameters > 1\. `nonc` is the non-centrality parameter.
Parameters:
    
dfnumfloat or array_like of floats
    
Numerator degrees of freedom, must be > 0.
dfdenfloat or array_like of floats
    
Denominator degrees of freedom, must be > 0.
noncfloat or array_like of floats
    
Non-centrality parameter, the sum of the squares of the numerator means, must be >= 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `dfnum`, `dfden`, and `nonc` are all scalars. Otherwise, `np.broadcast(dfnum, dfden, nonc).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized noncentral Fisher distribution.
#### Notes
When calculating the power of an experiment (power = probability of rejecting the null hypothesis when a specific alternative is true) the non-central F statistic becomes important. When the null hypothesis is true, the F statistic follows a central F distribution. When the null hypothesis is not true, then it follows a non-central F statistic.
#### References
[1]
Weisstein, Eric W. “Noncentral F-Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/NoncentralF-Distribution.html
[2]
Wikipedia, “Noncentral F-distribution”, https://en.wikipedia.org/wiki/Noncentral_F-distribution
#### Examples
In a study, testing for a specific alternative to the null hypothesis requires use of the Noncentral F distribution. We need to calculate the area in the tail of the distribution that exceeds the value of the F distribution for the null hypothesis. We’ll plot the two probability distributions for comparison.
    
    >>> rng = np.random.default_rng()
    >>> dfnum = 3 # between group deg of freedom
    >>> dfden = 20 # within groups degrees of freedom
    >>> nonc = 3.0
    >>> nc_vals = rng.noncentral_f(dfnum, dfden, nonc, 1000000)
    >>> NF = np.histogram(nc_vals, bins=50, density=True)
    >>> c_vals = rng.f(dfnum, dfden, 1000000)
    >>> F = np.histogram(c_vals, bins=50, density=True)
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(F[1][1:], F[0])
    >>> plt.plot(NF[1][1:], NF[0])
    >>> plt.show()
    
# numpy.random.Generator.normal
method
random.Generator.normal(loc=0.0, scale=1.0, size=None)
    
Draw random samples from a normal (Gaussian) distribution.
The probability density function of the normal distribution, first derived by De Moivre and 200 years later by both Gauss and Laplace independently [2], is often called the bell curve because of its characteristic shape (see the example below).
The normal distributions occurs often in nature. For example, it describes the commonly occurring distribution of samples influenced by a large number of tiny, random disturbances, each with its own unique distribution [2].
Parameters:
    
locfloat or array_like of floats
    
Mean (“centre”) of the distribution.
scalefloat or array_like of floats
    
Standard deviation (spread or “width”) of the distribution. Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized normal distribution.
See also
`scipy.stats.norm`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability density for the Gaussian distribution is
\\[p(x) = \frac{1}{\sqrt{ 2 \pi \sigma^2 }} e^{ - \frac{ (x - \mu)^2 } {2 \sigma^2} },\\]
where \\(\mu\\) is the mean and \\(\sigma\\) the standard deviation. The square of the standard deviation, \\(\sigma^2\\), is called the variance.
The function has its peak at the mean, and its “spread” increases with the standard deviation (the function reaches 0.607 times its maximum at \\(x + \sigma\\) and \\(x - \sigma\\) [2]). This implies that `normal` is more likely to return samples lying close to the mean, rather than those far away.
#### References
[1]
Wikipedia, “Normal distribution”, https://en.wikipedia.org/wiki/Normal_distribution
[2] (1,2,3)
P. R. Peebles Jr., “Central Limit Theorem” in “Probability, Random Variables and Random Signal Principles”, 4th ed., 2001, pp. 51, 51, 125.
#### Examples
Draw samples from the distribution:
    
    >>> mu, sigma = 0, 0.1 # mean and standard deviation
    >>> rng = np.random.default_rng()
    >>> s = rng.normal(mu, sigma, 1000)
    
Verify the mean and the standard deviation:
    
    >>> abs(mu - np.mean(s))
    0.0  # may vary
    
    
    >>> abs(sigma - np.std(s, ddof=1))
    0.0  # may vary
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 30, density=True)
    >>> plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
    ...                np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
    ...          linewidth=2, color='r')
    >>> plt.show()
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> rng = np.random.default_rng()
    >>> rng.normal(3, 2.5, size=(2, 4))
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.Generator.pareto
method
random.Generator.pareto(a, size=None)
    
Draw samples from a Pareto II (AKA Lomax) distribution with specified shape.
Parameters:
    
afloat or array_like of floats
    
Shape of the distribution. Must be positive.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the Pareto II distribution.
See also
`scipy.stats.pareto`
    
Pareto I distribution
`scipy.stats.lomax`
    
Lomax (Pareto II) distribution
`scipy.stats.genpareto`
    
Generalized Pareto distribution
#### Notes
The probability density for the Pareto II distribution is
\\[p(x) = \frac{a}{{x+1}^{a+1}} , x \ge 0\\]
where \\(a > 0\\) is the shape.
The Pareto II distribution is a shifted and scaled version of the Pareto I distribution, which can be found in `scipy.stats.pareto`.
#### References
[1]
Francis Hunt and Paul Johnson, On the Pareto Distribution of Sourceforge projects.
[2]
Pareto, V. (1896). Course of Political Economy. Lausanne.
[3]
Reiss, R.D., Thomas, M.(2001), Statistical Analysis of Extreme Values, Birkhauser Verlag, Basel, pp 23-30.
[4]
Wikipedia, “Pareto distribution”, https://en.wikipedia.org/wiki/Pareto_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a = 3.
    >>> rng = np.random.default_rng()
    >>> s = rng.pareto(a, 10000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.linspace(0, 3, 50)
    >>> pdf = a / (x+1)**(a+1)
    >>> plt.hist(s, bins=x, density=True, label='histogram')
    >>> plt.plot(x, pdf, linewidth=2, color='r', label='pdf')
    >>> plt.xlim(x.min(), x.max())
    >>> plt.legend()
    >>> plt.show()
    
# numpy.random.Generator.permutation
method
random.Generator.permutation(x, axis=0)
    
Randomly permute a sequence, or return a permuted range.
Parameters:
    
xint or array_like
    
If `x` is an integer, randomly permute `np.arange(x)`. If `x` is an array, make a copy and shuffle the elements randomly.
axisint, optional
    
The axis which `x` is shuffled along. Default is 0.
Returns:
    
outndarray
    
Permuted sequence or array range.
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> rng.permutation(10)
    array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6]) # random
    
    
    >>> rng.permutation([1, 4, 9, 12, 15])
    array([15,  1,  9,  4, 12]) # random
    
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> rng.permutation(arr)
    array([[6, 7, 8], # random
           [0, 1, 2],
           [3, 4, 5]])
    
    
    >>> rng.permutation("abc")
    Traceback (most recent call last):
        ...
    numpy.exceptions.AxisError: axis 0 is out of bounds for array of dimension 0
    
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> rng.permutation(arr, axis=1)
    array([[0, 2, 1], # random
           [3, 5, 4],
           [6, 8, 7]])
    
# numpy.random.Generator.permuted
method
random.Generator.permuted(x, axis=None, out=None)
    
Randomly permute `x` along axis `axis`.
Unlike `shuffle`, each slice along the given axis is shuffled independently of the others.
Parameters:
    
xarray_like, at least one-dimensional
    
Array to be shuffled.
axisint, optional
    
Slices of `x` in this axis are shuffled. Each slice is shuffled independently of the others. If `axis` is None, the flattened array is shuffled.
outndarray, optional
    
If given, this is the destination of the shuffled array. If `out` is None, a shuffled copy of the array is returned.
Returns:
    
ndarray
    
If `out` is None, a shuffled copy of `x` is returned. Otherwise, the shuffled array is stored in `out`, and `out` is returned
See also
`shuffle`
`permutation`
#### Notes
An important distinction between methods `shuffle` and `permuted` is how they both treat the `axis` parameter which can be found at Handling the axis parameter.
#### Examples
Create a `numpy.random.Generator` instance:
    
    >>> rng = np.random.default_rng()
    
Create a test array:
    
    >>> x = np.arange(24).reshape(3, 8)
    >>> x
    array([[ 0,  1,  2,  3,  4,  5,  6,  7],
           [ 8,  9, 10, 11, 12, 13, 14, 15],
           [16, 17, 18, 19, 20, 21, 22, 23]])
    
Shuffle the rows of `x`:
    
    >>> y = rng.permuted(x, axis=1)
    >>> y
    array([[ 4,  3,  6,  7,  1,  2,  5,  0],  # random
           [15, 10, 14,  9, 12, 11,  8, 13],
           [17, 16, 20, 21, 18, 22, 23, 19]])
    
`x` has not been modified:
    
    >>> x
    array([[ 0,  1,  2,  3,  4,  5,  6,  7],
           [ 8,  9, 10, 11, 12, 13, 14, 15],
           [16, 17, 18, 19, 20, 21, 22, 23]])
    
To shuffle the rows of `x` in-place, pass `x` as the `out` parameter:
    
    >>> y = rng.permuted(x, axis=1, out=x)
    >>> x
    array([[ 3,  0,  4,  7,  1,  6,  2,  5],  # random
           [ 8, 14, 13,  9, 12, 11, 15, 10],
           [17, 18, 16, 22, 19, 23, 20, 21]])
    
Note that when the `out` parameter is given, the return value is `out`:
    
    >>> y is x
    True
    
# numpy.random.Generator.poisson
method
random.Generator.poisson(lam=1.0, size=None)
    
Draw samples from a Poisson distribution.
The Poisson distribution is the limit of the binomial distribution for large N.
Parameters:
    
lamfloat or array_like of floats
    
Expected number of events occurring in a fixed-time interval, must be >= 0. A sequence must be broadcastable over the requested size.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `lam` is a scalar. Otherwise, `np.array(lam).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Poisson distribution.
#### Notes
The probability mass function (PMF) of Poisson distribution is
\\[f(k; \lambda)=\frac{\lambda^k e^{-\lambda}}{k!}\\]
For events with an expected separation \\(\lambda\\) the Poisson distribution \\(f(k; \lambda)\\) describes the probability of \\(k\\) events occurring within the observed interval \\(\lambda\\).
Because the output is limited to the range of the C int64 type, a ValueError is raised when `lam` is within 10 sigma of the maximum representable value.
#### References
[1]
Weisstein, Eric W. “Poisson Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/PoissonDistribution.html
[2]
Wikipedia, “Poisson distribution”, https://en.wikipedia.org/wiki/Poisson_distribution
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> lam, size = 5, 10000
    >>> s = rng.poisson(lam=lam, size=size)
    
Verify the mean and variance, which should be approximately `lam`:
    
    >>> s.mean(), s.var()
    (4.9917 5.1088311)  # may vary
    
Display the histogram and probability mass function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy import stats
    >>> x = np.arange(0, 21)
    >>> pmf = stats.poisson.pmf(x, mu=lam)
    >>> plt.hist(s, bins=x, density=True, width=0.5)
    >>> plt.stem(x, pmf, 'C1-')
    >>> plt.show()
    
Draw each 100 values for lambda 100 and 500:
    
    >>> s = rng.poisson(lam=(100., 500.), size=(100, 2))
    
# numpy.random.Generator.power
method
random.Generator.power(a, size=None)
    
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.
Also known as the power function distribution.
Parameters:
    
afloat or array_like of floats
    
Parameter of the distribution. Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized power distribution.
Raises:
    
ValueError
    
If a <= 0.
#### Notes
The probability density function is
\\[P(x; a) = ax^{a-1}, 0 \le x \le 1, a>0.\\]
The power function distribution is just the inverse of the Pareto distribution. It may also be seen as a special case of the Beta distribution.
It is used, for example, in modeling the over-reporting of insurance claims.
#### References
[1]
Christian Kleiber, Samuel Kotz, “Statistical size distributions in economics and actuarial sciences”, Wiley, 2003.
[2]
Heckert, N. A. and Filliben, James J. “NIST Handbook 148: Dataplot Reference Manual, Volume 2: Let Subcommands and Library Functions”, National Institute of Standards and Technology Handbook Series, June 2003. https://www.itl.nist.gov/div898/software/dataplot/refman2/auxillar/powpdf.pdf
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> a = 5. # shape
    >>> samples = 1000
    >>> s = rng.power(a, samples)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, bins=30)
    >>> x = np.linspace(0, 1, 100)
    >>> y = a*x**(a-1.)
    >>> normed_y = samples*np.diff(bins)[0]*y
    >>> plt.plot(x, normed_y)
    >>> plt.show()
    
Compare the power function distribution to the inverse of the Pareto.
    
    >>> from scipy import stats  
    >>> rvs = rng.power(5, 1000000)
    >>> rvsp = rng.pareto(5, 1000000)
    >>> xx = np.linspace(0,1,100)
    >>> powpdf = stats.powerlaw.pdf(xx,5)  
    
    
    >>> plt.figure()
    >>> plt.hist(rvs, bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('power(5)')
    
    
    >>> plt.figure()
    >>> plt.hist(1./(1.+rvsp), bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('inverse of 1 + Generator.pareto(5)')
    
    
    >>> plt.figure()
    >>> plt.hist(1./(1.+rvsp), bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('inverse of stats.pareto(5)')
    
# numpy.random.Generator.random
method
random.Generator.random(size=None, dtype=np.float64, out=None)
    
Return random floats in the half-open interval [0.0, 1.0).
Results are from the “continuous uniform” distribution over the stated interval. To sample \\(Unif[a, b), b > a\\) use `uniform` or multiply the output of `random` by `(b - a)` and add `a`:
    
    (b - a) * random() + a
    
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
dtypedtype, optional
    
Desired dtype of the result, only `float64` and `float32` are supported. Byteorder must be native. The default value is np.float64.
outndarray, optional
    
Alternative output array in which to place the result. If size is not None, it must have the same shape as the provided size and must match the type of the output values.
Returns:
    
outfloat or ndarray of floats
    
Array of random floats of shape `size` (unless `size=None`, in which case a single float is returned).
See also
`uniform`
    
Draw samples from the parameterized uniform distribution.
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> rng.random()
    0.47108547995356098 # random
    >>> type(rng.random())
    <class 'float'>
    >>> rng.random((5,))
    array([ 0.30220482,  0.86820401,  0.1654503 ,  0.11659149,  0.54323428]) # random
    
Three-by-two array of random numbers from [-5, 0):
    
    >>> 5 * rng.random((3, 2)) - 5
    array([[-3.99149989, -0.52338984], # random
           [-2.99091858, -0.79479508],
           [-1.23204345, -1.75224494]])
    
# numpy.random.Generator.rayleigh
method
random.Generator.rayleigh(scale=1.0, size=None)
    
Draw samples from a Rayleigh distribution.
The \\(\chi\\) and Weibull distributions are generalizations of the Rayleigh.
Parameters:
    
scalefloat or array_like of floats, optional
    
Scale, also equals the mode. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `scale` is a scalar. Otherwise, `np.array(scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Rayleigh distribution.
#### Notes
The probability density function for the Rayleigh distribution is
\\[P(x;scale) = \frac{x}{scale^2}e^{\frac{-x^2}{2 \cdotp scale^2}}\\]
The Rayleigh distribution would arise, for example, if the East and North components of the wind velocity had identical zero-mean Gaussian distributions. Then the wind speed would have a Rayleigh distribution.
#### References
[1]
Brighton Webs Ltd., “Rayleigh Distribution,” https://web.archive.org/web/20090514091424/http://brighton-webs.co.uk:80/distributions/rayleigh.asp
[2]
Wikipedia, “Rayleigh distribution” https://en.wikipedia.org/wiki/Rayleigh_distribution
#### Examples
Draw values from the distribution and plot the histogram
    
    >>> from matplotlib.pyplot import hist
    >>> rng = np.random.default_rng()
    >>> values = hist(rng.rayleigh(3, 100000), bins=200, density=True)
    
Wave heights tend to follow a Rayleigh distribution. If the mean wave height is 1 meter, what fraction of waves are likely to be larger than 3 meters?
    
    >>> meanvalue = 1
    >>> modevalue = np.sqrt(2 / np.pi) * meanvalue
    >>> s = rng.rayleigh(modevalue, 1000000)
    
The percentage of waves larger than 3 meters is:
    
    >>> 100.*sum(s>3)/1000000.
    0.087300000000000003 # random
    
# numpy.random.Generator.shuffle
method
random.Generator.shuffle(x, axis=0)
    
Modify an array or sequence in-place by shuffling its contents.
The order of sub-arrays is changed but their contents remains the same.
Parameters:
    
xndarray or MutableSequence
    
The array, list or mutable sequence to be shuffled.
axisint, optional
    
The axis which `x` is shuffled along. Default is 0. It is only supported on `ndarray` objects.
Returns:
    
None
See also
`permuted`
`permutation`
#### Notes
An important distinction between methods `shuffle` and `permuted` is how they both treat the `axis` parameter which can be found at Handling the axis parameter.
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> arr = np.arange(10)
    >>> arr
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> rng.shuffle(arr)
    >>> arr
    array([2, 0, 7, 5, 1, 4, 8, 9, 3, 6]) # random
    
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> arr
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> rng.shuffle(arr)
    >>> arr
    array([[3, 4, 5], # random
           [6, 7, 8],
           [0, 1, 2]])
    
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> arr
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> rng.shuffle(arr, axis=1)
    >>> arr
    array([[2, 0, 1], # random
           [5, 3, 4],
           [8, 6, 7]])
    
# numpy.random.Generator.spawn
method
random.Generator.spawn(n_children)
    
Create new independent child generators.
See SeedSequence spawning for additional notes on spawning children.
New in version 1.25.0.
Parameters:
    
n_childrenint
Returns:
    
child_generatorslist of Generators
Raises:
    
TypeError
    
When the underlying SeedSequence does not implement spawning.
See also
`random.BitGenerator.spawn`, `random.SeedSequence.spawn`
    
Equivalent method on the bit generator and seed sequence.
`bit_generator`
    
The bit generator instance used by the generator.
#### Examples
Starting from a seeded default generator:
    
    >>> # High quality entropy created with: f"0x{secrets.randbits(128):x}"
    >>> entropy = 0x3034c61a9ae04ff8cb62ab8ec2c4b501
    >>> rng = np.random.default_rng(entropy)
    
Create two new generators for example for parallel execution:
    
    >>> child_rng1, child_rng2 = rng.spawn(2)
    
Drawn numbers from each are independent but derived from the initial seeding entropy:
    
    >>> rng.uniform(), child_rng1.uniform(), child_rng2.uniform()
    (0.19029263503854454, 0.9475673279178444, 0.4702687338396767)
    
It is safe to spawn additional children from the original `rng` or the children:
    
    >>> more_child_rngs = rng.spawn(20)
    >>> nested_spawn = child_rng1.spawn(20)
    
# numpy.random.Generator.standard_cauchy
method
random.Generator.standard_cauchy(size=None)
    
Draw samples from a standard Cauchy distribution with mode = 0.
Also known as the Lorentz distribution.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
samplesndarray or scalar
    
The drawn samples.
#### Notes
The probability density function for the full Cauchy distribution is
\\[P(x; x_0, \gamma) = \frac{1}{\pi \gamma \bigl[ 1+ (\frac{x-x_0}{\gamma})^2 \bigr] }\\]
and the Standard Cauchy distribution just sets \\(x_0=0\\) and \\(\gamma=1\\)
The Cauchy distribution arises in the solution to the driven harmonic oscillator problem, and also describes spectral line broadening. It also describes the distribution of values at which a line tilted at a random angle will cut the x axis.
When studying hypothesis tests that assume normality, seeing how the tests perform on data from a Cauchy distribution is a good indicator of their sensitivity to a heavy-tailed distribution, since the Cauchy looks very much like a Gaussian distribution, but with heavier tails.
#### References
[1]
NIST/SEMATECH e-Handbook of Statistical Methods, “Cauchy Distribution”, https://www.itl.nist.gov/div898/handbook/eda/section3/eda3663.htm
[2]
Weisstein, Eric W. “Cauchy Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/CauchyDistribution.html
[3]
Wikipedia, “Cauchy distribution” https://en.wikipedia.org/wiki/Cauchy_distribution
#### Examples
Draw samples and plot the distribution:
    
    >>> import matplotlib.pyplot as plt
    >>> rng = np.random.default_rng()
    >>> s = rng.standard_cauchy(1000000)
    >>> s = s[(s>-25) & (s<25)]  # truncate distribution so it plots well
    >>> plt.hist(s, bins=100)
    >>> plt.show()
    
# numpy.random.Generator.standard_exponential
method
random.Generator.standard_exponential(size=None, dtype=np.float64, method='zig', out=None)
    
Draw samples from the standard exponential distribution.
`standard_exponential` is identical to the exponential distribution with a scale parameter of 1.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
dtypedtype, optional
    
Desired dtype of the result, only `float64` and `float32` are supported. Byteorder must be native. The default value is np.float64.
methodstr, optional
    
Either ‘inv’ or ‘zig’. ‘inv’ uses the default inverse CDF method. ‘zig’ uses the much faster Ziggurat method of Marsaglia and Tsang.
outndarray, optional
    
Alternative output array in which to place the result. If size is not None, it must have the same shape as the provided size and must match the type of the output values.
Returns:
    
outfloat or ndarray
    
Drawn samples.
#### Examples
Output a 3x8000 array:
    
    >>> rng = np.random.default_rng()
    >>> n = rng.standard_exponential((3, 8000))
    
# numpy.random.Generator.standard_gamma
method
random.Generator.standard_gamma(shape, size=None, dtype=np.float64, out=None)
    
Draw samples from a standard Gamma distribution.
Samples are drawn from a Gamma distribution with specified parameters, shape (sometimes designated “k”) and scale=1.
Parameters:
    
shapefloat or array_like of floats
    
Parameter, must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `shape` is a scalar. Otherwise, `np.array(shape).size` samples are drawn.
dtypedtype, optional
    
Desired dtype of the result, only `float64` and `float32` are supported. Byteorder must be native. The default value is np.float64.
outndarray, optional
    
Alternative output array in which to place the result. If size is not None, it must have the same shape as the provided size and must match the type of the output values.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized standard gamma distribution.
See also
`scipy.stats.gamma`
    
probability density function, distribution or cumulative density function, etc.
#### Notes
The probability density for the Gamma distribution is
\\[p(x) = x^{k-1}\frac{e^{-x/\theta}}{\theta^k\Gamma(k)},\\]
where \\(k\\) is the shape and \\(\theta\\) the scale, and \\(\Gamma\\) is the Gamma function.
The Gamma distribution is often used to model the times to failure of electronic components, and arises naturally in processes for which the waiting times between Poisson distributed events are relevant.
#### References
[1]
Weisstein, Eric W. “Gamma Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/GammaDistribution.html
[2]
Wikipedia, “Gamma distribution”, https://en.wikipedia.org/wiki/Gamma_distribution
#### Examples
Draw samples from the distribution:
    
    >>> shape, scale = 2., 1. # mean and width
    >>> rng = np.random.default_rng()
    >>> s = rng.standard_gamma(shape, 1000000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.special as sps  
    >>> count, bins, _ = plt.hist(s, 50, density=True)
    >>> y = bins**(shape-1) * ((np.exp(-bins/scale))/  
    ...                       (sps.gamma(shape) * scale**shape))
    >>> plt.plot(bins, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.Generator.standard_normal
method
random.Generator.standard_normal(size=None, dtype=np.float64, out=None)
    
Draw samples from a standard Normal distribution (mean=0, stdev=1).
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
dtypedtype, optional
    
Desired dtype of the result, only `float64` and `float32` are supported. Byteorder must be native. The default value is np.float64.
outndarray, optional
    
Alternative output array in which to place the result. If size is not None, it must have the same shape as the provided size and must match the type of the output values.
Returns:
    
outfloat or ndarray
    
A floating-point array of shape `size` of drawn samples, or a single sample if `size` was not specified.
See also
`normal`
    
Equivalent function with additional `loc` and `scale` arguments for setting the mean and standard deviation.
#### Notes
For random samples from the normal distribution with mean `mu` and standard deviation `sigma`, use one of:
    
    mu + sigma * rng.standard_normal(size=...)
    rng.normal(mu, sigma, size=...)
    
#### Examples
    
    >>> rng = np.random.default_rng()
    >>> rng.standard_normal()
    2.1923875335537315 # random
    
    
    >>> s = rng.standard_normal(8000)
    >>> s
    array([ 0.6888893 ,  0.78096262, -0.89086505, ...,  0.49876311,  # random
           -0.38672696, -0.4685006 ])                                # random
    >>> s.shape
    (8000,)
    >>> s = rng.standard_normal(size=(3, 4, 2))
    >>> s.shape
    (3, 4, 2)
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> 3 + 2.5 * rng.standard_normal(size=(2, 4))
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.Generator.standard_t
method
random.Generator.standard_t(df, size=None)
    
Draw samples from a standard Student’s t distribution with `df` degrees of freedom.
A special case of the hyperbolic distribution. As `df` gets large, the result resembles that of the standard normal distribution (`standard_normal`).
Parameters:
    
dffloat or array_like of floats
    
Degrees of freedom, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` is a scalar. Otherwise, `np.array(df).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized standard Student’s t distribution.
#### Notes
The probability density function for the t distribution is
\\[P(x, df) = \frac{\Gamma(\frac{df+1}{2})}{\sqrt{\pi df} \Gamma(\frac{df}{2})}\Bigl( 1+\frac{x^2}{df} \Bigr)^{-(df+1)/2}\\]
The t test is based on an assumption that the data come from a Normal distribution. The t test provides a way to test whether the sample mean (that is the mean calculated from the data) is a good estimate of the true mean.
The derivation of the t-distribution was first published in 1908 by William Gosset while working for the Guinness Brewery in Dublin. Due to proprietary issues, he had to publish under a pseudonym, and so he used the name Student.
#### References
[1]
Dalgaard, Peter, “Introductory Statistics With R”, Springer, 2002.
[2]
Wikipedia, “Student’s t-distribution” https://en.wikipedia.org/wiki/Student’s_t-distribution
#### Examples
From Dalgaard page 83 [1], suppose the daily energy intake for 11 women in kilojoules (kJ) is:
    
    >>> intake = np.array([5260., 5470, 5640, 6180, 6390, 6515, 6805, 7515, \
    ...                    7515, 8230, 8770])
    
Does their energy intake deviate systematically from the recommended value of 7725 kJ? Our null hypothesis will be the absence of deviation, and the alternate hypothesis will be the presence of an effect that could be either positive or negative, hence making our test 2-tailed.
Because we are estimating the mean and we have N=11 values in our sample, we have N-1=10 degrees of freedom. We set our significance level to 95% and compute the t statistic using the empirical mean and empirical standard deviation of our intake. We use a ddof of 1 to base the computation of our empirical standard deviation on an unbiased estimate of the variance (note: the final estimate is not unbiased due to the concave nature of the square root).
    
    >>> np.mean(intake)
    6753.636363636364
    >>> intake.std(ddof=1)
    1142.1232221373727
    >>> t = (np.mean(intake)-7725)/(intake.std(ddof=1)/np.sqrt(len(intake)))
    >>> t
    -2.8207540608310198
    
We draw 1000000 samples from Student’s t distribution with the adequate degrees of freedom.
    
    >>> import matplotlib.pyplot as plt
    >>> rng = np.random.default_rng()
    >>> s = rng.standard_t(10, size=1000000)
    >>> h = plt.hist(s, bins=100, density=True)
    
Does our t statistic land in one of the two critical regions found at both tails of the distribution?
    
    >>> np.sum(np.abs(t) < np.abs(s)) / float(len(s))
    0.018318  #random < 0.05, statistic is in critical region
    
The probability value for this 2-tailed test is about 1.83%, which is lower than the 5% pre-determined significance threshold.
Therefore, the probability of observing values as extreme as our intake conditionally on the null hypothesis being true is too low, and we reject the null hypothesis of no deviation.
# numpy.random.Generator.triangular
method
random.Generator.triangular(left, mode, right, size=None)
    
Draw samples from the triangular distribution over the interval `[left, right]`.
The triangular distribution is a continuous probability distribution with lower limit left, peak at mode, and upper limit right. Unlike the other distributions, these parameters directly define the shape of the pdf.
Parameters:
    
leftfloat or array_like of floats
    
Lower limit.
modefloat or array_like of floats
    
The value where the peak of the distribution occurs. The value must fulfill the condition `left <= mode <= right`.
rightfloat or array_like of floats
    
Upper limit, must be larger than `left`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `left`, `mode`, and `right` are all scalars. Otherwise, `np.broadcast(left, mode, right).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized triangular distribution.
#### Notes
The probability density function for the triangular distribution is
\\[\begin{split}P(x;l, m, r) = \begin{cases} \frac{2(x-l)}{(r-l)(m-l)}& \text{for $l \leq x \leq m$},\\\ \frac{2(r-x)}{(r-l)(r-m)}& \text{for $m \leq x \leq r$},\\\ 0& \text{otherwise}. \end{cases}\end{split}\\]
The triangular distribution is often used in ill-defined problems where the underlying distribution is not known, but some knowledge of the limits and mode exists. Often it is used in simulations.
#### References
[1]
Wikipedia, “Triangular distribution” https://en.wikipedia.org/wiki/Triangular_distribution
#### Examples
Draw values from the distribution and plot the histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> rng = np.random.default_rng()
    >>> h = plt.hist(rng.triangular(-3, 0, 8, 100000), bins=200,
    ...              density=True)
    >>> plt.show()
    
# numpy.random.Generator.uniform
method
random.Generator.uniform(low=0.0, high=1.0, size=None)
    
Draw samples from a uniform distribution.
Samples are uniformly distributed over the half-open interval `[low, high)` (includes low, but excludes high). In other words, any value within the given interval is equally likely to be drawn by `uniform`.
Parameters:
    
lowfloat or array_like of floats, optional
    
Lower boundary of the output interval. All values generated will be greater than or equal to low. The default value is 0.
highfloat or array_like of floats
    
Upper boundary of the output interval. All values generated will be less than high. The high limit may be included in the returned array of floats due to floating-point rounding in the equation `low + (high-low) * random_sample()`. high - low must be non-negative. The default value is 1.0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `low` and `high` are both scalars. Otherwise, `np.broadcast(low, high).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized uniform distribution.
See also
`integers`
    
Discrete uniform distribution, yielding integers.
`random`
    
Floats uniformly distributed over `[0, 1)`.
#### Notes
The probability density function of the uniform distribution is
\\[p(x) = \frac{1}{b - a}\\]
anywhere within the interval `[a, b)`, and zero elsewhere.
When `high` == `low`, values of `low` will be returned.
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> s = rng.uniform(-1,0,1000)
    
All values are within the given interval:
    
    >>> np.all(s >= -1)
    True
    >>> np.all(s < 0)
    True
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 15, density=True)
    >>> plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
    >>> plt.show()
    
# numpy.random.Generator.vonmises
method
random.Generator.vonmises(mu, kappa, size=None)
    
Draw samples from a von Mises distribution.
Samples are drawn from a von Mises distribution with specified mode (mu) and concentration (kappa), on the interval [-pi, pi].
The von Mises distribution (also known as the circular normal distribution) is a continuous probability distribution on the unit circle. It may be thought of as the circular analogue of the normal distribution.
Parameters:
    
mufloat or array_like of floats
    
Mode (“center”) of the distribution.
kappafloat or array_like of floats
    
Concentration of the distribution, has to be >=0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mu` and `kappa` are both scalars. Otherwise, `np.broadcast(mu, kappa).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized von Mises distribution.
See also
`scipy.stats.vonmises`
    
probability density function, distribution, or cumulative density function, etc.
#### Notes
The probability density for the von Mises distribution is
\\[p(x) = \frac{e^{\kappa cos(x-\mu)}}{2\pi I_0(\kappa)},\\]
where \\(\mu\\) is the mode and \\(\kappa\\) the concentration, and \\(I_0(\kappa)\\) is the modified Bessel function of order 0.
The von Mises is named for Richard Edler von Mises, who was born in Austria-Hungary, in what is now the Ukraine. He fled to the United States in 1939 and became a professor at Harvard. He worked in probability theory, aerodynamics, fluid mechanics, and philosophy of science.
#### References
[1]
Abramowitz, M. and Stegun, I. A. (Eds.). “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing,” New York: Dover, 1972.
[2]
von Mises, R., “Mathematical Theory of Probability and Statistics”, New York: Academic Press, 1964.
#### Examples
Draw samples from the distribution:
    
    >>> mu, kappa = 0.0, 4.0 # mean and concentration
    >>> rng = np.random.default_rng()
    >>> s = rng.vonmises(mu, kappa, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.special import i0  
    >>> plt.hist(s, 50, density=True)
    >>> x = np.linspace(-np.pi, np.pi, num=51)
    >>> y = np.exp(kappa*np.cos(x-mu))/(2*np.pi*i0(kappa))  
    >>> plt.plot(x, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.Generator.wald
method
random.Generator.wald(mean, scale, size=None)
    
Draw samples from a Wald, or inverse Gaussian, distribution.
As the scale approaches infinity, the distribution becomes more like a Gaussian. Some references claim that the Wald is an inverse Gaussian with mean equal to 1, but this is by no means universal.
The inverse Gaussian distribution was first studied in relationship to Brownian motion. In 1956 M.C.K. Tweedie used the name inverse Gaussian because there is an inverse relationship between the time to cover a unit distance and distance covered in unit time.
Parameters:
    
meanfloat or array_like of floats
    
Distribution mean, must be > 0.
scalefloat or array_like of floats
    
Scale parameter, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mean` and `scale` are both scalars. Otherwise, `np.broadcast(mean, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Wald distribution.
#### Notes
The probability density function for the Wald distribution is
\\[P(x;mean,scale) = \sqrt{\frac{scale}{2\pi x^3}}e^ \frac{-scale(x-mean)^2}{2\cdotp mean^2x}\\]
As noted above the inverse Gaussian distribution first arise from attempts to model Brownian motion. It is also a competitor to the Weibull for use in reliability modeling and modeling stock returns and interest rate processes.
#### References
[1]
Brighton Webs Ltd., Wald Distribution, https://web.archive.org/web/20090423014010/http://www.brighton-webs.co.uk:80/distributions/wald.asp
[2]
Chhikara, Raj S., and Folks, J. Leroy, “The Inverse Gaussian Distribution: Theory : Methodology, and Applications”, CRC Press, 1988.
[3]
Wikipedia, “Inverse Gaussian distribution” https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution
#### Examples
Draw values from the distribution and plot the histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> rng = np.random.default_rng()
    >>> h = plt.hist(rng.wald(3, 2, 100000), bins=200, density=True)
    >>> plt.show()
    
# numpy.random.Generator.weibull
method
random.Generator.weibull(a, size=None)
    
Draw samples from a Weibull distribution.
Draw samples from a 1-parameter Weibull distribution with the given shape parameter `a`.
\\[X = (-ln(U))^{1/a}\\]
Here, U is drawn from the uniform distribution over (0,1].
The more common 2-parameter Weibull, including a scale parameter \\(\lambda\\) is just \\(X = \lambda(-ln(U))^{1/a}\\).
Parameters:
    
afloat or array_like of floats
    
Shape parameter of the distribution. Must be nonnegative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Weibull distribution.
See also
`scipy.stats.weibull_max`
`scipy.stats.weibull_min`
`scipy.stats.genextreme`
`gumbel`
#### Notes
The Weibull (or Type III asymptotic extreme value distribution for smallest values, SEV Type III, or Rosin-Rammler distribution) is one of a class of Generalized Extreme Value (GEV) distributions used in modeling extreme value problems. This class includes the Gumbel and Frechet distributions.
The probability density for the Weibull distribution is
\\[p(x) = \frac{a} {\lambda}(\frac{x}{\lambda})^{a-1}e^{-(x/\lambda)^a},\\]
where \\(a\\) is the shape and \\(\lambda\\) the scale.
The function has its peak (the mode) at \\(\lambda(\frac{a-1}{a})^{1/a}\\).
When `a = 1`, the Weibull distribution reduces to the exponential distribution.
#### References
[1]
Waloddi Weibull, Royal Technical University, Stockholm, 1939 “A Statistical Theory Of The Strength Of Materials”, Ingeniorsvetenskapsakademiens Handlingar Nr 151, 1939, Generalstabens Litografiska Anstalts Forlag, Stockholm.
[2]
Waloddi Weibull, “A Statistical Distribution Function of Wide Applicability”, Journal Of Applied Mechanics ASME Paper 1951.
[3]
Wikipedia, “Weibull distribution”, https://en.wikipedia.org/wiki/Weibull_distribution
#### Examples
Draw samples from the distribution:
    
    >>> rng = np.random.default_rng()
    >>> a = 5. # shape
    >>> s = rng.weibull(a, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> def weibull(x, n, a):
    ...     return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)
    >>> count, bins, _ = plt.hist(rng.weibull(5., 1000))
    >>> x = np.linspace(0, 2, 1000)
    >>> bin_spacing = np.mean(np.diff(bins))
    >>> plt.plot(x, weibull(x, 1., 5.) * bin_spacing * s.size, label='Weibull PDF')
    >>> plt.legend()
    >>> plt.show()
    
# numpy.random.Generator.zipf
method
random.Generator.zipf(a, size=None)
    
Draw samples from a Zipf distribution.
Samples are drawn from a Zipf distribution with specified parameter `a` > 1.
The Zipf distribution (also known as the zeta distribution) is a discrete probability distribution that satisfies Zipf’s law: the frequency of an item is inversely proportional to its rank in a frequency table.
Parameters:
    
afloat or array_like of floats
    
Distribution parameter. Must be greater than 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Zipf distribution.
See also
`scipy.stats.zipf`
    
probability density function, distribution, or cumulative density function, etc.
#### Notes
The probability mass function (PMF) for the Zipf distribution is
\\[p(k) = \frac{k^{-a}}{\zeta(a)},\\]
for integers \\(k \geq 1\\), where \\(\zeta\\) is the Riemann Zeta function.
It is named for the American linguist George Kingsley Zipf, who noted that the frequency of any word in a sample of a language is inversely proportional to its rank in the frequency table.
#### References
[1]
Zipf, G. K., “Selected Studies of the Principle of Relative Frequency in Language,” Cambridge, MA: Harvard Univ. Press, 1932.
#### Examples
Draw samples from the distribution:
    
    >>> a = 4.0
    >>> n = 20000
    >>> rng = np.random.default_rng()
    >>> s = rng.zipf(a, size=n)
    
Display the histogram of the samples, along with the expected histogram based on the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.special import zeta  
    
`bincount` provides a fast histogram for small integers.
    
    >>> count = np.bincount(s)
    >>> k = np.arange(1, s.max() + 1)
    
    
    >>> plt.bar(k, count[1:], alpha=0.5, label='sample count')
    >>> plt.plot(k, n*(k**-a)/zeta(a), 'k.-', alpha=0.5,
    ...          label='expected count')   
    >>> plt.semilogy()
    >>> plt.grid(alpha=0.4)
    >>> plt.legend()
    >>> plt.title(f'Zipf sample, a={a}, size={n}')
    >>> plt.show()
    
# numpy.random.geometric
random.geometric(p, size=None)
    
Draw samples from the geometric distribution.
Bernoulli trials are experiments with one of two outcomes: success or failure (an example of such an experiment is flipping a coin). The geometric distribution models the number of trials that must be run in order to achieve success. It is therefore supported on the positive integers, `k = 1, 2, ...`.
The probability mass function of the geometric distribution is
\\[f(k) = (1 - p)^{k - 1} p\\]
where `p` is the probability of success of an individual trial.
Note
New code should use the `geometric` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
pfloat or array_like of floats
    
The probability of success of an individual trial.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `p` is a scalar. Otherwise, `np.array(p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized geometric distribution.
See also
`random.Generator.geometric`
    
which should be used for new code.
#### Examples
Draw ten thousand values from the geometric distribution, with the probability of an individual success equal to 0.35:
    
    >>> z = np.random.geometric(p=0.35, size=10000)
    
How many trials succeeded after a single run?
    
    >>> (z == 1).sum() / 10000.
    0.34889999999999999 #random
    
# numpy.random.get_state
random.get_state(legacy=True)
    
Return a tuple representing the internal state of the generator.
For more details, see `set_state`.
Parameters:
    
legacybool, optional
    
Flag indicating to return a legacy tuple state when the BitGenerator is MT19937, instead of a dict. Raises ValueError if the underlying bit generator is not an instance of MT19937.
Returns:
    
out{tuple(str, ndarray of 624 uints, int, int, float), dict}
    
If legacy is True, the returned tuple has the following items:
  1. the string ‘MT19937’.
  2. a 1-D array of 624 unsigned integer keys.
  3. an integer `pos`.
  4. an integer `has_gauss`.
  5. a float `cached_gaussian`.


If `legacy` is False, or the BitGenerator is not MT19937, then state is returned as a dictionary.
See also
`set_state`
#### Notes
`set_state` and `get_state` are not needed to work with any of the random distributions in NumPy. If the internal state is manually altered, the user should know exactly what he/she is doing.
# numpy.random.gumbel
random.gumbel(loc=0.0, scale=1.0, size=None)
    
Draw samples from a Gumbel distribution.
Draw samples from a Gumbel distribution with specified location and scale. For more information on the Gumbel distribution, see Notes and References below.
Note
New code should use the `gumbel` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats, optional
    
The location of the mode of the distribution. Default is 0.
scalefloat or array_like of floats, optional
    
The scale parameter of the distribution. Default is 1. Must be non- negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Gumbel distribution.
See also
`scipy.stats.gumbel_l`
`scipy.stats.gumbel_r`
`scipy.stats.genextreme`
`weibull`
`random.Generator.gumbel`
    
which should be used for new code.
#### Notes
The Gumbel (or Smallest Extreme Value (SEV) or the Smallest Extreme Value Type I) distribution is one of a class of Generalized Extreme Value (GEV) distributions used in modeling extreme value problems. The Gumbel is a special case of the Extreme Value Type I distribution for maximums from distributions with “exponential-like” tails.
The probability density for the Gumbel distribution is
\\[p(x) = \frac{e^{-(x - \mu)/ \beta}}{\beta} e^{ -e^{-(x - \mu)/ \beta}},\\]
where \\(\mu\\) is the mode, a location parameter, and \\(\beta\\) is the scale parameter.
The Gumbel (named for German mathematician Emil Julius Gumbel) was used very early in the hydrology literature, for modeling the occurrence of flood events. It is also used for modeling maximum wind speed and rainfall rates. It is a “fat-tailed” distribution - the probability of an event in the tail of the distribution is larger than if one used a Gaussian, hence the surprisingly frequent occurrence of 100-year floods. Floods were initially modeled as a Gaussian process, which underestimated the frequency of extreme events.
It is one of a class of extreme value distributions, the Generalized Extreme Value (GEV) distributions, which also includes the Weibull and Frechet.
The function has a mean of \\(\mu + 0.57721\beta\\) and a variance of \\(\frac{\pi^2}{6}\beta^2\\).
#### References
[1]
Gumbel, E. J., “Statistics of Extremes,” New York: Columbia University Press, 1958.
[2]
Reiss, R.-D. and Thomas, M., “Statistical Analysis of Extreme Values from Insurance, Finance, Hydrology and Other Fields,” Basel: Birkhauser Verlag, 2001.
#### Examples
Draw samples from the distribution:
    
    >>> mu, beta = 0, 0.1 # location and scale
    >>> s = np.random.gumbel(mu, beta, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 30, density=True)
    >>> plt.plot(bins, (1/beta)*np.exp(-(bins - mu)/beta)
    ...          * np.exp( -np.exp( -(bins - mu) /beta) ),
    ...          linewidth=2, color='r')
    >>> plt.show()
    
Show how an extreme value distribution can arise from a Gaussian process and compare to a Gaussian:
    
    >>> means = []
    >>> maxima = []
    >>> for i in range(0,1000) :
    ...    a = np.random.normal(mu, beta, 1000)
    ...    means.append(a.mean())
    ...    maxima.append(a.max())
    >>> count, bins, ignored = plt.hist(maxima, 30, density=True)
    >>> beta = np.std(maxima) * np.sqrt(6) / np.pi
    >>> mu = np.mean(maxima) - 0.57721*beta
    >>> plt.plot(bins, (1/beta)*np.exp(-(bins - mu)/beta)
    ...          * np.exp(-np.exp(-(bins - mu)/beta)),
    ...          linewidth=2, color='r')
    >>> plt.plot(bins, 1/(beta * np.sqrt(2 * np.pi))
    ...          * np.exp(-(bins - mu)**2 / (2 * beta**2)),
    ...          linewidth=2, color='g')
    >>> plt.show()
    
# numpy.random.hypergeometric
random.hypergeometric(ngood, nbad, nsample, size=None)
    
Draw samples from a Hypergeometric distribution.
Samples are drawn from a hypergeometric distribution with specified parameters, `ngood` (ways to make a good selection), `nbad` (ways to make a bad selection), and `nsample` (number of items sampled, which is less than or equal to the sum `ngood + nbad`).
Note
New code should use the `hypergeometric` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
ngoodint or array_like of ints
    
Number of ways to make a good selection. Must be nonnegative.
nbadint or array_like of ints
    
Number of ways to make a bad selection. Must be nonnegative.
nsampleint or array_like of ints
    
Number of items sampled. Must be at least 1 and at most `ngood + nbad`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `ngood`, `nbad`, and `nsample` are all scalars. Otherwise, `np.broadcast(ngood, nbad, nsample).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized hypergeometric distribution. Each sample is the number of good items within a randomly selected subset of size `nsample` taken from a set of `ngood` good items and `nbad` bad items.
See also
`scipy.stats.hypergeom`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.hypergeometric`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) for the Hypergeometric distribution is
\\[P(x) = \frac{\binom{g}{x}\binom{b}{n-x}}{\binom{g+b}{n}},\\]
where \\(0 \le x \le n\\) and \\(n-b \le x \le g\\)
for P(x) the probability of `x` good results in the drawn sample, g = `ngood`, b = `nbad`, and n = `nsample`.
Consider an urn with black and white marbles in it, `ngood` of them are black and `nbad` are white. If you draw `nsample` balls without replacement, then the hypergeometric distribution describes the distribution of black balls in the drawn sample.
Note that this distribution is very similar to the binomial distribution, except that in this case, samples are drawn without replacement, whereas in the Binomial case samples are drawn with replacement (or the sample space is infinite). As the sample space becomes large, this distribution approaches the binomial.
#### References
[1]
Lentner, Marvin, “Elementary Applied Statistics”, Bogden and Quigley, 1972.
[2]
Weisstein, Eric W. “Hypergeometric Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/HypergeometricDistribution.html
[3]
Wikipedia, “Hypergeometric distribution”, https://en.wikipedia.org/wiki/Hypergeometric_distribution
#### Examples
Draw samples from the distribution:
    
    >>> ngood, nbad, nsamp = 100, 2, 10
    # number of good, number of bad, and number of samples
    >>> s = np.random.hypergeometric(ngood, nbad, nsamp, 1000)
    >>> from matplotlib.pyplot import hist
    >>> hist(s)
    #   note that it is very unlikely to grab both bad items
    
Suppose you have an urn with 15 white and 15 black marbles. If you pull 15 marbles at random, how likely is it that 12 or more of them are one color?
    
    >>> s = np.random.hypergeometric(15, 15, 15, 100000)
    >>> sum(s>=12)/100000. + sum(s<=3)/100000.
    #   answer = 0.003 ... pretty unlikely!
    
# numpy.random.laplace
random.laplace(loc=0.0, scale=1.0, size=None)
    
Draw samples from the Laplace or double exponential distribution with specified location (or mean) and scale (decay).
The Laplace distribution is similar to the Gaussian/normal distribution, but is sharper at the peak and has fatter tails. It represents the difference between two independent, identically distributed exponential random variables.
Note
New code should use the `laplace` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats, optional
    
The position, \\(\mu\\), of the distribution peak. Default is 0.
scalefloat or array_like of floats, optional
    
\\(\lambda\\), the exponential decay. Default is 1. Must be non- negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Laplace distribution.
See also
`random.Generator.laplace`
    
which should be used for new code.
#### Notes
It has the probability density function
\\[f(x; \mu, \lambda) = \frac{1}{2\lambda} \exp\left(-\frac{|x - \mu|}{\lambda}\right).\\]
The first law of Laplace, from 1774, states that the frequency of an error can be expressed as an exponential function of the absolute magnitude of the error, which leads to the Laplace distribution. For many problems in economics and health sciences, this distribution seems to model the data better than the standard Gaussian distribution.
#### References
[1]
Abramowitz, M. and Stegun, I. A. (Eds.). “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing,” New York: Dover, 1972.
[2]
Kotz, Samuel, et. al. “The Laplace Distribution and Generalizations, “ Birkhauser, 2001.
[3]
Weisstein, Eric W. “Laplace Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/LaplaceDistribution.html
[4]
Wikipedia, “Laplace distribution”, https://en.wikipedia.org/wiki/Laplace_distribution
#### Examples
Draw samples from the distribution
    
    >>> loc, scale = 0., 1.
    >>> s = np.random.laplace(loc, scale, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 30, density=True)
    >>> x = np.arange(-8., 8., .01)
    >>> pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
    >>> plt.plot(x, pdf)
    
Plot Gaussian for comparison:
    
    >>> g = (1/(scale * np.sqrt(2 * np.pi)) *
    ...      np.exp(-(x - loc)**2 / (2 * scale**2)))
    >>> plt.plot(x,g)
    
# numpy.random.logistic
random.logistic(loc=0.0, scale=1.0, size=None)
    
Draw samples from a logistic distribution.
Samples are drawn from a logistic distribution with specified parameters, loc (location or mean, also median), and scale (>0).
Note
New code should use the `logistic` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats, optional
    
Parameter of the distribution. Default is 0.
scalefloat or array_like of floats, optional
    
Parameter of the distribution. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized logistic distribution.
See also
`scipy.stats.logistic`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.logistic`
    
which should be used for new code.
#### Notes
The probability density for the Logistic distribution is
\\[P(x) = P(x) = \frac{e^{-(x-\mu)/s}}{s(1+e^{-(x-\mu)/s})^2},\\]
where \\(\mu\\) = location and \\(s\\) = scale.
The Logistic distribution is used in Extreme Value problems where it can act as a mixture of Gumbel distributions, in Epidemiology, and by the World Chess Federation (FIDE) where it is used in the Elo ranking system, assuming the performance of each player is a logistically distributed random variable.
#### References
[1]
Reiss, R.-D. and Thomas M. (2001), “Statistical Analysis of Extreme Values, from Insurance, Finance, Hydrology and Other Fields,” Birkhauser Verlag, Basel, pp 132-133.
[2]
Weisstein, Eric W. “Logistic Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/LogisticDistribution.html
[3]
Wikipedia, “Logistic-distribution”, https://en.wikipedia.org/wiki/Logistic_distribution
#### Examples
Draw samples from the distribution:
    
    >>> loc, scale = 10, 1
    >>> s = np.random.logistic(loc, scale, 10000)
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, bins=50)
    
# plot against distribution
    
    >>> def logist(x, loc, scale):
    ...     return np.exp((loc-x)/scale)/(scale*(1+np.exp((loc-x)/scale))**2)
    >>> lgst_val = logist(bins, loc, scale)
    >>> plt.plot(bins, lgst_val * count.max() / lgst_val.max())
    >>> plt.show()
    
# numpy.random.lognormal
random.lognormal(mean=0.0, sigma=1.0, size=None)
    
Draw samples from a log-normal distribution.
Draw samples from a log-normal distribution with specified mean, standard deviation, and array shape. Note that the mean and standard deviation are not the values for the distribution itself, but of the underlying normal distribution it is derived from.
Note
New code should use the `lognormal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
meanfloat or array_like of floats, optional
    
Mean value of the underlying normal distribution. Default is 0.
sigmafloat or array_like of floats, optional
    
Standard deviation of the underlying normal distribution. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mean` and `sigma` are both scalars. Otherwise, `np.broadcast(mean, sigma).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized log-normal distribution.
See also
`scipy.stats.lognorm`
    
probability density function, distribution, cumulative density function, etc.
`random.Generator.lognormal`
    
which should be used for new code.
#### Notes
A variable `x` has a log-normal distribution if `log(x)` is normally distributed. The probability density function for the log-normal distribution is:
\\[p(x) = \frac{1}{\sigma x \sqrt{2\pi}} e^{(-\frac{(ln(x)-\mu)^2}{2\sigma^2})}\\]
where \\(\mu\\) is the mean and \\(\sigma\\) is the standard deviation of the normally distributed logarithm of the variable. A log-normal distribution results if a random variable is the product of a large number of independent, identically-distributed variables in the same way that a normal distribution results if the variable is the sum of a large number of independent, identically-distributed variables.
#### References
[1]
Limpert, E., Stahel, W. A., and Abbt, M., “Log-normal Distributions across the Sciences: Keys and Clues,” BioScience, Vol. 51, No. 5, May, 2001. https://stat.ethz.ch/~stahel/lognormal/bioscience.pdf
[2]
Reiss, R.D. and Thomas, M., “Statistical Analysis of Extreme Values,” Basel: Birkhauser Verlag, 2001, pp. 31-32.
#### Examples
Draw samples from the distribution:
    
    >>> mu, sigma = 3., 1. # mean and standard deviation
    >>> s = np.random.lognormal(mu, sigma, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 100, density=True, align='mid')
    
    
    >>> x = np.linspace(min(bins), max(bins), 10000)
    >>> pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
    ...        / (x * sigma * np.sqrt(2 * np.pi)))
    
    
    >>> plt.plot(x, pdf, linewidth=2, color='r')
    >>> plt.axis('tight')
    >>> plt.show()
    
Demonstrate that taking the products of random samples from a uniform distribution can be fit well by a log-normal probability density function.
    
    >>> # Generate a thousand samples: each is the product of 100 random
    >>> # values, drawn from a normal distribution.
    >>> b = []
    >>> for i in range(1000):
    ...    a = 10. + np.random.standard_normal(100)
    ...    b.append(np.prod(a))
    
    
    >>> b = np.array(b) / np.min(b) # scale values to be positive
    >>> count, bins, ignored = plt.hist(b, 100, density=True, align='mid')
    >>> sigma = np.std(np.log(b))
    >>> mu = np.mean(np.log(b))
    
    
    >>> x = np.linspace(min(bins), max(bins), 10000)
    >>> pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
    ...        / (x * sigma * np.sqrt(2 * np.pi)))
    
    
    >>> plt.plot(x, pdf, color='r', linewidth=2)
    >>> plt.show()
    
# numpy.random.logseries
random.logseries(p, size=None)
    
Draw samples from a logarithmic series distribution.
Samples are drawn from a log series distribution with specified shape parameter, 0 <= `p` < 1.
Note
New code should use the `logseries` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
pfloat or array_like of floats
    
Shape parameter for the distribution. Must be in the range [0, 1).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `p` is a scalar. Otherwise, `np.array(p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized logarithmic series distribution.
See also
`scipy.stats.logser`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.logseries`
    
which should be used for new code.
#### Notes
The probability density for the Log Series distribution is
\\[P(k) = \frac{-p^k}{k \ln(1-p)},\\]
where p = probability.
The log series distribution is frequently used to represent species richness and occurrence, first proposed by Fisher, Corbet, and Williams in 1943 [2]. It may also be used to model the numbers of occupants seen in cars [3].
#### References
[1]
Buzas, Martin A.; Culver, Stephen J., Understanding regional species diversity through the log series distribution of occurrences: BIODIVERSITY RESEARCH Diversity & Distributions, Volume 5, Number 5, September 1999 , pp. 187-195(9).
[2]
Fisher, R.A,, A.S. Corbet, and C.B. Williams. 1943. The relation between the number of species and the number of individuals in a random sample of an animal population. Journal of Animal Ecology, 12:42-58.
[3]
D. J. Hand, F. Daly, D. Lunn, E. Ostrowski, A Handbook of Small Data Sets, CRC Press, 1994.
[4]
Wikipedia, “Logarithmic distribution”, https://en.wikipedia.org/wiki/Logarithmic_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a = .6
    >>> s = np.random.logseries(a, 10000)
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s)
    
# plot against distribution
    
    >>> def logseries(k, p):
    ...     return -p**k/(k*np.log(1-p))
    >>> plt.plot(bins, logseries(bins, a)*count.max()/
    ...          logseries(bins, a).max(), 'r')
    >>> plt.show()
    
# numpy.random.multinomial
random.multinomial(n, pvals, size=None)
    
Draw samples from a multinomial distribution.
The multinomial distribution is a multivariate generalization of the binomial distribution. Take an experiment with one of `p` possible outcomes. An example of such an experiment is throwing a dice, where the outcome can be 1 through 6. Each sample drawn from the distribution represents `n` such experiments. Its values, `X_i = [X_0, X_1, ..., X_p]`, represent the number of times the outcome was `i`.
Note
New code should use the `multinomial` method of a `Generator` instance instead; please see the Quick start.
Warning
This function defaults to the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms.
Parameters:
    
nint
    
Number of experiments.
pvalssequence of floats, length p
    
Probabilities of each of the `p` different outcomes. These must sum to 1 (however, the last element is always assumed to account for the remaining probability, as long as `sum(pvals[:-1]) <= 1)`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outndarray
    
The drawn samples, of shape size, if that was provided. If not, the shape is `(N,)`.
In other words, each entry `out[i,j,...,:]` is an N-dimensional value drawn from the distribution.
See also
`random.Generator.multinomial`
    
which should be used for new code.
#### Examples
Throw a dice 20 times:
    
    >>> np.random.multinomial(20, [1/6.]*6, size=1)
    array([[4, 1, 7, 5, 2, 1]]) # random
    
It landed 4 times on 1, once on 2, etc.
Now, throw the dice 20 times, and 20 times again:
    
    >>> np.random.multinomial(20, [1/6.]*6, size=2)
    array([[3, 4, 3, 3, 4, 3], # random
           [2, 4, 3, 4, 0, 7]])
    
For the first run, we threw 3 times 1, 4 times 2, etc. For the second, we threw 2 times 1, 4 times 2, etc.
A loaded die is more likely to land on number 6:
    
    >>> np.random.multinomial(100, [1/7.]*5 + [2/7.])
    array([11, 16, 14, 17, 16, 26]) # random
    
The probability inputs should be normalized. As an implementation detail, the value of the last entry is ignored and assumed to take up any leftover probability mass, but this should not be relied on. A biased coin which has twice as much weight on one side as on the other should be sampled like so:
    
    >>> np.random.multinomial(100, [1.0 / 3, 2.0 / 3])  # RIGHT
    array([38, 62]) # random
    
not like:
    
    >>> np.random.multinomial(100, [1.0, 2.0])  # WRONG
    Traceback (most recent call last):
    ValueError: pvals < 0, pvals > 1 or pvals contains NaNs
    
# numpy.random.multivariate_normal
random.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)
    
Draw random samples from a multivariate normal distribution.
The multivariate normal, multinormal or Gaussian distribution is a generalization of the one-dimensional normal distribution to higher dimensions. Such a distribution is specified by its mean and covariance matrix. These parameters are analogous to the mean (average or “center”) and variance (standard deviation, or “width,” squared) of the one-dimensional normal distribution.
Note
New code should use the `multivariate_normal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
mean1-D array_like, of length N
    
Mean of the N-dimensional distribution.
cov2-D array_like, of shape (N, N)
    
Covariance matrix of the distribution. It must be symmetric and positive-semidefinite for proper sampling.
sizeint or tuple of ints, optional
    
Given a shape of, for example, `(m,n,k)`, `m*n*k` samples are generated, and packed in an `m`-by-`n`-by-`k` arrangement. Because each sample is `N`-dimensional, the output shape is `(m,n,k,N)`. If no shape is specified, a single (`N`-D) sample is returned.
check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, optional
    
Behavior when the covariance matrix is not positive semidefinite.
tolfloat, optional
    
Tolerance when checking the singular values in covariance matrix. cov is cast to double before the check.
Returns:
    
outndarray
    
The drawn samples, of shape size, if that was provided. If not, the shape is `(N,)`.
In other words, each entry `out[i,j,...,:]` is an N-dimensional value drawn from the distribution.
See also
`random.Generator.multivariate_normal`
    
which should be used for new code.
#### Notes
The mean is a coordinate in N-dimensional space, which represents the location where samples are most likely to be generated. This is analogous to the peak of the bell curve for the one-dimensional or univariate normal distribution.
Covariance indicates the level to which two variables vary together. From the multivariate normal distribution, we draw N-dimensional samples, \\(X = [x_1, x_2, ... x_N]\\). The covariance matrix element \\(C_{ij}\\) is the covariance of \\(x_i\\) and \\(x_j\\). The element \\(C_{ii}\\) is the variance of \\(x_i\\) (i.e. its “spread”).
Instead of specifying the full covariance matrix, popular approximations include:
  * Spherical covariance (`cov` is a multiple of the identity matrix)
  * Diagonal covariance (`cov` has non-negative elements, and only on the diagonal)


This geometrical property can be seen in two dimensions by plotting generated data-points:
    
    >>> mean = [0, 0]
    >>> cov = [[1, 0], [0, 100]]  # diagonal covariance
    
Diagonal covariance means that points are oriented along x or y-axis:
    
    >>> import matplotlib.pyplot as plt
    >>> x, y = np.random.multivariate_normal(mean, cov, 5000).T
    >>> plt.plot(x, y, 'x')
    >>> plt.axis('equal')
    >>> plt.show()
    
Note that the covariance matrix must be positive semidefinite (a.k.a. nonnegative-definite). Otherwise, the behavior of this method is undefined and backwards compatibility is not guaranteed.
#### References
[1]
Papoulis, A., “Probability, Random Variables, and Stochastic Processes,” 3rd ed., New York: McGraw-Hill, 1991.
[2]
Duda, R. O., Hart, P. E., and Stork, D. G., “Pattern Classification,” 2nd ed., New York: Wiley, 2001.
#### Examples
    
    >>> mean = (1, 2)
    >>> cov = [[1, 0], [0, 1]]
    >>> x = np.random.multivariate_normal(mean, cov, (3, 3))
    >>> x.shape
    (3, 3, 2)
    
Here we generate 800 samples from the bivariate normal distribution with mean [0, 0] and covariance matrix [[6, -3], [-3, 3.5]]. The expected variances of the first and second components of the sample are 6 and 3.5, respectively, and the expected correlation coefficient is -3/sqrt(6*3.5) ≈ -0.65465.
    
    >>> cov = np.array([[6, -3], [-3, 3.5]])
    >>> pts = np.random.multivariate_normal([0, 0], cov, size=800)
    
Check that the mean, covariance, and correlation coefficient of the sample are close to the expected values:
    
    >>> pts.mean(axis=0)
    array([ 0.0326911 , -0.01280782])  # may vary
    >>> np.cov(pts.T)
    array([[ 5.96202397, -2.85602287],
           [-2.85602287,  3.47613949]])  # may vary
    >>> np.corrcoef(pts.T)[0, 1]
    -0.6273591314603949  # may vary
    
We can visualize this data with a scatter plot. The orientation of the point cloud illustrates the negative correlation of the components of this sample.
    
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(pts[:, 0], pts[:, 1], '.', alpha=0.5)
    >>> plt.axis('equal')
    >>> plt.grid()
    >>> plt.show()
    
# numpy.random.negative_binomial
random.negative_binomial(n, p, size=None)
    
Draw samples from a negative binomial distribution.
Samples are drawn from a negative binomial distribution with specified parameters, `n` successes and `p` probability of success where `n` is > 0 and `p` is in the interval [0, 1].
Note
New code should use the `negative_binomial` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
nfloat or array_like of floats
    
Parameter of the distribution, > 0.
pfloat or array_like of floats
    
Parameter of the distribution, >= 0 and <=1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `n` and `p` are both scalars. Otherwise, `np.broadcast(n, p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized negative binomial distribution, where each sample is equal to N, the number of failures that occurred before a total of n successes was reached.
Warning
This function returns the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms.
See also
`random.Generator.negative_binomial`
    
which should be used for new code.
#### Notes
The probability mass function of the negative binomial distribution is
\\[P(N;n,p) = \frac{\Gamma(N+n)}{N!\Gamma(n)}p^{n}(1-p)^{N},\\]
where \\(n\\) is the number of successes, \\(p\\) is the probability of success, \\(N+n\\) is the number of trials, and \\(\Gamma\\) is the gamma function. When \\(n\\) is an integer, \\(\frac{\Gamma(N+n)}{N!\Gamma(n)} = \binom{N+n-1}{N}\\), which is the more common form of this term in the pmf. The negative binomial distribution gives the probability of N failures given n successes, with a success on the last trial.
If one throws a die repeatedly until the third time a “1” appears, then the probability distribution of the number of non-“1”s that appear before the third “1” is a negative binomial distribution.
#### References
[1]
Weisstein, Eric W. “Negative Binomial Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/NegativeBinomialDistribution.html
[2]
Wikipedia, “Negative binomial distribution”, https://en.wikipedia.org/wiki/Negative_binomial_distribution
#### Examples
Draw samples from the distribution:
A real world example. A company drills wild-cat oil exploration wells, each with an estimated probability of success of 0.1. What is the probability of having one success for each successive well, that is what is the probability of a single success after drilling 5 wells, after 6 wells, etc.?
    
    >>> s = np.random.negative_binomial(1, 0.1, 100000)
    >>> for i in range(1, 11): 
    ...    probability = sum(s<i) / 100000.
    ...    print(i, "wells drilled, probability of one success =", probability)
    
# numpy.random.noncentral_chisquare
random.noncentral_chisquare(df, nonc, size=None)
    
Draw samples from a noncentral chi-square distribution.
The noncentral \\(\chi^2\\) distribution is a generalization of the \\(\chi^2\\) distribution.
Note
New code should use the `noncentral_chisquare` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dffloat or array_like of floats
    
Degrees of freedom, must be > 0.
noncfloat or array_like of floats
    
Non-centrality, must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` and `nonc` are both scalars. Otherwise, `np.broadcast(df, nonc).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized noncentral chi-square distribution.
See also
`random.Generator.noncentral_chisquare`
    
which should be used for new code.
#### Notes
The probability density function for the noncentral Chi-square distribution is
\\[P(x;df,nonc) = \sum^{\infty}_{i=0} \frac{e^{-nonc/2}(nonc/2)^{i}}{i!} P_{Y_{df+2i}}(x),\\]
where \\(Y_{q}\\) is the Chi-square with q degrees of freedom.
#### References
[1]
Wikipedia, “Noncentral chi-squared distribution” https://en.wikipedia.org/wiki/Noncentral_chi-squared_distribution
#### Examples
Draw values from the distribution and plot the histogram
    
    >>> import matplotlib.pyplot as plt
    >>> values = plt.hist(np.random.noncentral_chisquare(3, 20, 100000),
    ...                   bins=200, density=True)
    >>> plt.show()
    
Draw values from a noncentral chisquare with very small noncentrality, and compare to a chisquare.
    
    >>> plt.figure()
    >>> values = plt.hist(np.random.noncentral_chisquare(3, .0000001, 100000),
    ...                   bins=np.arange(0., 25, .1), density=True)
    >>> values2 = plt.hist(np.random.chisquare(3, 100000),
    ...                    bins=np.arange(0., 25, .1), density=True)
    >>> plt.plot(values[1][0:-1], values[0]-values2[0], 'ob')
    >>> plt.show()
    
Demonstrate how large values of non-centrality lead to a more symmetric distribution.
    
    >>> plt.figure()
    >>> values = plt.hist(np.random.noncentral_chisquare(3, 20, 100000),
    ...                   bins=200, density=True)
    >>> plt.show()
    
# numpy.random.noncentral_f
random.noncentral_f(dfnum, dfden, nonc, size=None)
    
Draw samples from the noncentral F distribution.
Samples are drawn from an F distribution with specified parameters, `dfnum` (degrees of freedom in numerator) and `dfden` (degrees of freedom in denominator), where both parameters > 1\. `nonc` is the non-centrality parameter.
Note
New code should use the `noncentral_f` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dfnumfloat or array_like of floats
    
Numerator degrees of freedom, must be > 0.
dfdenfloat or array_like of floats
    
Denominator degrees of freedom, must be > 0.
noncfloat or array_like of floats
    
Non-centrality parameter, the sum of the squares of the numerator means, must be >= 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `dfnum`, `dfden`, and `nonc` are all scalars. Otherwise, `np.broadcast(dfnum, dfden, nonc).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized noncentral Fisher distribution.
See also
`random.Generator.noncentral_f`
    
which should be used for new code.
#### Notes
When calculating the power of an experiment (power = probability of rejecting the null hypothesis when a specific alternative is true) the non-central F statistic becomes important. When the null hypothesis is true, the F statistic follows a central F distribution. When the null hypothesis is not true, then it follows a non-central F statistic.
#### References
[1]
Weisstein, Eric W. “Noncentral F-Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/NoncentralF-Distribution.html
[2]
Wikipedia, “Noncentral F-distribution”, https://en.wikipedia.org/wiki/Noncentral_F-distribution
#### Examples
In a study, testing for a specific alternative to the null hypothesis requires use of the Noncentral F distribution. We need to calculate the area in the tail of the distribution that exceeds the value of the F distribution for the null hypothesis. We’ll plot the two probability distributions for comparison.
    
    >>> dfnum = 3 # between group deg of freedom
    >>> dfden = 20 # within groups degrees of freedom
    >>> nonc = 3.0
    >>> nc_vals = np.random.noncentral_f(dfnum, dfden, nonc, 1000000)
    >>> NF = np.histogram(nc_vals, bins=50, density=True)
    >>> c_vals = np.random.f(dfnum, dfden, 1000000)
    >>> F = np.histogram(c_vals, bins=50, density=True)
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(F[1][1:], F[0])
    >>> plt.plot(NF[1][1:], NF[0])
    >>> plt.show()
    
# numpy.random.normal
random.normal(loc=0.0, scale=1.0, size=None)
    
Draw random samples from a normal (Gaussian) distribution.
The probability density function of the normal distribution, first derived by De Moivre and 200 years later by both Gauss and Laplace independently [2], is often called the bell curve because of its characteristic shape (see the example below).
The normal distributions occurs often in nature. For example, it describes the commonly occurring distribution of samples influenced by a large number of tiny, random disturbances, each with its own unique distribution [2].
Note
New code should use the `normal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats
    
Mean (“centre”) of the distribution.
scalefloat or array_like of floats
    
Standard deviation (spread or “width”) of the distribution. Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized normal distribution.
See also
`scipy.stats.norm`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.normal`
    
which should be used for new code.
#### Notes
The probability density for the Gaussian distribution is
\\[p(x) = \frac{1}{\sqrt{ 2 \pi \sigma^2 }} e^{ - \frac{ (x - \mu)^2 } {2 \sigma^2} },\\]
where \\(\mu\\) is the mean and \\(\sigma\\) the standard deviation. The square of the standard deviation, \\(\sigma^2\\), is called the variance.
The function has its peak at the mean, and its “spread” increases with the standard deviation (the function reaches 0.607 times its maximum at \\(x + \sigma\\) and \\(x - \sigma\\) [2]). This implies that normal is more likely to return samples lying close to the mean, rather than those far away.
#### References
[1]
Wikipedia, “Normal distribution”, https://en.wikipedia.org/wiki/Normal_distribution
[2] (1,2,3)
P. R. Peebles Jr., “Central Limit Theorem” in “Probability, Random Variables and Random Signal Principles”, 4th ed., 2001, pp. 51, 51, 125.
#### Examples
Draw samples from the distribution:
    
    >>> mu, sigma = 0, 0.1 # mean and standard deviation
    >>> s = np.random.normal(mu, sigma, 1000)
    
Verify the mean and the standard deviation:
    
    >>> abs(mu - np.mean(s))
    0.0  # may vary
    
    
    >>> abs(sigma - np.std(s, ddof=1))
    0.1  # may vary
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 30, density=True)
    >>> plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
    ...                np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
    ...          linewidth=2, color='r')
    >>> plt.show()
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> np.random.normal(3, 2.5, size=(2, 4))
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.pareto
random.pareto(a, size=None)
    
Draw samples from a Pareto II or Lomax distribution with specified shape.
The Lomax or Pareto II distribution is a shifted Pareto distribution. The classical Pareto distribution can be obtained from the Lomax distribution by adding 1 and multiplying by the scale parameter `m` (see Notes). The smallest value of the Lomax distribution is zero while for the classical Pareto distribution it is `mu`, where the standard Pareto distribution has location `mu = 1`. Lomax can also be considered as a simplified version of the Generalized Pareto distribution (available in SciPy), with the scale set to one and the location set to zero.
The Pareto distribution must be greater than zero, and is unbounded above. It is also known as the “80-20 rule”. In this distribution, 80 percent of the weights are in the lowest 20 percent of the range, while the other 20 percent fill the remaining 80 percent of the range.
Note
New code should use the `pareto` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Shape of the distribution. Must be positive.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Pareto distribution.
See also
`scipy.stats.lomax`
    
probability density function, distribution or cumulative density function, etc.
`scipy.stats.genpareto`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.pareto`
    
which should be used for new code.
#### Notes
The probability density for the Pareto distribution is
\\[p(x) = \frac{am^a}{x^{a+1}}\\]
where \\(a\\) is the shape and \\(m\\) the scale.
The Pareto distribution, named after the Italian economist Vilfredo Pareto, is a power law probability distribution useful in many real world problems. Outside the field of economics it is generally referred to as the Bradford distribution. Pareto developed the distribution to describe the distribution of wealth in an economy. It has also found use in insurance, web page access statistics, oil field sizes, and many other problems, including the download frequency for projects in Sourceforge [1]. It is one of the so-called “fat-tailed” distributions.
#### References
[1]
Francis Hunt and Paul Johnson, On the Pareto Distribution of Sourceforge projects.
[2]
Pareto, V. (1896). Course of Political Economy. Lausanne.
[3]
Reiss, R.D., Thomas, M.(2001), Statistical Analysis of Extreme Values, Birkhauser Verlag, Basel, pp 23-30.
[4]
Wikipedia, “Pareto distribution”, https://en.wikipedia.org/wiki/Pareto_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a, m = 3., 2.  # shape and mode
    >>> s = (np.random.pareto(a, 1000) + 1) * m
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 100, density=True)
    >>> fit = a*m**a / bins**(a+1)
    >>> plt.plot(bins, max(count)*fit/max(fit), linewidth=2, color='r')
    >>> plt.show()
    
# numpy.random.permutation
random.permutation(x)
    
Randomly permute a sequence, or return a permuted range.
If `x` is a multi-dimensional array, it is only shuffled along its first index.
Note
New code should use the `permutation` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
xint or array_like
    
If `x` is an integer, randomly permute `np.arange(x)`. If `x` is an array, make a copy and shuffle the elements randomly.
Returns:
    
outndarray
    
Permuted sequence or array range.
See also
`random.Generator.permutation`
    
which should be used for new code.
#### Examples
    
    >>> np.random.permutation(10)
    array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6]) # random
    
    
    >>> np.random.permutation([1, 4, 9, 12, 15])
    array([15,  1,  9,  4, 12]) # random
    
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> np.random.permutation(arr)
    array([[6, 7, 8], # random
           [0, 1, 2],
           [3, 4, 5]])
    
# numpy.random.poisson
random.poisson(lam=1.0, size=None)
    
Draw samples from a Poisson distribution.
The Poisson distribution is the limit of the binomial distribution for large N.
Note
New code should use the `poisson` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lamfloat or array_like of floats
    
Expected number of events occurring in a fixed-time interval, must be >= 0. A sequence must be broadcastable over the requested size.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `lam` is a scalar. Otherwise, `np.array(lam).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Poisson distribution.
See also
`random.Generator.poisson`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) of Poisson distribution is
\\[f(k; \lambda)=\frac{\lambda^k e^{-\lambda}}{k!}\\]
For events with an expected separation \\(\lambda\\) the Poisson distribution \\(f(k; \lambda)\\) describes the probability of \\(k\\) events occurring within the observed interval \\(\lambda\\).
Because the output is limited to the range of the C int64 type, a ValueError is raised when `lam` is within 10 sigma of the maximum representable value.
#### References
[1]
Weisstein, Eric W. “Poisson Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/PoissonDistribution.html
[2]
Wikipedia, “Poisson distribution”, https://en.wikipedia.org/wiki/Poisson_distribution
#### Examples
Draw samples from the distribution:
    
    >>> import numpy as np
    >>> s = np.random.poisson(5, 10000)
    
Display histogram of the sample:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 14, density=True)
    >>> plt.show()
    
Draw each 100 values for lambda 100 and 500:
    
    >>> s = np.random.poisson(lam=(100., 500.), size=(100, 2))
    
# numpy.random.power
random.power(a, size=None)
    
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.
Also known as the power function distribution.
Note
New code should use the `power` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Parameter of the distribution. Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized power distribution.
Raises:
    
ValueError
    
If a <= 0.
See also
`random.Generator.power`
    
which should be used for new code.
#### Notes
The probability density function is
\\[P(x; a) = ax^{a-1}, 0 \le x \le 1, a>0.\\]
The power function distribution is just the inverse of the Pareto distribution. It may also be seen as a special case of the Beta distribution.
It is used, for example, in modeling the over-reporting of insurance claims.
#### References
[1]
Christian Kleiber, Samuel Kotz, “Statistical size distributions in economics and actuarial sciences”, Wiley, 2003.
[2]
Heckert, N. A. and Filliben, James J. “NIST Handbook 148: Dataplot Reference Manual, Volume 2: Let Subcommands and Library Functions”, National Institute of Standards and Technology Handbook Series, June 2003. https://www.itl.nist.gov/div898/software/dataplot/refman2/auxillar/powpdf.pdf
#### Examples
Draw samples from the distribution:
    
    >>> a = 5. # shape
    >>> samples = 1000
    >>> s = np.random.power(a, samples)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, bins=30)
    >>> x = np.linspace(0, 1, 100)
    >>> y = a*x**(a-1.)
    >>> normed_y = samples*np.diff(bins)[0]*y
    >>> plt.plot(x, normed_y)
    >>> plt.show()
    
Compare the power function distribution to the inverse of the Pareto.
    
    >>> from scipy import stats 
    >>> rvs = np.random.power(5, 1000000)
    >>> rvsp = np.random.pareto(5, 1000000)
    >>> xx = np.linspace(0,1,100)
    >>> powpdf = stats.powerlaw.pdf(xx,5)  
    
    
    >>> plt.figure()
    >>> plt.hist(rvs, bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('np.random.power(5)')
    
    
    >>> plt.figure()
    >>> plt.hist(1./(1.+rvsp), bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('inverse of 1 + np.random.pareto(5)')
    
    
    >>> plt.figure()
    >>> plt.hist(1./(1.+rvsp), bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('inverse of stats.pareto(5)')
    
# numpy.random.rand
random.rand(d0, d1, ..., dn)
    
Random values in a given shape.
Note
This is a convenience function for users porting code from Matlab, and wraps `random_sample`. That function takes a tuple to specify the size of the output, which is consistent with other NumPy functions like `numpy.zeros` and `numpy.ones`.
Create an array of the given shape and populate it with random samples from a uniform distribution over `[0, 1)`.
Parameters:
    
d0, d1, …, dnint, optional
    
The dimensions of the returned array, must be non-negative. If no argument is given a single Python float is returned.
Returns:
    
outndarray, shape `(d0, d1, ..., dn)`
    
Random values.
See also
`random`
#### Examples
    
    >>> np.random.rand(3,2)
    array([[ 0.14022471,  0.96360618],  #random
           [ 0.37601032,  0.25528411],  #random
           [ 0.49313049,  0.94909878]]) #random
    
# numpy.random.randint
random.randint(low, high=None, size=None, dtype=int)
    
Return random integers from `low` (inclusive) to `high` (exclusive).
Return random integers from the “discrete uniform” distribution of the specified dtype in the “half-open” interval [`low`, `high`). If `high` is None (the default), then results are from [0, `low`).
Note
New code should use the `integers` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lowint or array-like of ints
    
Lowest (signed) integers to be drawn from the distribution (unless `high=None`, in which case this parameter is one above the highest such integer).
highint or array-like of ints, optional
    
If provided, one above the largest (signed) integer to be drawn from the distribution (see above for behavior if `high=None`). If array-like, must contain integer values
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
dtypedtype, optional
    
Desired dtype of the result. Byteorder must be native. The default value is long.
Warning
This function defaults to the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms. Which corresponds to `np.intp`. (`dtype=int` is not the same as in most NumPy functions.)
Returns:
    
outint or ndarray of ints
    
`size`-shaped array of random integers from the appropriate distribution, or a single such random int if `size` not provided.
See also
`random_integers`
    
similar to `randint`, only for the closed interval [`low`, `high`], and 1 is the lowest value if `high` is omitted.
`random.Generator.integers`
    
which should be used for new code.
#### Examples
    
    >>> np.random.randint(2, size=10)
    array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0]) # random
    >>> np.random.randint(1, size=10)
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    
Generate a 2 x 4 array of ints between 0 and 4, inclusive:
    
    >>> np.random.randint(5, size=(2, 4))
    array([[4, 0, 2, 1], # random
           [3, 2, 2, 0]])
    
Generate a 1 x 3 array with 3 different upper bounds
    
    >>> np.random.randint(1, [3, 5, 10])
    array([2, 2, 9]) # random
    
Generate a 1 by 3 array with 3 different lower bounds
    
    >>> np.random.randint([1, 5, 7], 10)
    array([9, 8, 7]) # random
    
Generate a 2 by 4 array using broadcasting with dtype of uint8
    
    >>> np.random.randint([1, 3, 5, 7], [[10], [20]], dtype=np.uint8)
    array([[ 8,  6,  9,  7], # random
           [ 1, 16,  9, 12]], dtype=uint8)
    
# numpy.random.randn
random.randn(d0, d1, ..., dn)
    
Return a sample (or samples) from the “standard normal” distribution.
Note
This is a convenience function for users porting code from Matlab, and wraps `standard_normal`. That function takes a tuple to specify the size of the output, which is consistent with other NumPy functions like `numpy.zeros` and `numpy.ones`.
Note
New code should use the `standard_normal` method of a `Generator` instance instead; please see the Quick start.
If positive int_like arguments are provided, `randn` generates an array of shape `(d0, d1, ..., dn)`, filled with random floats sampled from a univariate “normal” (Gaussian) distribution of mean 0 and variance 1. A single float randomly sampled from the distribution is returned if no argument is provided.
Parameters:
    
d0, d1, …, dnint, optional
    
The dimensions of the returned array, must be non-negative. If no argument is given a single Python float is returned.
Returns:
    
Zndarray or float
    
A `(d0, d1, ..., dn)`-shaped array of floating-point samples from the standard normal distribution, or a single such float if no parameters were supplied.
See also
`standard_normal`
    
Similar, but takes a tuple as its argument.
`normal`
    
Also accepts mu and sigma arguments.
`random.Generator.standard_normal`
    
which should be used for new code.
#### Notes
For random samples from the normal distribution with mean `mu` and standard deviation `sigma`, use:
    
    sigma * np.random.randn(...) + mu
    
#### Examples
    
    >>> np.random.randn()
    2.1923875335537315  # random
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> 3 + 2.5 * np.random.randn(2, 4)
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.random
random.random(size=None)
    
Return random floats in the half-open interval [0.0, 1.0). Alias for `random_sample` to ease forward-porting to the new random API.
# numpy.random.random_integers
random.random_integers(low, high=None, size=None)
    
Random integers of type `numpy.int_` between `low` and `high`, inclusive.
Return random integers of type `numpy.int_` from the “discrete uniform” distribution in the closed interval [`low`, `high`]. If `high` is None (the default), then results are from [1, `low`]. The `numpy.int_` type translates to the C long integer type and its precision is platform dependent.
This function has been deprecated. Use randint instead.
Deprecated since version 1.11.0.
Parameters:
    
lowint
    
Lowest (signed) integer to be drawn from the distribution (unless `high=None`, in which case this parameter is the highest such integer).
highint, optional
    
If provided, the largest (signed) integer to be drawn from the distribution (see above for behavior if `high=None`).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outint or ndarray of ints
    
`size`-shaped array of random integers from the appropriate distribution, or a single such random int if `size` not provided.
See also
`randint`
    
Similar to `random_integers`, only for the half-open interval [`low`, `high`), and 0 is the lowest value if `high` is omitted.
#### Notes
To sample from N evenly spaced floating-point numbers between a and b, use:
    
    a + (b - a) * (np.random.random_integers(N) - 1) / (N - 1.)
    
#### Examples
    
    >>> np.random.random_integers(5)
    4 # random
    >>> type(np.random.random_integers(5))
    <class 'numpy.int64'>
    >>> np.random.random_integers(5, size=(3,2))
    array([[5, 4], # random
           [3, 3],
           [4, 5]])
    
Choose five random numbers from the set of five evenly-spaced numbers between 0 and 2.5, inclusive (i.e., from the set \\({0, 5/8, 10/8, 15/8, 20/8}\\)):
    
    >>> 2.5 * (np.random.random_integers(5, size=(5,)) - 1) / 4.
    array([ 0.625,  1.25 ,  0.625,  0.625,  2.5  ]) # random
    
Roll two six sided dice 1000 times and sum the results:
    
    >>> d1 = np.random.random_integers(1, 6, 1000)
    >>> d2 = np.random.random_integers(1, 6, 1000)
    >>> dsums = d1 + d2
    
Display results as a histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(dsums, 11, density=True)
    >>> plt.show()
    
# numpy.random.random_sample
random.random_sample(size=None)
    
Return random floats in the half-open interval [0.0, 1.0).
Results are from the “continuous uniform” distribution over the stated interval. To sample \\(Unif[a, b), b > a\\) multiply the output of `random_sample` by `(b-a)` and add `a`:
    
    (b - a) * random_sample() + a
    
Note
New code should use the `random` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outfloat or ndarray of floats
    
Array of random floats of shape `size` (unless `size=None`, in which case a single float is returned).
See also
`random.Generator.random`
    
which should be used for new code.
#### Examples
    
    >>> np.random.random_sample()
    0.47108547995356098 # random
    >>> type(np.random.random_sample())
    <class 'float'>
    >>> np.random.random_sample((5,))
    array([ 0.30220482,  0.86820401,  0.1654503 ,  0.11659149,  0.54323428]) # random
    
Three-by-two array of random numbers from [-5, 0):
    
    >>> 5 * np.random.random_sample((3, 2)) - 5
    array([[-3.99149989, -0.52338984], # random
           [-2.99091858, -0.79479508],
           [-1.23204345, -1.75224494]])
    
# numpy.random.RandomState.beta
method
random.RandomState.beta(a, b, size=None)
    
Draw samples from a Beta distribution.
The Beta distribution is a special case of the Dirichlet distribution, and is related to the Gamma distribution. It has the probability distribution function
\\[f(x; a,b) = \frac{1}{B(\alpha, \beta)} x^{\alpha - 1} (1 - x)^{\beta - 1},\\]
where the normalization, B, is the beta function,
\\[B(\alpha, \beta) = \int_0^1 t^{\alpha - 1} (1 - t)^{\beta - 1} dt.\\]
It is often seen in Bayesian inference and order statistics.
Note
New code should use the `beta` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Alpha, positive (>0).
bfloat or array_like of floats
    
Beta, positive (>0).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` and `b` are both scalars. Otherwise, `np.broadcast(a, b).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized beta distribution.
See also
`random.Generator.beta`
    
which should be used for new code.
# numpy.random.RandomState.binomial
method
random.RandomState.binomial(n, p, size=None)
    
Draw samples from a binomial distribution.
Samples are drawn from a binomial distribution with specified parameters, n trials and p probability of success where n an integer >= 0 and p is in the interval [0,1]. (n may be input as a float, but it is truncated to an integer in use)
Note
New code should use the `binomial` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
nint or array_like of ints
    
Parameter of the distribution, >= 0. Floats are also accepted, but they will be truncated to integers.
pfloat or array_like of floats
    
Parameter of the distribution, >= 0 and <=1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `n` and `p` are both scalars. Otherwise, `np.broadcast(n, p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized binomial distribution, where each sample is equal to the number of successes over the n trials.
See also
`scipy.stats.binom`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.binomial`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) for the binomial distribution is
\\[P(N) = \binom{n}{N}p^N(1-p)^{n-N},\\]
where \\(n\\) is the number of trials, \\(p\\) is the probability of success, and \\(N\\) is the number of successes.
When estimating the standard error of a proportion in a population by using a random sample, the normal distribution works well unless the product p*n <=5, where p = population proportion estimate, and n = number of samples, in which case the binomial distribution is used instead. For example, a sample of 15 people shows 4 who are left handed, and 11 who are right handed. Then p = 4/15 = 27%. 0.27*15 = 4, so the binomial distribution should be used in this case.
#### References
[1]
Dalgaard, Peter, “Introductory Statistics with R”, Springer-Verlag, 2002.
[2]
Glantz, Stanton A. “Primer of Biostatistics.”, McGraw-Hill, Fifth Edition, 2002.
[3]
Lentner, Marvin, “Elementary Applied Statistics”, Bogden and Quigley, 1972.
[4]
Weisstein, Eric W. “Binomial Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/BinomialDistribution.html
[5]
Wikipedia, “Binomial distribution”, https://en.wikipedia.org/wiki/Binomial_distribution
#### Examples
Draw samples from the distribution:
    
    >>> n, p = 10, .5  # number of trials, probability of each trial
    >>> s = np.random.binomial(n, p, 1000)
    # result of flipping a coin 10 times, tested 1000 times.
    
A real world example. A company drills 9 wild-cat oil exploration wells, each with an estimated probability of success of 0.1. All nine wells fail. What is the probability of that happening?
Let’s do 20,000 trials of the model, and count the number that generate zero positive results.
    
    >>> sum(np.random.binomial(9, 0.1, 20000) == 0)/20000.
    # answer = 0.38885, or 38%.
    
# numpy.random.RandomState.bytes
method
random.RandomState.bytes(length)
    
Return random bytes.
Note
New code should use the `bytes` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lengthint
    
Number of random bytes.
Returns:
    
outbytes
    
String of length `length`.
See also
`random.Generator.bytes`
    
which should be used for new code.
#### Examples
    
    >>> np.random.bytes(10)
    b' eh\x85\x022SZ\xbf\xa4' #random
    
# numpy.random.RandomState.chisquare
method
random.RandomState.chisquare(df, size=None)
    
Draw samples from a chi-square distribution.
When `df` independent random variables, each with standard normal distributions (mean 0, variance 1), are squared and summed, the resulting distribution is chi-square (see Notes). This distribution is often used in hypothesis testing.
Note
New code should use the `chisquare` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dffloat or array_like of floats
    
Number of degrees of freedom, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` is a scalar. Otherwise, `np.array(df).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized chi-square distribution.
Raises:
    
ValueError
    
When `df` <= 0 or when an inappropriate `size` (e.g. `size=-1`) is given.
See also
`random.Generator.chisquare`
    
which should be used for new code.
#### Notes
The variable obtained by summing the squares of `df` independent, standard normally distributed random variables:
\\[Q = \sum_{i=1}^{\mathtt{df}} X^2_i\\]
is chi-square distributed, denoted
\\[Q \sim \chi^2_k.\\]
The probability density function of the chi-squared distribution is
\\[p(x) = \frac{(1/2)^{k/2}}{\Gamma(k/2)} x^{k/2 - 1} e^{-x/2},\\]
where \\(\Gamma\\) is the gamma function,
\\[\Gamma(x) = \int_0^{-\infty} t^{x - 1} e^{-t} dt.\\]
#### References
[1]
NIST “Engineering Statistics Handbook” https://www.itl.nist.gov/div898/handbook/eda/section3/eda3666.htm
#### Examples
    
    >>> np.random.chisquare(2,4)
    array([ 1.89920014,  9.00867716,  3.13710533,  5.62318272]) # random
    
# numpy.random.RandomState.choice
method
random.RandomState.choice(a, size=None, replace=True, p=None)
    
Generates a random sample from a given 1-D array
Note
New code should use the `choice` method of a `Generator` instance instead; please see the Quick start.
Warning
This function uses the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms.
Parameters:
    
a1-D array-like or int
    
If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if it were `np.arange(a)`
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
replaceboolean, optional
    
Whether the sample is with or without replacement. Default is True, meaning that a value of `a` can be selected multiple times.
p1-D array-like, optional
    
The probabilities associated with each entry in a. If not given, the sample assumes a uniform distribution over all entries in `a`.
Returns:
    
samplessingle item or ndarray
    
The generated random samples
Raises:
    
ValueError
    
If a is an int and less than zero, if a or p are not 1-dimensional, if a is an array-like of size 0, if p is not a vector of probabilities, if a and p have different lengths, or if replace=False and the sample size is greater than the population size
See also
`randint`, `shuffle`, `permutation`
`random.Generator.choice`
    
which should be used in new code
#### Notes
Setting user-specified probabilities through `p` uses a more general but less efficient sampler than the default. The general sampler produces a different sample than the optimized sampler even if each element of `p` is 1 / len(a).
Sampling random rows from a 2-D array is not possible with this function, but is possible with `Generator.choice` through its `axis` keyword.
#### Examples
Generate a uniform random sample from np.arange(5) of size 3:
    
    >>> np.random.choice(5, 3)
    array([0, 3, 4]) # random
    >>> #This is equivalent to np.random.randint(0,5,3)
    
Generate a non-uniform random sample from np.arange(5) of size 3:
    
    >>> np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
    array([3, 3, 0]) # random
    
Generate a uniform random sample from np.arange(5) of size 3 without replacement:
    
    >>> np.random.choice(5, 3, replace=False)
    array([3,1,0]) # random
    >>> #This is equivalent to np.random.permutation(np.arange(5))[:3]
    
Generate a non-uniform random sample from np.arange(5) of size 3 without replacement:
    
    >>> np.random.choice(5, 3, replace=False, p=[0.1, 0, 0.3, 0.6, 0])
    array([2, 3, 0]) # random
    
Any of the above can be repeated with an arbitrary array-like instead of just integers. For instance:
    
    >>> aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']
    >>> np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
    array(['pooh', 'pooh', 'pooh', 'Christopher', 'piglet'], # random
          dtype='<U11')
    
# numpy.random.RandomState.dirichlet
method
random.RandomState.dirichlet(alpha, size=None)
    
Draw samples from the Dirichlet distribution.
Draw `size` samples of dimension k from a Dirichlet distribution. A Dirichlet-distributed random variable can be seen as a multivariate generalization of a Beta distribution. The Dirichlet distribution is a conjugate prior of a multinomial distribution in Bayesian inference.
Note
New code should use the `dirichlet` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
alphasequence of floats, length k
    
Parameter of the distribution (length `k` for sample of length `k`).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n)`, then `m * n * k` samples are drawn. Default is None, in which case a vector of length `k` is returned.
Returns:
    
samplesndarray,
    
The drawn samples, of shape `(size, k)`.
Raises:
    
ValueError
    
If any value in `alpha` is less than or equal to zero
See also
`random.Generator.dirichlet`
    
which should be used for new code.
#### Notes
The Dirichlet distribution is a distribution over vectors \\(x\\) that fulfil the conditions \\(x_i>0\\) and \\(\sum_{i=1}^k x_i = 1\\).
The probability density function \\(p\\) of a Dirichlet-distributed random vector \\(X\\) is proportional to
\\[p(x) \propto \prod_{i=1}^{k}{x^{\alpha_i-1}_i},\\]
where \\(\alpha\\) is a vector containing the positive concentration parameters.
The method uses the following property for computation: let \\(Y\\) be a random vector which has components that follow a standard gamma distribution, then \\(X = \frac{1}{\sum_{i=1}^k{Y_i}} Y\\) is Dirichlet-distributed
#### References
[1]
David McKay, “Information Theory, Inference and Learning Algorithms,” chapter 23, https://www.inference.org.uk/mackay/itila/
[2]
Wikipedia, “Dirichlet distribution”, https://en.wikipedia.org/wiki/Dirichlet_distribution
#### Examples
Taking an example cited in Wikipedia, this distribution can be used if one wanted to cut strings (each of initial length 1.0) into K pieces with different lengths, where each piece had, on average, a designated average length, but allowing some variation in the relative sizes of the pieces.
    
    >>> s = np.random.dirichlet((10, 5, 3), 20).transpose()
    
    
    >>> import matplotlib.pyplot as plt
    >>> plt.barh(range(20), s[0])
    >>> plt.barh(range(20), s[1], left=s[0], color='g')
    >>> plt.barh(range(20), s[2], left=s[0]+s[1], color='r')
    >>> plt.title("Lengths of Strings")
    
# numpy.random.RandomState.exponential
method
random.RandomState.exponential(scale=1.0, size=None)
    
Draw samples from an exponential distribution.
Its probability density function is
\\[f(x; \frac{1}{\beta}) = \frac{1}{\beta} \exp(-\frac{x}{\beta}),\\]
for `x > 0` and 0 elsewhere. \\(\beta\\) is the scale parameter, which is the inverse of the rate parameter \\(\lambda = 1/\beta\\). The rate parameter is an alternative, widely used parameterization of the exponential distribution [3].
The exponential distribution is a continuous analogue of the geometric distribution. It describes many common situations, such as the size of raindrops measured over many rainstorms [1], or the time between page requests to Wikipedia [2].
Note
New code should use the `exponential` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
scalefloat or array_like of floats
    
The scale parameter, \\(\beta = 1/\lambda\\). Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `scale` is a scalar. Otherwise, `np.array(scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized exponential distribution.
See also
`random.Generator.exponential`
    
which should be used for new code.
#### References
[1]
Peyton Z. Peebles Jr., “Probability, Random Variables and Random Signal Principles”, 4th ed, 2001, p. 57.
[2]
Wikipedia, “Poisson process”, https://en.wikipedia.org/wiki/Poisson_process
[3]
Wikipedia, “Exponential distribution”, https://en.wikipedia.org/wiki/Exponential_distribution
#### Examples
A real world example: Assume a company has 10000 customer support agents and the average time between customer calls is 4 minutes.
    
    >>> n = 10000
    >>> time_between_calls = np.random.default_rng().exponential(scale=4, size=n)
    
What is the probability that a customer will call in the next 4 to 5 minutes?
    
    >>> x = ((time_between_calls < 5).sum())/n 
    >>> y = ((time_between_calls < 4).sum())/n
    >>> x-y
    0.08 # may vary
    
# numpy.random.RandomState.f
method
random.RandomState.f(dfnum, dfden, size=None)
    
Draw samples from an F distribution.
Samples are drawn from an F distribution with specified parameters, `dfnum` (degrees of freedom in numerator) and `dfden` (degrees of freedom in denominator), where both parameters must be greater than zero.
The random variate of the F distribution (also known as the Fisher distribution) is a continuous probability distribution that arises in ANOVA tests, and is the ratio of two chi-square variates.
Note
New code should use the `f` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dfnumfloat or array_like of floats
    
Degrees of freedom in numerator, must be > 0.
dfdenfloat or array_like of float
    
Degrees of freedom in denominator, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `dfnum` and `dfden` are both scalars. Otherwise, `np.broadcast(dfnum, dfden).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Fisher distribution.
See also
`scipy.stats.f`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.f`
    
which should be used for new code.
#### Notes
The F statistic is used to compare in-group variances to between-group variances. Calculating the distribution depends on the sampling, and so it is a function of the respective degrees of freedom in the problem. The variable `dfnum` is the number of samples minus one, the between-groups degrees of freedom, while `dfden` is the within-groups degrees of freedom, the sum of the number of samples in each group minus the number of groups.
#### References
[1]
Glantz, Stanton A. “Primer of Biostatistics.”, McGraw-Hill, Fifth Edition, 2002.
[2]
Wikipedia, “F-distribution”, https://en.wikipedia.org/wiki/F-distribution
#### Examples
An example from Glantz[1], pp 47-40:
Two groups, children of diabetics (25 people) and children from people without diabetes (25 controls). Fasting blood glucose was measured, case group had a mean value of 86.1, controls had a mean value of 82.2. Standard deviations were 2.09 and 2.49 respectively. Are these data consistent with the null hypothesis that the parents diabetic status does not affect their children’s blood glucose levels? Calculating the F statistic from the data gives a value of 36.01.
Draw samples from the distribution:
    
    >>> dfnum = 1. # between group degrees of freedom
    >>> dfden = 48. # within groups degrees of freedom
    >>> s = np.random.f(dfnum, dfden, 1000)
    
The lower bound for the top 1% of the samples is :
    
    >>> np.sort(s)[-10]
    7.61988120985 # random
    
So there is about a 1% chance that the F statistic will exceed 7.62, the measured value is 36, so the null hypothesis is rejected at the 1% level.
# numpy.random.RandomState.gamma
method
random.RandomState.gamma(shape, scale=1.0, size=None)
    
Draw samples from a Gamma distribution.
Samples are drawn from a Gamma distribution with specified parameters, `shape` (sometimes designated “k”) and `scale` (sometimes designated “theta”), where both parameters are > 0.
Note
New code should use the `gamma` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
shapefloat or array_like of floats
    
The shape of the gamma distribution. Must be non-negative.
scalefloat or array_like of floats, optional
    
The scale of the gamma distribution. Must be non-negative. Default is equal to 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `shape` and `scale` are both scalars. Otherwise, `np.broadcast(shape, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized gamma distribution.
See also
`scipy.stats.gamma`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.gamma`
    
which should be used for new code.
#### Notes
The probability density for the Gamma distribution is
\\[p(x) = x^{k-1}\frac{e^{-x/\theta}}{\theta^k\Gamma(k)},\\]
where \\(k\\) is the shape and \\(\theta\\) the scale, and \\(\Gamma\\) is the Gamma function.
The Gamma distribution is often used to model the times to failure of electronic components, and arises naturally in processes for which the waiting times between Poisson distributed events are relevant.
#### References
[1]
Weisstein, Eric W. “Gamma Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/GammaDistribution.html
[2]
Wikipedia, “Gamma distribution”, https://en.wikipedia.org/wiki/Gamma_distribution
#### Examples
Draw samples from the distribution:
    
    >>> shape, scale = 2., 2.  # mean=4, std=2*sqrt(2)
    >>> s = np.random.gamma(shape, scale, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.special as sps  
    >>> count, bins, ignored = plt.hist(s, 50, density=True)
    >>> y = bins**(shape-1)*(np.exp(-bins/scale) /  
    ...                      (sps.gamma(shape)*scale**shape))
    >>> plt.plot(bins, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.RandomState.geometric
method
random.RandomState.geometric(p, size=None)
    
Draw samples from the geometric distribution.
Bernoulli trials are experiments with one of two outcomes: success or failure (an example of such an experiment is flipping a coin). The geometric distribution models the number of trials that must be run in order to achieve success. It is therefore supported on the positive integers, `k = 1, 2, ...`.
The probability mass function of the geometric distribution is
\\[f(k) = (1 - p)^{k - 1} p\\]
where `p` is the probability of success of an individual trial.
Note
New code should use the `geometric` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
pfloat or array_like of floats
    
The probability of success of an individual trial.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `p` is a scalar. Otherwise, `np.array(p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized geometric distribution.
See also
`random.Generator.geometric`
    
which should be used for new code.
#### Examples
Draw ten thousand values from the geometric distribution, with the probability of an individual success equal to 0.35:
    
    >>> z = np.random.geometric(p=0.35, size=10000)
    
How many trials succeeded after a single run?
    
    >>> (z == 1).sum() / 10000.
    0.34889999999999999 #random
    
# numpy.random.RandomState.get_state
method
random.RandomState.get_state(legacy=True)
    
Return a tuple representing the internal state of the generator.
For more details, see `set_state`.
Parameters:
    
legacybool, optional
    
Flag indicating to return a legacy tuple state when the BitGenerator is MT19937, instead of a dict. Raises ValueError if the underlying bit generator is not an instance of MT19937.
Returns:
    
out{tuple(str, ndarray of 624 uints, int, int, float), dict}
    
If legacy is True, the returned tuple has the following items:
  1. the string ‘MT19937’.
  2. a 1-D array of 624 unsigned integer keys.
  3. an integer `pos`.
  4. an integer `has_gauss`.
  5. a float `cached_gaussian`.


If `legacy` is False, or the BitGenerator is not MT19937, then state is returned as a dictionary.
See also
`set_state`
#### Notes
`set_state` and `get_state` are not needed to work with any of the random distributions in NumPy. If the internal state is manually altered, the user should know exactly what he/she is doing.
# numpy.random.RandomState.gumbel
method
random.RandomState.gumbel(loc=0.0, scale=1.0, size=None)
    
Draw samples from a Gumbel distribution.
Draw samples from a Gumbel distribution with specified location and scale. For more information on the Gumbel distribution, see Notes and References below.
Note
New code should use the `gumbel` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats, optional
    
The location of the mode of the distribution. Default is 0.
scalefloat or array_like of floats, optional
    
The scale parameter of the distribution. Default is 1. Must be non- negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Gumbel distribution.
See also
`scipy.stats.gumbel_l`
`scipy.stats.gumbel_r`
`scipy.stats.genextreme`
`weibull`
`random.Generator.gumbel`
    
which should be used for new code.
#### Notes
The Gumbel (or Smallest Extreme Value (SEV) or the Smallest Extreme Value Type I) distribution is one of a class of Generalized Extreme Value (GEV) distributions used in modeling extreme value problems. The Gumbel is a special case of the Extreme Value Type I distribution for maximums from distributions with “exponential-like” tails.
The probability density for the Gumbel distribution is
\\[p(x) = \frac{e^{-(x - \mu)/ \beta}}{\beta} e^{ -e^{-(x - \mu)/ \beta}},\\]
where \\(\mu\\) is the mode, a location parameter, and \\(\beta\\) is the scale parameter.
The Gumbel (named for German mathematician Emil Julius Gumbel) was used very early in the hydrology literature, for modeling the occurrence of flood events. It is also used for modeling maximum wind speed and rainfall rates. It is a “fat-tailed” distribution - the probability of an event in the tail of the distribution is larger than if one used a Gaussian, hence the surprisingly frequent occurrence of 100-year floods. Floods were initially modeled as a Gaussian process, which underestimated the frequency of extreme events.
It is one of a class of extreme value distributions, the Generalized Extreme Value (GEV) distributions, which also includes the Weibull and Frechet.
The function has a mean of \\(\mu + 0.57721\beta\\) and a variance of \\(\frac{\pi^2}{6}\beta^2\\).
#### References
[1]
Gumbel, E. J., “Statistics of Extremes,” New York: Columbia University Press, 1958.
[2]
Reiss, R.-D. and Thomas, M., “Statistical Analysis of Extreme Values from Insurance, Finance, Hydrology and Other Fields,” Basel: Birkhauser Verlag, 2001.
#### Examples
Draw samples from the distribution:
    
    >>> mu, beta = 0, 0.1 # location and scale
    >>> s = np.random.gumbel(mu, beta, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 30, density=True)
    >>> plt.plot(bins, (1/beta)*np.exp(-(bins - mu)/beta)
    ...          * np.exp( -np.exp( -(bins - mu) /beta) ),
    ...          linewidth=2, color='r')
    >>> plt.show()
    
Show how an extreme value distribution can arise from a Gaussian process and compare to a Gaussian:
    
    >>> means = []
    >>> maxima = []
    >>> for i in range(0,1000) :
    ...    a = np.random.normal(mu, beta, 1000)
    ...    means.append(a.mean())
    ...    maxima.append(a.max())
    >>> count, bins, ignored = plt.hist(maxima, 30, density=True)
    >>> beta = np.std(maxima) * np.sqrt(6) / np.pi
    >>> mu = np.mean(maxima) - 0.57721*beta
    >>> plt.plot(bins, (1/beta)*np.exp(-(bins - mu)/beta)
    ...          * np.exp(-np.exp(-(bins - mu)/beta)),
    ...          linewidth=2, color='r')
    >>> plt.plot(bins, 1/(beta * np.sqrt(2 * np.pi))
    ...          * np.exp(-(bins - mu)**2 / (2 * beta**2)),
    ...          linewidth=2, color='g')
    >>> plt.show()
    
# numpy.random.RandomState.hypergeometric
method
random.RandomState.hypergeometric(ngood, nbad, nsample, size=None)
    
Draw samples from a Hypergeometric distribution.
Samples are drawn from a hypergeometric distribution with specified parameters, `ngood` (ways to make a good selection), `nbad` (ways to make a bad selection), and `nsample` (number of items sampled, which is less than or equal to the sum `ngood + nbad`).
Note
New code should use the `hypergeometric` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
ngoodint or array_like of ints
    
Number of ways to make a good selection. Must be nonnegative.
nbadint or array_like of ints
    
Number of ways to make a bad selection. Must be nonnegative.
nsampleint or array_like of ints
    
Number of items sampled. Must be at least 1 and at most `ngood + nbad`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `ngood`, `nbad`, and `nsample` are all scalars. Otherwise, `np.broadcast(ngood, nbad, nsample).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized hypergeometric distribution. Each sample is the number of good items within a randomly selected subset of size `nsample` taken from a set of `ngood` good items and `nbad` bad items.
See also
`scipy.stats.hypergeom`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.hypergeometric`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) for the Hypergeometric distribution is
\\[P(x) = \frac{\binom{g}{x}\binom{b}{n-x}}{\binom{g+b}{n}},\\]
where \\(0 \le x \le n\\) and \\(n-b \le x \le g\\)
for P(x) the probability of `x` good results in the drawn sample, g = `ngood`, b = `nbad`, and n = `nsample`.
Consider an urn with black and white marbles in it, `ngood` of them are black and `nbad` are white. If you draw `nsample` balls without replacement, then the hypergeometric distribution describes the distribution of black balls in the drawn sample.
Note that this distribution is very similar to the binomial distribution, except that in this case, samples are drawn without replacement, whereas in the Binomial case samples are drawn with replacement (or the sample space is infinite). As the sample space becomes large, this distribution approaches the binomial.
#### References
[1]
Lentner, Marvin, “Elementary Applied Statistics”, Bogden and Quigley, 1972.
[2]
Weisstein, Eric W. “Hypergeometric Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/HypergeometricDistribution.html
[3]
Wikipedia, “Hypergeometric distribution”, https://en.wikipedia.org/wiki/Hypergeometric_distribution
#### Examples
Draw samples from the distribution:
    
    >>> ngood, nbad, nsamp = 100, 2, 10
    # number of good, number of bad, and number of samples
    >>> s = np.random.hypergeometric(ngood, nbad, nsamp, 1000)
    >>> from matplotlib.pyplot import hist
    >>> hist(s)
    #   note that it is very unlikely to grab both bad items
    
Suppose you have an urn with 15 white and 15 black marbles. If you pull 15 marbles at random, how likely is it that 12 or more of them are one color?
    
    >>> s = np.random.hypergeometric(15, 15, 15, 100000)
    >>> sum(s>=12)/100000. + sum(s<=3)/100000.
    #   answer = 0.003 ... pretty unlikely!
    
# numpy.random.RandomState.laplace
method
random.RandomState.laplace(loc=0.0, scale=1.0, size=None)
    
Draw samples from the Laplace or double exponential distribution with specified location (or mean) and scale (decay).
The Laplace distribution is similar to the Gaussian/normal distribution, but is sharper at the peak and has fatter tails. It represents the difference between two independent, identically distributed exponential random variables.
Note
New code should use the `laplace` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats, optional
    
The position, \\(\mu\\), of the distribution peak. Default is 0.
scalefloat or array_like of floats, optional
    
\\(\lambda\\), the exponential decay. Default is 1. Must be non- negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Laplace distribution.
See also
`random.Generator.laplace`
    
which should be used for new code.
#### Notes
It has the probability density function
\\[f(x; \mu, \lambda) = \frac{1}{2\lambda} \exp\left(-\frac{|x - \mu|}{\lambda}\right).\\]
The first law of Laplace, from 1774, states that the frequency of an error can be expressed as an exponential function of the absolute magnitude of the error, which leads to the Laplace distribution. For many problems in economics and health sciences, this distribution seems to model the data better than the standard Gaussian distribution.
#### References
[1]
Abramowitz, M. and Stegun, I. A. (Eds.). “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing,” New York: Dover, 1972.
[2]
Kotz, Samuel, et. al. “The Laplace Distribution and Generalizations, “ Birkhauser, 2001.
[3]
Weisstein, Eric W. “Laplace Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/LaplaceDistribution.html
[4]
Wikipedia, “Laplace distribution”, https://en.wikipedia.org/wiki/Laplace_distribution
#### Examples
Draw samples from the distribution
    
    >>> loc, scale = 0., 1.
    >>> s = np.random.laplace(loc, scale, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 30, density=True)
    >>> x = np.arange(-8., 8., .01)
    >>> pdf = np.exp(-abs(x-loc)/scale)/(2.*scale)
    >>> plt.plot(x, pdf)
    
Plot Gaussian for comparison:
    
    >>> g = (1/(scale * np.sqrt(2 * np.pi)) *
    ...      np.exp(-(x - loc)**2 / (2 * scale**2)))
    >>> plt.plot(x,g)
    
# numpy.random.RandomState.logistic
method
random.RandomState.logistic(loc=0.0, scale=1.0, size=None)
    
Draw samples from a logistic distribution.
Samples are drawn from a logistic distribution with specified parameters, loc (location or mean, also median), and scale (>0).
Note
New code should use the `logistic` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats, optional
    
Parameter of the distribution. Default is 0.
scalefloat or array_like of floats, optional
    
Parameter of the distribution. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized logistic distribution.
See also
`scipy.stats.logistic`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.logistic`
    
which should be used for new code.
#### Notes
The probability density for the Logistic distribution is
\\[P(x) = P(x) = \frac{e^{-(x-\mu)/s}}{s(1+e^{-(x-\mu)/s})^2},\\]
where \\(\mu\\) = location and \\(s\\) = scale.
The Logistic distribution is used in Extreme Value problems where it can act as a mixture of Gumbel distributions, in Epidemiology, and by the World Chess Federation (FIDE) where it is used in the Elo ranking system, assuming the performance of each player is a logistically distributed random variable.
#### References
[1]
Reiss, R.-D. and Thomas M. (2001), “Statistical Analysis of Extreme Values, from Insurance, Finance, Hydrology and Other Fields,” Birkhauser Verlag, Basel, pp 132-133.
[2]
Weisstein, Eric W. “Logistic Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/LogisticDistribution.html
[3]
Wikipedia, “Logistic-distribution”, https://en.wikipedia.org/wiki/Logistic_distribution
#### Examples
Draw samples from the distribution:
    
    >>> loc, scale = 10, 1
    >>> s = np.random.logistic(loc, scale, 10000)
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, bins=50)
    
# plot against distribution
    
    >>> def logist(x, loc, scale):
    ...     return np.exp((loc-x)/scale)/(scale*(1+np.exp((loc-x)/scale))**2)
    >>> lgst_val = logist(bins, loc, scale)
    >>> plt.plot(bins, lgst_val * count.max() / lgst_val.max())
    >>> plt.show()
    
# numpy.random.RandomState.lognormal
method
random.RandomState.lognormal(mean=0.0, sigma=1.0, size=None)
    
Draw samples from a log-normal distribution.
Draw samples from a log-normal distribution with specified mean, standard deviation, and array shape. Note that the mean and standard deviation are not the values for the distribution itself, but of the underlying normal distribution it is derived from.
Note
New code should use the `lognormal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
meanfloat or array_like of floats, optional
    
Mean value of the underlying normal distribution. Default is 0.
sigmafloat or array_like of floats, optional
    
Standard deviation of the underlying normal distribution. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mean` and `sigma` are both scalars. Otherwise, `np.broadcast(mean, sigma).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized log-normal distribution.
See also
`scipy.stats.lognorm`
    
probability density function, distribution, cumulative density function, etc.
`random.Generator.lognormal`
    
which should be used for new code.
#### Notes
A variable `x` has a log-normal distribution if `log(x)` is normally distributed. The probability density function for the log-normal distribution is:
\\[p(x) = \frac{1}{\sigma x \sqrt{2\pi}} e^{(-\frac{(ln(x)-\mu)^2}{2\sigma^2})}\\]
where \\(\mu\\) is the mean and \\(\sigma\\) is the standard deviation of the normally distributed logarithm of the variable. A log-normal distribution results if a random variable is the product of a large number of independent, identically-distributed variables in the same way that a normal distribution results if the variable is the sum of a large number of independent, identically-distributed variables.
#### References
[1]
Limpert, E., Stahel, W. A., and Abbt, M., “Log-normal Distributions across the Sciences: Keys and Clues,” BioScience, Vol. 51, No. 5, May, 2001. https://stat.ethz.ch/~stahel/lognormal/bioscience.pdf
[2]
Reiss, R.D. and Thomas, M., “Statistical Analysis of Extreme Values,” Basel: Birkhauser Verlag, 2001, pp. 31-32.
#### Examples
Draw samples from the distribution:
    
    >>> mu, sigma = 3., 1. # mean and standard deviation
    >>> s = np.random.lognormal(mu, sigma, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 100, density=True, align='mid')
    
    
    >>> x = np.linspace(min(bins), max(bins), 10000)
    >>> pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
    ...        / (x * sigma * np.sqrt(2 * np.pi)))
    
    
    >>> plt.plot(x, pdf, linewidth=2, color='r')
    >>> plt.axis('tight')
    >>> plt.show()
    
Demonstrate that taking the products of random samples from a uniform distribution can be fit well by a log-normal probability density function.
    
    >>> # Generate a thousand samples: each is the product of 100 random
    >>> # values, drawn from a normal distribution.
    >>> b = []
    >>> for i in range(1000):
    ...    a = 10. + np.random.standard_normal(100)
    ...    b.append(np.prod(a))
    
    
    >>> b = np.array(b) / np.min(b) # scale values to be positive
    >>> count, bins, ignored = plt.hist(b, 100, density=True, align='mid')
    >>> sigma = np.std(np.log(b))
    >>> mu = np.mean(np.log(b))
    
    
    >>> x = np.linspace(min(bins), max(bins), 10000)
    >>> pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
    ...        / (x * sigma * np.sqrt(2 * np.pi)))
    
    
    >>> plt.plot(x, pdf, color='r', linewidth=2)
    >>> plt.show()
    
# numpy.random.RandomState.logseries
method
random.RandomState.logseries(p, size=None)
    
Draw samples from a logarithmic series distribution.
Samples are drawn from a log series distribution with specified shape parameter, 0 <= `p` < 1.
Note
New code should use the `logseries` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
pfloat or array_like of floats
    
Shape parameter for the distribution. Must be in the range [0, 1).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `p` is a scalar. Otherwise, `np.array(p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized logarithmic series distribution.
See also
`scipy.stats.logser`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.logseries`
    
which should be used for new code.
#### Notes
The probability density for the Log Series distribution is
\\[P(k) = \frac{-p^k}{k \ln(1-p)},\\]
where p = probability.
The log series distribution is frequently used to represent species richness and occurrence, first proposed by Fisher, Corbet, and Williams in 1943 [2]. It may also be used to model the numbers of occupants seen in cars [3].
#### References
[1]
Buzas, Martin A.; Culver, Stephen J., Understanding regional species diversity through the log series distribution of occurrences: BIODIVERSITY RESEARCH Diversity & Distributions, Volume 5, Number 5, September 1999 , pp. 187-195(9).
[2]
Fisher, R.A,, A.S. Corbet, and C.B. Williams. 1943. The relation between the number of species and the number of individuals in a random sample of an animal population. Journal of Animal Ecology, 12:42-58.
[3]
D. J. Hand, F. Daly, D. Lunn, E. Ostrowski, A Handbook of Small Data Sets, CRC Press, 1994.
[4]
Wikipedia, “Logarithmic distribution”, https://en.wikipedia.org/wiki/Logarithmic_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a = .6
    >>> s = np.random.logseries(a, 10000)
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s)
    
# plot against distribution
    
    >>> def logseries(k, p):
    ...     return -p**k/(k*np.log(1-p))
    >>> plt.plot(bins, logseries(bins, a)*count.max()/
    ...          logseries(bins, a).max(), 'r')
    >>> plt.show()
    
# numpy.random.RandomState.multinomial
method
random.RandomState.multinomial(n, pvals, size=None)
    
Draw samples from a multinomial distribution.
The multinomial distribution is a multivariate generalization of the binomial distribution. Take an experiment with one of `p` possible outcomes. An example of such an experiment is throwing a dice, where the outcome can be 1 through 6. Each sample drawn from the distribution represents `n` such experiments. Its values, `X_i = [X_0, X_1, ..., X_p]`, represent the number of times the outcome was `i`.
Note
New code should use the `multinomial` method of a `Generator` instance instead; please see the Quick start.
Warning
This function defaults to the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms.
Parameters:
    
nint
    
Number of experiments.
pvalssequence of floats, length p
    
Probabilities of each of the `p` different outcomes. These must sum to 1 (however, the last element is always assumed to account for the remaining probability, as long as `sum(pvals[:-1]) <= 1)`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outndarray
    
The drawn samples, of shape size, if that was provided. If not, the shape is `(N,)`.
In other words, each entry `out[i,j,...,:]` is an N-dimensional value drawn from the distribution.
See also
`random.Generator.multinomial`
    
which should be used for new code.
#### Examples
Throw a dice 20 times:
    
    >>> np.random.multinomial(20, [1/6.]*6, size=1)
    array([[4, 1, 7, 5, 2, 1]]) # random
    
It landed 4 times on 1, once on 2, etc.
Now, throw the dice 20 times, and 20 times again:
    
    >>> np.random.multinomial(20, [1/6.]*6, size=2)
    array([[3, 4, 3, 3, 4, 3], # random
           [2, 4, 3, 4, 0, 7]])
    
For the first run, we threw 3 times 1, 4 times 2, etc. For the second, we threw 2 times 1, 4 times 2, etc.
A loaded die is more likely to land on number 6:
    
    >>> np.random.multinomial(100, [1/7.]*5 + [2/7.])
    array([11, 16, 14, 17, 16, 26]) # random
    
The probability inputs should be normalized. As an implementation detail, the value of the last entry is ignored and assumed to take up any leftover probability mass, but this should not be relied on. A biased coin which has twice as much weight on one side as on the other should be sampled like so:
    
    >>> np.random.multinomial(100, [1.0 / 3, 2.0 / 3])  # RIGHT
    array([38, 62]) # random
    
not like:
    
    >>> np.random.multinomial(100, [1.0, 2.0])  # WRONG
    Traceback (most recent call last):
    ValueError: pvals < 0, pvals > 1 or pvals contains NaNs
    
# numpy.random.RandomState.multivariate_normal
method
random.RandomState.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)
    
Draw random samples from a multivariate normal distribution.
The multivariate normal, multinormal or Gaussian distribution is a generalization of the one-dimensional normal distribution to higher dimensions. Such a distribution is specified by its mean and covariance matrix. These parameters are analogous to the mean (average or “center”) and variance (standard deviation, or “width,” squared) of the one-dimensional normal distribution.
Note
New code should use the `multivariate_normal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
mean1-D array_like, of length N
    
Mean of the N-dimensional distribution.
cov2-D array_like, of shape (N, N)
    
Covariance matrix of the distribution. It must be symmetric and positive-semidefinite for proper sampling.
sizeint or tuple of ints, optional
    
Given a shape of, for example, `(m,n,k)`, `m*n*k` samples are generated, and packed in an `m`-by-`n`-by-`k` arrangement. Because each sample is `N`-dimensional, the output shape is `(m,n,k,N)`. If no shape is specified, a single (`N`-D) sample is returned.
check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, optional
    
Behavior when the covariance matrix is not positive semidefinite.
tolfloat, optional
    
Tolerance when checking the singular values in covariance matrix. cov is cast to double before the check.
Returns:
    
outndarray
    
The drawn samples, of shape size, if that was provided. If not, the shape is `(N,)`.
In other words, each entry `out[i,j,...,:]` is an N-dimensional value drawn from the distribution.
See also
`random.Generator.multivariate_normal`
    
which should be used for new code.
#### Notes
The mean is a coordinate in N-dimensional space, which represents the location where samples are most likely to be generated. This is analogous to the peak of the bell curve for the one-dimensional or univariate normal distribution.
Covariance indicates the level to which two variables vary together. From the multivariate normal distribution, we draw N-dimensional samples, \\(X = [x_1, x_2, ... x_N]\\). The covariance matrix element \\(C_{ij}\\) is the covariance of \\(x_i\\) and \\(x_j\\). The element \\(C_{ii}\\) is the variance of \\(x_i\\) (i.e. its “spread”).
Instead of specifying the full covariance matrix, popular approximations include:
  * Spherical covariance (`cov` is a multiple of the identity matrix)
  * Diagonal covariance (`cov` has non-negative elements, and only on the diagonal)


This geometrical property can be seen in two dimensions by plotting generated data-points:
    
    >>> mean = [0, 0]
    >>> cov = [[1, 0], [0, 100]]  # diagonal covariance
    
Diagonal covariance means that points are oriented along x or y-axis:
    
    >>> import matplotlib.pyplot as plt
    >>> x, y = np.random.multivariate_normal(mean, cov, 5000).T
    >>> plt.plot(x, y, 'x')
    >>> plt.axis('equal')
    >>> plt.show()
    
Note that the covariance matrix must be positive semidefinite (a.k.a. nonnegative-definite). Otherwise, the behavior of this method is undefined and backwards compatibility is not guaranteed.
#### References
[1]
Papoulis, A., “Probability, Random Variables, and Stochastic Processes,” 3rd ed., New York: McGraw-Hill, 1991.
[2]
Duda, R. O., Hart, P. E., and Stork, D. G., “Pattern Classification,” 2nd ed., New York: Wiley, 2001.
#### Examples
    
    >>> mean = (1, 2)
    >>> cov = [[1, 0], [0, 1]]
    >>> x = np.random.multivariate_normal(mean, cov, (3, 3))
    >>> x.shape
    (3, 3, 2)
    
Here we generate 800 samples from the bivariate normal distribution with mean [0, 0] and covariance matrix [[6, -3], [-3, 3.5]]. The expected variances of the first and second components of the sample are 6 and 3.5, respectively, and the expected correlation coefficient is -3/sqrt(6*3.5) ≈ -0.65465.
    
    >>> cov = np.array([[6, -3], [-3, 3.5]])
    >>> pts = np.random.multivariate_normal([0, 0], cov, size=800)
    
Check that the mean, covariance, and correlation coefficient of the sample are close to the expected values:
    
    >>> pts.mean(axis=0)
    array([ 0.0326911 , -0.01280782])  # may vary
    >>> np.cov(pts.T)
    array([[ 5.96202397, -2.85602287],
           [-2.85602287,  3.47613949]])  # may vary
    >>> np.corrcoef(pts.T)[0, 1]
    -0.6273591314603949  # may vary
    
We can visualize this data with a scatter plot. The orientation of the point cloud illustrates the negative correlation of the components of this sample.
    
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(pts[:, 0], pts[:, 1], '.', alpha=0.5)
    >>> plt.axis('equal')
    >>> plt.grid()
    >>> plt.show()
    
# numpy.random.RandomState.negative_binomial
method
random.RandomState.negative_binomial(n, p, size=None)
    
Draw samples from a negative binomial distribution.
Samples are drawn from a negative binomial distribution with specified parameters, `n` successes and `p` probability of success where `n` is > 0 and `p` is in the interval [0, 1].
Note
New code should use the `negative_binomial` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
nfloat or array_like of floats
    
Parameter of the distribution, > 0.
pfloat or array_like of floats
    
Parameter of the distribution, >= 0 and <=1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `n` and `p` are both scalars. Otherwise, `np.broadcast(n, p).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized negative binomial distribution, where each sample is equal to N, the number of failures that occurred before a total of n successes was reached.
Warning
This function returns the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms.
See also
`random.Generator.negative_binomial`
    
which should be used for new code.
#### Notes
The probability mass function of the negative binomial distribution is
\\[P(N;n,p) = \frac{\Gamma(N+n)}{N!\Gamma(n)}p^{n}(1-p)^{N},\\]
where \\(n\\) is the number of successes, \\(p\\) is the probability of success, \\(N+n\\) is the number of trials, and \\(\Gamma\\) is the gamma function. When \\(n\\) is an integer, \\(\frac{\Gamma(N+n)}{N!\Gamma(n)} = \binom{N+n-1}{N}\\), which is the more common form of this term in the pmf. The negative binomial distribution gives the probability of N failures given n successes, with a success on the last trial.
If one throws a die repeatedly until the third time a “1” appears, then the probability distribution of the number of non-“1”s that appear before the third “1” is a negative binomial distribution.
#### References
[1]
Weisstein, Eric W. “Negative Binomial Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/NegativeBinomialDistribution.html
[2]
Wikipedia, “Negative binomial distribution”, https://en.wikipedia.org/wiki/Negative_binomial_distribution
#### Examples
Draw samples from the distribution:
A real world example. A company drills wild-cat oil exploration wells, each with an estimated probability of success of 0.1. What is the probability of having one success for each successive well, that is what is the probability of a single success after drilling 5 wells, after 6 wells, etc.?
    
    >>> s = np.random.negative_binomial(1, 0.1, 100000)
    >>> for i in range(1, 11): 
    ...    probability = sum(s<i) / 100000.
    ...    print(i, "wells drilled, probability of one success =", probability)
    
# numpy.random.RandomState.noncentral_chisquare
method
random.RandomState.noncentral_chisquare(df, nonc, size=None)
    
Draw samples from a noncentral chi-square distribution.
The noncentral \\(\chi^2\\) distribution is a generalization of the \\(\chi^2\\) distribution.
Note
New code should use the `noncentral_chisquare` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dffloat or array_like of floats
    
Degrees of freedom, must be > 0.
noncfloat or array_like of floats
    
Non-centrality, must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` and `nonc` are both scalars. Otherwise, `np.broadcast(df, nonc).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized noncentral chi-square distribution.
See also
`random.Generator.noncentral_chisquare`
    
which should be used for new code.
#### Notes
The probability density function for the noncentral Chi-square distribution is
\\[P(x;df,nonc) = \sum^{\infty}_{i=0} \frac{e^{-nonc/2}(nonc/2)^{i}}{i!} P_{Y_{df+2i}}(x),\\]
where \\(Y_{q}\\) is the Chi-square with q degrees of freedom.
#### References
[1]
Wikipedia, “Noncentral chi-squared distribution” https://en.wikipedia.org/wiki/Noncentral_chi-squared_distribution
#### Examples
Draw values from the distribution and plot the histogram
    
    >>> import matplotlib.pyplot as plt
    >>> values = plt.hist(np.random.noncentral_chisquare(3, 20, 100000),
    ...                   bins=200, density=True)
    >>> plt.show()
    
Draw values from a noncentral chisquare with very small noncentrality, and compare to a chisquare.
    
    >>> plt.figure()
    >>> values = plt.hist(np.random.noncentral_chisquare(3, .0000001, 100000),
    ...                   bins=np.arange(0., 25, .1), density=True)
    >>> values2 = plt.hist(np.random.chisquare(3, 100000),
    ...                    bins=np.arange(0., 25, .1), density=True)
    >>> plt.plot(values[1][0:-1], values[0]-values2[0], 'ob')
    >>> plt.show()
    
Demonstrate how large values of non-centrality lead to a more symmetric distribution.
    
    >>> plt.figure()
    >>> values = plt.hist(np.random.noncentral_chisquare(3, 20, 100000),
    ...                   bins=200, density=True)
    >>> plt.show()
    
# numpy.random.RandomState.noncentral_f
method
random.RandomState.noncentral_f(dfnum, dfden, nonc, size=None)
    
Draw samples from the noncentral F distribution.
Samples are drawn from an F distribution with specified parameters, `dfnum` (degrees of freedom in numerator) and `dfden` (degrees of freedom in denominator), where both parameters > 1\. `nonc` is the non-centrality parameter.
Note
New code should use the `noncentral_f` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dfnumfloat or array_like of floats
    
Numerator degrees of freedom, must be > 0.
dfdenfloat or array_like of floats
    
Denominator degrees of freedom, must be > 0.
noncfloat or array_like of floats
    
Non-centrality parameter, the sum of the squares of the numerator means, must be >= 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `dfnum`, `dfden`, and `nonc` are all scalars. Otherwise, `np.broadcast(dfnum, dfden, nonc).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized noncentral Fisher distribution.
See also
`random.Generator.noncentral_f`
    
which should be used for new code.
#### Notes
When calculating the power of an experiment (power = probability of rejecting the null hypothesis when a specific alternative is true) the non-central F statistic becomes important. When the null hypothesis is true, the F statistic follows a central F distribution. When the null hypothesis is not true, then it follows a non-central F statistic.
#### References
[1]
Weisstein, Eric W. “Noncentral F-Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/NoncentralF-Distribution.html
[2]
Wikipedia, “Noncentral F-distribution”, https://en.wikipedia.org/wiki/Noncentral_F-distribution
#### Examples
In a study, testing for a specific alternative to the null hypothesis requires use of the Noncentral F distribution. We need to calculate the area in the tail of the distribution that exceeds the value of the F distribution for the null hypothesis. We’ll plot the two probability distributions for comparison.
    
    >>> dfnum = 3 # between group deg of freedom
    >>> dfden = 20 # within groups degrees of freedom
    >>> nonc = 3.0
    >>> nc_vals = np.random.noncentral_f(dfnum, dfden, nonc, 1000000)
    >>> NF = np.histogram(nc_vals, bins=50, density=True)
    >>> c_vals = np.random.f(dfnum, dfden, 1000000)
    >>> F = np.histogram(c_vals, bins=50, density=True)
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(F[1][1:], F[0])
    >>> plt.plot(NF[1][1:], NF[0])
    >>> plt.show()
    
# numpy.random.RandomState.normal
method
random.RandomState.normal(loc=0.0, scale=1.0, size=None)
    
Draw random samples from a normal (Gaussian) distribution.
The probability density function of the normal distribution, first derived by De Moivre and 200 years later by both Gauss and Laplace independently [2], is often called the bell curve because of its characteristic shape (see the example below).
The normal distributions occurs often in nature. For example, it describes the commonly occurring distribution of samples influenced by a large number of tiny, random disturbances, each with its own unique distribution [2].
Note
New code should use the `normal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
locfloat or array_like of floats
    
Mean (“centre”) of the distribution.
scalefloat or array_like of floats
    
Standard deviation (spread or “width”) of the distribution. Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `loc` and `scale` are both scalars. Otherwise, `np.broadcast(loc, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized normal distribution.
See also
`scipy.stats.norm`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.normal`
    
which should be used for new code.
#### Notes
The probability density for the Gaussian distribution is
\\[p(x) = \frac{1}{\sqrt{ 2 \pi \sigma^2 }} e^{ - \frac{ (x - \mu)^2 } {2 \sigma^2} },\\]
where \\(\mu\\) is the mean and \\(\sigma\\) the standard deviation. The square of the standard deviation, \\(\sigma^2\\), is called the variance.
The function has its peak at the mean, and its “spread” increases with the standard deviation (the function reaches 0.607 times its maximum at \\(x + \sigma\\) and \\(x - \sigma\\) [2]). This implies that normal is more likely to return samples lying close to the mean, rather than those far away.
#### References
[1]
Wikipedia, “Normal distribution”, https://en.wikipedia.org/wiki/Normal_distribution
[2] (1,2,3)
P. R. Peebles Jr., “Central Limit Theorem” in “Probability, Random Variables and Random Signal Principles”, 4th ed., 2001, pp. 51, 51, 125.
#### Examples
Draw samples from the distribution:
    
    >>> mu, sigma = 0, 0.1 # mean and standard deviation
    >>> s = np.random.normal(mu, sigma, 1000)
    
Verify the mean and the standard deviation:
    
    >>> abs(mu - np.mean(s))
    0.0  # may vary
    
    
    >>> abs(sigma - np.std(s, ddof=1))
    0.1  # may vary
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 30, density=True)
    >>> plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
    ...                np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
    ...          linewidth=2, color='r')
    >>> plt.show()
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> np.random.normal(3, 2.5, size=(2, 4))
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.RandomState.pareto
method
random.RandomState.pareto(a, size=None)
    
Draw samples from a Pareto II or Lomax distribution with specified shape.
The Lomax or Pareto II distribution is a shifted Pareto distribution. The classical Pareto distribution can be obtained from the Lomax distribution by adding 1 and multiplying by the scale parameter `m` (see Notes). The smallest value of the Lomax distribution is zero while for the classical Pareto distribution it is `mu`, where the standard Pareto distribution has location `mu = 1`. Lomax can also be considered as a simplified version of the Generalized Pareto distribution (available in SciPy), with the scale set to one and the location set to zero.
The Pareto distribution must be greater than zero, and is unbounded above. It is also known as the “80-20 rule”. In this distribution, 80 percent of the weights are in the lowest 20 percent of the range, while the other 20 percent fill the remaining 80 percent of the range.
Note
New code should use the `pareto` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Shape of the distribution. Must be positive.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Pareto distribution.
See also
`scipy.stats.lomax`
    
probability density function, distribution or cumulative density function, etc.
`scipy.stats.genpareto`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.pareto`
    
which should be used for new code.
#### Notes
The probability density for the Pareto distribution is
\\[p(x) = \frac{am^a}{x^{a+1}}\\]
where \\(a\\) is the shape and \\(m\\) the scale.
The Pareto distribution, named after the Italian economist Vilfredo Pareto, is a power law probability distribution useful in many real world problems. Outside the field of economics it is generally referred to as the Bradford distribution. Pareto developed the distribution to describe the distribution of wealth in an economy. It has also found use in insurance, web page access statistics, oil field sizes, and many other problems, including the download frequency for projects in Sourceforge [1]. It is one of the so-called “fat-tailed” distributions.
#### References
[1]
Francis Hunt and Paul Johnson, On the Pareto Distribution of Sourceforge projects.
[2]
Pareto, V. (1896). Course of Political Economy. Lausanne.
[3]
Reiss, R.D., Thomas, M.(2001), Statistical Analysis of Extreme Values, Birkhauser Verlag, Basel, pp 23-30.
[4]
Wikipedia, “Pareto distribution”, https://en.wikipedia.org/wiki/Pareto_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a, m = 3., 2.  # shape and mode
    >>> s = (np.random.pareto(a, 1000) + 1) * m
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, _ = plt.hist(s, 100, density=True)
    >>> fit = a*m**a / bins**(a+1)
    >>> plt.plot(bins, max(count)*fit/max(fit), linewidth=2, color='r')
    >>> plt.show()
    
# numpy.random.RandomState.permutation
method
random.RandomState.permutation(x)
    
Randomly permute a sequence, or return a permuted range.
If `x` is a multi-dimensional array, it is only shuffled along its first index.
Note
New code should use the `permutation` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
xint or array_like
    
If `x` is an integer, randomly permute `np.arange(x)`. If `x` is an array, make a copy and shuffle the elements randomly.
Returns:
    
outndarray
    
Permuted sequence or array range.
See also
`random.Generator.permutation`
    
which should be used for new code.
#### Examples
    
    >>> np.random.permutation(10)
    array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6]) # random
    
    
    >>> np.random.permutation([1, 4, 9, 12, 15])
    array([15,  1,  9,  4, 12]) # random
    
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> np.random.permutation(arr)
    array([[6, 7, 8], # random
           [0, 1, 2],
           [3, 4, 5]])
    
# numpy.random.RandomState.poisson
method
random.RandomState.poisson(lam=1.0, size=None)
    
Draw samples from a Poisson distribution.
The Poisson distribution is the limit of the binomial distribution for large N.
Note
New code should use the `poisson` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lamfloat or array_like of floats
    
Expected number of events occurring in a fixed-time interval, must be >= 0. A sequence must be broadcastable over the requested size.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `lam` is a scalar. Otherwise, `np.array(lam).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Poisson distribution.
See also
`random.Generator.poisson`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) of Poisson distribution is
\\[f(k; \lambda)=\frac{\lambda^k e^{-\lambda}}{k!}\\]
For events with an expected separation \\(\lambda\\) the Poisson distribution \\(f(k; \lambda)\\) describes the probability of \\(k\\) events occurring within the observed interval \\(\lambda\\).
Because the output is limited to the range of the C int64 type, a ValueError is raised when `lam` is within 10 sigma of the maximum representable value.
#### References
[1]
Weisstein, Eric W. “Poisson Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/PoissonDistribution.html
[2]
Wikipedia, “Poisson distribution”, https://en.wikipedia.org/wiki/Poisson_distribution
#### Examples
Draw samples from the distribution:
    
    >>> import numpy as np
    >>> s = np.random.poisson(5, 10000)
    
Display histogram of the sample:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 14, density=True)
    >>> plt.show()
    
Draw each 100 values for lambda 100 and 500:
    
    >>> s = np.random.poisson(lam=(100., 500.), size=(100, 2))
    
# numpy.random.RandomState.power
method
random.RandomState.power(a, size=None)
    
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.
Also known as the power function distribution.
Note
New code should use the `power` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Parameter of the distribution. Must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized power distribution.
Raises:
    
ValueError
    
If a <= 0.
See also
`random.Generator.power`
    
which should be used for new code.
#### Notes
The probability density function is
\\[P(x; a) = ax^{a-1}, 0 \le x \le 1, a>0.\\]
The power function distribution is just the inverse of the Pareto distribution. It may also be seen as a special case of the Beta distribution.
It is used, for example, in modeling the over-reporting of insurance claims.
#### References
[1]
Christian Kleiber, Samuel Kotz, “Statistical size distributions in economics and actuarial sciences”, Wiley, 2003.
[2]
Heckert, N. A. and Filliben, James J. “NIST Handbook 148: Dataplot Reference Manual, Volume 2: Let Subcommands and Library Functions”, National Institute of Standards and Technology Handbook Series, June 2003. https://www.itl.nist.gov/div898/software/dataplot/refman2/auxillar/powpdf.pdf
#### Examples
Draw samples from the distribution:
    
    >>> a = 5. # shape
    >>> samples = 1000
    >>> s = np.random.power(a, samples)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, bins=30)
    >>> x = np.linspace(0, 1, 100)
    >>> y = a*x**(a-1.)
    >>> normed_y = samples*np.diff(bins)[0]*y
    >>> plt.plot(x, normed_y)
    >>> plt.show()
    
Compare the power function distribution to the inverse of the Pareto.
    
    >>> from scipy import stats 
    >>> rvs = np.random.power(5, 1000000)
    >>> rvsp = np.random.pareto(5, 1000000)
    >>> xx = np.linspace(0,1,100)
    >>> powpdf = stats.powerlaw.pdf(xx,5)  
    
    
    >>> plt.figure()
    >>> plt.hist(rvs, bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('np.random.power(5)')
    
    
    >>> plt.figure()
    >>> plt.hist(1./(1.+rvsp), bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('inverse of 1 + np.random.pareto(5)')
    
    
    >>> plt.figure()
    >>> plt.hist(1./(1.+rvsp), bins=50, density=True)
    >>> plt.plot(xx,powpdf,'r-')  
    >>> plt.title('inverse of stats.pareto(5)')
    
# numpy.random.RandomState.rand
method
random.RandomState.rand(d0, d1, ..., dn)
    
Random values in a given shape.
Note
This is a convenience function for users porting code from Matlab, and wraps `random_sample`. That function takes a tuple to specify the size of the output, which is consistent with other NumPy functions like `numpy.zeros` and `numpy.ones`.
Create an array of the given shape and populate it with random samples from a uniform distribution over `[0, 1)`.
Parameters:
    
d0, d1, …, dnint, optional
    
The dimensions of the returned array, must be non-negative. If no argument is given a single Python float is returned.
Returns:
    
outndarray, shape `(d0, d1, ..., dn)`
    
Random values.
See also
`random`
#### Examples
    
    >>> np.random.rand(3,2)
    array([[ 0.14022471,  0.96360618],  #random
           [ 0.37601032,  0.25528411],  #random
           [ 0.49313049,  0.94909878]]) #random
    
# numpy.random.RandomState.randint
method
random.RandomState.randint(low, high=None, size=None, dtype=int)
    
Return random integers from `low` (inclusive) to `high` (exclusive).
Return random integers from the “discrete uniform” distribution of the specified dtype in the “half-open” interval [`low`, `high`). If `high` is None (the default), then results are from [0, `low`).
Note
New code should use the `integers` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lowint or array-like of ints
    
Lowest (signed) integers to be drawn from the distribution (unless `high=None`, in which case this parameter is one above the highest such integer).
highint or array-like of ints, optional
    
If provided, one above the largest (signed) integer to be drawn from the distribution (see above for behavior if `high=None`). If array-like, must contain integer values
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
dtypedtype, optional
    
Desired dtype of the result. Byteorder must be native. The default value is long.
Warning
This function defaults to the C-long dtype, which is 32bit on windows and otherwise 64bit on 64bit platforms (and 32bit on 32bit ones). Since NumPy 2.0, NumPy’s default integer is 32bit on 32bit platforms and 64bit on 64bit platforms. Which corresponds to `np.intp`. (`dtype=int` is not the same as in most NumPy functions.)
Returns:
    
outint or ndarray of ints
    
`size`-shaped array of random integers from the appropriate distribution, or a single such random int if `size` not provided.
See also
`random_integers`
    
similar to `randint`, only for the closed interval [`low`, `high`], and 1 is the lowest value if `high` is omitted.
`random.Generator.integers`
    
which should be used for new code.
#### Examples
    
    >>> np.random.randint(2, size=10)
    array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0]) # random
    >>> np.random.randint(1, size=10)
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    
Generate a 2 x 4 array of ints between 0 and 4, inclusive:
    
    >>> np.random.randint(5, size=(2, 4))
    array([[4, 0, 2, 1], # random
           [3, 2, 2, 0]])
    
Generate a 1 x 3 array with 3 different upper bounds
    
    >>> np.random.randint(1, [3, 5, 10])
    array([2, 2, 9]) # random
    
Generate a 1 by 3 array with 3 different lower bounds
    
    >>> np.random.randint([1, 5, 7], 10)
    array([9, 8, 7]) # random
    
Generate a 2 by 4 array using broadcasting with dtype of uint8
    
    >>> np.random.randint([1, 3, 5, 7], [[10], [20]], dtype=np.uint8)
    array([[ 8,  6,  9,  7], # random
           [ 1, 16,  9, 12]], dtype=uint8)
    
# numpy.random.RandomState.randn
method
random.RandomState.randn(d0, d1, ..., dn)
    
Return a sample (or samples) from the “standard normal” distribution.
Note
This is a convenience function for users porting code from Matlab, and wraps `standard_normal`. That function takes a tuple to specify the size of the output, which is consistent with other NumPy functions like `numpy.zeros` and `numpy.ones`.
Note
New code should use the `standard_normal` method of a `Generator` instance instead; please see the Quick start.
If positive int_like arguments are provided, `randn` generates an array of shape `(d0, d1, ..., dn)`, filled with random floats sampled from a univariate “normal” (Gaussian) distribution of mean 0 and variance 1. A single float randomly sampled from the distribution is returned if no argument is provided.
Parameters:
    
d0, d1, …, dnint, optional
    
The dimensions of the returned array, must be non-negative. If no argument is given a single Python float is returned.
Returns:
    
Zndarray or float
    
A `(d0, d1, ..., dn)`-shaped array of floating-point samples from the standard normal distribution, or a single such float if no parameters were supplied.
See also
`standard_normal`
    
Similar, but takes a tuple as its argument.
`normal`
    
Also accepts mu and sigma arguments.
`random.Generator.standard_normal`
    
which should be used for new code.
#### Notes
For random samples from the normal distribution with mean `mu` and standard deviation `sigma`, use:
    
    sigma * np.random.randn(...) + mu
    
#### Examples
    
    >>> np.random.randn()
    2.1923875335537315  # random
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> 3 + 2.5 * np.random.randn(2, 4)
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.RandomState.random_integers
method
random.RandomState.random_integers(low, high=None, size=None)
    
Random integers of type `numpy.int_` between `low` and `high`, inclusive.
Return random integers of type `numpy.int_` from the “discrete uniform” distribution in the closed interval [`low`, `high`]. If `high` is None (the default), then results are from [1, `low`]. The `numpy.int_` type translates to the C long integer type and its precision is platform dependent.
This function has been deprecated. Use randint instead.
Deprecated since version 1.11.0.
Parameters:
    
lowint
    
Lowest (signed) integer to be drawn from the distribution (unless `high=None`, in which case this parameter is the highest such integer).
highint, optional
    
If provided, the largest (signed) integer to be drawn from the distribution (see above for behavior if `high=None`).
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outint or ndarray of ints
    
`size`-shaped array of random integers from the appropriate distribution, or a single such random int if `size` not provided.
See also
`randint`
    
Similar to `random_integers`, only for the half-open interval [`low`, `high`), and 0 is the lowest value if `high` is omitted.
#### Notes
To sample from N evenly spaced floating-point numbers between a and b, use:
    
    a + (b - a) * (np.random.random_integers(N) - 1) / (N - 1.)
    
#### Examples
    
    >>> np.random.random_integers(5)
    4 # random
    >>> type(np.random.random_integers(5))
    <class 'numpy.int64'>
    >>> np.random.random_integers(5, size=(3,2))
    array([[5, 4], # random
           [3, 3],
           [4, 5]])
    
Choose five random numbers from the set of five evenly-spaced numbers between 0 and 2.5, inclusive (i.e., from the set \\({0, 5/8, 10/8, 15/8, 20/8}\\)):
    
    >>> 2.5 * (np.random.random_integers(5, size=(5,)) - 1) / 4.
    array([ 0.625,  1.25 ,  0.625,  0.625,  2.5  ]) # random
    
Roll two six sided dice 1000 times and sum the results:
    
    >>> d1 = np.random.random_integers(1, 6, 1000)
    >>> d2 = np.random.random_integers(1, 6, 1000)
    >>> dsums = d1 + d2
    
Display results as a histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(dsums, 11, density=True)
    >>> plt.show()
    
# numpy.random.RandomState.random_sample
method
random.RandomState.random_sample(size=None)
    
Return random floats in the half-open interval [0.0, 1.0).
Results are from the “continuous uniform” distribution over the stated interval. To sample \\(Unif[a, b), b > a\\) multiply the output of `random_sample` by `(b-a)` and add `a`:
    
    (b - a) * random_sample() + a
    
Note
New code should use the `random` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outfloat or ndarray of floats
    
Array of random floats of shape `size` (unless `size=None`, in which case a single float is returned).
See also
`random.Generator.random`
    
which should be used for new code.
#### Examples
    
    >>> np.random.random_sample()
    0.47108547995356098 # random
    >>> type(np.random.random_sample())
    <class 'float'>
    >>> np.random.random_sample((5,))
    array([ 0.30220482,  0.86820401,  0.1654503 ,  0.11659149,  0.54323428]) # random
    
Three-by-two array of random numbers from [-5, 0):
    
    >>> 5 * np.random.random_sample((3, 2)) - 5
    array([[-3.99149989, -0.52338984], # random
           [-2.99091858, -0.79479508],
           [-1.23204345, -1.75224494]])
    
# numpy.random.RandomState.rayleigh
method
random.RandomState.rayleigh(scale=1.0, size=None)
    
Draw samples from a Rayleigh distribution.
The \\(\chi\\) and Weibull distributions are generalizations of the Rayleigh.
Note
New code should use the `rayleigh` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
scalefloat or array_like of floats, optional
    
Scale, also equals the mode. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `scale` is a scalar. Otherwise, `np.array(scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Rayleigh distribution.
See also
`random.Generator.rayleigh`
    
which should be used for new code.
#### Notes
The probability density function for the Rayleigh distribution is
\\[P(x;scale) = \frac{x}{scale^2}e^{\frac{-x^2}{2 \cdotp scale^2}}\\]
The Rayleigh distribution would arise, for example, if the East and North components of the wind velocity had identical zero-mean Gaussian distributions. Then the wind speed would have a Rayleigh distribution.
#### References
[1]
Brighton Webs Ltd., “Rayleigh Distribution,” https://web.archive.org/web/20090514091424/http://brighton-webs.co.uk:80/distributions/rayleigh.asp
[2]
Wikipedia, “Rayleigh distribution” https://en.wikipedia.org/wiki/Rayleigh_distribution
#### Examples
Draw values from the distribution and plot the histogram
    
    >>> from matplotlib.pyplot import hist
    >>> values = hist(np.random.rayleigh(3, 100000), bins=200, density=True)
    
Wave heights tend to follow a Rayleigh distribution. If the mean wave height is 1 meter, what fraction of waves are likely to be larger than 3 meters?
    
    >>> meanvalue = 1
    >>> modevalue = np.sqrt(2 / np.pi) * meanvalue
    >>> s = np.random.rayleigh(modevalue, 1000000)
    
The percentage of waves larger than 3 meters is:
    
    >>> 100.*sum(s>3)/1000000.
    0.087300000000000003 # random
    
# numpy.random.RandomState.seed
method
random.RandomState.seed(seed=None)
    
Reseed a legacy MT19937 BitGenerator
#### Notes
This is a convenience, legacy function.
The best practice is to not reseed a BitGenerator, rather to recreate a new one. This method is here for legacy reasons. This example demonstrates best practice.
    
    >>> from numpy.random import MT19937
    >>> from numpy.random import RandomState, SeedSequence
    >>> rs = RandomState(MT19937(SeedSequence(123456789)))
    # Later, you want to restart the stream
    >>> rs = RandomState(MT19937(SeedSequence(987654321)))
    
# numpy.random.RandomState.set_state
method
random.RandomState.set_state(state)
    
Set the internal state of the generator from a tuple.
For use if one has reason to manually (re-)set the internal state of the bit generator used by the RandomState instance. By default, RandomState uses the “Mersenne Twister”[1] pseudo-random number generating algorithm.
Parameters:
    
state{tuple(str, ndarray of 624 uints, int, int, float), dict}
    
The `state` tuple has the following items:
  1. the string ‘MT19937’, specifying the Mersenne Twister algorithm.
  2. a 1-D array of 624 unsigned integers `keys`.
  3. an integer `pos`.
  4. an integer `has_gauss`.
  5. a float `cached_gaussian`.


If state is a dictionary, it is directly set using the BitGenerators `state` property.
Returns:
    
outNone
    
Returns ‘None’ on success.
See also
`get_state`
#### Notes
`set_state` and `get_state` are not needed to work with any of the random distributions in NumPy. If the internal state is manually altered, the user should know exactly what he/she is doing.
For backwards compatibility, the form (str, array of 624 uints, int) is also accepted although it is missing some information about the cached Gaussian value: `state = ('MT19937', keys, pos)`.
#### References
[1]
M. Matsumoto and T. Nishimura, “Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator,” ACM Trans. on Modeling and Computer Simulation, Vol. 8, No. 1, pp. 3-30, Jan. 1998.
# numpy.random.RandomState.shuffle
method
random.RandomState.shuffle(x)
    
Modify a sequence in-place by shuffling its contents.
This function only shuffles the array along the first axis of a multi-dimensional array. The order of sub-arrays is changed but their contents remains the same.
Note
New code should use the `shuffle` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
xndarray or MutableSequence
    
The array, list or mutable sequence to be shuffled.
Returns:
    
None
See also
`random.Generator.shuffle`
    
which should be used for new code.
#### Examples
    
    >>> arr = np.arange(10)
    >>> np.random.shuffle(arr)
    >>> arr
    [1 7 5 2 9 4 3 6 0 8] # random
    
Multi-dimensional arrays are only shuffled along the first axis:
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> np.random.shuffle(arr)
    >>> arr
    array([[3, 4, 5], # random
           [6, 7, 8],
           [0, 1, 2]])
    
# numpy.random.RandomState.standard_cauchy
method
random.RandomState.standard_cauchy(size=None)
    
Draw samples from a standard Cauchy distribution with mode = 0.
Also known as the Lorentz distribution.
Note
New code should use the `standard_cauchy` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
samplesndarray or scalar
    
The drawn samples.
See also
`random.Generator.standard_cauchy`
    
which should be used for new code.
#### Notes
The probability density function for the full Cauchy distribution is
\\[P(x; x_0, \gamma) = \frac{1}{\pi \gamma \bigl[ 1+ (\frac{x-x_0}{\gamma})^2 \bigr] }\\]
and the Standard Cauchy distribution just sets \\(x_0=0\\) and \\(\gamma=1\\)
The Cauchy distribution arises in the solution to the driven harmonic oscillator problem, and also describes spectral line broadening. It also describes the distribution of values at which a line tilted at a random angle will cut the x axis.
When studying hypothesis tests that assume normality, seeing how the tests perform on data from a Cauchy distribution is a good indicator of their sensitivity to a heavy-tailed distribution, since the Cauchy looks very much like a Gaussian distribution, but with heavier tails.
#### References
[1]
NIST/SEMATECH e-Handbook of Statistical Methods, “Cauchy Distribution”, https://www.itl.nist.gov/div898/handbook/eda/section3/eda3663.htm
[2]
Weisstein, Eric W. “Cauchy Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/CauchyDistribution.html
[3]
Wikipedia, “Cauchy distribution” https://en.wikipedia.org/wiki/Cauchy_distribution
#### Examples
Draw samples and plot the distribution:
    
    >>> import matplotlib.pyplot as plt
    >>> s = np.random.standard_cauchy(1000000)
    >>> s = s[(s>-25) & (s<25)]  # truncate distribution so it plots well
    >>> plt.hist(s, bins=100)
    >>> plt.show()
    
# numpy.random.RandomState.standard_exponential
method
random.RandomState.standard_exponential(size=None)
    
Draw samples from the standard exponential distribution.
`standard_exponential` is identical to the exponential distribution with a scale parameter of 1.
Note
New code should use the `standard_exponential` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outfloat or ndarray
    
Drawn samples.
See also
`random.Generator.standard_exponential`
    
which should be used for new code.
#### Examples
Output a 3x8000 array:
    
    >>> n = np.random.standard_exponential((3, 8000))
    
# numpy.random.RandomState.standard_gamma
method
random.RandomState.standard_gamma(shape, size=None)
    
Draw samples from a standard Gamma distribution.
Samples are drawn from a Gamma distribution with specified parameters, shape (sometimes designated “k”) and scale=1.
Note
New code should use the `standard_gamma` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
shapefloat or array_like of floats
    
Parameter, must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `shape` is a scalar. Otherwise, `np.array(shape).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized standard gamma distribution.
See also
`scipy.stats.gamma`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.standard_gamma`
    
which should be used for new code.
#### Notes
The probability density for the Gamma distribution is
\\[p(x) = x^{k-1}\frac{e^{-x/\theta}}{\theta^k\Gamma(k)},\\]
where \\(k\\) is the shape and \\(\theta\\) the scale, and \\(\Gamma\\) is the Gamma function.
The Gamma distribution is often used to model the times to failure of electronic components, and arises naturally in processes for which the waiting times between Poisson distributed events are relevant.
#### References
[1]
Weisstein, Eric W. “Gamma Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/GammaDistribution.html
[2]
Wikipedia, “Gamma distribution”, https://en.wikipedia.org/wiki/Gamma_distribution
#### Examples
Draw samples from the distribution:
    
    >>> shape, scale = 2., 1. # mean and width
    >>> s = np.random.standard_gamma(shape, 1000000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.special as sps  
    >>> count, bins, ignored = plt.hist(s, 50, density=True)
    >>> y = bins**(shape-1) * ((np.exp(-bins/scale))/  
    ...                       (sps.gamma(shape) * scale**shape))
    >>> plt.plot(bins, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.RandomState.standard_normal
method
random.RandomState.standard_normal(size=None)
    
Draw samples from a standard Normal distribution (mean=0, stdev=1).
Note
New code should use the `standard_normal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outfloat or ndarray
    
A floating-point array of shape `size` of drawn samples, or a single sample if `size` was not specified.
See also
`normal`
    
Equivalent function with additional `loc` and `scale` arguments for setting the mean and standard deviation.
`random.Generator.standard_normal`
    
which should be used for new code.
#### Notes
For random samples from the normal distribution with mean `mu` and standard deviation `sigma`, use one of:
    
    mu + sigma * np.random.standard_normal(size=...)
    np.random.normal(mu, sigma, size=...)
    
#### Examples
    
    >>> np.random.standard_normal()
    2.1923875335537315 #random
    
    
    >>> s = np.random.standard_normal(8000)
    >>> s
    array([ 0.6888893 ,  0.78096262, -0.89086505, ...,  0.49876311,  # random
           -0.38672696, -0.4685006 ])                                # random
    >>> s.shape
    (8000,)
    >>> s = np.random.standard_normal(size=(3, 4, 2))
    >>> s.shape
    (3, 4, 2)
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> 3 + 2.5 * np.random.standard_normal(size=(2, 4))
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.RandomState.standard_t
method
random.RandomState.standard_t(df, size=None)
    
Draw samples from a standard Student’s t distribution with `df` degrees of freedom.
A special case of the hyperbolic distribution. As `df` gets large, the result resembles that of the standard normal distribution (`standard_normal`).
Note
New code should use the `standard_t` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dffloat or array_like of floats
    
Degrees of freedom, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` is a scalar. Otherwise, `np.array(df).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized standard Student’s t distribution.
See also
`random.Generator.standard_t`
    
which should be used for new code.
#### Notes
The probability density function for the t distribution is
\\[P(x, df) = \frac{\Gamma(\frac{df+1}{2})}{\sqrt{\pi df} \Gamma(\frac{df}{2})}\Bigl( 1+\frac{x^2}{df} \Bigr)^{-(df+1)/2}\\]
The t test is based on an assumption that the data come from a Normal distribution. The t test provides a way to test whether the sample mean (that is the mean calculated from the data) is a good estimate of the true mean.
The derivation of the t-distribution was first published in 1908 by William Gosset while working for the Guinness Brewery in Dublin. Due to proprietary issues, he had to publish under a pseudonym, and so he used the name Student.
#### References
[1]
Dalgaard, Peter, “Introductory Statistics With R”, Springer, 2002.
[2]
Wikipedia, “Student’s t-distribution” https://en.wikipedia.org/wiki/Student’s_t-distribution
#### Examples
From Dalgaard page 83 [1], suppose the daily energy intake for 11 women in kilojoules (kJ) is:
    
    >>> intake = np.array([5260., 5470, 5640, 6180, 6390, 6515, 6805, 7515, \
    ...                    7515, 8230, 8770])
    
Does their energy intake deviate systematically from the recommended value of 7725 kJ? Our null hypothesis will be the absence of deviation, and the alternate hypothesis will be the presence of an effect that could be either positive or negative, hence making our test 2-tailed.
Because we are estimating the mean and we have N=11 values in our sample, we have N-1=10 degrees of freedom. We set our significance level to 95% and compute the t statistic using the empirical mean and empirical standard deviation of our intake. We use a ddof of 1 to base the computation of our empirical standard deviation on an unbiased estimate of the variance (note: the final estimate is not unbiased due to the concave nature of the square root).
    
    >>> np.mean(intake)
    6753.636363636364
    >>> intake.std(ddof=1)
    1142.1232221373727
    >>> t = (np.mean(intake)-7725)/(intake.std(ddof=1)/np.sqrt(len(intake)))
    >>> t
    -2.8207540608310198
    
We draw 1000000 samples from Student’s t distribution with the adequate degrees of freedom.
    
    >>> import matplotlib.pyplot as plt
    >>> s = np.random.standard_t(10, size=1000000)
    >>> h = plt.hist(s, bins=100, density=True)
    
Does our t statistic land in one of the two critical regions found at both tails of the distribution?
    
    >>> np.sum(np.abs(t) < np.abs(s)) / float(len(s))
    0.018318  #random < 0.05, statistic is in critical region
    
The probability value for this 2-tailed test is about 1.83%, which is lower than the 5% pre-determined significance threshold.
Therefore, the probability of observing values as extreme as our intake conditionally on the null hypothesis being true is too low, and we reject the null hypothesis of no deviation.
# numpy.random.RandomState.triangular
method
random.RandomState.triangular(left, mode, right, size=None)
    
Draw samples from the triangular distribution over the interval `[left, right]`.
The triangular distribution is a continuous probability distribution with lower limit left, peak at mode, and upper limit right. Unlike the other distributions, these parameters directly define the shape of the pdf.
Note
New code should use the `triangular` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
leftfloat or array_like of floats
    
Lower limit.
modefloat or array_like of floats
    
The value where the peak of the distribution occurs. The value must fulfill the condition `left <= mode <= right`.
rightfloat or array_like of floats
    
Upper limit, must be larger than `left`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `left`, `mode`, and `right` are all scalars. Otherwise, `np.broadcast(left, mode, right).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized triangular distribution.
See also
`random.Generator.triangular`
    
which should be used for new code.
#### Notes
The probability density function for the triangular distribution is
\\[\begin{split}P(x;l, m, r) = \begin{cases} \frac{2(x-l)}{(r-l)(m-l)}& \text{for $l \leq x \leq m$},\\\ \frac{2(r-x)}{(r-l)(r-m)}& \text{for $m \leq x \leq r$},\\\ 0& \text{otherwise}. \end{cases}\end{split}\\]
The triangular distribution is often used in ill-defined problems where the underlying distribution is not known, but some knowledge of the limits and mode exists. Often it is used in simulations.
#### References
[1]
Wikipedia, “Triangular distribution” https://en.wikipedia.org/wiki/Triangular_distribution
#### Examples
Draw values from the distribution and plot the histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> h = plt.hist(np.random.triangular(-3, 0, 8, 100000), bins=200,
    ...              density=True)
    >>> plt.show()
    
# numpy.random.RandomState.uniform
method
random.RandomState.uniform(low=0.0, high=1.0, size=None)
    
Draw samples from a uniform distribution.
Samples are uniformly distributed over the half-open interval `[low, high)` (includes low, but excludes high). In other words, any value within the given interval is equally likely to be drawn by `uniform`.
Note
New code should use the `uniform` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lowfloat or array_like of floats, optional
    
Lower boundary of the output interval. All values generated will be greater than or equal to low. The default value is 0.
highfloat or array_like of floats
    
Upper boundary of the output interval. All values generated will be less than or equal to high. The high limit may be included in the returned array of floats due to floating-point rounding in the equation `low + (high-low) * random_sample()`. The default value is 1.0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `low` and `high` are both scalars. Otherwise, `np.broadcast(low, high).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized uniform distribution.
See also
`randint`
    
Discrete uniform distribution, yielding integers.
`random_integers`
    
Discrete uniform distribution over the closed interval `[low, high]`.
`random_sample`
    
Floats uniformly distributed over `[0, 1)`.
`random`
    
Alias for `random_sample`.
`rand`
    
Convenience function that accepts dimensions as input, e.g., `rand(2,2)` would generate a 2-by-2 array of floats, uniformly distributed over `[0, 1)`.
`random.Generator.uniform`
    
which should be used for new code.
#### Notes
The probability density function of the uniform distribution is
\\[p(x) = \frac{1}{b - a}\\]
anywhere within the interval `[a, b)`, and zero elsewhere.
When `high` == `low`, values of `low` will be returned. If `high` < `low`, the results are officially undefined and may eventually raise an error, i.e. do not rely on this function to behave when passed arguments satisfying that inequality condition. The `high` limit may be included in the returned array of floats due to floating-point rounding in the equation `low + (high-low) * random_sample()`. For example:
    
    >>> x = np.float32(5*0.99999999)
    >>> x
    np.float32(5.0)
    
#### Examples
Draw samples from the distribution:
    
    >>> s = np.random.uniform(-1,0,1000)
    
All values are within the given interval:
    
    >>> np.all(s >= -1)
    True
    >>> np.all(s < 0)
    True
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 15, density=True)
    >>> plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
    >>> plt.show()
    
# numpy.random.RandomState.vonmises
method
random.RandomState.vonmises(mu, kappa, size=None)
    
Draw samples from a von Mises distribution.
Samples are drawn from a von Mises distribution with specified mode (mu) and concentration (kappa), on the interval [-pi, pi].
The von Mises distribution (also known as the circular normal distribution) is a continuous probability distribution on the unit circle. It may be thought of as the circular analogue of the normal distribution.
Note
New code should use the `vonmises` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
mufloat or array_like of floats
    
Mode (“center”) of the distribution.
kappafloat or array_like of floats
    
Concentration of the distribution, has to be >=0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mu` and `kappa` are both scalars. Otherwise, `np.broadcast(mu, kappa).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized von Mises distribution.
See also
`scipy.stats.vonmises`
    
probability density function, distribution, or cumulative density function, etc.
`random.Generator.vonmises`
    
which should be used for new code.
#### Notes
The probability density for the von Mises distribution is
\\[p(x) = \frac{e^{\kappa cos(x-\mu)}}{2\pi I_0(\kappa)},\\]
where \\(\mu\\) is the mode and \\(\kappa\\) the concentration, and \\(I_0(\kappa)\\) is the modified Bessel function of order 0.
The von Mises is named for Richard Edler von Mises, who was born in Austria-Hungary, in what is now the Ukraine. He fled to the United States in 1939 and became a professor at Harvard. He worked in probability theory, aerodynamics, fluid mechanics, and philosophy of science.
#### References
[1]
Abramowitz, M. and Stegun, I. A. (Eds.). “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing,” New York: Dover, 1972.
[2]
von Mises, R., “Mathematical Theory of Probability and Statistics”, New York: Academic Press, 1964.
#### Examples
Draw samples from the distribution:
    
    >>> mu, kappa = 0.0, 4.0 # mean and concentration
    >>> s = np.random.vonmises(mu, kappa, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.special import i0  
    >>> plt.hist(s, 50, density=True)
    >>> x = np.linspace(-np.pi, np.pi, num=51)
    >>> y = np.exp(kappa*np.cos(x-mu))/(2*np.pi*i0(kappa))  
    >>> plt.plot(x, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.RandomState.wald
method
random.RandomState.wald(mean, scale, size=None)
    
Draw samples from a Wald, or inverse Gaussian, distribution.
As the scale approaches infinity, the distribution becomes more like a Gaussian. Some references claim that the Wald is an inverse Gaussian with mean equal to 1, but this is by no means universal.
The inverse Gaussian distribution was first studied in relationship to Brownian motion. In 1956 M.C.K. Tweedie used the name inverse Gaussian because there is an inverse relationship between the time to cover a unit distance and distance covered in unit time.
Note
New code should use the `wald` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
meanfloat or array_like of floats
    
Distribution mean, must be > 0.
scalefloat or array_like of floats
    
Scale parameter, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mean` and `scale` are both scalars. Otherwise, `np.broadcast(mean, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Wald distribution.
See also
`random.Generator.wald`
    
which should be used for new code.
#### Notes
The probability density function for the Wald distribution is
\\[P(x;mean,scale) = \sqrt{\frac{scale}{2\pi x^3}}e^ \frac{-scale(x-mean)^2}{2\cdotp mean^2x}\\]
As noted above the inverse Gaussian distribution first arise from attempts to model Brownian motion. It is also a competitor to the Weibull for use in reliability modeling and modeling stock returns and interest rate processes.
#### References
[1]
Brighton Webs Ltd., Wald Distribution, https://web.archive.org/web/20090423014010/http://www.brighton-webs.co.uk:80/distributions/wald.asp
[2]
Chhikara, Raj S., and Folks, J. Leroy, “The Inverse Gaussian Distribution: Theory : Methodology, and Applications”, CRC Press, 1988.
[3]
Wikipedia, “Inverse Gaussian distribution” https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution
#### Examples
Draw values from the distribution and plot the histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> h = plt.hist(np.random.wald(3, 2, 100000), bins=200, density=True)
    >>> plt.show()
    
# numpy.random.RandomState.weibull
method
random.RandomState.weibull(a, size=None)
    
Draw samples from a Weibull distribution.
Draw samples from a 1-parameter Weibull distribution with the given shape parameter `a`.
\\[X = (-ln(U))^{1/a}\\]
Here, U is drawn from the uniform distribution over (0,1].
The more common 2-parameter Weibull, including a scale parameter \\(\lambda\\) is just \\(X = \lambda(-ln(U))^{1/a}\\).
Note
New code should use the `weibull` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Shape parameter of the distribution. Must be nonnegative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Weibull distribution.
See also
`scipy.stats.weibull_max`
`scipy.stats.weibull_min`
`scipy.stats.genextreme`
`gumbel`
`random.Generator.weibull`
    
which should be used for new code.
#### Notes
The Weibull (or Type III asymptotic extreme value distribution for smallest values, SEV Type III, or Rosin-Rammler distribution) is one of a class of Generalized Extreme Value (GEV) distributions used in modeling extreme value problems. This class includes the Gumbel and Frechet distributions.
The probability density for the Weibull distribution is
\\[p(x) = \frac{a} {\lambda}(\frac{x}{\lambda})^{a-1}e^{-(x/\lambda)^a},\\]
where \\(a\\) is the shape and \\(\lambda\\) the scale.
The function has its peak (the mode) at \\(\lambda(\frac{a-1}{a})^{1/a}\\).
When `a = 1`, the Weibull distribution reduces to the exponential distribution.
#### References
[1]
Waloddi Weibull, Royal Technical University, Stockholm, 1939 “A Statistical Theory Of The Strength Of Materials”, Ingeniorsvetenskapsakademiens Handlingar Nr 151, 1939, Generalstabens Litografiska Anstalts Forlag, Stockholm.
[2]
Waloddi Weibull, “A Statistical Distribution Function of Wide Applicability”, Journal Of Applied Mechanics ASME Paper 1951.
[3]
Wikipedia, “Weibull distribution”, https://en.wikipedia.org/wiki/Weibull_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a = 5. # shape
    >>> s = np.random.weibull(a, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.arange(1,100.)/50.
    >>> def weib(x,n,a):
    ...     return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)
    
    
    >>> count, bins, ignored = plt.hist(np.random.weibull(5.,1000))
    >>> x = np.arange(1,100.)/50.
    >>> scale = count.max()/weib(x, 1., 5.).max()
    >>> plt.plot(x, weib(x, 1., 5.)*scale)
    >>> plt.show()
    
# numpy.random.RandomState.zipf
method
random.RandomState.zipf(a, size=None)
    
Draw samples from a Zipf distribution.
Samples are drawn from a Zipf distribution with specified parameter `a` > 1.
The Zipf distribution (also known as the zeta distribution) is a discrete probability distribution that satisfies Zipf’s law: the frequency of an item is inversely proportional to its rank in a frequency table.
Note
New code should use the `zipf` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Distribution parameter. Must be greater than 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Zipf distribution.
See also
`scipy.stats.zipf`
    
probability density function, distribution, or cumulative density function, etc.
`random.Generator.zipf`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) for the Zipf distribution is
\\[p(k) = \frac{k^{-a}}{\zeta(a)},\\]
for integers \\(k \geq 1\\), where \\(\zeta\\) is the Riemann Zeta function.
It is named for the American linguist George Kingsley Zipf, who noted that the frequency of any word in a sample of a language is inversely proportional to its rank in the frequency table.
#### References
[1]
Zipf, G. K., “Selected Studies of the Principle of Relative Frequency in Language,” Cambridge, MA: Harvard Univ. Press, 1932.
#### Examples
Draw samples from the distribution:
    
    >>> a = 4.0
    >>> n = 20000
    >>> s = np.random.zipf(a, n)
    
Display the histogram of the samples, along with the expected histogram based on the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.special import zeta  
    
`bincount` provides a fast histogram for small integers.
    
    >>> count = np.bincount(s)
    >>> k = np.arange(1, s.max() + 1)
    
    
    >>> plt.bar(k, count[1:], alpha=0.5, label='sample count')
    >>> plt.plot(k, n*(k**-a)/zeta(a), 'k.-', alpha=0.5,
    ...          label='expected count')   
    >>> plt.semilogy()
    >>> plt.grid(alpha=0.4)
    >>> plt.legend()
    >>> plt.title(f'Zipf sample, a={a}, size={n}')
    >>> plt.show()
    
# numpy.random.ranf
random.ranf(*args, **kwargs)
    
This is an alias of `random_sample`. See `random_sample` for the complete documentation.
# numpy.random.rayleigh
random.rayleigh(scale=1.0, size=None)
    
Draw samples from a Rayleigh distribution.
The \\(\chi\\) and Weibull distributions are generalizations of the Rayleigh.
Note
New code should use the `rayleigh` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
scalefloat or array_like of floats, optional
    
Scale, also equals the mode. Must be non-negative. Default is 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `scale` is a scalar. Otherwise, `np.array(scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Rayleigh distribution.
See also
`random.Generator.rayleigh`
    
which should be used for new code.
#### Notes
The probability density function for the Rayleigh distribution is
\\[P(x;scale) = \frac{x}{scale^2}e^{\frac{-x^2}{2 \cdotp scale^2}}\\]
The Rayleigh distribution would arise, for example, if the East and North components of the wind velocity had identical zero-mean Gaussian distributions. Then the wind speed would have a Rayleigh distribution.
#### References
[1]
Brighton Webs Ltd., “Rayleigh Distribution,” https://web.archive.org/web/20090514091424/http://brighton-webs.co.uk:80/distributions/rayleigh.asp
[2]
Wikipedia, “Rayleigh distribution” https://en.wikipedia.org/wiki/Rayleigh_distribution
#### Examples
Draw values from the distribution and plot the histogram
    
    >>> from matplotlib.pyplot import hist
    >>> values = hist(np.random.rayleigh(3, 100000), bins=200, density=True)
    
Wave heights tend to follow a Rayleigh distribution. If the mean wave height is 1 meter, what fraction of waves are likely to be larger than 3 meters?
    
    >>> meanvalue = 1
    >>> modevalue = np.sqrt(2 / np.pi) * meanvalue
    >>> s = np.random.rayleigh(modevalue, 1000000)
    
The percentage of waves larger than 3 meters is:
    
    >>> 100.*sum(s>3)/1000000.
    0.087300000000000003 # random
    
# numpy.random.sample
random.sample(*args, **kwargs)
    
This is an alias of `random_sample`. See `random_sample` for the complete documentation.
# numpy.random.seed
random.seed(seed=None)
    
Reseed the singleton RandomState instance.
See also
`numpy.random.Generator`
#### Notes
This is a convenience, legacy function that exists to support older code that uses the singleton RandomState. Best practice is to use a dedicated `Generator` instance rather than the random variate generation methods exposed directly in the random module.
# numpy.random.set_state
random.set_state(state)
    
Set the internal state of the generator from a tuple.
For use if one has reason to manually (re-)set the internal state of the bit generator used by the RandomState instance. By default, RandomState uses the “Mersenne Twister”[1] pseudo-random number generating algorithm.
Parameters:
    
state{tuple(str, ndarray of 624 uints, int, int, float), dict}
    
The `state` tuple has the following items:
  1. the string ‘MT19937’, specifying the Mersenne Twister algorithm.
  2. a 1-D array of 624 unsigned integers `keys`.
  3. an integer `pos`.
  4. an integer `has_gauss`.
  5. a float `cached_gaussian`.


If state is a dictionary, it is directly set using the BitGenerators `state` property.
Returns:
    
outNone
    
Returns ‘None’ on success.
See also
`get_state`
#### Notes
`set_state` and `get_state` are not needed to work with any of the random distributions in NumPy. If the internal state is manually altered, the user should know exactly what he/she is doing.
For backwards compatibility, the form (str, array of 624 uints, int) is also accepted although it is missing some information about the cached Gaussian value: `state = ('MT19937', keys, pos)`.
#### References
[1]
M. Matsumoto and T. Nishimura, “Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator,” ACM Trans. on Modeling and Computer Simulation, Vol. 8, No. 1, pp. 3-30, Jan. 1998.
# numpy.random.shuffle
random.shuffle(x)
    
Modify a sequence in-place by shuffling its contents.
This function only shuffles the array along the first axis of a multi-dimensional array. The order of sub-arrays is changed but their contents remains the same.
Note
New code should use the `shuffle` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
xndarray or MutableSequence
    
The array, list or mutable sequence to be shuffled.
Returns:
    
None
See also
`random.Generator.shuffle`
    
which should be used for new code.
#### Examples
    
    >>> arr = np.arange(10)
    >>> np.random.shuffle(arr)
    >>> arr
    [1 7 5 2 9 4 3 6 0 8] # random
    
Multi-dimensional arrays are only shuffled along the first axis:
    
    >>> arr = np.arange(9).reshape((3, 3))
    >>> np.random.shuffle(arr)
    >>> arr
    array([[3, 4, 5], # random
           [6, 7, 8],
           [0, 1, 2]])
    
# numpy.random.standard_cauchy
random.standard_cauchy(size=None)
    
Draw samples from a standard Cauchy distribution with mode = 0.
Also known as the Lorentz distribution.
Note
New code should use the `standard_cauchy` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
samplesndarray or scalar
    
The drawn samples.
See also
`random.Generator.standard_cauchy`
    
which should be used for new code.
#### Notes
The probability density function for the full Cauchy distribution is
\\[P(x; x_0, \gamma) = \frac{1}{\pi \gamma \bigl[ 1+ (\frac{x-x_0}{\gamma})^2 \bigr] }\\]
and the Standard Cauchy distribution just sets \\(x_0=0\\) and \\(\gamma=1\\)
The Cauchy distribution arises in the solution to the driven harmonic oscillator problem, and also describes spectral line broadening. It also describes the distribution of values at which a line tilted at a random angle will cut the x axis.
When studying hypothesis tests that assume normality, seeing how the tests perform on data from a Cauchy distribution is a good indicator of their sensitivity to a heavy-tailed distribution, since the Cauchy looks very much like a Gaussian distribution, but with heavier tails.
#### References
[1]
NIST/SEMATECH e-Handbook of Statistical Methods, “Cauchy Distribution”, https://www.itl.nist.gov/div898/handbook/eda/section3/eda3663.htm
[2]
Weisstein, Eric W. “Cauchy Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/CauchyDistribution.html
[3]
Wikipedia, “Cauchy distribution” https://en.wikipedia.org/wiki/Cauchy_distribution
#### Examples
Draw samples and plot the distribution:
    
    >>> import matplotlib.pyplot as plt
    >>> s = np.random.standard_cauchy(1000000)
    >>> s = s[(s>-25) & (s<25)]  # truncate distribution so it plots well
    >>> plt.hist(s, bins=100)
    >>> plt.show()
    
# numpy.random.standard_exponential
random.standard_exponential(size=None)
    
Draw samples from the standard exponential distribution.
`standard_exponential` is identical to the exponential distribution with a scale parameter of 1.
Note
New code should use the `standard_exponential` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outfloat or ndarray
    
Drawn samples.
See also
`random.Generator.standard_exponential`
    
which should be used for new code.
#### Examples
Output a 3x8000 array:
    
    >>> n = np.random.standard_exponential((3, 8000))
    
# numpy.random.standard_gamma
random.standard_gamma(shape, size=None)
    
Draw samples from a standard Gamma distribution.
Samples are drawn from a Gamma distribution with specified parameters, shape (sometimes designated “k”) and scale=1.
Note
New code should use the `standard_gamma` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
shapefloat or array_like of floats
    
Parameter, must be non-negative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `shape` is a scalar. Otherwise, `np.array(shape).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized standard gamma distribution.
See also
`scipy.stats.gamma`
    
probability density function, distribution or cumulative density function, etc.
`random.Generator.standard_gamma`
    
which should be used for new code.
#### Notes
The probability density for the Gamma distribution is
\\[p(x) = x^{k-1}\frac{e^{-x/\theta}}{\theta^k\Gamma(k)},\\]
where \\(k\\) is the shape and \\(\theta\\) the scale, and \\(\Gamma\\) is the Gamma function.
The Gamma distribution is often used to model the times to failure of electronic components, and arises naturally in processes for which the waiting times between Poisson distributed events are relevant.
#### References
[1]
Weisstein, Eric W. “Gamma Distribution.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/GammaDistribution.html
[2]
Wikipedia, “Gamma distribution”, https://en.wikipedia.org/wiki/Gamma_distribution
#### Examples
Draw samples from the distribution:
    
    >>> shape, scale = 2., 1. # mean and width
    >>> s = np.random.standard_gamma(shape, 1000000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> import scipy.special as sps  
    >>> count, bins, ignored = plt.hist(s, 50, density=True)
    >>> y = bins**(shape-1) * ((np.exp(-bins/scale))/  
    ...                       (sps.gamma(shape) * scale**shape))
    >>> plt.plot(bins, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.standard_normal
random.standard_normal(size=None)
    
Draw samples from a standard Normal distribution (mean=0, stdev=1).
Note
New code should use the `standard_normal` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. Default is None, in which case a single value is returned.
Returns:
    
outfloat or ndarray
    
A floating-point array of shape `size` of drawn samples, or a single sample if `size` was not specified.
See also
`normal`
    
Equivalent function with additional `loc` and `scale` arguments for setting the mean and standard deviation.
`random.Generator.standard_normal`
    
which should be used for new code.
#### Notes
For random samples from the normal distribution with mean `mu` and standard deviation `sigma`, use one of:
    
    mu + sigma * np.random.standard_normal(size=...)
    np.random.normal(mu, sigma, size=...)
    
#### Examples
    
    >>> np.random.standard_normal()
    2.1923875335537315 #random
    
    
    >>> s = np.random.standard_normal(8000)
    >>> s
    array([ 0.6888893 ,  0.78096262, -0.89086505, ...,  0.49876311,  # random
           -0.38672696, -0.4685006 ])                                # random
    >>> s.shape
    (8000,)
    >>> s = np.random.standard_normal(size=(3, 4, 2))
    >>> s.shape
    (3, 4, 2)
    
Two-by-four array of samples from the normal distribution with mean 3 and standard deviation 2.5:
    
    >>> 3 + 2.5 * np.random.standard_normal(size=(2, 4))
    array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
           [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random
    
# numpy.random.standard_t
random.standard_t(df, size=None)
    
Draw samples from a standard Student’s t distribution with `df` degrees of freedom.
A special case of the hyperbolic distribution. As `df` gets large, the result resembles that of the standard normal distribution (`standard_normal`).
Note
New code should use the `standard_t` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
dffloat or array_like of floats
    
Degrees of freedom, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `df` is a scalar. Otherwise, `np.array(df).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized standard Student’s t distribution.
See also
`random.Generator.standard_t`
    
which should be used for new code.
#### Notes
The probability density function for the t distribution is
\\[P(x, df) = \frac{\Gamma(\frac{df+1}{2})}{\sqrt{\pi df} \Gamma(\frac{df}{2})}\Bigl( 1+\frac{x^2}{df} \Bigr)^{-(df+1)/2}\\]
The t test is based on an assumption that the data come from a Normal distribution. The t test provides a way to test whether the sample mean (that is the mean calculated from the data) is a good estimate of the true mean.
The derivation of the t-distribution was first published in 1908 by William Gosset while working for the Guinness Brewery in Dublin. Due to proprietary issues, he had to publish under a pseudonym, and so he used the name Student.
#### References
[1]
Dalgaard, Peter, “Introductory Statistics With R”, Springer, 2002.
[2]
Wikipedia, “Student’s t-distribution” https://en.wikipedia.org/wiki/Student’s_t-distribution
#### Examples
From Dalgaard page 83 [1], suppose the daily energy intake for 11 women in kilojoules (kJ) is:
    
    >>> intake = np.array([5260., 5470, 5640, 6180, 6390, 6515, 6805, 7515, \
    ...                    7515, 8230, 8770])
    
Does their energy intake deviate systematically from the recommended value of 7725 kJ? Our null hypothesis will be the absence of deviation, and the alternate hypothesis will be the presence of an effect that could be either positive or negative, hence making our test 2-tailed.
Because we are estimating the mean and we have N=11 values in our sample, we have N-1=10 degrees of freedom. We set our significance level to 95% and compute the t statistic using the empirical mean and empirical standard deviation of our intake. We use a ddof of 1 to base the computation of our empirical standard deviation on an unbiased estimate of the variance (note: the final estimate is not unbiased due to the concave nature of the square root).
    
    >>> np.mean(intake)
    6753.636363636364
    >>> intake.std(ddof=1)
    1142.1232221373727
    >>> t = (np.mean(intake)-7725)/(intake.std(ddof=1)/np.sqrt(len(intake)))
    >>> t
    -2.8207540608310198
    
We draw 1000000 samples from Student’s t distribution with the adequate degrees of freedom.
    
    >>> import matplotlib.pyplot as plt
    >>> s = np.random.standard_t(10, size=1000000)
    >>> h = plt.hist(s, bins=100, density=True)
    
Does our t statistic land in one of the two critical regions found at both tails of the distribution?
    
    >>> np.sum(np.abs(t) < np.abs(s)) / float(len(s))
    0.018318  #random < 0.05, statistic is in critical region
    
The probability value for this 2-tailed test is about 1.83%, which is lower than the 5% pre-determined significance threshold.
Therefore, the probability of observing values as extreme as our intake conditionally on the null hypothesis being true is too low, and we reject the null hypothesis of no deviation.
# numpy.random.triangular
random.triangular(left, mode, right, size=None)
    
Draw samples from the triangular distribution over the interval `[left, right]`.
The triangular distribution is a continuous probability distribution with lower limit left, peak at mode, and upper limit right. Unlike the other distributions, these parameters directly define the shape of the pdf.
Note
New code should use the `triangular` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
leftfloat or array_like of floats
    
Lower limit.
modefloat or array_like of floats
    
The value where the peak of the distribution occurs. The value must fulfill the condition `left <= mode <= right`.
rightfloat or array_like of floats
    
Upper limit, must be larger than `left`.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `left`, `mode`, and `right` are all scalars. Otherwise, `np.broadcast(left, mode, right).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized triangular distribution.
See also
`random.Generator.triangular`
    
which should be used for new code.
#### Notes
The probability density function for the triangular distribution is
\\[\begin{split}P(x;l, m, r) = \begin{cases} \frac{2(x-l)}{(r-l)(m-l)}& \text{for $l \leq x \leq m$},\\\ \frac{2(r-x)}{(r-l)(r-m)}& \text{for $m \leq x \leq r$},\\\ 0& \text{otherwise}. \end{cases}\end{split}\\]
The triangular distribution is often used in ill-defined problems where the underlying distribution is not known, but some knowledge of the limits and mode exists. Often it is used in simulations.
#### References
[1]
Wikipedia, “Triangular distribution” https://en.wikipedia.org/wiki/Triangular_distribution
#### Examples
Draw values from the distribution and plot the histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> h = plt.hist(np.random.triangular(-3, 0, 8, 100000), bins=200,
    ...              density=True)
    >>> plt.show()
    
# numpy.random.uniform
random.uniform(low=0.0, high=1.0, size=None)
    
Draw samples from a uniform distribution.
Samples are uniformly distributed over the half-open interval `[low, high)` (includes low, but excludes high). In other words, any value within the given interval is equally likely to be drawn by `uniform`.
Note
New code should use the `uniform` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
lowfloat or array_like of floats, optional
    
Lower boundary of the output interval. All values generated will be greater than or equal to low. The default value is 0.
highfloat or array_like of floats
    
Upper boundary of the output interval. All values generated will be less than or equal to high. The high limit may be included in the returned array of floats due to floating-point rounding in the equation `low + (high-low) * random_sample()`. The default value is 1.0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `low` and `high` are both scalars. Otherwise, `np.broadcast(low, high).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized uniform distribution.
See also
`randint`
    
Discrete uniform distribution, yielding integers.
`random_integers`
    
Discrete uniform distribution over the closed interval `[low, high]`.
`random_sample`
    
Floats uniformly distributed over `[0, 1)`.
`random`
    
Alias for `random_sample`.
`rand`
    
Convenience function that accepts dimensions as input, e.g., `rand(2,2)` would generate a 2-by-2 array of floats, uniformly distributed over `[0, 1)`.
`random.Generator.uniform`
    
which should be used for new code.
#### Notes
The probability density function of the uniform distribution is
\\[p(x) = \frac{1}{b - a}\\]
anywhere within the interval `[a, b)`, and zero elsewhere.
When `high` == `low`, values of `low` will be returned. If `high` < `low`, the results are officially undefined and may eventually raise an error, i.e. do not rely on this function to behave when passed arguments satisfying that inequality condition. The `high` limit may be included in the returned array of floats due to floating-point rounding in the equation `low + (high-low) * random_sample()`. For example:
    
    >>> x = np.float32(5*0.99999999)
    >>> x
    np.float32(5.0)
    
#### Examples
Draw samples from the distribution:
    
    >>> s = np.random.uniform(-1,0,1000)
    
All values are within the given interval:
    
    >>> np.all(s >= -1)
    True
    >>> np.all(s < 0)
    True
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> count, bins, ignored = plt.hist(s, 15, density=True)
    >>> plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
    >>> plt.show()
    
# numpy.random.vonmises
random.vonmises(mu, kappa, size=None)
    
Draw samples from a von Mises distribution.
Samples are drawn from a von Mises distribution with specified mode (mu) and concentration (kappa), on the interval [-pi, pi].
The von Mises distribution (also known as the circular normal distribution) is a continuous probability distribution on the unit circle. It may be thought of as the circular analogue of the normal distribution.
Note
New code should use the `vonmises` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
mufloat or array_like of floats
    
Mode (“center”) of the distribution.
kappafloat or array_like of floats
    
Concentration of the distribution, has to be >=0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mu` and `kappa` are both scalars. Otherwise, `np.broadcast(mu, kappa).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized von Mises distribution.
See also
`scipy.stats.vonmises`
    
probability density function, distribution, or cumulative density function, etc.
`random.Generator.vonmises`
    
which should be used for new code.
#### Notes
The probability density for the von Mises distribution is
\\[p(x) = \frac{e^{\kappa cos(x-\mu)}}{2\pi I_0(\kappa)},\\]
where \\(\mu\\) is the mode and \\(\kappa\\) the concentration, and \\(I_0(\kappa)\\) is the modified Bessel function of order 0.
The von Mises is named for Richard Edler von Mises, who was born in Austria-Hungary, in what is now the Ukraine. He fled to the United States in 1939 and became a professor at Harvard. He worked in probability theory, aerodynamics, fluid mechanics, and philosophy of science.
#### References
[1]
Abramowitz, M. and Stegun, I. A. (Eds.). “Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing,” New York: Dover, 1972.
[2]
von Mises, R., “Mathematical Theory of Probability and Statistics”, New York: Academic Press, 1964.
#### Examples
Draw samples from the distribution:
    
    >>> mu, kappa = 0.0, 4.0 # mean and concentration
    >>> s = np.random.vonmises(mu, kappa, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.special import i0  
    >>> plt.hist(s, 50, density=True)
    >>> x = np.linspace(-np.pi, np.pi, num=51)
    >>> y = np.exp(kappa*np.cos(x-mu))/(2*np.pi*i0(kappa))  
    >>> plt.plot(x, y, linewidth=2, color='r')  
    >>> plt.show()
    
# numpy.random.wald
random.wald(mean, scale, size=None)
    
Draw samples from a Wald, or inverse Gaussian, distribution.
As the scale approaches infinity, the distribution becomes more like a Gaussian. Some references claim that the Wald is an inverse Gaussian with mean equal to 1, but this is by no means universal.
The inverse Gaussian distribution was first studied in relationship to Brownian motion. In 1956 M.C.K. Tweedie used the name inverse Gaussian because there is an inverse relationship between the time to cover a unit distance and distance covered in unit time.
Note
New code should use the `wald` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
meanfloat or array_like of floats
    
Distribution mean, must be > 0.
scalefloat or array_like of floats
    
Scale parameter, must be > 0.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `mean` and `scale` are both scalars. Otherwise, `np.broadcast(mean, scale).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Wald distribution.
See also
`random.Generator.wald`
    
which should be used for new code.
#### Notes
The probability density function for the Wald distribution is
\\[P(x;mean,scale) = \sqrt{\frac{scale}{2\pi x^3}}e^ \frac{-scale(x-mean)^2}{2\cdotp mean^2x}\\]
As noted above the inverse Gaussian distribution first arise from attempts to model Brownian motion. It is also a competitor to the Weibull for use in reliability modeling and modeling stock returns and interest rate processes.
#### References
[1]
Brighton Webs Ltd., Wald Distribution, https://web.archive.org/web/20090423014010/http://www.brighton-webs.co.uk:80/distributions/wald.asp
[2]
Chhikara, Raj S., and Folks, J. Leroy, “The Inverse Gaussian Distribution: Theory : Methodology, and Applications”, CRC Press, 1988.
[3]
Wikipedia, “Inverse Gaussian distribution” https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution
#### Examples
Draw values from the distribution and plot the histogram:
    
    >>> import matplotlib.pyplot as plt
    >>> h = plt.hist(np.random.wald(3, 2, 100000), bins=200, density=True)
    >>> plt.show()
    
# numpy.random.weibull
random.weibull(a, size=None)
    
Draw samples from a Weibull distribution.
Draw samples from a 1-parameter Weibull distribution with the given shape parameter `a`.
\\[X = (-ln(U))^{1/a}\\]
Here, U is drawn from the uniform distribution over (0,1].
The more common 2-parameter Weibull, including a scale parameter \\(\lambda\\) is just \\(X = \lambda(-ln(U))^{1/a}\\).
Note
New code should use the `weibull` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Shape parameter of the distribution. Must be nonnegative.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Weibull distribution.
See also
`scipy.stats.weibull_max`
`scipy.stats.weibull_min`
`scipy.stats.genextreme`
`gumbel`
`random.Generator.weibull`
    
which should be used for new code.
#### Notes
The Weibull (or Type III asymptotic extreme value distribution for smallest values, SEV Type III, or Rosin-Rammler distribution) is one of a class of Generalized Extreme Value (GEV) distributions used in modeling extreme value problems. This class includes the Gumbel and Frechet distributions.
The probability density for the Weibull distribution is
\\[p(x) = \frac{a} {\lambda}(\frac{x}{\lambda})^{a-1}e^{-(x/\lambda)^a},\\]
where \\(a\\) is the shape and \\(\lambda\\) the scale.
The function has its peak (the mode) at \\(\lambda(\frac{a-1}{a})^{1/a}\\).
When `a = 1`, the Weibull distribution reduces to the exponential distribution.
#### References
[1]
Waloddi Weibull, Royal Technical University, Stockholm, 1939 “A Statistical Theory Of The Strength Of Materials”, Ingeniorsvetenskapsakademiens Handlingar Nr 151, 1939, Generalstabens Litografiska Anstalts Forlag, Stockholm.
[2]
Waloddi Weibull, “A Statistical Distribution Function of Wide Applicability”, Journal Of Applied Mechanics ASME Paper 1951.
[3]
Wikipedia, “Weibull distribution”, https://en.wikipedia.org/wiki/Weibull_distribution
#### Examples
Draw samples from the distribution:
    
    >>> a = 5. # shape
    >>> s = np.random.weibull(a, 1000)
    
Display the histogram of the samples, along with the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> x = np.arange(1,100.)/50.
    >>> def weib(x,n,a):
    ...     return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)
    
    
    >>> count, bins, ignored = plt.hist(np.random.weibull(5.,1000))
    >>> x = np.arange(1,100.)/50.
    >>> scale = count.max()/weib(x, 1., 5.).max()
    >>> plt.plot(x, weib(x, 1., 5.)*scale)
    >>> plt.show()
    
# numpy.random.zipf
random.zipf(a, size=None)
    
Draw samples from a Zipf distribution.
Samples are drawn from a Zipf distribution with specified parameter `a` > 1.
The Zipf distribution (also known as the zeta distribution) is a discrete probability distribution that satisfies Zipf’s law: the frequency of an item is inversely proportional to its rank in a frequency table.
Note
New code should use the `zipf` method of a `Generator` instance instead; please see the Quick start.
Parameters:
    
afloat or array_like of floats
    
Distribution parameter. Must be greater than 1.
sizeint or tuple of ints, optional
    
Output shape. If the given shape is, e.g., `(m, n, k)`, then `m * n * k` samples are drawn. If size is `None` (default), a single value is returned if `a` is a scalar. Otherwise, `np.array(a).size` samples are drawn.
Returns:
    
outndarray or scalar
    
Drawn samples from the parameterized Zipf distribution.
See also
`scipy.stats.zipf`
    
probability density function, distribution, or cumulative density function, etc.
`random.Generator.zipf`
    
which should be used for new code.
#### Notes
The probability mass function (PMF) for the Zipf distribution is
\\[p(k) = \frac{k^{-a}}{\zeta(a)},\\]
for integers \\(k \geq 1\\), where \\(\zeta\\) is the Riemann Zeta function.
It is named for the American linguist George Kingsley Zipf, who noted that the frequency of any word in a sample of a language is inversely proportional to its rank in the frequency table.
#### References
[1]
Zipf, G. K., “Selected Studies of the Principle of Relative Frequency in Language,” Cambridge, MA: Harvard Univ. Press, 1932.
#### Examples
Draw samples from the distribution:
    
    >>> a = 4.0
    >>> n = 20000
    >>> s = np.random.zipf(a, n)
    
Display the histogram of the samples, along with the expected histogram based on the probability density function:
    
    >>> import matplotlib.pyplot as plt
    >>> from scipy.special import zeta  
    
`bincount` provides a fast histogram for small integers.
    
    >>> count = np.bincount(s)
    >>> k = np.arange(1, s.max() + 1)
    
    
    >>> plt.bar(k, count[1:], alpha=0.5, label='sample count')
    >>> plt.plot(k, n*(k**-a)/zeta(a), 'k.-', alpha=0.5,
    ...          label='expected count')   
    >>> plt.semilogy()
    >>> plt.grid(alpha=0.4)
    >>> plt.legend()
    >>> plt.title(f'Zipf sample, a={a}, size={n}')
    >>> plt.show()
    
# Random Generator
The `Generator` provides access to a wide range of distributions, and served as a replacement for `RandomState`. The main difference between the two is that `Generator` relies on an additional BitGenerator to manage state and generate the random bits, which are then transformed into random values from useful distributions. The default BitGenerator used by `Generator` is `PCG64`. The BitGenerator can be changed by passing an instantized BitGenerator to `Generator`.
numpy.random.default_rng(seed=None)
    
Construct a new Generator with the default BitGenerator (PCG64).
Parameters:
    
seed{None, int, array_like[ints], SeedSequence, BitGenerator, Generator, RandomState}, optional
    
A seed to initialize the `BitGenerator`. If None, then fresh, unpredictable entropy will be pulled from the OS. If an `int` or `array_like[ints]` is passed, then all values must be non-negative and will be passed to `SeedSequence` to derive the initial `BitGenerator` state. One may also pass in a `SeedSequence` instance. Additionally, when passed a `BitGenerator`, it will be wrapped by `Generator`. If passed a `Generator`, it will be returned unaltered. When passed a legacy `RandomState` instance it will be coerced to a `Generator`.
Returns:
    
Generator
    
The initialized generator object.
#### Notes
If `seed` is not a `BitGenerator` or a `Generator`, a new `BitGenerator` is instantiated. This function does not manage a default global instance.
See Seeding and entropy for more information about seeding.
#### Examples
`default_rng` is the recommended constructor for the random number class `Generator`. Here are several ways we can construct a random number generator using `default_rng` and the `Generator` class.
Here we use `default_rng` to generate a random float:
    
    >>> import numpy as np
    >>> rng = np.random.default_rng(12345)
    >>> print(rng)
    Generator(PCG64)
    >>> rfloat = rng.random()
    >>> rfloat
    0.22733602246716966
    >>> type(rfloat)
    <class 'float'>
    
Here we use `default_rng` to generate 3 random integers between 0 (inclusive) and 10 (exclusive):
    
    >>> import numpy as np
    >>> rng = np.random.default_rng(12345)
    >>> rints = rng.integers(low=0, high=10, size=3)
    >>> rints
    array([6, 2, 7])
    >>> type(rints[0])
    <class 'numpy.int64'>
    
Here we specify a seed so that we have reproducible results:
    
    >>> import numpy as np
    >>> rng = np.random.default_rng(seed=42)
    >>> print(rng)
    Generator(PCG64)
    >>> arr1 = rng.random((3, 3))
    >>> arr1
    array([[0.77395605, 0.43887844, 0.85859792],
           [0.69736803, 0.09417735, 0.97562235],
           [0.7611397 , 0.78606431, 0.12811363]])
    
If we exit and restart our Python interpreter, we’ll see that we generate the same random numbers again:
    
    >>> import numpy as np
    >>> rng = np.random.default_rng(seed=42)
    >>> arr2 = rng.random((3, 3))
    >>> arr2
    array([[0.77395605, 0.43887844, 0.85859792],
           [0.69736803, 0.09417735, 0.97562235],
           [0.7611397 , 0.78606431, 0.12811363]])
    
classnumpy.random.Generator(bit_generator)
    
Container for the BitGenerators.
`Generator` exposes a number of methods for generating random numbers drawn from a variety of probability distributions. In addition to the distribution-specific arguments, each method takes a keyword argument `size` that defaults to `None`. If `size` is `None`, then a single value is generated and returned. If `size` is an integer, then a 1-D array filled with generated values is returned. If `size` is a tuple, then an array with that shape is filled and returned.
The function `numpy.random.default_rng` will instantiate a `Generator` with numpy’s default `BitGenerator`.
No Compatibility Guarantee
`Generator` does not provide a version compatibility guarantee. In particular, as better algorithms evolve the bit stream may change.
Parameters:
    
bit_generatorBitGenerator
    
BitGenerator to use as the core generator.
See also
`default_rng`
    
Recommended constructor for `Generator`.
#### Notes
The Python stdlib module `random` contains pseudo-random number generator with a number of methods that are similar to the ones available in `Generator`. It uses Mersenne Twister, and this bit generator can be accessed using `MT19937`. `Generator`, besides being NumPy-aware, has the advantage that it provides a much larger number of probability distributions to choose from.
#### Examples
    
    >>> from numpy.random import Generator, PCG64
    >>> rng = Generator(PCG64())
    >>> rng.standard_normal()
    -0.203  # random
    
## Accessing the BitGenerator and spawning
`bit_generator`
Gets the bit generator instance used by the generator  
`spawn`(n_children)
Create new independent child generators.  
## Simple random data
`integers`(low[, high, size, dtype, endpoint])
Return random integers from `low` (inclusive) to `high` (exclusive), or if endpoint=True, `low` (inclusive) to `high` (inclusive).  
`random`([size, dtype, out])
Return random floats in the half-open interval [0.0, 1.0).  
`choice`(a[, size, replace, p, axis, shuffle])
Generates a random sample from a given array  
`bytes`(length)
Return random bytes.  
## Permutations
The methods for randomly permuting a sequence are
`shuffle`(x[, axis])
Modify an array or sequence in-place by shuffling its contents.  
`permutation`(x[, axis])
Randomly permute a sequence, or return a permuted range.  
`permuted`(x[, axis, out])
Randomly permute `x` along axis `axis`.  
The following table summarizes the behaviors of the methods.
method
copy/in-place
axis handling  
shuffle
in-place
as if 1d  
permutation
copy
as if 1d  
permuted
either (use ‘out’ for in-place)
axis independent  
The following subsections provide more details about the differences.
### In-place vs. copy
The main difference between `Generator.shuffle` and `Generator.permutation` is that `Generator.shuffle` operates in-place, while `Generator.permutation` returns a copy.
By default, `Generator.permuted` returns a copy. To operate in-place with `Generator.permuted`, pass the same array as the first argument and as the value of the `out` parameter. For example,
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> x = np.arange(0, 15).reshape(3, 5)
    >>> x 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    >>> y = rng.permuted(x, axis=1, out=x)
    >>> x 
    array([[ 1,  0,  2,  4,  3],  # random
           [ 6,  7,  8,  9,  5],
           [10, 14, 11, 13, 12]])
    
Note that when `out` is given, the return value is `out`:
    
    >>> y is x
    True
    
### Handling the `axis` parameter
An important distinction for these methods is how they handle the `axis` parameter. Both `Generator.shuffle` and `Generator.permutation` treat the input as a one-dimensional sequence, and the `axis` parameter determines which dimension of the input array to use as the sequence. In the case of a two-dimensional array, `axis=0` will, in effect, rearrange the rows of the array, and `axis=1` will rearrange the columns. For example
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> x = np.arange(0, 15).reshape(3, 5)
    >>> x
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    >>> rng.permutation(x, axis=1) 
    array([[ 1,  3,  2,  0,  4],  # random
           [ 6,  8,  7,  5,  9],
           [11, 13, 12, 10, 14]])
    
Note that the columns have been rearranged “in bulk”: the values within each column have not changed.
The method `Generator.permuted` treats the `axis` parameter similar to how `numpy.sort` treats it. Each slice along the given axis is shuffled independently of the others. Compare the following example of the use of `Generator.permuted` to the above example of `Generator.permutation`:
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> rng.permuted(x, axis=1) 
    array([[ 1,  0,  2,  4,  3],  # random
           [ 5,  7,  6,  9,  8],
           [10, 14, 12, 13, 11]])
    
In this example, the values within each row (i.e. the values along `axis=1`) have been shuffled independently. This is not a “bulk” shuffle of the columns.
### Shuffling non-NumPy sequences
`Generator.shuffle` works on non-NumPy sequences. That is, if it is given a sequence that is not a NumPy array, it shuffles that sequence in-place.
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> a = ['A', 'B', 'C', 'D', 'E']
    >>> rng.shuffle(a)  # shuffle the list in-place
    >>> a 
    ['B', 'D', 'A', 'E', 'C']  # random
    
## Distributions
`beta`(a, b[, size])
Draw samples from a Beta distribution.  
`binomial`(n, p[, size])
Draw samples from a binomial distribution.  
`chisquare`(df[, size])
Draw samples from a chi-square distribution.  
`dirichlet`(alpha[, size])
Draw samples from the Dirichlet distribution.  
`exponential`([scale, size])
Draw samples from an exponential distribution.  
`f`(dfnum, dfden[, size])
Draw samples from an F distribution.  
`gamma`(shape[, scale, size])
Draw samples from a Gamma distribution.  
`geometric`(p[, size])
Draw samples from the geometric distribution.  
`gumbel`([loc, scale, size])
Draw samples from a Gumbel distribution.  
`hypergeometric`(ngood, nbad, nsample[, size])
Draw samples from a Hypergeometric distribution.  
`laplace`([loc, scale, size])
Draw samples from the Laplace or double exponential distribution with specified location (or mean) and scale (decay).  
`logistic`([loc, scale, size])
Draw samples from a logistic distribution.  
`lognormal`([mean, sigma, size])
Draw samples from a log-normal distribution.  
`logseries`(p[, size])
Draw samples from a logarithmic series distribution.  
`multinomial`(n, pvals[, size])
Draw samples from a multinomial distribution.  
`multivariate_hypergeometric`(colors, nsample)
Generate variates from a multivariate hypergeometric distribution.  
`multivariate_normal`(mean, cov[, size, ...])
Draw random samples from a multivariate normal distribution.  
`negative_binomial`(n, p[, size])
Draw samples from a negative binomial distribution.  
`noncentral_chisquare`(df, nonc[, size])
Draw samples from a noncentral chi-square distribution.  
`noncentral_f`(dfnum, dfden, nonc[, size])
Draw samples from the noncentral F distribution.  
`normal`([loc, scale, size])
Draw random samples from a normal (Gaussian) distribution.  
`pareto`(a[, size])
Draw samples from a Pareto II (AKA Lomax) distribution with specified shape.  
`poisson`([lam, size])
Draw samples from a Poisson distribution.  
`power`(a[, size])
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.  
`rayleigh`([scale, size])
Draw samples from a Rayleigh distribution.  
`standard_cauchy`([size])
Draw samples from a standard Cauchy distribution with mode = 0.  
`standard_exponential`([size, dtype, method, out])
Draw samples from the standard exponential distribution.  
`standard_gamma`(shape[, size, dtype, out])
Draw samples from a standard Gamma distribution.  
`standard_normal`([size, dtype, out])
Draw samples from a standard Normal distribution (mean=0, stdev=1).  
`standard_t`(df[, size])
Draw samples from a standard Student's t distribution with `df` degrees of freedom.  
`triangular`(left, mode, right[, size])
Draw samples from the triangular distribution over the interval `[left, right]`.  
`uniform`([low, high, size])
Draw samples from a uniform distribution.  
`vonmises`(mu, kappa[, size])
Draw samples from a von Mises distribution.  
`wald`(mean, scale[, size])
Draw samples from a Wald, or inverse Gaussian, distribution.  
`weibull`(a[, size])
Draw samples from a Weibull distribution.  
`zipf`(a[, size])
Draw samples from a Zipf distribution.  
# Random sampling (numpy.random)
## Quick start
The `numpy.random` module implements pseudo-random number generators (PRNGs or RNGs, for short) with the ability to draw samples from a variety of probability distributions. In general, users will create a `Generator` instance with `default_rng` and call the various methods on it to obtain samples from different distributions.
    
    >>> import numpy as np
    >>> rng = np.random.default_rng()
    # Generate one random float uniformly distributed over the range [0, 1)
    >>> rng.random()  
    0.06369197489564249  # may vary
    # Generate an array of 10 numbers according to a unit Gaussian distribution
    >>> rng.standard_normal(10)  
    array([-0.31018314, -1.8922078 , -0.3628523 , -0.63526532,  0.43181166,  # may vary
            0.51640373,  1.25693945,  0.07779185,  0.84090247, -2.13406828])
    # Generate an array of 5 integers uniformly over the range [0, 10)
    >>> rng.integers(low=0, high=10, size=5)  
    array([8, 7, 6, 2, 0])  # may vary
    
Our RNGs are deterministic sequences and can be reproduced by specifying a seed integer to derive its initial state. By default, with no seed provided, `default_rng` will seed the RNG from nondeterministic data from the operating system and therefore generate different numbers each time. The pseudo-random sequences will be independent for all practical purposes, at least those purposes for which our pseudo-randomness was good for in the first place.
    
    >>> import numpy as np
    >>> rng1 = np.random.default_rng()
    >>> rng1.random()  
    0.6596288841243357  # may vary
    >>> rng2 = np.random.default_rng()
    >>> rng2.random()  
    0.11885628817151628  # may vary
    
Warning
The pseudo-random number generators implemented in this module are designed for statistical modeling and simulation. They are not suitable for security or cryptographic purposes. See the `secrets` module from the standard library for such use cases.
Seeds should be large positive integers. `default_rng` can take positive integers of any size. We recommend using very large, unique numbers to ensure that your seed is different from anyone else’s. This is good practice to ensure that your results are statistically independent from theirs unless you are intentionally trying to reproduce their result. A convenient way to get such a seed number is to use `secrets.randbits` to get an arbitrary 128-bit integer.
    
    >>> import numpy as np
    >>> import secrets
    >>> secrets.randbits(128)  
    122807528840384100672342137672332424406  # may vary
    >>> rng1 = np.random.default_rng(122807528840384100672342137672332424406)
    >>> rng1.random()
    0.5363922081269535
    >>> rng2 = np.random.default_rng(122807528840384100672342137672332424406)
    >>> rng2.random()
    0.5363922081269535
    
See the documentation on `default_rng` and `SeedSequence` for more advanced options for controlling the seed in specialized scenarios.
`Generator` and its associated infrastructure was introduced in NumPy version 1.17.0. There is still a lot of code that uses the older `RandomState` and the functions in `numpy.random`. While there are no plans to remove them at this time, we do recommend transitioning to `Generator` as you can. The algorithms are faster, more flexible, and will receive more improvements in the future. For the most part, `Generator` can be used as a replacement for `RandomState`. See Legacy random generation for information on the legacy infrastructure, What’s new or different for information on transitioning, and NEP 19 for some of the reasoning for the transition.
## Design
Users primarily interact with `Generator` instances. Each `Generator` instance owns a `BitGenerator` instance that implements the core RNG algorithm. The `BitGenerator` has a limited set of responsibilities. It manages state and provides functions to produce random doubles and random unsigned 32- and 64-bit values.
The `Generator` takes the bit generator-provided stream and transforms them into more useful distributions, e.g., simulated normal random values. This structure allows alternative bit generators to be used with little code duplication.
NumPy implements several different `BitGenerator` classes implementing different RNG algorithms. `default_rng` currently uses `PCG64` as the default `BitGenerator`. It has better statistical properties and performance than the `MT19937` algorithm used in the legacy `RandomState`. See Bit generators for more details on the supported BitGenerators.
`default_rng` and BitGenerators delegate the conversion of seeds into RNG states to `SeedSequence` internally. `SeedSequence` implements a sophisticated algorithm that intermediates between the user’s input and the internal implementation details of each `BitGenerator` algorithm, each of which can require different amounts of bits for its state. Importantly, it lets you use arbitrary-sized integers and arbitrary sequences of such integers to mix together into the RNG state. This is a useful primitive for constructing a flexible pattern for parallel RNG streams.
For backward compatibility, we still maintain the legacy `RandomState` class. It continues to use the `MT19937` algorithm by default, and old seeds continue to reproduce the same results. The convenience Functions in numpy.random are still aliases to the methods on a single global `RandomState` instance. See Legacy random generation for the complete details. See What’s new or different for a detailed comparison between `Generator` and `RandomState`.
### Parallel Generation
The included generators can be used in parallel, distributed applications in a number of ways:
  * SeedSequence spawning
  * Sequence of integer seeds
  * Independent streams
  * Jumping the BitGenerator state


Users with a very large amount of parallelism will want to consult Upgrading PCG64 with PCG64DXSM.
## Concepts
  * Random `Generator`
  * Legacy Generator (RandomState)
  * Bit generators
  * Seeding and entropy
  * Upgrading PCG64 with PCG64DXSM
  * Compatibility policy


## Features
  * Parallel Applications
    * `SeedSequence` spawning
    * Sequence of integer seeds
    * Independent streams
    * Jumping the BitGenerator state
  * Multithreaded Generation
  * What’s new or different
  * Comparing Performance
    * Recommendation
    * Timings
    * Performance on different operating systems
  * C API for random
  * Examples of using Numba, Cython, CFFI
    * Numba
    * Cython
    * CFFI
    * New BitGenerators
    * Examples


### Original Source of the Generator and BitGenerators
This package was developed independently of NumPy and was integrated in version 1.17.0. The original repo is at bashtage/randomgen.
# Legacy random generation
The `RandomState` provides access to legacy generators. This generator is considered frozen and will have no further improvements. It is guaranteed to produce the same values as the final point release of NumPy v1.16. These all depend on Box-Muller normals or inverse CDF exponentials or gammas. This class should only be used if it is essential to have randoms that are identical to what would have been produced by previous versions of NumPy.
`RandomState` adds additional information to the state which is required when using Box-Muller normals since these are produced in pairs. It is important to use `RandomState.get_state`, and not the underlying bit generators `state`, when accessing the state so that these extra values are saved.
Although we provide the `MT19937` BitGenerator for use independent of `RandomState`, note that its default seeding uses `SeedSequence` rather than the legacy seeding algorithm. `RandomState` will use the legacy seeding algorithm. The methods to use the legacy seeding algorithm are currently private as the main reason to use them is just to implement `RandomState`. However, one can reset the state of `MT19937` using the state of the `RandomState`:
    
    from numpy.random import MT19937
    from numpy.random import RandomState
    
    rs = RandomState(12345)
    mt19937 = MT19937()
    mt19937.state = rs.get_state()
    rs2 = RandomState(mt19937)
    
    # Same output
    rs.standard_normal()
    rs2.standard_normal()
    
    rs.random()
    rs2.random()
    
    rs.standard_exponential()
    rs2.standard_exponential()
    
classnumpy.random.RandomState(seed=None)
    
Container for the slow Mersenne Twister pseudo-random number generator. Consider using a different BitGenerator with the Generator container instead.
`RandomState` and `Generator` expose a number of methods for generating random numbers drawn from a variety of probability distributions. In addition to the distribution-specific arguments, each method takes a keyword argument `size` that defaults to `None`. If `size` is `None`, then a single value is generated and returned. If `size` is an integer, then a 1-D array filled with generated values is returned. If `size` is a tuple, then an array with that shape is filled and returned.
Compatibility Guarantee
A fixed bit generator using a fixed seed and a fixed series of calls to ‘RandomState’ methods using the same parameters will always produce the same results up to roundoff error except when the values were incorrect. `RandomState` is effectively frozen and will only receive updates that are required by changes in the internals of Numpy. More substantial changes, including algorithmic improvements, are reserved for `Generator`.
Parameters:
    
seed{None, int, array_like, BitGenerator}, optional
    
Random seed used to initialize the pseudo-random number generator or an instantized BitGenerator. If an integer or array, used as a seed for the MT19937 BitGenerator. Values can be any integer between 0 and 2**32 - 1 inclusive, an array (or other sequence) of such integers, or `None` (the default). If `seed` is `None`, then the `MT19937` BitGenerator is initialized by reading data from `/dev/urandom` (or the Windows analogue) if available or seed from the clock otherwise.
See also
`Generator`
`MT19937`
`numpy.random.BitGenerator`
#### Notes
The Python stdlib module “random” also contains a Mersenne Twister pseudo-random number generator with a number of methods that are similar to the ones available in `RandomState`. `RandomState`, besides being NumPy-aware, has the advantage that it provides a much larger number of probability distributions to choose from.
## Seeding and state
`get_state`([legacy])
Return a tuple representing the internal state of the generator.  
`set_state`(state)
Set the internal state of the generator from a tuple.  
`seed`([seed])
Reseed a legacy MT19937 BitGenerator  
## Simple random data
`rand`(d0, d1, ..., dn)
Random values in a given shape.  
`randn`(d0, d1, ..., dn)
Return a sample (or samples) from the "standard normal" distribution.  
`randint`(low[, high, size, dtype])
Return random integers from `low` (inclusive) to `high` (exclusive).  
`random_integers`(low[, high, size])
Random integers of type `numpy.int_` between `low` and `high`, inclusive.  
`random_sample`([size])
Return random floats in the half-open interval [0.0, 1.0).  
`choice`(a[, size, replace, p])
Generates a random sample from a given 1-D array  
`bytes`(length)
Return random bytes.  
## Permutations
`shuffle`(x)
Modify a sequence in-place by shuffling its contents.  
`permutation`(x)
Randomly permute a sequence, or return a permuted range.  
## Distributions
`beta`(a, b[, size])
Draw samples from a Beta distribution.  
`binomial`(n, p[, size])
Draw samples from a binomial distribution.  
`chisquare`(df[, size])
Draw samples from a chi-square distribution.  
`dirichlet`(alpha[, size])
Draw samples from the Dirichlet distribution.  
`exponential`([scale, size])
Draw samples from an exponential distribution.  
`f`(dfnum, dfden[, size])
Draw samples from an F distribution.  
`gamma`(shape[, scale, size])
Draw samples from a Gamma distribution.  
`geometric`(p[, size])
Draw samples from the geometric distribution.  
`gumbel`([loc, scale, size])
Draw samples from a Gumbel distribution.  
`hypergeometric`(ngood, nbad, nsample[, size])
Draw samples from a Hypergeometric distribution.  
`laplace`([loc, scale, size])
Draw samples from the Laplace or double exponential distribution with specified location (or mean) and scale (decay).  
`logistic`([loc, scale, size])
Draw samples from a logistic distribution.  
`lognormal`([mean, sigma, size])
Draw samples from a log-normal distribution.  
`logseries`(p[, size])
Draw samples from a logarithmic series distribution.  
`multinomial`(n, pvals[, size])
Draw samples from a multinomial distribution.  
`multivariate_normal`(mean, cov[, size, ...])
Draw random samples from a multivariate normal distribution.  
`negative_binomial`(n, p[, size])
Draw samples from a negative binomial distribution.  
`noncentral_chisquare`(df, nonc[, size])
Draw samples from a noncentral chi-square distribution.  
`noncentral_f`(dfnum, dfden, nonc[, size])
Draw samples from the noncentral F distribution.  
`normal`([loc, scale, size])
Draw random samples from a normal (Gaussian) distribution.  
`pareto`(a[, size])
Draw samples from a Pareto II or Lomax distribution with specified shape.  
`poisson`([lam, size])
Draw samples from a Poisson distribution.  
`power`(a[, size])
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.  
`rayleigh`([scale, size])
Draw samples from a Rayleigh distribution.  
`standard_cauchy`([size])
Draw samples from a standard Cauchy distribution with mode = 0.  
`standard_exponential`([size])
Draw samples from the standard exponential distribution.  
`standard_gamma`(shape[, size])
Draw samples from a standard Gamma distribution.  
`standard_normal`([size])
Draw samples from a standard Normal distribution (mean=0, stdev=1).  
`standard_t`(df[, size])
Draw samples from a standard Student's t distribution with `df` degrees of freedom.  
`triangular`(left, mode, right[, size])
Draw samples from the triangular distribution over the interval `[left, right]`.  
`uniform`([low, high, size])
Draw samples from a uniform distribution.  
`vonmises`(mu, kappa[, size])
Draw samples from a von Mises distribution.  
`wald`(mean, scale[, size])
Draw samples from a Wald, or inverse Gaussian, distribution.  
`weibull`(a[, size])
Draw samples from a Weibull distribution.  
`zipf`(a[, size])
Draw samples from a Zipf distribution.  
## Functions in numpy.random
Many of the RandomState methods above are exported as functions in `numpy.random` This usage is discouraged, as it is implemented via a global `RandomState` instance which is not advised on two counts:
  * It uses global state, which means results will change as the code changes
  * It uses a `RandomState` rather than the more modern `Generator`.


For backward compatible legacy reasons, we will not change this.
`beta`(a, b[, size])
Draw samples from a Beta distribution.  
`binomial`(n, p[, size])
Draw samples from a binomial distribution.  
`bytes`(length)
Return random bytes.  
`chisquare`(df[, size])
Draw samples from a chi-square distribution.  
`choice`(a[, size, replace, p])
Generates a random sample from a given 1-D array  
`dirichlet`(alpha[, size])
Draw samples from the Dirichlet distribution.  
`exponential`([scale, size])
Draw samples from an exponential distribution.  
`f`(dfnum, dfden[, size])
Draw samples from an F distribution.  
`gamma`(shape[, scale, size])
Draw samples from a Gamma distribution.  
`geometric`(p[, size])
Draw samples from the geometric distribution.  
`get_state`([legacy])
Return a tuple representing the internal state of the generator.  
`gumbel`([loc, scale, size])
Draw samples from a Gumbel distribution.  
`hypergeometric`(ngood, nbad, nsample[, size])
Draw samples from a Hypergeometric distribution.  
`laplace`([loc, scale, size])
Draw samples from the Laplace or double exponential distribution with specified location (or mean) and scale (decay).  
`logistic`([loc, scale, size])
Draw samples from a logistic distribution.  
`lognormal`([mean, sigma, size])
Draw samples from a log-normal distribution.  
`logseries`(p[, size])
Draw samples from a logarithmic series distribution.  
`multinomial`(n, pvals[, size])
Draw samples from a multinomial distribution.  
`multivariate_normal`(mean, cov[, size, ...])
Draw random samples from a multivariate normal distribution.  
`negative_binomial`(n, p[, size])
Draw samples from a negative binomial distribution.  
`noncentral_chisquare`(df, nonc[, size])
Draw samples from a noncentral chi-square distribution.  
`noncentral_f`(dfnum, dfden, nonc[, size])
Draw samples from the noncentral F distribution.  
`normal`([loc, scale, size])
Draw random samples from a normal (Gaussian) distribution.  
`pareto`(a[, size])
Draw samples from a Pareto II or Lomax distribution with specified shape.  
`permutation`(x)
Randomly permute a sequence, or return a permuted range.  
`poisson`([lam, size])
Draw samples from a Poisson distribution.  
`power`(a[, size])
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.  
`rand`(d0, d1, ..., dn)
Random values in a given shape.  
`randint`(low[, high, size, dtype])
Return random integers from `low` (inclusive) to `high` (exclusive).  
`randn`(d0, d1, ..., dn)
Return a sample (or samples) from the "standard normal" distribution.  
`random`([size])
Return random floats in the half-open interval [0.0, 1.0).  
`random_integers`(low[, high, size])
Random integers of type `numpy.int_` between `low` and `high`, inclusive.  
`random_sample`([size])
Return random floats in the half-open interval [0.0, 1.0).  
`ranf`(*args, **kwargs)
This is an alias of `random_sample`.  
`rayleigh`([scale, size])
Draw samples from a Rayleigh distribution.  
`sample`(*args, **kwargs)
This is an alias of `random_sample`.  
`seed`([seed])
Reseed the singleton RandomState instance.  
`set_state`(state)
Set the internal state of the generator from a tuple.  
`shuffle`(x)
Modify a sequence in-place by shuffling its contents.  
`standard_cauchy`([size])
Draw samples from a standard Cauchy distribution with mode = 0.  
`standard_exponential`([size])
Draw samples from the standard exponential distribution.  
`standard_gamma`(shape[, size])
Draw samples from a standard Gamma distribution.  
`standard_normal`([size])
Draw samples from a standard Normal distribution (mean=0, stdev=1).  
`standard_t`(df[, size])
Draw samples from a standard Student's t distribution with `df` degrees of freedom.  
`triangular`(left, mode, right[, size])
Draw samples from the triangular distribution over the interval `[left, right]`.  
`uniform`([low, high, size])
Draw samples from a uniform distribution.  
`vonmises`(mu, kappa[, size])
Draw samples from a von Mises distribution.  
`wald`(mean, scale[, size])
Draw samples from a Wald, or inverse Gaussian, distribution.  
`weibull`(a[, size])
Draw samples from a Weibull distribution.  
`zipf`(a[, size])
Draw samples from a Zipf distribution.  
# Multithreaded generation
The four core distributions (`random`, `standard_normal`, `standard_exponential`, and `standard_gamma`) all allow existing arrays to be filled using the `out` keyword argument. Existing arrays need to be contiguous and well-behaved (writable and aligned). Under normal circumstances, arrays created using the common constructors such as `numpy.empty` will satisfy these requirements.
This example makes use of Python 3 `concurrent.futures` to fill an array using multiple threads. Threads are long-lived so that repeated calls do not require any additional overheads from thread creation.
The random numbers generated are reproducible in the sense that the same seed will produce the same outputs, given that the number of threads does not change.
    
    from numpy.random import default_rng, SeedSequence
    import multiprocessing
    import concurrent.futures
    import numpy as np
    
    class MultithreadedRNG:
        def __init__(self, n, seed=None, threads=None):
            if threads is None:
                threads = multiprocessing.cpu_count()
            self.threads = threads
    
            seq = SeedSequence(seed)
            self._random_generators = [default_rng(s)
                                       for s in seq.spawn(threads)]
    
            self.n = n
            self.executor = concurrent.futures.ThreadPoolExecutor(threads)
            self.values = np.empty(n)
            self.step = np.ceil(n / threads).astype(np.int_)
    
        def fill(self):
            def _fill(random_state, out, first, last):
                random_state.standard_normal(out=out[first:last])
    
            futures = {}
            for i in range(self.threads):
                args = (_fill,
                        self._random_generators[i],
                        self.values,
                        i * self.step,
                        (i + 1) * self.step)
                futures[self.executor.submit(*args)] = i
            concurrent.futures.wait(futures)
    
        def __del__(self):
            self.executor.shutdown(False)
    
The multithreaded random number generator can be used to fill an array. The `values` attributes shows the zero-value before the fill and the random value after.
    
    In [2]: mrng = MultithreadedRNG(10000000, seed=12345)
       ...: print(mrng.values[-1])
    Out[2]: 0.0
    
    In [3]: mrng.fill()
       ...: print(mrng.values[-1])
    Out[3]: 2.4545724517479104
    
The time required to produce using multiple threads can be compared to the time required to generate using a single thread.
    
    In [4]: print(mrng.threads)
       ...: %timeit mrng.fill()
    
    Out[4]: 4
       ...: 32.8 ms ± 2.71 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
The single threaded call directly uses the BitGenerator.
    
    In [5]: values = np.empty(10000000)
       ...: rg = default_rng()
       ...: %timeit rg.standard_normal(out=values)
    
    Out[5]: 99.6 ms ± 222 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
The gains are substantial and the scaling is reasonable even for arrays that are only moderately large. The gains are even larger when compared to a call that does not use an existing array due to array creation overhead.
    
    In [6]: rg = default_rng()
       ...: %timeit rg.standard_normal(10000000)
    
    Out[6]: 125 ms ± 309 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
Note that if `threads` is not set by the user, it will be determined by `multiprocessing.cpu_count()`.
    
    In [7]: # simulate the behavior for `threads=None`, if the machine had only one thread
       ...: mrng = MultithreadedRNG(10000000, seed=12345, threads=1)
       ...: print(mrng.values[-1])
    Out[7]: 1.1800150052158556
    
# What’s new or different
NumPy 1.17.0 introduced `Generator` as an improved replacement for the legacy `RandomState`. Here is a quick comparison of the two implementations.
Feature
Older Equivalent
Notes  
`Generator`
`RandomState`
`Generator` requires a stream source, called a `BitGenerator` A number of these are provided. `RandomState` uses the Mersenne Twister `MT19937` by default, but can also be instantiated with any BitGenerator.  
`random`
`random_sample`, `rand`
Access the values in a BitGenerator, convert them to `float64` in the interval `[0.0., 1.0)`. In addition to the `size` kwarg, now supports `dtype='d'` or `dtype='f'`, and an `out` kwarg to fill a user-supplied array.
Many other distributions are also supported.  
`integers`
`randint`, `random_integers`
Use the `endpoint` kwarg to adjust the inclusion or exclusion of the `high` interval endpoint.  
  * The normal, exponential and gamma generators use 256-step Ziggurat methods which are 2-10 times faster than NumPy’s default implementation in `standard_normal`, `standard_exponential` or `standard_gamma`. Because of the change in algorithms, it is not possible to reproduce the exact random values using `Generator` for these distributions or any distribution method that relies on them.


    
    In [1]: import numpy.random
    
    In [2]: rng = np.random.default_rng()
    
    In [3]: %timeit -n 1 rng.standard_normal(100000)
       ...: %timeit -n 1 numpy.random.standard_normal(100000)
       ...: 
    936 us +- 4.33 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
    1.72 ms +- 11.5 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
    
    
    In [4]: %timeit -n 1 rng.standard_exponential(100000)
       ...: %timeit -n 1 numpy.random.standard_exponential(100000)
       ...: 
    464 us +- 3.84 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
    1.23 ms +- 7.66 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
    
    
    In [5]: %timeit -n 1 rng.standard_gamma(3.0, 100000)
       ...: %timeit -n 1 numpy.random.standard_gamma(3.0, 100000)
       ...: 
    1.75 ms +- 9.05 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
    3.48 ms +- 4.1 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
    
  * `integers` is now the canonical way to generate integer random numbers from a discrete uniform distribution. This replaces both `randint` and the deprecated `random_integers`.
  * The `rand` and `randn` methods are only available through the legacy `RandomState`.
  * `Generator.random` is now the canonical way to generate floating-point random numbers, which replaces `RandomState.random_sample`, `sample`, and `ranf`, all of which were aliases. This is consistent with Python’s `random.random`.
  * All bit generators can produce doubles, uint64s and uint32s via CTypes (`ctypes`) and CFFI (`cffi`). This allows these bit generators to be used in numba.
  * The bit generators can be used in downstream projects via Cython.
  * All bit generators use `SeedSequence` to convert seed integers to initialized states.
  * Optional `dtype` argument that accepts `np.float32` or `np.float64` to produce either single or double precision uniform random variables for select distributions. `integers` accepts a `dtype` argument with any signed or unsigned integer dtype.
    * Uniforms (`random` and `integers`)
    * Normals (`standard_normal`)
    * Standard Gammas (`standard_gamma`)
    * Standard Exponentials (`standard_exponential`)


    
    In [6]: rng = np.random.default_rng()
    
    In [7]: rng.random(3, dtype=np.float64)
    Out[7]: array([0.09583911, 0.93160588, 0.71947891])
    
    In [8]: rng.random(3, dtype=np.float32)
    Out[8]: array([0.50844425, 0.20221537, 0.7923881 ], dtype=float32)
    
    In [9]: rng.integers(0, 256, size=3, dtype=np.uint8)
    Out[9]: array([  4, 201, 126], dtype=uint8)
    
  * Optional `out` argument that allows existing arrays to be filled for select distributions
    * Uniforms (`random`)
    * Normals (`standard_normal`)
    * Standard Gammas (`standard_gamma`)
    * Standard Exponentials (`standard_exponential`)
This allows multithreading to fill large arrays in chunks using suitable BitGenerators in parallel.


    
    In [10]: rng = np.random.default_rng()
    
    In [11]: existing = np.zeros(4)
    
    In [12]: rng.random(out=existing[:2])
    Out[12]: array([0.42493599, 0.03707944])
    
    In [13]: print(existing)
    [0.42493599 0.03707944 0.         0.        ]
    
  * Optional `axis` argument for methods like `choice`, `permutation` and `shuffle` that controls which axis an operation is performed over for multi-dimensional arrays.


    
    In [14]: rng = np.random.default_rng()
    
    In [15]: a = np.arange(12).reshape((3, 4))
    
    In [16]: a
    Out[16]: 
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    In [17]: rng.choice(a, axis=1, size=5)
    Out[17]: 
    array([[ 1,  2,  2,  2,  0],
           [ 5,  6,  6,  6,  4],
           [ 9, 10, 10, 10,  8]])
    
    In [18]: rng.shuffle(a, axis=1)        # Shuffle in-place
    
    In [19]: a
    Out[19]: 
    array([[ 1,  3,  2,  0],
           [ 5,  7,  6,  4],
           [ 9, 11, 10,  8]])
    
  * Added a method to sample from the complex normal distribution (`complex_normal`)


# Parallel random number generation
There are four main strategies implemented that can be used to produce repeatable pseudo-random numbers across multiple processes (local or distributed).
## SeedSequence spawning
NumPy allows you to spawn new (with very high probability) independent `BitGenerator` and `Generator` instances via their `spawn()` method. This spawning is implemented by the `SeedSequence` used for initializing the bit generators random stream.
`SeedSequence` implements an algorithm to process a user-provided seed, typically as an integer of some size, and to convert it into an initial state for a `BitGenerator`. It uses hashing techniques to ensure that low-quality seeds are turned into high quality initial states (at least, with very high probability).
For example, `MT19937` has a state consisting of 624 `uint32` integers. A naive way to take a 32-bit integer seed would be to just set the last element of the state to the 32-bit seed and leave the rest 0s. This is a valid state for `MT19937`, but not a good one. The Mersenne Twister algorithm suffers if there are too many 0s. Similarly, two adjacent 32-bit integer seeds (i.e. `12345` and `12346`) would produce very similar streams.
`SeedSequence` avoids these problems by using successions of integer hashes with good avalanche properties to ensure that flipping any bit in the input has about a 50% chance of flipping any bit in the output. Two input seeds that are very close to each other will produce initial states that are very far from each other (with very high probability). It is also constructed in such a way that you can provide arbitrary-sized integers or lists of integers. `SeedSequence` will take all of the bits that you provide and mix them together to produce however many bits the consuming `BitGenerator` needs to initialize itself.
These properties together mean that we can safely mix together the usual user-provided seed with simple incrementing counters to get `BitGenerator` states that are (to very high probability) independent of each other. We can wrap this together into an API that is easy to use and difficult to misuse. Note that while `SeedSequence` attempts to solve many of the issues related to user-provided small seeds, we still recommend using `secrets.randbits` to generate seeds with 128 bits of entropy to avoid the remaining biases introduced by human-chosen seeds.
    
    from numpy.random import SeedSequence, default_rng
    
    ss = SeedSequence(12345)
    
    # Spawn off 10 child SeedSequences to pass to child processes.
    child_seeds = ss.spawn(10)
    streams = [default_rng(s) for s in child_seeds]
    
For convenience the direct use of `SeedSequence` is not necessary. The above `streams` can be spawned directly from a parent generator via `spawn`:
    
    parent_rng = default_rng(12345)
    streams = parent_rng.spawn(10)
    
Child objects can also spawn to make grandchildren, and so on. Each child has a `SeedSequence` with its position in the tree of spawned child objects mixed in with the user-provided seed to generate independent (with very high probability) streams.
    
    grandchildren = streams[0].spawn(4)
    
This feature lets you make local decisions about when and how to split up streams without coordination between processes. You do not have to preallocate space to avoid overlapping or request streams from a common global service. This general “tree-hashing” scheme is not unique to numpy but not yet widespread. Python has increasingly-flexible mechanisms for parallelization available, and this scheme fits in very well with that kind of use.
Using this scheme, an upper bound on the probability of a collision can be estimated if one knows the number of streams that you derive. `SeedSequence` hashes its inputs, both the seed and the spawn-tree-path, down to a 128-bit pool by default. The probability that there is a collision in that pool, pessimistically-estimated ([1]), will be about \\(n^2*2^{-128}\\) where `n` is the number of streams spawned. If a program uses an aggressive million streams, about \\(2^{20}\\), then the probability that at least one pair of them are identical is about \\(2^{-88}\\), which is in solidly-ignorable territory ([2]).
[1]
The algorithm is carefully designed to eliminate a number of possible ways to collide. For example, if one only does one level of spawning, it is guaranteed that all states will be unique. But it’s easier to estimate the naive upper bound on a napkin and take comfort knowing that the probability is actually lower.
[2]
In this calculation, we can mostly ignore the amount of numbers drawn from each stream. See Upgrading PCG64 with PCG64DXSM for the technical details about `PCG64`. The other PRNGs we provide have some extra protection built in that avoids overlaps if the `SeedSequence` pools differ in the slightest bit. `PCG64DXSM` has \\(2^{127}\\) separate cycles determined by the seed in addition to the position in the \\(2^{128}\\) long period for each cycle, so one has to both get on or near the same cycle and seed a nearby position in the cycle. `Philox` has completely independent cycles determined by the seed. `SFC64` incorporates a 64-bit counter so every unique seed is at least \\(2^{64}\\) iterations away from any other seed. And finally, `MT19937` has just an unimaginably huge period. Getting a collision internal to `SeedSequence` is the way a failure would be observed.
## Sequence of integer seeds
As discussed in the previous section, `SeedSequence` can not only take an integer seed, it can also take an arbitrary-length sequence of (non-negative) integers. If one exercises a little care, one can use this feature to design ad hoc schemes for getting safe parallel PRNG streams with similar safety guarantees as spawning.
For example, one common use case is that a worker process is passed one root seed integer for the whole calculation and also an integer worker ID (or something more granular like a job ID, batch ID, or something similar). If these IDs are created deterministically and uniquely, then one can derive reproducible parallel PRNG streams by combining the ID and the root seed integer in a list.
    
    # default_rng() and each of the BitGenerators use SeedSequence underneath, so
    # they all accept sequences of integers as seeds the same way.
    from numpy.random import default_rng
    
    def worker(root_seed, worker_id):
        rng = default_rng([worker_id, root_seed])
        # Do work ...
    
    root_seed = 0x8c3c010cb4754c905776bdac5ee7501
    results = [worker(root_seed, worker_id) for worker_id in range(10)]
    
This can be used to replace a number of unsafe strategies that have been used in the past which try to combine the root seed and the ID back into a single integer seed value. For example, it is common to see users add the worker ID to the root seed, especially with the legacy `RandomState` code.
    
    # UNSAFE! Do not do this!
    worker_seed = root_seed + worker_id
    rng = np.random.RandomState(worker_seed)
    
It is true that for any one run of a parallel program constructed this way, each worker will have distinct streams. However, it is quite likely that multiple invocations of the program with different seeds will get overlapping sets of worker seeds. It is not uncommon (in the author’s self-experience) to change the root seed merely by an increment or two when doing these repeat runs. If the worker seeds are also derived by small increments of the worker ID, then subsets of the workers will return identical results, causing a bias in the overall ensemble of results.
Combining the worker ID and the root seed as a list of integers eliminates this risk. Lazy seeding practices will still be fairly safe.
This scheme does require that the extra IDs be unique and deterministically created. This may require coordination between the worker processes. It is recommended to place the varying IDs before the unvarying root seed. `spawn` appends integers after the user-provided seed, so if you might be mixing both this ad hoc mechanism and spawning, or passing your objects down to library code that might be spawning, then it is a little bit safer to prepend your worker IDs rather than append them to avoid a collision.
    
    # Good.
    worker_seed = [worker_id, root_seed]
    
    # Less good. It will *work*, but it's less flexible.
    worker_seed = [root_seed, worker_id]
    
With those caveats in mind, the safety guarantees against collision are about the same as with spawning, discussed in the previous section. The algorithmic mechanisms are the same.
## Independent streams
`Philox` is a counter-based RNG based which generates values by encrypting an incrementing counter using weak cryptographic primitives. The seed determines the key that is used for the encryption. Unique keys create unique, independent streams. `Philox` lets you bypass the seeding algorithm to directly set the 128-bit key. Similar, but different, keys will still create independent streams.
    
    import secrets
    from numpy.random import Philox
    
    # 128-bit number as a seed
    root_seed = secrets.getrandbits(128)
    streams = [Philox(key=root_seed + stream_id) for stream_id in range(10)]
    
This scheme does require that you avoid reusing stream IDs. This may require coordination between the parallel processes.
## Jumping the BitGenerator state
`jumped` advances the state of the BitGenerator as-if a large number of random numbers have been drawn, and returns a new instance with this state. The specific number of draws varies by BitGenerator, and ranges from \\(2^{64}\\) to \\(2^{128}\\). Additionally, the as-if draws also depend on the size of the default random number produced by the specific BitGenerator. The BitGenerators that support `jumped`, along with the period of the BitGenerator, the size of the jump and the bits in the default unsigned random are listed below.
BitGenerator
Period
Jump Size
Bits per Draw  
`MT19937`
\\(2^{19937}-1\\)
\\(2^{128}\\)
32  
`PCG64`
\\(2^{128}\\)
\\(~2^{127}\\) ([3])
64  
`PCG64DXSM`
\\(2^{128}\\)
\\(~2^{127}\\) ([3])
64  
`Philox`
\\(2^{256}\\)
\\(2^{128}\\)
64  
[3] (1,2)
The jump size is \\((\phi-1)*2^{128}\\) where \\(\phi\\) is the golden ratio. As the jumps wrap around the period, the actual distances between neighboring streams will slowly grow smaller than the jump size, but using the golden ratio this way is a classic method of constructing a low-discrepancy sequence that spreads out the states around the period optimally. You will not be able to jump enough to make those distances small enough to overlap in your lifetime.
`jumped` can be used to produce long blocks which should be long enough to not overlap.
    
    import secrets
    from numpy.random import PCG64
    
    seed = secrets.getrandbits(128)
    blocked_rng = []
    rng = PCG64(seed)
    for i in range(10):
        blocked_rng.append(rng.jumped(i))
    
When using `jumped`, one does have to take care not to jump to a stream that was already used. In the above example, one could not later use `blocked_rng[0].jumped()` as it would overlap with `blocked_rng[1]`. Like with the independent streams, if the main process here wants to split off 10 more streams by jumping, then it needs to start with `range(10, 20)`, otherwise it would recreate the same streams. On the other hand, if you carefully construct the streams, then you are guaranteed to have streams that do not overlap.
# Performance
## Recommendation
The recommended generator for general use is `PCG64` or its upgraded variant `PCG64DXSM` for heavily-parallel use cases. They are statistically high quality, full-featured, and fast on most platforms, but somewhat slow when compiled for 32-bit processes. See Upgrading PCG64 with PCG64DXSM for details on when heavy parallelism would indicate using `PCG64DXSM`.
`Philox` is fairly slow, but its statistical properties have very high quality, and it is easy to get an assuredly-independent stream by using unique keys. If that is the style you wish to use for parallel streams, or you are porting from another system that uses that style, then `Philox` is your choice.
`SFC64` is statistically high quality and very fast. However, it lacks jumpability. If you are not using that capability and want lots of speed, even on 32-bit processes, this is your choice.
`MT19937` fails some statistical tests and is not especially fast compared to modern PRNGs. For these reasons, we mostly do not recommend using it on its own, only through the legacy `RandomState` for reproducing old results. That said, it has a very long history as a default in many systems.
## Timings
The timings below are the time in ns to produce 1 random value from a specific distribution. The original `MT19937` generator is much slower since it requires 2 32-bit values to equal the output of the faster generators.
Integer performance has a similar ordering.
The pattern is similar for other, more complex generators. The normal performance of the legacy `RandomState` generator is much lower than the other since it uses the Box-Muller transform rather than the Ziggurat method. The performance gap for Exponentials is also large due to the cost of computing the log function to invert the CDF. The column labeled MT19973 uses the same 32-bit generator as `RandomState` but produces random variates using `Generator`.
MT19937
PCG64
PCG64DXSM
Philox
SFC64
RandomState  
32-bit Unsigned Ints
3.3
1.9
2.0
3.3
1.8
3.1  
64-bit Unsigned Ints
5.6
3.2
2.9
4.9
2.5
5.5  
Uniforms
5.9
3.1
2.9
5.0
2.6
6.0  
Normals
13.9
10.8
10.5
12.0
8.3
56.8  
Exponentials
9.1
6.0
5.8
8.1
5.4
63.9  
Gammas
37.2
30.8
28.9
34.0
27.5
77.0  
Binomials
21.3
17.4
17.6
19.3
15.6
21.4  
Laplaces
73.2
72.3
76.1
73.0
72.3
82.5  
Poissons
111.7
103.4
100.5
109.4
90.7
115.2  
The next table presents the performance in percentage relative to values generated by the legacy generator, `RandomState(MT19937())`. The overall performance was computed using a geometric mean.
MT19937
PCG64
PCG64DXSM
Philox
SFC64  
32-bit Unsigned Ints
96
162
160
96
175  
64-bit Unsigned Ints
97
171
188
113
218  
Uniforms
102
192
206
121
233  
Normals
409
526
541
471
684  
Exponentials
701
1071
1101
784
1179  
Gammas
207
250
266
227
281  
Binomials
100
123
122
111
138  
Laplaces
113
114
108
113
114  
Poissons
103
111
115
105
127  
Overall
159
219
225
174
251  
Note
All timings were taken using Linux on an AMD Ryzen 9 3900X processor.
## Performance on different operating systems
Performance differs across platforms due to compiler and hardware availability (e.g., register width) differences. The default bit generator has been chosen to perform well on 64-bit platforms. Performance on 32-bit operating systems is very different.
The values reported are normalized relative to the speed of MT19937 in each table. A value of 100 indicates that the performance matches the MT19937. Higher values indicate improved performance. These values cannot be compared across tables.
### 64-bit Linux
Distribution
MT19937
PCG64
PCG64DXSM
Philox
SFC64  
32-bit Unsigned Ints
100
168
166
100
182  
64-bit Unsigned Ints
100
176
193
116
224  
Uniforms
100
188
202
118
228  
Normals
100
128
132
115
167  
Exponentials
100
152
157
111
168  
Overall
100
161
168
112
192  
### 64-bit Windows
The relative performance on 64-bit Linux and 64-bit Windows is broadly similar with the notable exception of the Philox generator.
Distribution
MT19937
PCG64
PCG64DXSM
Philox
SFC64  
32-bit Unsigned Ints
100
155
131
29
150  
64-bit Unsigned Ints
100
157
143
25
154  
Uniforms
100
151
144
24
155  
Normals
100
129
128
37
150  
Exponentials
100
150
145
28
159  
Overall
100
148
138
28
154  
### 32-bit Windows
The performance of 64-bit generators on 32-bit Windows is much lower than on 64-bit operating systems due to register width. MT19937, the generator that has been in NumPy since 2005, operates on 32-bit integers.
Distribution
MT19937
PCG64
PCG64DXSM
Philox
SFC64  
32-bit Unsigned Ints
100
24
34
14
57  
64-bit Unsigned Ints
100
21
32
14
74  
Uniforms
100
21
34
16
73  
Normals
100
36
57
28
101  
Exponentials
100
28
44
20
88  
Overall
100
25
39
18
77  
Note
Linux timings used Ubuntu 20.04 and GCC 9.3.0. Windows timings were made on Windows 10 using Microsoft C/C++ Optimizing Compiler Version 19 (Visual Studio 2019). All timings were produced on an AMD Ryzen 9 3900X processor.
# Upgrading PCG64 with PCG64DXSM
Uses of the `PCG64` `BitGenerator` in a massively-parallel context have been shown to have statistical weaknesses that were not apparent at the first release in numpy 1.17. Most users will never observe this weakness and are safe to continue to use `PCG64`. We have introduced a new `PCG64DXSM` `BitGenerator` that will eventually become the new default `BitGenerator` implementation used by `default_rng` in future releases. `PCG64DXSM` solves the statistical weakness while preserving the performance and the features of `PCG64`.
## Does this affect me?
If you
  1. only use a single `Generator` instance,
  2. only use `RandomState` or the functions in `numpy.random`,
  3. only use the `PCG64.jumped` method to generate parallel streams,
  4. explicitly use a `BitGenerator` other than `PCG64`,


then this weakness does not affect you at all. Carry on.
If you use moderate numbers of parallel streams created with `default_rng` or `SeedSequence.spawn`, in the 1000s, then the chance of observing this weakness is negligibly small. You can continue to use `PCG64` comfortably.
If you use very large numbers of parallel streams, in the millions, and draw large amounts of numbers from each, then the chance of observing this weakness can become non-negligible, if still small. An example of such a use case would be a very large distributed reinforcement learning problem with millions of long Monte Carlo playouts each generating billions of random number draws. Such use cases should consider using `PCG64DXSM` explicitly or another modern `BitGenerator` like `SFC64` or `Philox`, but it is unlikely that any old results you may have calculated are invalid. In any case, the weakness is a kind of Birthday Paradox collision. That is, a single pair of parallel streams out of the millions, considered together, might fail a stringent set of statistical tests of randomness. The remaining millions of streams would all be perfectly fine, and the effect of the bad pair in the whole calculation is very likely to be swamped by the remaining streams in most applications.
## Technical details
Like many PRNG algorithms, `PCG64` is constructed from a transition function, which advances a 128-bit state, and an output function, that mixes the 128-bit state into a 64-bit integer to be output. One of the guiding design principles of the PCG family of PRNGs is to balance the computational cost (and pseudorandomness strength) between the transition function and the output function. The transition function is a 128-bit linear congruential generator (LCG), which consists of multiplying the 128-bit state with a fixed multiplication constant and then adding a user-chosen increment, in 128-bit modular arithmetic. LCGs are well-analyzed PRNGs with known weaknesses, though 128-bit LCGs are large enough to pass stringent statistical tests on their own, with only the trivial output function. The output function of `PCG64` is intended to patch up some of those known weaknesses by doing “just enough” scrambling of the bits to assist in the statistical properties without adding too much computational cost.
One of these known weaknesses is that advancing the state of the LCG by steps numbering a power of two (`bg.advance(2**N)`) will leave the lower `N` bits identical to the state that was just left. For a single stream drawn from sequentially, this is of little consequence. The remaining \\(128-N\\) bits provide plenty of pseudorandomness that will be mixed in for any practical `N` that can be observed in a single stream, which is why one does not need to worry about this if you only use a single stream in your application. Similarly, the `PCG64.jumped` method uses a carefully chosen number of steps to avoid creating these collisions. However, once you start creating “randomly-initialized” parallel streams, either using OS entropy by calling `default_rng` repeatedly or using `SeedSequence.spawn`, then we need to consider how many lower bits need to “collide” in order to create a bad pair of streams, and then evaluate the probability of creating such a collision. Empirically, it has been determined that if one shares the lower 58 bits of state and shares an increment, then the pair of streams, when interleaved, will fail PractRand in a reasonable amount of time, after drawing a few gigabytes of data. Following the standard Birthday Paradox calculations for a collision of 58 bits, we can see that we can create \\(2^{29}\\), or about half a billion, streams which is when the probability of such a collision becomes high. Half a billion streams is quite high, and the amount of data each stream needs to draw before the statistical correlations become apparent to even the strict `PractRand` tests is in the gigabytes. But this is on the horizon for very large applications like distributed reinforcement learning. There are reasons to expect that even in these applications a collision probably will not have a practical effect in the total result, since the statistical problem is constrained to just the colliding pair.
Now, let us consider the case when the increment is not constrained to be the same. Our implementation of `PCG64` seeds both the state and the increment; that is, two calls to `default_rng` (almost certainly) have different states and increments. Upon our first release, we believed that having the seeded increment would provide a certain amount of extra protection, that one would have to be “close” in both the state space and increment space in order to observe correlations (`PractRand` failures) in a pair of streams. If that were true, then the “bottleneck” for collisions would be the 128-bit entropy pool size inside of `SeedSequence` (and 128-bit collisions are in the “preposterously unlikely” category). Unfortunately, this is not true.
One of the known properties of an LCG is that different increments create distinct streams, but with a known relationship. Each LCG has an orbit that traverses all \\(2^{128}\\) different 128-bit states. Two LCGs with different increments are related in that one can “rotate” the orbit of the first LCG (advance it by a number of steps that we can compute from the two increments) such that then both LCGs will always then have the same state, up to an additive constant and maybe an inversion of the bits. If you then iterate both streams in lockstep, then the states will always remain related by that same additive constant (and the inversion, if present). Recall that `PCG64` is constructed from both a transition function (the LCG) and an output function. It was expected that the scrambling effect of the output function would have been strong enough to make the distinct streams practically independent (i.e. “passing the `PractRand` tests”) unless the two increments were pathologically related to each other (e.g. 1 and 3). The output function XSL-RR of the then-standard PCG algorithm that we implemented in `PCG64` turns out to be too weak to cover up for the 58-bit collision of the underlying LCG that we described above. For any given pair of increments, the size of the “colliding” space of states is the same, so for this weakness, the extra distinctness provided by the increments does not translate into extra protection from statistical correlations that `PractRand` can detect.
Fortunately, strengthening the output function is able to correct this weakness and does turn the extra distinctness provided by differing increments into additional protection from these low-bit collisions. To the PCG author’s credit, she had developed a stronger output function in response to related discussions during the long birth of the new `BitGenerator` system. We NumPy developers chose to be “conservative” and use the XSL-RR variant that had undergone a longer period of testing at that time. The DXSM output function adopts a “xorshift-multiply” construction used in strong integer hashes that has much better avalanche properties than the XSL-RR output function. While there are “pathological” pairs of increments that induce “bad” additive constants that relate the two streams, the vast majority of pairs induce “good” additive constants that make the merely-distinct streams of LCG states into practically-independent output streams. Indeed, now the claim we once made about `PCG64` is actually true of `PCG64DXSM`: collisions are possible, but both streams have to simultaneously be both “close” in the 128 bit state space and “close” in the 127-bit increment space, so that would be less likely than the negligible chance of colliding in the 128-bit internal `SeedSequence` pool. The DXSM output function is more computationally intensive than XSL-RR, but some optimizations in the LCG more than make up for the performance hit on most machines, so `PCG64DXSM` is a good, safe upgrade. There are, of course, an infinite number of stronger output functions that one could consider, but most will have a greater computational cost, and the DXSM output function has now received many CPU cycles of testing via `PractRand` at this time.
# Array creation routines
See also
Array creation
## From shape or value
`empty`(shape[, dtype, order, device, like])
Return a new array of given shape and type, without initializing entries.  
`empty_like`(prototype[, dtype, order, subok, ...])
Return a new array with the same shape and type as a given array.  
`eye`(N[, M, k, dtype, order, device, like])
Return a 2-D array with ones on the diagonal and zeros elsewhere.  
`identity`(n[, dtype, like])
Return the identity array.  
`ones`(shape[, dtype, order, device, like])
Return a new array of given shape and type, filled with ones.  
`ones_like`(a[, dtype, order, subok, shape, ...])
Return an array of ones with the same shape and type as a given array.  
`zeros`(shape[, dtype, order, like])
Return a new array of given shape and type, filled with zeros.  
`zeros_like`(a[, dtype, order, subok, shape, ...])
Return an array of zeros with the same shape and type as a given array.  
`full`(shape, fill_value[, dtype, order, ...])
Return a new array of given shape and type, filled with `fill_value`.  
`full_like`(a, fill_value[, dtype, order, ...])
Return a full array with the same shape and type as a given array.  
## From existing data
`array`(object[, dtype, copy, order, subok, ...])
Create an array.  
`asarray`(a[, dtype, order, device, copy, like])
Convert the input to an array.  
`asanyarray`(a[, dtype, order, device, copy, like])
Convert the input to an ndarray, but pass ndarray subclasses through.  
`ascontiguousarray`(a[, dtype, like])
Return a contiguous array (ndim >= 1) in memory (C order).  
`asmatrix`(data[, dtype])
Interpret the input as a matrix.  
`astype`(x, dtype, /, *[, copy, device])
Copies an array to a specified data type.  
`copy`(a[, order, subok])
Return an array copy of the given object.  
`frombuffer`(buffer[, dtype, count, offset, like])
Interpret a buffer as a 1-dimensional array.  
`from_dlpack`(x, /, *[, device, copy])
Create a NumPy array from an object implementing the `__dlpack__` protocol.  
`fromfile`(file[, dtype, count, sep, offset, like])
Construct an array from data in a text or binary file.  
`fromfunction`(function, shape, *[, dtype, like])
Construct an array by executing a function over each coordinate.  
`fromiter`(iter, dtype[, count, like])
Create a new 1-dimensional array from an iterable object.  
`fromstring`(string[, dtype, count, like])
A new 1-D array initialized from text data in a string.  
`loadtxt`(fname[, dtype, comments, delimiter, ...])
Load data from a text file.  
## Creating record arrays
Note
Please refer to Record arrays for record arrays.
`rec.array`(obj[, dtype, shape, offset, ...])
Construct a record array from a wide-variety of objects.  
`rec.fromarrays`(arrayList[, dtype, shape, ...])
Create a record array from a (flat) list of arrays  
`rec.fromrecords`(recList[, dtype, shape, ...])
Create a recarray from a list of records in text form.  
`rec.fromstring`(datastring[, dtype, shape, ...])
Create a record array from binary data  
`rec.fromfile`(fd[, dtype, shape, offset, ...])
Create an array from binary file data  
## Creating character arrays (numpy.char)
Note
`numpy.char` is used to create character arrays.
`char.array`(obj[, itemsize, copy, unicode, order])
Create a `chararray`.  
`char.asarray`(obj[, itemsize, unicode, order])
Convert the input to a `chararray`, copying the data only if necessary.  
## Numerical ranges
`arange`([start,] stop[, step,][, dtype, ...])
Return evenly spaced values within a given interval.  
`linspace`(start, stop[, num, endpoint, ...])
Return evenly spaced numbers over a specified interval.  
`logspace`(start, stop[, num, endpoint, base, ...])
Return numbers spaced evenly on a log scale.  
`geomspace`(start, stop[, num, endpoint, ...])
Return numbers spaced evenly on a log scale (a geometric progression).  
`meshgrid`(*xi[, copy, sparse, indexing])
Return a tuple of coordinate matrices from coordinate vectors.  
`mgrid`
An instance which returns a dense multi-dimensional "meshgrid".  
`ogrid`
An instance which returns an open multi-dimensional "meshgrid".  
## Building matrices
`diag`(v[, k])
Extract a diagonal or construct a diagonal array.  
`diagflat`(v[, k])
Create a two-dimensional array with the flattened input as a diagonal.  
`tri`(N[, M, k, dtype, like])
An array with ones at and below the given diagonal and zeros elsewhere.  
`tril`(m[, k])
Lower triangle of an array.  
`triu`(m[, k])
Upper triangle of an array.  
`vander`(x[, N, increasing])
Generate a Vandermonde matrix.  
## The matrix class
`bmat`(obj[, ldict, gdict])
Build a matrix object from a string, nested sequence, or array.  
# Array manipulation routines
## Basic operations
`copyto`(dst, src[, casting, where])
Copies values from one array to another, broadcasting as necessary.  
`ndim`(a)
Return the number of dimensions of an array.  
`shape`(a)
Return the shape of an array.  
`size`(a[, axis])
Return the number of elements along a given axis.  
## Changing array shape
`reshape`(a, /[, shape, order, newshape, copy])
Gives a new shape to an array without changing its data.  
`ravel`(a[, order])
Return a contiguous flattened array.  
`ndarray.flat`
A 1-D iterator over the array.  
`ndarray.flatten`([order])
Return a copy of the array collapsed into one dimension.  
## Transpose-like operations
`moveaxis`(a, source, destination)
Move axes of an array to new positions.  
`rollaxis`(a, axis[, start])
Roll the specified axis backwards, until it lies in a given position.  
`swapaxes`(a, axis1, axis2)
Interchange two axes of an array.  
`ndarray.T`
View of the transposed array.  
`transpose`(a[, axes])
Returns an array with axes transposed.  
`permute_dims`(a[, axes])
Returns an array with axes transposed.  
`matrix_transpose`(x, /)
Transposes a matrix (or a stack of matrices) `x`.  
## Changing number of dimensions
`atleast_1d`(*arys)
Convert inputs to arrays with at least one dimension.  
`atleast_2d`(*arys)
View inputs as arrays with at least two dimensions.  
`atleast_3d`(*arys)
View inputs as arrays with at least three dimensions.  
`broadcast`
Produce an object that mimics broadcasting.  
`broadcast_to`(array, shape[, subok])
Broadcast an array to a new shape.  
`broadcast_arrays`(*args[, subok])
Broadcast any number of arrays against each other.  
`expand_dims`(a, axis)
Expand the shape of an array.  
`squeeze`(a[, axis])
Remove axes of length one from `a`.  
## Changing kind of array
`asarray`(a[, dtype, order, device, copy, like])
Convert the input to an array.  
`asanyarray`(a[, dtype, order, device, copy, like])
Convert the input to an ndarray, but pass ndarray subclasses through.  
`asmatrix`(data[, dtype])
Interpret the input as a matrix.  
`asfortranarray`(a[, dtype, like])
Return an array (ndim >= 1) laid out in Fortran order in memory.  
`ascontiguousarray`(a[, dtype, like])
Return a contiguous array (ndim >= 1) in memory (C order).  
`asarray_chkfinite`(a[, dtype, order])
Convert the input to an array, checking for NaNs or Infs.  
`require`(a[, dtype, requirements, like])
Return an ndarray of the provided type that satisfies requirements.  
## Joining arrays
`concatenate`([axis, out, dtype, casting])
Join a sequence of arrays along an existing axis.  
`concat`([axis, out, dtype, casting])
Join a sequence of arrays along an existing axis.  
`stack`(arrays[, axis, out, dtype, casting])
Join a sequence of arrays along a new axis.  
`block`(arrays)
Assemble an nd-array from nested lists of blocks.  
`vstack`(tup, *[, dtype, casting])
Stack arrays in sequence vertically (row wise).  
`hstack`(tup, *[, dtype, casting])
Stack arrays in sequence horizontally (column wise).  
`dstack`(tup)
Stack arrays in sequence depth wise (along third axis).  
`column_stack`(tup)
Stack 1-D arrays as columns into a 2-D array.  
## Splitting arrays
`split`(ary, indices_or_sections[, axis])
Split an array into multiple sub-arrays as views into `ary`.  
`array_split`(ary, indices_or_sections[, axis])
Split an array into multiple sub-arrays.  
`dsplit`(ary, indices_or_sections)
Split array into multiple sub-arrays along the 3rd axis (depth).  
`hsplit`(ary, indices_or_sections)
Split an array into multiple sub-arrays horizontally (column-wise).  
`vsplit`(ary, indices_or_sections)
Split an array into multiple sub-arrays vertically (row-wise).  
`unstack`(x, /, *[, axis])
Split an array into a sequence of arrays along the given axis.  
## Tiling arrays
`tile`(A, reps)
Construct an array by repeating A the number of times given by reps.  
`repeat`(a, repeats[, axis])
Repeat each element of an array after themselves  
## Adding and removing elements
`delete`(arr, obj[, axis])
Return a new array with sub-arrays along an axis deleted.  
`insert`(arr, obj, values[, axis])
Insert values along the given axis before the given indices.  
`append`(arr, values[, axis])
Append values to the end of an array.  
`resize`(a, new_shape)
Return a new array with the specified shape.  
`trim_zeros`(filt[, trim, axis])
Remove values along a dimension which are zero along all other.  
`unique`(ar[, return_index, return_inverse, ...])
Find the unique elements of an array.  
`pad`(array, pad_width[, mode])
Pad an array.  
## Rearranging elements
`flip`(m[, axis])
Reverse the order of elements in an array along the given axis.  
`fliplr`(m)
Reverse the order of elements along axis 1 (left/right).  
`flipud`(m)
Reverse the order of elements along axis 0 (up/down).  
`roll`(a, shift[, axis])
Roll array elements along a given axis.  
`rot90`(m[, k, axes])
Rotate an array by 90 degrees in the plane specified by axes.  
# Bit-wise operations
## Elementwise bit operations
`bitwise_and`(x1, x2, /[, out, where, ...])
Compute the bit-wise AND of two arrays element-wise.  
`bitwise_or`(x1, x2, /[, out, where, casting, ...])
Compute the bit-wise OR of two arrays element-wise.  
`bitwise_xor`(x1, x2, /[, out, where, ...])
Compute the bit-wise XOR of two arrays element-wise.  
`invert`(x, /[, out, where, casting, order, ...])
Compute bit-wise inversion, or bit-wise NOT, element-wise.  
`bitwise_invert`(x, /[, out, where, casting, ...])
Compute bit-wise inversion, or bit-wise NOT, element-wise.  
`left_shift`(x1, x2, /[, out, where, casting, ...])
Shift the bits of an integer to the left.  
`bitwise_left_shift`(x1, x2, /[, out, where, ...])
Shift the bits of an integer to the left.  
`right_shift`(x1, x2, /[, out, where, ...])
Shift the bits of an integer to the right.  
`bitwise_right_shift`(x1, x2, /[, out, where, ...])
Shift the bits of an integer to the right.  
## Bit packing
`packbits`(a, /[, axis, bitorder])
Packs the elements of a binary-valued array into bits in a uint8 array.  
`unpackbits`(a, /[, axis, count, bitorder])
Unpacks elements of a uint8 array into a binary-valued output array.  
## Output formatting
`binary_repr`(num[, width])
Return the binary representation of the input number as a string.  
# Legacy fixed-width string functionality
Legacy
This submodule is considered legacy and will no longer receive updates. This could also mean it will be removed in future NumPy versions. The string operations in this module, as well as the `numpy.char.chararray` class, are planned to be deprecated in the future. Use `numpy.strings` instead.
The `numpy.char` module provides a set of vectorized string operations for arrays of type `numpy.str_` or `numpy.bytes_`. For example
    
    >>> import numpy as np
    >>> np.char.capitalize(["python", "numpy"])
    array(['Python', 'Numpy'], dtype='<U6')
    >>> np.char.add(["num", "doc"], ["py", "umentation"])
    array(['numpy', 'documentation'], dtype='<U13')
    
The methods in this module are based on the methods in `string`
## String operations
`add`(x1, x2, /[, out, where, casting, order, ...])
Add arguments element-wise.  
`multiply`(a, i)
Return (a * i), that is string multiple concatenation, element-wise.  
`mod`(a, values)
Return (a % i), that is pre-Python 2.6 string formatting (interpolation), element-wise for a pair of array_likes of str or unicode.  
`capitalize`(a)
Return a copy of `a` with only the first character of each element capitalized.  
`center`(a, width[, fillchar])
Return a copy of `a` with its elements centered in a string of length `width`.  
`decode`(a[, encoding, errors])
Calls `bytes.decode` element-wise.  
`encode`(a[, encoding, errors])
Calls `str.encode` element-wise.  
`expandtabs`(a[, tabsize])
Return a copy of each string element where all tab characters are replaced by one or more spaces.  
`join`(sep, seq)
Return a string which is the concatenation of the strings in the sequence `seq`.  
`ljust`(a, width[, fillchar])
Return an array with the elements of `a` left-justified in a string of length `width`.  
`lower`(a)
Return an array with the elements converted to lowercase.  
`lstrip`(a[, chars])
For each element in `a`, return a copy with the leading characters removed.  
`partition`(a, sep)
Partition each element in `a` around `sep`.  
`replace`(a, old, new[, count])
For each element in `a`, return a copy of the string with occurrences of substring `old` replaced by `new`.  
`rjust`(a, width[, fillchar])
Return an array with the elements of `a` right-justified in a string of length `width`.  
`rpartition`(a, sep)
Partition (split) each element around the right-most separator.  
`rsplit`(a[, sep, maxsplit])
For each element in `a`, return a list of the words in the string, using `sep` as the delimiter string.  
`rstrip`(a[, chars])
For each element in `a`, return a copy with the trailing characters removed.  
`split`(a[, sep, maxsplit])
For each element in `a`, return a list of the words in the string, using `sep` as the delimiter string.  
`splitlines`(a[, keepends])
For each element in `a`, return a list of the lines in the element, breaking at line boundaries.  
`strip`(a[, chars])
For each element in `a`, return a copy with the leading and trailing characters removed.  
`swapcase`(a)
Return element-wise a copy of the string with uppercase characters converted to lowercase and vice versa.  
`title`(a)
Return element-wise title cased version of string or unicode.  
`translate`(a, table[, deletechars])
For each element in `a`, return a copy of the string where all characters occurring in the optional argument `deletechars` are removed, and the remaining characters have been mapped through the given translation table.  
`upper`(a)
Return an array with the elements converted to uppercase.  
`zfill`(a, width)
Return the numeric string left-filled with zeros.  
## Comparison
Unlike the standard numpy comparison operators, the ones in the `char` module strip trailing whitespace characters before performing the comparison.
`equal`(x1, x2)
Return (x1 == x2) element-wise.  
`not_equal`(x1, x2)
Return (x1 != x2) element-wise.  
`greater_equal`(x1, x2)
Return (x1 >= x2) element-wise.  
`less_equal`(x1, x2)
Return (x1 <= x2) element-wise.  
`greater`(x1, x2)
Return (x1 > x2) element-wise.  
`less`(x1, x2)
Return (x1 < x2) element-wise.  
`compare_chararrays`(a1, a2, cmp, rstrip)
Performs element-wise comparison of two string arrays using the comparison operator specified by `cmp`.  
## String information
`count`(a, sub[, start, end])
Returns an array with the number of non-overlapping occurrences of substring `sub` in the range [`start`, `end`).  
`endswith`(a, suffix[, start, end])
Returns a boolean array which is `True` where the string element in `a` ends with `suffix`, otherwise `False`.  
`find`(a, sub[, start, end])
For each element, return the lowest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).  
`index`(a, sub[, start, end])
Like `find`, but raises `ValueError` when the substring is not found.  
`isalpha`(x, /[, out, where, casting, order, ...])
Returns true for each element if all characters in the data interpreted as a string are alphabetic and there is at least one character, false otherwise.  
`isalnum`(x, /[, out, where, casting, order, ...])
Returns true for each element if all characters in the string are alphanumeric and there is at least one character, false otherwise.  
`isdecimal`(x, /[, out, where, casting, ...])
For each element, return True if there are only decimal characters in the element.  
`isdigit`(x, /[, out, where, casting, order, ...])
Returns true for each element if all characters in the string are digits and there is at least one character, false otherwise.  
`islower`(x, /[, out, where, casting, order, ...])
Returns true for each element if all cased characters in the string are lowercase and there is at least one cased character, false otherwise.  
`isnumeric`(x, /[, out, where, casting, ...])
For each element, return True if there are only numeric characters in the element.  
`isspace`(x, /[, out, where, casting, order, ...])
Returns true for each element if there are only whitespace characters in the string and there is at least one character, false otherwise.  
`istitle`(x, /[, out, where, casting, order, ...])
Returns true for each element if the element is a titlecased string and there is at least one character, false otherwise.  
`isupper`(x, /[, out, where, casting, order, ...])
Return true for each element if all cased characters in the string are uppercase and there is at least one character, false otherwise.  
`rfind`(a, sub[, start, end])
For each element, return the highest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).  
`rindex`(a, sub[, start, end])
Like `rfind`, but raises `ValueError` when the substring `sub` is not found.  
`startswith`(a, prefix[, start, end])
Returns a boolean array which is `True` where the string element in `a` starts with `prefix`, otherwise `False`.  
`str_len`(x, /[, out, where, casting, order, ...])
Returns the length of each element.  
## Convenience class
`array`(obj[, itemsize, copy, unicode, order])
Create a `chararray`.  
`asarray`(obj[, itemsize, unicode, order])
Convert the input to a `chararray`, copying the data only if necessary.  
`chararray`(shape[, itemsize, unicode, ...])
Provides a convenient view on arrays of string and unicode values.  
# ctypes foreign function interface (numpy.ctypeslib)
numpy.ctypeslib.as_array(obj, shape=None)[source]
    
Create a numpy array from a ctypes array or POINTER.
The numpy array shares the memory with the ctypes object.
The shape parameter must be given if converting from a ctypes POINTER. The shape parameter is ignored if converting from a ctypes array
#### Examples
Converting a ctypes integer array:
    
    >>> import ctypes
    >>> ctypes_array = (ctypes.c_int * 5)(0, 1, 2, 3, 4)
    >>> np_array = np.ctypeslib.as_array(ctypes_array)
    >>> np_array
    array([0, 1, 2, 3, 4], dtype=int32)
    
Converting a ctypes POINTER:
    
    >>> import ctypes
    >>> buffer = (ctypes.c_int * 5)(0, 1, 2, 3, 4)
    >>> pointer = ctypes.cast(buffer, ctypes.POINTER(ctypes.c_int))
    >>> np_array = np.ctypeslib.as_array(pointer, (5,))
    >>> np_array
    array([0, 1, 2, 3, 4], dtype=int32)
    
numpy.ctypeslib.as_ctypes(obj)[source]
    
Create and return a ctypes object from a numpy array. Actually anything that exposes the __array_interface__ is accepted.
#### Examples
Create ctypes object from inferred int `np.array`:
    
    >>> inferred_int_array = np.array([1, 2, 3])
    >>> c_int_array = np.ctypeslib.as_ctypes(inferred_int_array)
    >>> type(c_int_array)
    <class 'c_long_Array_3'>
    >>> c_int_array[:]
    [1, 2, 3]
    
Create ctypes object from explicit 8 bit unsigned int `np.array` :
    
    >>> exp_int_array = np.array([1, 2, 3], dtype=np.uint8)
    >>> c_int_array = np.ctypeslib.as_ctypes(exp_int_array)
    >>> type(c_int_array)
    <class 'c_ubyte_Array_3'>
    >>> c_int_array[:]
    [1, 2, 3]
    
numpy.ctypeslib.as_ctypes_type(dtype)[source]
    
Convert a dtype into a ctypes type.
Parameters:
    
dtypedtype
    
The dtype to convert
Returns:
    
ctype
    
A ctype scalar, union, array, or struct
Raises:
    
NotImplementedError
    
If the conversion is not possible
#### Notes
This function does not losslessly round-trip in either direction.
`np.dtype(as_ctypes_type(dt))` will:
  * insert padding fields
  * reorder fields to be sorted by offset
  * discard field titles


`as_ctypes_type(np.dtype(ctype))` will:
  * discard the class names of `ctypes.Structure`s and `ctypes.Union`s
  * convert single-element `ctypes.Union`s into single-element `ctypes.Structure`s
  * insert padding fields


#### Examples
Converting a simple dtype:
    
    >>> dt = np.dtype('int8')
    >>> ctype = np.ctypeslib.as_ctypes_type(dt)
    >>> ctype
    <class 'ctypes.c_byte'>
    
Converting a structured dtype:
    
    >>> dt = np.dtype([('x', 'i4'), ('y', 'f4')])
    >>> ctype = np.ctypeslib.as_ctypes_type(dt)
    >>> ctype
    <class 'struct'>
    
numpy.ctypeslib.load_library(libname, loader_path)[source]
    
It is possible to load a library using
    
    >>> lib = ctypes.cdll[<full_path_name>] 
    
But there are cross-platform considerations, such as library file extensions, plus the fact Windows will just load the first library it finds with that name. NumPy supplies the load_library function as a convenience.
Changed in version 1.20.0: Allow libname and loader_path to take any path-like object.
Parameters:
    
libnamepath-like
    
Name of the library, which can have ‘lib’ as a prefix, but without an extension.
loader_pathpath-like
    
Where the library can be found.
Returns:
    
ctypes.cdll[libpath]library object
    
A ctypes library object
Raises:
    
OSError
    
If there is no library with the expected extension, or the library is defective and cannot be loaded.
numpy.ctypeslib.ndpointer(dtype=None, ndim=None, shape=None, flags=None)[source]
    
Array-checking restype/argtypes.
An ndpointer instance is used to describe an ndarray in restypes and argtypes specifications. This approach is more flexible than using, for example, `POINTER(c_double)`, since several restrictions can be specified, which are verified upon calling the ctypes function. These include data type, number of dimensions, shape and flags. If a given array does not satisfy the specified restrictions, a `TypeError` is raised.
Parameters:
    
dtypedata-type, optional
    
Array data-type.
ndimint, optional
    
Number of array dimensions.
shapetuple of ints, optional
    
Array shape.
flagsstr or tuple of str
    
Array flags; may be one or more of:
  * C_CONTIGUOUS / C / CONTIGUOUS
  * F_CONTIGUOUS / F / FORTRAN
  * OWNDATA / O
  * WRITEABLE / W
  * ALIGNED / A
  * WRITEBACKIFCOPY / X


Returns:
    
klassndpointer type object
    
A type object, which is an `_ndtpr` instance containing dtype, ndim, shape and flags information.
Raises:
    
TypeError
    
If a given array does not satisfy the specified restrictions.
#### Examples
    
    >>> clib.somefunc.argtypes = [np.ctypeslib.ndpointer(dtype=np.float64,
    ...                                                  ndim=1,
    ...                                                  flags='C_CONTIGUOUS')]
    ... 
    >>> clib.somefunc(np.array([1, 2, 3], dtype=np.float64))
    ... 
    
classnumpy.ctypeslib.c_intp
    
A `ctypes` signed integer type of the same size as `numpy.intp`.
Depending on the platform, it can be an alias for either `c_int`, `c_long` or `c_longlong`.
# Datetime support functions
`datetime_as_string`(arr[, unit, timezone, ...])
Convert an array of datetimes into an array of strings.  
`datetime_data`(dtype, /)
Get information about the step size of a date or time type.  
## Business day functions
`busdaycalendar`([weekmask, holidays])
A business day calendar object that efficiently stores information defining valid days for the busday family of functions.  
`is_busday`(dates[, weekmask, holidays, ...])
Calculates which of the given dates are valid days, and which are not.  
`busday_offset`(dates, offsets[, roll, ...])
First adjusts the date to fall on a valid day according to the `roll` rule, then applies offsets to the given dates counted in valid days.  
`busday_count`(begindates, enddates[, ...])
Counts the number of valid days between `begindates` and `enddates`, not including the day of `enddates`.  
# Data type routines
`can_cast`(from_, to[, casting])
Returns True if cast between data types can occur according to the casting rule.  
`promote_types`(type1, type2)
Returns the data type with the smallest size and smallest scalar kind to which both `type1` and `type2` may be safely cast.  
`min_scalar_type`(a, /)
For scalar `a`, returns the data type with the smallest size and smallest scalar kind which can hold its value.  
`result_type`(*arrays_and_dtypes)
Returns the type that results from applying the NumPy type promotion rules to the arguments.  
`common_type`(*arrays)
Return a scalar type which is common to the input arrays.  
## Creating data types
`dtype`(dtype[, align, copy])
Create a data type object.  
`rec.format_parser`(formats, names, titles[, ...])
Class to convert formats, names, titles description to a dtype.  
## Data type information
`finfo`(dtype)
Machine limits for floating point types.  
`iinfo`(type)
Machine limits for integer types.  
## Data type testing
`isdtype`(dtype, kind)
Determine if a provided dtype is of a specified data type `kind`.  
`issubdtype`(arg1, arg2)
Returns True if first argument is a typecode lower/equal in type hierarchy.  
## Miscellaneous
`typename`(char)
Return a description for the given data type code.  
`mintypecode`(typechars[, typeset, default])
Return the character for the minimum-size type to which given types can be safely cast.  
# Data type classes (numpy.dtypes)
This module is home to specific dtypes related functionality and their classes. For more general information about dtypes, also see `numpy.dtype` and Data type objects (dtype).
Similar to the builtin `types` module, this submodule defines types (classes) that are not widely used directly.
New in version NumPy: 1.25
The dtypes module is new in NumPy 1.25. Previously DType classes were only accessible indirectly.
## DType classes
The following are the classes of the corresponding NumPy dtype instances and NumPy scalar types. The classes can be used in `isinstance` checks and can also be instantiated or used directly. Direct use of these classes is not typical, since their scalar counterparts (e.g. `np.float64`) or strings like `"float64"` can be used.
## Boolean
numpy.dtypes.BoolDType[source]
## Bit-sized integers
numpy.dtypes.Int8DType[source]
numpy.dtypes.UInt8DType
numpy.dtypes.Int16DType
numpy.dtypes.UInt16DType
numpy.dtypes.Int32DType
numpy.dtypes.UInt32DType
numpy.dtypes.Int64DType
numpy.dtypes.UInt64DType
## C-named integers (may be aliases)
numpy.dtypes.ByteDType[source]
numpy.dtypes.UByteDType
numpy.dtypes.ShortDType
numpy.dtypes.UShortDType
numpy.dtypes.IntDType
numpy.dtypes.UIntDType
numpy.dtypes.LongDType
numpy.dtypes.ULongDType
numpy.dtypes.LongLongDType
numpy.dtypes.ULongLongDType
## Floating point
numpy.dtypes.Float16DType[source]
numpy.dtypes.Float32DType
numpy.dtypes.Float64DType
numpy.dtypes.LongDoubleDType
## Complex
numpy.dtypes.Complex64DType[source]
numpy.dtypes.Complex128DType
numpy.dtypes.CLongDoubleDType
## Strings and Bytestrings
numpy.dtypes.StrDType[source]
numpy.dtypes.BytesDType
numpy.dtypes.StringDType
## Times
numpy.dtypes.DateTime64DType[source]
numpy.dtypes.TimeDelta64DType
## Others
numpy.dtypes.ObjectDType[source]
numpy.dtypes.VoidDType
# Mathematical functions with automatic domain
Note
`numpy.emath` is a preferred alias for `numpy.lib.scimath`, available after `numpy` is imported.
Wrapper functions to more user-friendly calling of certain math functions whose output data-type is different than the input data-type in certain domains of the input.
For example, for functions like `log` with branch cuts, the versions in this module provide the mathematically valid answers in the complex plane:
    
    >>> import math
    >>> np.emath.log(-math.exp(1)) == (1+1j*math.pi)
    True
    
Similarly, `sqrt`, other base logarithms, `power` and trig functions are correctly handled. See their respective docstrings for specific examples.
## Functions
`arccos`(x)
Compute the inverse cosine of x.  
`arcsin`(x)
Compute the inverse sine of x.  
`arctanh`(x)
Compute the inverse hyperbolic tangent of `x`.  
`log`(x)
Compute the natural logarithm of `x`.  
`log2`(x)
Compute the logarithm base 2 of `x`.  
`logn`(n, x)
Take log base n of x.  
`log10`(x)
Compute the logarithm base 10 of `x`.  
`power`(x, p)
Return x to the power p, (x**p).  
`sqrt`(x)
Compute the square root of x.  
# Floating point error handling
## Setting and getting error handling
`seterr`([all, divide, over, under, invalid])
Set how floating-point errors are handled.  
`geterr`()
Get the current way of handling floating-point errors.  
`seterrcall`(func)
Set the floating-point error callback function or log object.  
`geterrcall`()
Return the current callback function used on floating-point errors.  
`errstate`(**kwargs)
Context manager for floating-point error handling.  
# Exceptions and Warnings (numpy.exceptions)
General exceptions used by NumPy. Note that some exceptions may be module specific, such as linear algebra errors.
New in version NumPy: 1.25
The exceptions module is new in NumPy 1.25. Older exceptions remain available through the main NumPy namespace for compatibility.
## Warnings
`ComplexWarning`
The warning raised when casting a complex dtype to a real dtype.  
`VisibleDeprecationWarning`
Visible deprecation warning.  
`RankWarning`
Matrix rank warning.  
## Exceptions
`AxisError`(axis[, ndim, msg_prefix])
Axis supplied was invalid.  
`DTypePromotionError`
Multiple DTypes could not be converted to a common one.  
`TooHardError`
max_work was exceeded.  
# Discrete Fourier Transform (numpy.fft)
The SciPy module `scipy.fft` is a more comprehensive superset of `numpy.fft`, which includes only a basic set of routines.
## Standard FFTs
`fft`(a[, n, axis, norm, out])
Compute the one-dimensional discrete Fourier Transform.  
`ifft`(a[, n, axis, norm, out])
Compute the one-dimensional inverse discrete Fourier Transform.  
`fft2`(a[, s, axes, norm, out])
Compute the 2-dimensional discrete Fourier Transform.  
`ifft2`(a[, s, axes, norm, out])
Compute the 2-dimensional inverse discrete Fourier Transform.  
`fftn`(a[, s, axes, norm, out])
Compute the N-dimensional discrete Fourier Transform.  
`ifftn`(a[, s, axes, norm, out])
Compute the N-dimensional inverse discrete Fourier Transform.  
## Real FFTs
`rfft`(a[, n, axis, norm, out])
Compute the one-dimensional discrete Fourier Transform for real input.  
`irfft`(a[, n, axis, norm, out])
Computes the inverse of `rfft`.  
`rfft2`(a[, s, axes, norm, out])
Compute the 2-dimensional FFT of a real array.  
`irfft2`(a[, s, axes, norm, out])
Computes the inverse of `rfft2`.  
`rfftn`(a[, s, axes, norm, out])
Compute the N-dimensional discrete Fourier Transform for real input.  
`irfftn`(a[, s, axes, norm, out])
Computes the inverse of `rfftn`.  
## Hermitian FFTs
`hfft`(a[, n, axis, norm, out])
Compute the FFT of a signal that has Hermitian symmetry, i.e., a real spectrum.  
`ihfft`(a[, n, axis, norm, out])
Compute the inverse FFT of a signal that has Hermitian symmetry.  
## Helper routines
`fftfreq`(n[, d, device])
Return the Discrete Fourier Transform sample frequencies.  
`rfftfreq`(n[, d, device])
Return the Discrete Fourier Transform sample frequencies (for usage with rfft, irfft).  
`fftshift`(x[, axes])
Shift the zero-frequency component to the center of the spectrum.  
`ifftshift`(x[, axes])
The inverse of `fftshift`.  
## Background information
Fourier analysis is fundamentally a method for expressing a function as a sum of periodic components, and for recovering the function from those components. When both the function and its Fourier transform are replaced with discretized counterparts, it is called the discrete Fourier transform (DFT). The DFT has become a mainstay of numerical computing in part because of a very fast algorithm for computing it, called the Fast Fourier Transform (FFT), which was known to Gauss (1805) and was brought to light in its current form by Cooley and Tukey [CT]. Press et al. [NR] provide an accessible introduction to Fourier analysis and its applications.
Because the discrete Fourier transform separates its input into components that contribute at discrete frequencies, it has a great number of applications in digital signal processing, e.g., for filtering, and in this context the discretized input to the transform is customarily referred to as a signal, which exists in the time domain. The output is called a spectrum or transform and exists in the frequency domain.
## Implementation details
There are many ways to define the DFT, varying in the sign of the exponent, normalization, etc. In this implementation, the DFT is defined as
\\[A_k = \sum_{m=0}^{n-1} a_m \exp\left\\{-2\pi i{mk \over n}\right\\} \qquad k = 0,\ldots,n-1.\\]
The DFT is in general defined for complex inputs and outputs, and a single-frequency component at linear frequency \\(f\\) is represented by a complex exponential \\(a_m = \exp\\{2\pi i\,f m\Delta t\\}\\), where \\(\Delta t\\) is the sampling interval.
The values in the result follow so-called “standard” order: If `A = fft(a, n)`, then `A[0]` contains the zero-frequency term (the sum of the signal), which is always purely real for real inputs. Then `A[1:n/2]` contains the positive-frequency terms, and `A[n/2+1:]` contains the negative-frequency terms, in order of decreasingly negative frequency. For an even number of input points, `A[n/2]` represents both positive and negative Nyquist frequency, and is also purely real for real input. For an odd number of input points, `A[(n-1)/2]` contains the largest positive frequency, while `A[(n+1)/2]` contains the largest negative frequency. The routine `np.fft.fftfreq(n)` returns an array giving the frequencies of corresponding elements in the output. The routine `np.fft.fftshift(A)` shifts transforms and their frequencies to put the zero-frequency components in the middle, and `np.fft.ifftshift(A)` undoes that shift.
When the input `a` is a time-domain signal and `A = fft(a)`, `np.abs(A)` is its amplitude spectrum and `np.abs(A)**2` is its power spectrum. The phase spectrum is obtained by `np.angle(A)`.
The inverse DFT is defined as
\\[a_m = \frac{1}{n}\sum_{k=0}^{n-1}A_k\exp\left\\{2\pi i{mk\over n}\right\\} \qquad m = 0,\ldots,n-1.\\]
It differs from the forward transform by the sign of the exponential argument and the default normalization by \\(1/n\\).
## Type Promotion
`numpy.fft` promotes `float32` and `complex64` arrays to `float64` and `complex128` arrays respectively. For an FFT implementation that does not promote input arrays, see `scipy.fftpack`.
## Normalization
The argument `norm` indicates which direction of the pair of direct/inverse transforms is scaled and with what normalization factor. The default normalization (`"backward"`) has the direct (forward) transforms unscaled and the inverse (backward) transforms scaled by \\(1/n\\). It is possible to obtain unitary transforms by setting the keyword argument `norm` to `"ortho"` so that both direct and inverse transforms are scaled by \\(1/\sqrt{n}\\). Finally, setting the keyword argument `norm` to `"forward"` has the direct transforms scaled by \\(1/n\\) and the inverse transforms unscaled (i.e. exactly opposite to the default `"backward"`). `None` is an alias of the default option `"backward"` for backward compatibility.
## Real and Hermitian transforms
When the input is purely real, its transform is Hermitian, i.e., the component at frequency \\(f_k\\) is the complex conjugate of the component at frequency \\(-f_k\\), which means that for real inputs there is no information in the negative frequency components that is not already available from the positive frequency components. The family of `rfft` functions is designed to operate on real inputs, and exploits this symmetry by computing only the positive frequency components, up to and including the Nyquist frequency. Thus, `n` input points produce `n/2+1` complex output points. The inverses of this family assumes the same symmetry of its input, and for an output of `n` points uses `n/2+1` input points.
Correspondingly, when the spectrum is purely real, the signal is Hermitian. The `hfft` family of functions exploits this symmetry by using `n/2+1` complex points in the input (time) domain for `n` real points in the frequency domain.
In higher dimensions, FFTs are used, e.g., for image analysis and filtering. The computational efficiency of the FFT means that it can also be a faster way to compute large convolutions, using the property that a convolution in the time domain is equivalent to a point-by-point multiplication in the frequency domain.
## Higher dimensions
In two dimensions, the DFT is defined as
\\[A_{kl} = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} a_{mn}\exp\left\\{-2\pi i \left({mk\over M}+{nl\over N}\right)\right\\} \qquad k = 0, \ldots, M-1;\quad l = 0, \ldots, N-1,\\]
which extends in the obvious way to higher dimensions, and the inverses in higher dimensions also extend in the same way.
## References
[CT]
Cooley, James W., and John W. Tukey, 1965, “An algorithm for the machine calculation of complex Fourier series,” Math. Comput. 19: 297-301.
[NR]
Press, W., Teukolsky, S., Vetterline, W.T., and Flannery, B.P., 2007, Numerical Recipes: The Art of Scientific Computing, ch. 12-13. Cambridge Univ. Press, Cambridge, UK.
## Examples
For examples, see the various functions.
# Functional programming
`apply_along_axis`(func1d, axis, arr, *args, ...)
Apply a function to 1-D slices along the given axis.  
`apply_over_axes`(func, a, axes)
Apply a function repeatedly over multiple axes.  
`vectorize`([pyfunc, otypes, doc, excluded, ...])
Returns an object that acts like pyfunc, but takes arrays as input.  
`frompyfunc`(func, /, nin, nout, *[, identity])
Takes an arbitrary Python function and returns a NumPy ufunc.  
`piecewise`(x, condlist, funclist, *args, **kw)
Evaluate a piecewise-defined function.  
# Routines and objects by topic
In this chapter routine docstrings are presented, grouped by functionality. Many docstrings contain example code, which demonstrates basic usage of the routine. The examples assume that NumPy is imported with:
    
    >>> import numpy as np
    
A convenient way to execute examples is the `%doctest_mode` mode of IPython, which allows for pasting of multi-line examples and preserves indentation.
  * Constants
  * Array creation routines
  * Array manipulation routines
  * Bit-wise operations
  * String functionality
  * Datetime support functions
  * Data type routines
  * Mathematical functions with automatic domain
  * Floating point error handling
  * Exceptions and Warnings (`numpy.exceptions`)
  * Discrete Fourier Transform (`numpy.fft`)
  * Functional programming
  * Input and output
  * Indexing routines
  * Linear algebra (`numpy.linalg`)
  * Logic functions
  * Masked array operations
  * Mathematical functions
  * Miscellaneous routines
  * Polynomials
  * Random sampling (`numpy.random`)
  * Set routines
  * Sorting, searching, and counting
  * Statistics
  * Test support (`numpy.testing`)
  * Window functions


# Indexing routines
See also
Indexing on ndarrays
## Generating index arrays
`c_`
Translates slice objects to concatenation along the second axis.  
`r_`
Translates slice objects to concatenation along the first axis.  
`s_`
A nicer way to build up index tuples for arrays.  
`nonzero`(a)
Return the indices of the elements that are non-zero.  
`where`(condition, [x, y], /)
Return elements chosen from `x` or `y` depending on `condition`.  
`indices`(dimensions[, dtype, sparse])
Return an array representing the indices of a grid.  
`ix_`(*args)
Construct an open mesh from multiple sequences.  
`ogrid`
An instance which returns an open multi-dimensional "meshgrid".  
`ravel_multi_index`(multi_index, dims[, mode, ...])
Converts a tuple of index arrays into an array of flat indices, applying boundary modes to the multi-index.  
`unravel_index`(indices, shape[, order])
Converts a flat index or array of flat indices into a tuple of coordinate arrays.  
`diag_indices`(n[, ndim])
Return the indices to access the main diagonal of an array.  
`diag_indices_from`(arr)
Return the indices to access the main diagonal of an n-dimensional array.  
`mask_indices`(n, mask_func[, k])
Return the indices to access (n, n) arrays, given a masking function.  
`tril_indices`(n[, k, m])
Return the indices for the lower-triangle of an (n, m) array.  
`tril_indices_from`(arr[, k])
Return the indices for the lower-triangle of arr.  
`triu_indices`(n[, k, m])
Return the indices for the upper-triangle of an (n, m) array.  
`triu_indices_from`(arr[, k])
Return the indices for the upper-triangle of arr.  
## Indexing-like operations
`take`(a, indices[, axis, out, mode])
Take elements from an array along an axis.  
`take_along_axis`(arr, indices, axis)
Take values from the input array by matching 1d index and data slices.  
`choose`(a, choices[, out, mode])
Construct an array from an index array and a list of arrays to choose from.  
`compress`(condition, a[, axis, out])
Return selected slices of an array along given axis.  
`diag`(v[, k])
Extract a diagonal or construct a diagonal array.  
`diagonal`(a[, offset, axis1, axis2])
Return specified diagonals.  
`select`(condlist, choicelist[, default])
Return an array drawn from elements in choicelist, depending on conditions.  
## Inserting data into arrays
`place`(arr, mask, vals)
Change elements of an array based on conditional and input values.  
`put`(a, ind, v[, mode])
Replaces specified elements of an array with given values.  
`put_along_axis`(arr, indices, values, axis)
Put values into the destination array by matching 1d index and data slices.  
`putmask`(a, mask, values)
Changes elements of an array based on conditional and input values.  
`fill_diagonal`(a, val[, wrap])
Fill the main diagonal of the given array of any dimensionality.  
## Iterating over arrays
`nditer`(op[, flags, op_flags, op_dtypes, ...])
Efficient multi-dimensional iterator object to iterate over arrays.  
`ndenumerate`(arr)
Multidimensional index iterator.  
`ndindex`(*shape)
An N-dimensional iterator object to index arrays.  
`nested_iters`(op, axes[, flags, op_flags, ...])
Create nditers for use in nested loops  
`flatiter`()
Flat iterator object to iterate over arrays.  
`iterable`(y)
Check whether or not an object can be iterated over.  
# Input and output
## NumPy binary files (npy, npz)
`load`(file[, mmap_mode, allow_pickle, ...])
Load arrays or pickled objects from `.npy`, `.npz` or pickled files.  
`save`(file, arr[, allow_pickle, fix_imports])
Save an array to a binary file in NumPy `.npy` format.  
`savez`(file, *args[, allow_pickle])
Save several arrays into a single file in uncompressed `.npz` format.  
`savez_compressed`(file, *args[, allow_pickle])
Save several arrays into a single file in compressed `.npz` format.  
`lib.npyio.NpzFile`(fid)
A dictionary-like object with lazy-loading of files in the zipped archive provided on construction.  
The format of these binary file types is documented in `numpy.lib.format`
## Text files
`loadtxt`(fname[, dtype, comments, delimiter, ...])
Load data from a text file.  
`savetxt`(fname, X[, fmt, delimiter, newline, ...])
Save an array to a text file.  
`genfromtxt`(fname[, dtype, comments, ...])
Load data from a text file, with missing values handled as specified.  
`fromregex`(file, regexp, dtype[, encoding])
Construct an array from a text file, using regular expression parsing.  
`fromstring`(string[, dtype, count, like])
A new 1-D array initialized from text data in a string.  
`ndarray.tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
`ndarray.tolist`()
Return the array as an `a.ndim`-levels deep nested list of Python scalars.  
## Raw binary files
`fromfile`(file[, dtype, count, sep, offset, like])
Construct an array from data in a text or binary file.  
`ndarray.tofile`(fid[, sep, format])
Write array to a file as text or binary (default).  
## String formatting
`array2string`(a[, max_line_width, precision, ...])
Return a string representation of an array.  
`array_repr`(arr[, max_line_width, precision, ...])
Return the string representation of an array.  
`array_str`(a[, max_line_width, precision, ...])
Return a string representation of the data in an array.  
`format_float_positional`(x[, precision, ...])
Format a floating-point scalar as a decimal string in positional notation.  
`format_float_scientific`(x[, precision, ...])
Format a floating-point scalar as a decimal string in scientific notation.  
## Memory mapping files
`memmap`(filename[, dtype, mode, offset, ...])
Create a memory-map to an array stored in a binary file on disk.  
`lib.format.open_memmap`(filename[, mode, ...])
Open a .npy file as a memory-mapped array.  
## Text formatting options
`set_printoptions`([precision, threshold, ...])
Set printing options.  
`get_printoptions`()
Return the current print options.  
`printoptions`(*args, **kwargs)
Context manager for setting print options.  
## Base-n representations
`binary_repr`(num[, width])
Return the binary representation of the input number as a string.  
`base_repr`(number[, base, padding])
Return a string representation of a number in the given base system.  
## Data sources
`lib.npyio.DataSource`([destpath])
A generic data source file (file, http, ftp, ...).  
## Binary format description
`lib.format`
Binary serialization  
# Lib module (numpy.lib)
## Functions & other objects
`add_docstring`(obj, docstring)
Add a docstring to a built-in obj if possible.  
`add_newdoc`(place, obj, doc[, warn_on_python])
Add documentation to an existing object, typically one defined in C  
`Arrayterator`(var[, buf_size])
Buffered iterator for big arrays.  
`NumpyVersion`(vstring)
Parse and compare numpy version strings.  
## Submodules
`array_utils`
Miscellaneous utils.  
`format`
Binary serialization  
`introspect`
Introspection helper functions.  
`mixins`
Mixin classes for custom array types that don't inherit from ndarray.  
`npyio`
IO related functions.  
`scimath`
Wrapper functions to more user-friendly calling of certain math functions whose output data-type is different than the input data-type in certain domains of the input.  
`stride_tricks`
Utilities that manipulate strides to achieve desirable effects.  
# Linear algebra (numpy.linalg)
The NumPy linear algebra functions rely on BLAS and LAPACK to provide efficient low level implementations of standard linear algebra algorithms. Those libraries may be provided by NumPy itself using C versions of a subset of their reference implementations but, when possible, highly optimized libraries that take advantage of specialized processor functionality are preferred. Examples of such libraries are OpenBLAS, MKL (TM), and ATLAS. Because those libraries are multithreaded and processor dependent, environmental variables and external packages such as threadpoolctl may be needed to control the number of threads or specify the processor architecture.
The SciPy library also contains a `linalg` submodule, and there is overlap in the functionality provided by the SciPy and NumPy submodules. SciPy contains functions not found in `numpy.linalg`, such as functions related to LU decomposition and the Schur decomposition, multiple ways of calculating the pseudoinverse, and matrix transcendentals such as the matrix logarithm. Some functions that exist in both have augmented functionality in `scipy.linalg`. For example, `scipy.linalg.eig` can take a second matrix argument for solving generalized eigenvalue problems. Some functions in NumPy, however, have more flexible broadcasting options. For example, `numpy.linalg.solve` can handle “stacked” arrays, while `scipy.linalg.solve` accepts only a single square array as its first argument.
Note
The term matrix as it is used on this page indicates a 2d `numpy.array` object, and not a `numpy.matrix` object. The latter is no longer recommended, even for linear algebra. See the matrix object documentation for more information.
## The `@` operator
Introduced in NumPy 1.10.0, the `@` operator is preferable to other methods when computing the matrix product between 2d arrays. The `numpy.matmul` function implements the `@` operator.
## Matrix and vector products
`dot`(a, b[, out])
Dot product of two arrays.  
`linalg.multi_dot`(arrays, *[, out])
Compute the dot product of two or more arrays in a single function call, while automatically selecting the fastest evaluation order.  
`vdot`(a, b, /)
Return the dot product of two vectors.  
`vecdot`(x1, x2, /[, out, casting, order, ...])
Vector dot product of two arrays.  
`linalg.vecdot`(x1, x2, /, *[, axis])
Computes the vector dot product.  
`inner`(a, b, /)
Inner product of two arrays.  
`outer`(a, b[, out])
Compute the outer product of two vectors.  
`matmul`(x1, x2, /[, out, casting, order, ...])
Matrix product of two arrays.  
`linalg.matmul`(x1, x2, /)
Computes the matrix product.  
`matvec`(x1, x2, /[, out, casting, order, ...])
Matrix-vector dot product of two arrays.  
`vecmat`(x1, x2, /[, out, casting, order, ...])
Vector-matrix dot product of two arrays.  
`tensordot`(a, b[, axes])
Compute tensor dot product along specified axes.  
`linalg.tensordot`(x1, x2, /, *[, axes])
Compute tensor dot product along specified axes.  
`einsum`(subscripts, *operands[, out, dtype, ...])
Evaluates the Einstein summation convention on the operands.  
`einsum_path`(subscripts, *operands[, optimize])
Evaluates the lowest cost contraction order for an einsum expression by considering the creation of intermediate arrays.  
`linalg.matrix_power`(a, n)
Raise a square matrix to the (integer) power `n`.  
`kron`(a, b)
Kronecker product of two arrays.  
`linalg.cross`(x1, x2, /, *[, axis])
Returns the cross product of 3-element vectors.  
## Decompositions
`linalg.cholesky`(a, /, *[, upper])
Cholesky decomposition.  
`linalg.outer`(x1, x2, /)
Compute the outer product of two vectors.  
`linalg.qr`(a[, mode])
Compute the qr factorization of a matrix.  
`linalg.svd`(a[, full_matrices, compute_uv, ...])
Singular Value Decomposition.  
`linalg.svdvals`(x, /)
Returns the singular values of a matrix (or a stack of matrices) `x`.  
## Matrix eigenvalues
`linalg.eig`(a)
Compute the eigenvalues and right eigenvectors of a square array.  
`linalg.eigh`(a[, UPLO])
Return the eigenvalues and eigenvectors of a complex Hermitian (conjugate symmetric) or a real symmetric matrix.  
`linalg.eigvals`(a)
Compute the eigenvalues of a general matrix.  
`linalg.eigvalsh`(a[, UPLO])
Compute the eigenvalues of a complex Hermitian or real symmetric matrix.  
## Norms and other numbers
`linalg.norm`(x[, ord, axis, keepdims])
Matrix or vector norm.  
`linalg.matrix_norm`(x, /, *[, keepdims, ord])
Computes the matrix norm of a matrix (or a stack of matrices) `x`.  
`linalg.vector_norm`(x, /, *[, axis, ...])
Computes the vector norm of a vector (or batch of vectors) `x`.  
`linalg.cond`(x[, p])
Compute the condition number of a matrix.  
`linalg.det`(a)
Compute the determinant of an array.  
`linalg.matrix_rank`(A[, tol, hermitian, rtol])
Return matrix rank of array using SVD method  
`linalg.slogdet`(a)
Compute the sign and (natural) logarithm of the determinant of an array.  
`trace`(a[, offset, axis1, axis2, dtype, out])
Return the sum along diagonals of the array.  
`linalg.trace`(x, /, *[, offset, dtype])
Returns the sum along the specified diagonals of a matrix (or a stack of matrices) `x`.  
## Solving equations and inverting matrices
`linalg.solve`(a, b)
Solve a linear matrix equation, or system of linear scalar equations.  
`linalg.tensorsolve`(a, b[, axes])
Solve the tensor equation `a x = b` for x.  
`linalg.lstsq`(a, b[, rcond])
Return the least-squares solution to a linear matrix equation.  
`linalg.inv`(a)
Compute the inverse of a matrix.  
`linalg.pinv`(a[, rcond, hermitian, rtol])
Compute the (Moore-Penrose) pseudo-inverse of a matrix.  
`linalg.tensorinv`(a[, ind])
Compute the 'inverse' of an N-dimensional array.  
## Other matrix operations
`diagonal`(a[, offset, axis1, axis2])
Return specified diagonals.  
`linalg.diagonal`(x, /, *[, offset])
Returns specified diagonals of a matrix (or a stack of matrices) `x`.  
`linalg.matrix_transpose`(x, /)
Transposes a matrix (or a stack of matrices) `x`.  
## Exceptions
`linalg.LinAlgError`
Generic Python-exception-derived object raised by linalg functions.  
## Linear algebra on several matrices at once
Several of the linear algebra routines listed above are able to compute results for several matrices at once, if they are stacked into the same array.
This is indicated in the documentation via input parameter specifications such as `a : (..., M, M) array_like`. This means that if for instance given an input array `a.shape == (N, M, M)`, it is interpreted as a “stack” of N matrices, each of size M-by-M. Similar specification applies to return values, for instance the determinant has `det : (...)` and will in this case return an array of shape `det(a).shape == (N,)`. This generalizes to linear algebra operations on higher-dimensional arrays: the last 1 or 2 dimensions of a multidimensional array are interpreted as vectors or matrices, as appropriate for each operation.
# Logic functions
## Truth value testing
`all`(a[, axis, out, keepdims, where])
Test whether all array elements along a given axis evaluate to True.  
`any`(a[, axis, out, keepdims, where])
Test whether any array element along a given axis evaluates to True.  
## Array contents
`isfinite`(x, /[, out, where, casting, order, ...])
Test element-wise for finiteness (not infinity and not Not a Number).  
`isinf`(x, /[, out, where, casting, order, ...])
Test element-wise for positive or negative infinity.  
`isnan`(x, /[, out, where, casting, order, ...])
Test element-wise for NaN and return result as a boolean array.  
`isnat`(x, /[, out, where, casting, order, ...])
Test element-wise for NaT (not a time) and return result as a boolean array.  
`isneginf`(x[, out])
Test element-wise for negative infinity, return result as bool array.  
`isposinf`(x[, out])
Test element-wise for positive infinity, return result as bool array.  
## Array type testing
`iscomplex`(x)
Returns a bool array, where True if input element is complex.  
`iscomplexobj`(x)
Check for a complex type or an array of complex numbers.  
`isfortran`(a)
Check if the array is Fortran contiguous but not C contiguous.  
`isreal`(x)
Returns a bool array, where True if input element is real.  
`isrealobj`(x)
Return True if x is a not complex type or an array of complex numbers.  
`isscalar`(element)
Returns True if the type of `element` is a scalar type.  
## Logical operations
`logical_and`(x1, x2, /[, out, where, ...])
Compute the truth value of x1 AND x2 element-wise.  
`logical_or`(x1, x2, /[, out, where, casting, ...])
Compute the truth value of x1 OR x2 element-wise.  
`logical_not`(x, /[, out, where, casting, ...])
Compute the truth value of NOT x element-wise.  
`logical_xor`(x1, x2, /[, out, where, ...])
Compute the truth value of x1 XOR x2, element-wise.  
## Comparison
`allclose`(a, b[, rtol, atol, equal_nan])
Returns True if two arrays are element-wise equal within a tolerance.  
`isclose`(a, b[, rtol, atol, equal_nan])
Returns a boolean array where two arrays are element-wise equal within a tolerance.  
`array_equal`(a1, a2[, equal_nan])
True if two arrays have the same shape and elements, False otherwise.  
`array_equiv`(a1, a2)
Returns True if input arrays are shape consistent and all elements equal.  
`greater`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 > x2) element-wise.  
`greater_equal`(x1, x2, /[, out, where, ...])
Return the truth value of (x1 >= x2) element-wise.  
`less`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 < x2) element-wise.  
`less_equal`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 <= x2) element-wise.  
`equal`(x1, x2, /[, out, where, casting, ...])
Return (x1 == x2) element-wise.  
`not_equal`(x1, x2, /[, out, where, casting, ...])
Return (x1 != x2) element-wise.  
# Masked array operations
## Constants
`ma.MaskType`
alias of `bool`  
## Creation
### From existing data
`ma.masked_array`
alias of `MaskedArray`  
`ma.array`(data[, dtype, copy, order, mask, ...])
An array class with possibly masked values.  
`ma.copy`(self, *args, **params) a.copy(order=)
Return a copy of the array.  
`ma.frombuffer`(buffer[, dtype, count, ...])
Interpret a buffer as a 1-dimensional array.  
`ma.fromfunction`(function, shape, **dtype)
Construct an array by executing a function over each coordinate.  
`ma.MaskedArray.copy`([order])
Return a copy of the array.  
`ma.diagflat`
Create a two-dimensional array with the flattened input as a diagonal.  
### Ones and zeros
`ma.empty`(shape[, dtype, order, device, like])
Return a new array of given shape and type, without initializing entries.  
`ma.empty_like`(prototype[, dtype, order, ...])
Return a new array with the same shape and type as a given array.  
`ma.masked_all`(shape[, dtype])
Empty masked array with all elements masked.  
`ma.masked_all_like`(arr)
Empty masked array with the properties of an existing array.  
`ma.ones`(shape[, dtype, order])
Return a new array of given shape and type, filled with ones.  
`ma.ones_like`
Return an array of ones with the same shape and type as a given array.  
`ma.zeros`(shape[, dtype, order, like])
Return a new array of given shape and type, filled with zeros.  
`ma.zeros_like`
Return an array of zeros with the same shape and type as a given array.  
## Inspecting the array
`ma.all`(self[, axis, out, keepdims])
Returns True if all elements evaluate to True.  
`ma.any`(self[, axis, out, keepdims])
Returns True if any of the elements of `a` evaluate to True.  
`ma.count`(self[, axis, keepdims])
Count the non-masked elements of the array along the given axis.  
`ma.count_masked`(arr[, axis])
Count the number of masked elements along the given axis.  
`ma.getmask`(a)
Return the mask of a masked array, or nomask.  
`ma.getmaskarray`(arr)
Return the mask of a masked array, or full boolean array of False.  
`ma.getdata`(a[, subok])
Return the data of a masked array as an ndarray.  
`ma.nonzero`(self)
Return the indices of unmasked elements that are not zero.  
`ma.shape`(obj)
Return the shape of an array.  
`ma.size`(obj[, axis])
Return the number of elements along a given axis.  
`ma.is_masked`(x)
Determine whether input has masked values.  
`ma.is_mask`(m)
Return True if m is a valid, standard mask.  
`ma.isMaskedArray`(x)
Test whether input is an instance of MaskedArray.  
`ma.isMA`(x)
Test whether input is an instance of MaskedArray.  
`ma.isarray`(x)
Test whether input is an instance of MaskedArray.  
`ma.isin`(element, test_elements[, ...])
Calculates `element in test_elements`, broadcasting over `element` only.  
`ma.in1d`(ar1, ar2[, assume_unique, invert])
Test whether each element of an array is also present in a second array.  
`ma.unique`(ar1[, return_index, return_inverse])
Finds the unique elements of an array.  
`ma.MaskedArray.all`([axis, out, keepdims])
Returns True if all elements evaluate to True.  
`ma.MaskedArray.any`([axis, out, keepdims])
Returns True if any of the elements of `a` evaluate to True.  
`ma.MaskedArray.count`([axis, keepdims])
Count the non-masked elements of the array along the given axis.  
`ma.MaskedArray.nonzero`()
Return the indices of unmasked elements that are not zero.  
`ma.shape`(obj)
Return the shape of an array.  
`ma.size`(obj[, axis])
Return the number of elements along a given axis.  
`ma.MaskedArray.data`
Returns the underlying data, as a view of the masked array.  
`ma.MaskedArray.mask`
Current mask.  
`ma.MaskedArray.recordmask`
Get or set the mask of the array if it has no named fields.  
## Manipulating a MaskedArray
### Changing the shape
`ma.ravel`(self[, order])
Returns a 1D version of self, as a view.  
`ma.reshape`(a, new_shape[, order])
Returns an array containing the same data with a new shape.  
`ma.resize`(x, new_shape)
Return a new masked array with the specified size and shape.  
`ma.MaskedArray.flatten`([order])
Return a copy of the array collapsed into one dimension.  
`ma.MaskedArray.ravel`([order])
Returns a 1D version of self, as a view.  
`ma.MaskedArray.reshape`(*s, **kwargs)
Give a new shape to the array without changing its data.  
`ma.MaskedArray.resize`(newshape[, refcheck, ...])  
### Modifying axes
`ma.swapaxes`(self, *args, ...)
Return a view of the array with `axis1` and `axis2` interchanged.  
`ma.transpose`(a[, axes])
Permute the dimensions of an array.  
`ma.MaskedArray.swapaxes`(axis1, axis2)
Return a view of the array with `axis1` and `axis2` interchanged.  
`ma.MaskedArray.transpose`(*axes)
Returns a view of the array with axes transposed.  
### Changing the number of dimensions
`ma.atleast_1d`
Convert inputs to arrays with at least one dimension.  
`ma.atleast_2d`
View inputs as arrays with at least two dimensions.  
`ma.atleast_3d`
View inputs as arrays with at least three dimensions.  
`ma.expand_dims`(a, axis)
Expand the shape of an array.  
`ma.squeeze`
Remove axes of length one from `a`.  
`ma.MaskedArray.squeeze`([axis])
Remove axes of length one from `a`.  
`ma.stack`
Join a sequence of arrays along a new axis.  
`ma.column_stack`
Stack 1-D arrays as columns into a 2-D array.  
`ma.concatenate`(arrays[, axis])
Concatenate a sequence of arrays along the given axis.  
`ma.dstack`
Stack arrays in sequence depth wise (along third axis).  
`ma.hstack`
Stack arrays in sequence horizontally (column wise).  
`ma.hsplit`
Split an array into multiple sub-arrays horizontally (column-wise).  
`ma.mr_`
Translate slice objects to concatenation along the first axis.  
`ma.vstack`
Stack arrays in sequence vertically (row wise).  
### Joining arrays
`ma.concatenate`(arrays[, axis])
Concatenate a sequence of arrays along the given axis.  
`ma.stack`
Join a sequence of arrays along a new axis.  
`ma.vstack`
Stack arrays in sequence vertically (row wise).  
`ma.hstack`
Stack arrays in sequence horizontally (column wise).  
`ma.dstack`
Stack arrays in sequence depth wise (along third axis).  
`ma.column_stack`
Stack 1-D arrays as columns into a 2-D array.  
`ma.append`(a, b[, axis])
Append values to the end of an array.  
## Operations on masks
### Creating a mask
`ma.make_mask`(m[, copy, shrink, dtype])
Create a boolean mask from an array.  
`ma.make_mask_none`(newshape[, dtype])
Return a boolean mask of the given shape, filled with False.  
`ma.mask_or`(m1, m2[, copy, shrink])
Combine two masks with the `logical_or` operator.  
`ma.make_mask_descr`(ndtype)
Construct a dtype description list from a given dtype.  
### Accessing a mask
`ma.getmask`(a)
Return the mask of a masked array, or nomask.  
`ma.getmaskarray`(arr)
Return the mask of a masked array, or full boolean array of False.  
`ma.masked_array.mask`
Current mask.  
### Finding masked data
`ma.ndenumerate`(a[, compressed])
Multidimensional index iterator.  
`ma.flatnotmasked_contiguous`(a)
Find contiguous unmasked data in a masked array.  
`ma.flatnotmasked_edges`(a)
Find the indices of the first and last unmasked values.  
`ma.notmasked_contiguous`(a[, axis])
Find contiguous unmasked data in a masked array along the given axis.  
`ma.notmasked_edges`(a[, axis])
Find the indices of the first and last unmasked values along an axis.  
`ma.clump_masked`(a)
Returns a list of slices corresponding to the masked clumps of a 1-D array.  
`ma.clump_unmasked`(a)
Return list of slices corresponding to the unmasked clumps of a 1-D array.  
### Modifying a mask
`ma.mask_cols`(a[, axis])
Mask columns of a 2D array that contain masked values.  
`ma.mask_or`(m1, m2[, copy, shrink])
Combine two masks with the `logical_or` operator.  
`ma.mask_rowcols`(a[, axis])
Mask rows and/or columns of a 2D array that contain masked values.  
`ma.mask_rows`(a[, axis])
Mask rows of a 2D array that contain masked values.  
`ma.harden_mask`(self)
Force the mask to hard, preventing unmasking by assignment.  
`ma.soften_mask`(self)
Force the mask to soft (default), allowing unmasking by assignment.  
`ma.MaskedArray.harden_mask`()
Force the mask to hard, preventing unmasking by assignment.  
`ma.MaskedArray.soften_mask`()
Force the mask to soft (default), allowing unmasking by assignment.  
`ma.MaskedArray.shrink_mask`()
Reduce a mask to nomask when possible.  
`ma.MaskedArray.unshare_mask`()
Copy the mask and set the `sharedmask` flag to `False`.  
## Conversion operations
### > to a masked array
`ma.asarray`(a[, dtype, order])
Convert the input to a masked array of the given data-type.  
`ma.asanyarray`(a[, dtype])
Convert the input to a masked array, conserving subclasses.  
`ma.fix_invalid`(a[, mask, copy, fill_value])
Return input with invalid data masked and replaced by a fill value.  
`ma.masked_equal`(x, value[, copy])
Mask an array where equal to a given value.  
`ma.masked_greater`(x, value[, copy])
Mask an array where greater than a given value.  
`ma.masked_greater_equal`(x, value[, copy])
Mask an array where greater than or equal to a given value.  
`ma.masked_inside`(x, v1, v2[, copy])
Mask an array inside a given interval.  
`ma.masked_invalid`(a[, copy])
Mask an array where invalid values occur (NaNs or infs).  
`ma.masked_less`(x, value[, copy])
Mask an array where less than a given value.  
`ma.masked_less_equal`(x, value[, copy])
Mask an array where less than or equal to a given value.  
`ma.masked_not_equal`(x, value[, copy])
Mask an array where not equal to a given value.  
`ma.masked_object`(x, value[, copy, shrink])
Mask the array `x` where the data are exactly equal to value.  
`ma.masked_outside`(x, v1, v2[, copy])
Mask an array outside a given interval.  
`ma.masked_values`(x, value[, rtol, atol, ...])
Mask using floating point equality.  
`ma.masked_where`(condition, a[, copy])
Mask an array where a condition is met.  
### > to a ndarray
`ma.compress_cols`(a)
Suppress whole columns of a 2-D array that contain masked values.  
`ma.compress_rowcols`(x[, axis])
Suppress the rows and/or columns of a 2-D array that contain masked values.  
`ma.compress_rows`(a)
Suppress whole rows of a 2-D array that contain masked values.  
`ma.compressed`(x)
Return all the non-masked data as a 1-D array.  
`ma.filled`(a[, fill_value])
Return input as an `ndarray`, with masked values replaced by `fill_value`.  
`ma.MaskedArray.compressed`()
Return all the non-masked data as a 1-D array.  
`ma.MaskedArray.filled`([fill_value])
Return a copy of self, with masked values filled with a given value.  
### > to another object
`ma.MaskedArray.tofile`(fid[, sep, format])
Save a masked array to a file in binary format.  
`ma.MaskedArray.tolist`([fill_value])
Return the data portion of the masked array as a hierarchical Python list.  
`ma.MaskedArray.torecords`()
Transforms a masked array into a flexible-type array.  
`ma.MaskedArray.tobytes`([fill_value, order])
Return the array data as a string containing the raw bytes in the array.  
### Filling a masked array
`ma.common_fill_value`(a, b)
Return the common filling value of two masked arrays, if any.  
`ma.default_fill_value`(obj)
Return the default fill value for the argument object.  
`ma.maximum_fill_value`(obj)
Return the minimum value that can be represented by the dtype of an object.  
`ma.minimum_fill_value`(obj)
Return the maximum value that can be represented by the dtype of an object.  
`ma.set_fill_value`(a, fill_value)
Set the filling value of a, if a is a masked array.  
`ma.MaskedArray.get_fill_value`()
The filling value of the masked array is a scalar.  
`ma.MaskedArray.set_fill_value`([value])  
`ma.MaskedArray.fill_value`
The filling value of the masked array is a scalar.  
## Masked arrays arithmetic
### Arithmetic
`ma.anom`(self[, axis, dtype])
Compute the anomalies (deviations from the arithmetic mean) along the given axis.  
`ma.anomalies`(self[, axis, dtype])
Compute the anomalies (deviations from the arithmetic mean) along the given axis.  
`ma.average`(a[, axis, weights, returned, ...])
Return the weighted average of array over the given axis.  
`ma.conjugate`(x, /[, out, where, casting, ...])
Return the complex conjugate, element-wise.  
`ma.corrcoef`(x[, y, rowvar, bias, ...])
Return Pearson product-moment correlation coefficients.  
`ma.cov`(x[, y, rowvar, bias, allow_masked, ddof])
Estimate the covariance matrix.  
`ma.cumsum`(self[, axis, dtype, out])
Return the cumulative sum of the array elements over the given axis.  
`ma.cumprod`(self[, axis, dtype, out])
Return the cumulative product of the array elements over the given axis.  
`ma.mean`(self[, axis, dtype, out, keepdims])
Returns the average of the array elements along given axis.  
`ma.median`(a[, axis, out, overwrite_input, ...])
Compute the median along the specified axis.  
`ma.power`(a, b[, third])
Returns element-wise base array raised to power from second array.  
`ma.prod`(self[, axis, dtype, out, keepdims])
Return the product of the array elements over the given axis.  
`ma.std`(self[, axis, dtype, out, ddof, ...])
Returns the standard deviation of the array elements along given axis.  
`ma.sum`(self[, axis, dtype, out, keepdims])
Return the sum of the array elements over the given axis.  
`ma.var`(self[, axis, dtype, out, ddof, ...])
Compute the variance along the specified axis.  
`ma.MaskedArray.anom`([axis, dtype])
Compute the anomalies (deviations from the arithmetic mean) along the given axis.  
`ma.MaskedArray.cumprod`([axis, dtype, out])
Return the cumulative product of the array elements over the given axis.  
`ma.MaskedArray.cumsum`([axis, dtype, out])
Return the cumulative sum of the array elements over the given axis.  
`ma.MaskedArray.mean`([axis, dtype, out, keepdims])
Returns the average of the array elements along given axis.  
`ma.MaskedArray.prod`([axis, dtype, out, keepdims])
Return the product of the array elements over the given axis.  
`ma.MaskedArray.std`([axis, dtype, out, ddof, ...])
Returns the standard deviation of the array elements along given axis.  
`ma.MaskedArray.sum`([axis, dtype, out, keepdims])
Return the sum of the array elements over the given axis.  
`ma.MaskedArray.var`([axis, dtype, out, ddof, ...])
Compute the variance along the specified axis.  
### Minimum/maximum
`ma.argmax`(self[, axis, fill_value, out])
Returns array of indices of the maximum values along the given axis.  
`ma.argmin`(self[, axis, fill_value, out])
Return array of indices to the minimum values along the given axis.  
`ma.max`(obj[, axis, out, fill_value, keepdims])
Return the maximum along a given axis.  
`ma.min`(obj[, axis, out, fill_value, keepdims])
Return the minimum along a given axis.  
`ma.ptp`(obj[, axis, out, fill_value, keepdims])
Return (maximum - minimum) along the given dimension (i.e. peak-to-peak value).  
`ma.diff`(a, /[, n, axis, prepend, append])
Calculate the n-th discrete difference along the given axis.  
`ma.MaskedArray.argmax`([axis, fill_value, ...])
Returns array of indices of the maximum values along the given axis.  
`ma.MaskedArray.argmin`([axis, fill_value, ...])
Return array of indices to the minimum values along the given axis.  
`ma.MaskedArray.max`([axis, out, fill_value, ...])
Return the maximum along a given axis.  
`ma.MaskedArray.min`([axis, out, fill_value, ...])
Return the minimum along a given axis.  
`ma.MaskedArray.ptp`([axis, out, fill_value, ...])
Return (maximum - minimum) along the given dimension (i.e. peak-to-peak value).  
### Sorting
`ma.argsort`(a[, axis, kind, order, endwith, ...])
Return an ndarray of indices that sort the array along the specified axis.  
`ma.sort`(a[, axis, kind, order, endwith, ...])
Return a sorted copy of the masked array.  
`ma.MaskedArray.argsort`([axis, kind, order, ...])
Return an ndarray of indices that sort the array along the specified axis.  
`ma.MaskedArray.sort`([axis, kind, order, ...])
Sort the array, in-place  
### Algebra
`ma.diag`(v[, k])
Extract a diagonal or construct a diagonal array.  
`ma.dot`(a, b[, strict, out])
Return the dot product of two arrays.  
`ma.identity`(n[, dtype])
Return the identity array.  
`ma.inner`(a, b, /)
Inner product of two arrays.  
`ma.innerproduct`(a, b, /)
Inner product of two arrays.  
`ma.outer`(a, b)
Compute the outer product of two vectors.  
`ma.outerproduct`(a, b)
Compute the outer product of two vectors.  
`ma.trace`(self[, offset, axis1, axis2, ...])
Return the sum along diagonals of the array.  
`ma.transpose`(a[, axes])
Permute the dimensions of an array.  
`ma.MaskedArray.trace`([offset, axis1, axis2, ...])
Return the sum along diagonals of the array.  
`ma.MaskedArray.transpose`(*axes)
Returns a view of the array with axes transposed.  
### Polynomial fit
`ma.vander`(x[, n])
Generate a Vandermonde matrix.  
`ma.polyfit`(x, y, deg[, rcond, full, w, cov])
Least squares polynomial fit.  
### Clipping and rounding
`ma.around`
Round an array to the given number of decimals.  
`ma.clip`
Clip (limit) the values in an array.  
`ma.round`(a[, decimals, out])
Return a copy of a, rounded to 'decimals' places.  
`ma.MaskedArray.clip`([min, max, out])
Return an array whose values are limited to `[min, max]`.  
`ma.MaskedArray.round`([decimals, out])
Return each element rounded to the given number of decimals.  
### Set operations
`ma.intersect1d`(ar1, ar2[, assume_unique])
Returns the unique elements common to both arrays.  
`ma.setdiff1d`(ar1, ar2[, assume_unique])
Set difference of 1D arrays with unique elements.  
`ma.setxor1d`(ar1, ar2[, assume_unique])
Set exclusive-or of 1-D arrays with unique elements.  
`ma.union1d`(ar1, ar2)
Union of two arrays.  
### Miscellanea
`ma.allequal`(a, b[, fill_value])
Return True if all entries of a and b are equal, using fill_value as a truth value where either or both are masked.  
`ma.allclose`(a, b[, masked_equal, rtol, atol])
Returns True if two arrays are element-wise equal within a tolerance.  
`ma.amax`(a[, axis, out, keepdims, initial, where])
Return the maximum of an array or maximum along an axis.  
`ma.amin`(a[, axis, out, keepdims, initial, where])
Return the minimum of an array or minimum along an axis.  
`ma.apply_along_axis`(func1d, axis, arr, ...)
Apply a function to 1-D slices along the given axis.  
`ma.apply_over_axes`(func, a, axes)
Apply a function repeatedly over multiple axes.  
`ma.arange`([start,] stop[, step,][, dtype, ...])
Return evenly spaced values within a given interval.  
`ma.choose`(indices, choices[, out, mode])
Use an index array to construct a new array from a list of choices.  
`ma.compress_nd`(x[, axis])
Suppress slices from multiple dimensions which contain masked values.  
`ma.convolve`(a, v[, mode, propagate_mask])
Returns the discrete, linear convolution of two one-dimensional sequences.  
`ma.correlate`(a, v[, mode, propagate_mask])
Cross-correlation of two 1-dimensional sequences.  
`ma.ediff1d`(arr[, to_end, to_begin])
Compute the differences between consecutive elements of an array.  
`ma.flatten_mask`(mask)
Returns a completely flattened version of the mask, where nested fields are collapsed.  
`ma.flatten_structured_array`(a)
Flatten a structured array.  
`ma.fromflex`(fxarray)
Build a masked array from a suitable flexible-type array.  
`ma.indices`(dimensions[, dtype, sparse])
Return an array representing the indices of a grid.  
`ma.left_shift`(a, n)
Shift the bits of an integer to the left.  
`ma.ndim`(obj)
Return the number of dimensions of an array.  
`ma.put`(a, indices, values[, mode])
Set storage-indexed locations to corresponding values.  
`ma.putmask`(a, mask, values)
Changes elements of an array based on conditional and input values.  
`ma.right_shift`(a, n)
Shift the bits of an integer to the right.  
`ma.round_`(a[, decimals, out])
Return a copy of a, rounded to 'decimals' places.  
`ma.take`(a, indices[, axis, out, mode])  
`ma.where`(condition[, x, y])
Return a masked array with elements from `x` or `y`, depending on condition.  
# Mathematical functions
## Trigonometric functions
`sin`(x, /[, out, where, casting, order, ...])
Trigonometric sine, element-wise.  
`cos`(x, /[, out, where, casting, order, ...])
Cosine element-wise.  
`tan`(x, /[, out, where, casting, order, ...])
Compute tangent element-wise.  
`arcsin`(x, /[, out, where, casting, order, ...])
Inverse sine, element-wise.  
`asin`(x, /[, out, where, casting, order, ...])
Inverse sine, element-wise.  
`arccos`(x, /[, out, where, casting, order, ...])
Trigonometric inverse cosine, element-wise.  
`acos`(x, /[, out, where, casting, order, ...])
Trigonometric inverse cosine, element-wise.  
`arctan`(x, /[, out, where, casting, order, ...])
Trigonometric inverse tangent, element-wise.  
`atan`(x, /[, out, where, casting, order, ...])
Trigonometric inverse tangent, element-wise.  
`hypot`(x1, x2, /[, out, where, casting, ...])
Given the "legs" of a right triangle, return its hypotenuse.  
`arctan2`(x1, x2, /[, out, where, casting, ...])
Element-wise arc tangent of `x1/x2` choosing the quadrant correctly.  
`atan2`(x1, x2, /[, out, where, casting, ...])
Element-wise arc tangent of `x1/x2` choosing the quadrant correctly.  
`degrees`(x, /[, out, where, casting, order, ...])
Convert angles from radians to degrees.  
`radians`(x, /[, out, where, casting, order, ...])
Convert angles from degrees to radians.  
`unwrap`(p[, discont, axis, period])
Unwrap by taking the complement of large deltas with respect to the period.  
`deg2rad`(x, /[, out, where, casting, order, ...])
Convert angles from degrees to radians.  
`rad2deg`(x, /[, out, where, casting, order, ...])
Convert angles from radians to degrees.  
## Hyperbolic functions
`sinh`(x, /[, out, where, casting, order, ...])
Hyperbolic sine, element-wise.  
`cosh`(x, /[, out, where, casting, order, ...])
Hyperbolic cosine, element-wise.  
`tanh`(x, /[, out, where, casting, order, ...])
Compute hyperbolic tangent element-wise.  
`arcsinh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic sine element-wise.  
`asinh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic sine element-wise.  
`arccosh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic cosine, element-wise.  
`acosh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic cosine, element-wise.  
`arctanh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic tangent element-wise.  
`atanh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic tangent element-wise.  
## Rounding
`round`(a[, decimals, out])
Evenly round to the given number of decimals.  
`around`(a[, decimals, out])
Round an array to the given number of decimals.  
`rint`(x, /[, out, where, casting, order, ...])
Round elements of the array to the nearest integer.  
`fix`(x[, out])
Round to nearest integer towards zero.  
`floor`(x, /[, out, where, casting, order, ...])
Return the floor of the input, element-wise.  
`ceil`(x, /[, out, where, casting, order, ...])
Return the ceiling of the input, element-wise.  
`trunc`(x, /[, out, where, casting, order, ...])
Return the truncated value of the input, element-wise.  
## Sums, products, differences
`prod`(a[, axis, dtype, out, keepdims, ...])
Return the product of array elements over a given axis.  
`sum`(a[, axis, dtype, out, keepdims, ...])
Sum of array elements over a given axis.  
`nanprod`(a[, axis, dtype, out, keepdims, ...])
Return the product of array elements over a given axis treating Not a Numbers (NaNs) as ones.  
`nansum`(a[, axis, dtype, out, keepdims, ...])
Return the sum of array elements over a given axis treating Not a Numbers (NaNs) as zero.  
`cumulative_sum`(x, /, *[, axis, dtype, out, ...])
Return the cumulative sum of the elements along a given axis.  
`cumulative_prod`(x, /, *[, axis, dtype, out, ...])
Return the cumulative product of elements along a given axis.  
`cumprod`(a[, axis, dtype, out])
Return the cumulative product of elements along a given axis.  
`cumsum`(a[, axis, dtype, out])
Return the cumulative sum of the elements along a given axis.  
`nancumprod`(a[, axis, dtype, out])
Return the cumulative product of array elements over a given axis treating Not a Numbers (NaNs) as one.  
`nancumsum`(a[, axis, dtype, out])
Return the cumulative sum of array elements over a given axis treating Not a Numbers (NaNs) as zero.  
`diff`(a[, n, axis, prepend, append])
Calculate the n-th discrete difference along the given axis.  
`ediff1d`(ary[, to_end, to_begin])
The differences between consecutive elements of an array.  
`gradient`(f, *varargs[, axis, edge_order])
Return the gradient of an N-dimensional array.  
`cross`(a, b[, axisa, axisb, axisc, axis])
Return the cross product of two (arrays of) vectors.  
`trapezoid`(y[, x, dx, axis])
Integrate along the given axis using the composite trapezoidal rule.  
## Exponents and logarithms
`exp`(x, /[, out, where, casting, order, ...])
Calculate the exponential of all elements in the input array.  
`expm1`(x, /[, out, where, casting, order, ...])
Calculate `exp(x) - 1` for all elements in the array.  
`exp2`(x, /[, out, where, casting, order, ...])
Calculate `2**p` for all `p` in the input array.  
`log`(x, /[, out, where, casting, order, ...])
Natural logarithm, element-wise.  
`log10`(x, /[, out, where, casting, order, ...])
Return the base 10 logarithm of the input array, element-wise.  
`log2`(x, /[, out, where, casting, order, ...])
Base-2 logarithm of `x`.  
`log1p`(x, /[, out, where, casting, order, ...])
Return the natural logarithm of one plus the input array, element-wise.  
`logaddexp`(x1, x2, /[, out, where, casting, ...])
Logarithm of the sum of exponentiations of the inputs.  
`logaddexp2`(x1, x2, /[, out, where, casting, ...])
Logarithm of the sum of exponentiations of the inputs in base-2.  
## Other special functions
`i0`(x)
Modified Bessel function of the first kind, order 0.  
`sinc`(x)
Return the normalized sinc function.  
## Floating point routines
`signbit`(x, /[, out, where, casting, order, ...])
Returns element-wise True where signbit is set (less than zero).  
`copysign`(x1, x2, /[, out, where, casting, ...])
Change the sign of x1 to that of x2, element-wise.  
`frexp`(x[, out1, out2], / [[, out, where, ...])
Decompose the elements of x into mantissa and twos exponent.  
`ldexp`(x1, x2, /[, out, where, casting, ...])
Returns x1 * 2**x2, element-wise.  
`nextafter`(x1, x2, /[, out, where, casting, ...])
Return the next floating-point value after x1 towards x2, element-wise.  
`spacing`(x, /[, out, where, casting, order, ...])
Return the distance between x and the nearest adjacent number.  
## Rational routines
`lcm`(x1, x2, /[, out, where, casting, order, ...])
Returns the lowest common multiple of `|x1|` and `|x2|`  
`gcd`(x1, x2, /[, out, where, casting, order, ...])
Returns the greatest common divisor of `|x1|` and `|x2|`  
## Arithmetic operations
`add`(x1, x2, /[, out, where, casting, order, ...])
Add arguments element-wise.  
`reciprocal`(x, /[, out, where, casting, ...])
Return the reciprocal of the argument, element-wise.  
`positive`(x, /[, out, where, casting, order, ...])
Numerical positive, element-wise.  
`negative`(x, /[, out, where, casting, order, ...])
Numerical negative, element-wise.  
`multiply`(x1, x2, /[, out, where, casting, ...])
Multiply arguments element-wise.  
`divide`(x1, x2, /[, out, where, casting, ...])
Divide arguments element-wise.  
`power`(x1, x2, /[, out, where, casting, ...])
First array elements raised to powers from second array, element-wise.  
`pow`(x1, x2, /[, out, where, casting, order, ...])
First array elements raised to powers from second array, element-wise.  
`subtract`(x1, x2, /[, out, where, casting, ...])
Subtract arguments, element-wise.  
`true_divide`(x1, x2, /[, out, where, ...])
Divide arguments element-wise.  
`floor_divide`(x1, x2, /[, out, where, ...])
Return the largest integer smaller or equal to the division of the inputs.  
`float_power`(x1, x2, /[, out, where, ...])
First array elements raised to powers from second array, element-wise.  
`fmod`(x1, x2, /[, out, where, casting, ...])
Returns the element-wise remainder of division.  
`mod`(x1, x2, /[, out, where, casting, order, ...])
Returns the element-wise remainder of division.  
`modf`(x[, out1, out2], / [[, out, where, ...])
Return the fractional and integral parts of an array, element-wise.  
`remainder`(x1, x2, /[, out, where, casting, ...])
Returns the element-wise remainder of division.  
`divmod`(x1, x2[, out1, out2], / [[, out, ...])
Return element-wise quotient and remainder simultaneously.  
## Handling complex numbers
`angle`(z[, deg])
Return the angle of the complex argument.  
`real`(val)
Return the real part of the complex argument.  
`imag`(val)
Return the imaginary part of the complex argument.  
`conj`(x, /[, out, where, casting, order, ...])
Return the complex conjugate, element-wise.  
`conjugate`(x, /[, out, where, casting, ...])
Return the complex conjugate, element-wise.  
## Extrema finding
`maximum`(x1, x2, /[, out, where, casting, ...])
Element-wise maximum of array elements.  
`max`(a[, axis, out, keepdims, initial, where])
Return the maximum of an array or maximum along an axis.  
`amax`(a[, axis, out, keepdims, initial, where])
Return the maximum of an array or maximum along an axis.  
`fmax`(x1, x2, /[, out, where, casting, ...])
Element-wise maximum of array elements.  
`nanmax`(a[, axis, out, keepdims, initial, where])
Return the maximum of an array or maximum along an axis, ignoring any NaNs.  
`minimum`(x1, x2, /[, out, where, casting, ...])
Element-wise minimum of array elements.  
`min`(a[, axis, out, keepdims, initial, where])
Return the minimum of an array or minimum along an axis.  
`amin`(a[, axis, out, keepdims, initial, where])
Return the minimum of an array or minimum along an axis.  
`fmin`(x1, x2, /[, out, where, casting, ...])
Element-wise minimum of array elements.  
`nanmin`(a[, axis, out, keepdims, initial, where])
Return minimum of an array or minimum along an axis, ignoring any NaNs.  
## Miscellaneous
`convolve`(a, v[, mode])
Returns the discrete, linear convolution of two one-dimensional sequences.  
`clip`(a[, a_min, a_max, out, min, max])
Clip (limit) the values in an array.  
`sqrt`(x, /[, out, where, casting, order, ...])
Return the non-negative square-root of an array, element-wise.  
`cbrt`(x, /[, out, where, casting, order, ...])
Return the cube-root of an array, element-wise.  
`square`(x, /[, out, where, casting, order, ...])
Return the element-wise square of the input.  
`absolute`(x, /[, out, where, casting, order, ...])
Calculate the absolute value element-wise.  
`fabs`(x, /[, out, where, casting, order, ...])
Compute the absolute values element-wise.  
`sign`(x, /[, out, where, casting, order, ...])
Returns an element-wise indication of the sign of a number.  
`heaviside`(x1, x2, /[, out, where, casting, ...])
Compute the Heaviside step function.  
`nan_to_num`(x[, copy, nan, posinf, neginf])
Replace NaN with zero and infinity with large finite numbers (default behaviour) or with the numbers defined by the user using the `nan`, `posinf` and/or `neginf` keywords.  
`real_if_close`(a[, tol])
If input is complex with all imaginary parts close to zero, return real parts.  
`interp`(x, xp, fp[, left, right, period])
One-dimensional linear interpolation for monotonically increasing sample points.  
`bitwise_count`(x, /[, out, where, casting, ...])
Computes the number of 1-bits in the absolute value of `x`.  
# Matrix library (numpy.matlib)
This module contains all functions in the `numpy` namespace, with the following replacement functions that return `matrices` instead of `ndarrays`.
Functions that are also in the numpy namespace and return matrices
`matrix`(data[, dtype, copy])
Returns a matrix from an array-like object, or from a string of data.  
`asmatrix`(data[, dtype])
Interpret the input as a matrix.  
`bmat`(obj[, ldict, gdict])
Build a matrix object from a string, nested sequence, or array.  
Replacement functions in `matlib`
`empty`(shape[, dtype, order])
Return a new matrix of given shape and type, without initializing entries.  
`zeros`(shape[, dtype, order])
Return a matrix of given shape and type, filled with zeros.  
`ones`(shape[, dtype, order])
Matrix of ones.  
`eye`(n[, M, k, dtype, order])
Return a matrix with ones on the diagonal and zeros elsewhere.  
`identity`(n[, dtype])
Returns the square identity matrix of given size.  
`repmat`(a, m, n)
Repeat a 0-D to 2-D array or matrix MxN times.  
`rand`(*args)
Return a matrix of random values with given shape.  
`randn`(*args)
Return a random matrix with data from the "standard normal" distribution.  
# Miscellaneous routines
## Performance tuning
`setbufsize`(size)
Set the size of the buffer used in ufuncs.  
`getbufsize`()
Return the size of the buffer used in ufuncs.  
## Memory ranges
`shares_memory`(a, b, /[, max_work])
Determine if two arrays share memory.  
`may_share_memory`(a, b, /[, max_work])
Determine if two arrays might share memory  
## Utility
`get_include`()
Return the directory that contains the NumPy *.h header files.  
`show_config`([mode])
Show libraries and system information on which NumPy was built and is being used  
`show_runtime`()
Print information about various resources in the system including available intrinsic support and BLAS/LAPACK library in use  
`broadcast_shapes`(*args)
Broadcast the input shapes into a single shape.  
## NumPy-specific help function
`info`([object, maxwidth, output, toplevel])
Get help information for an array, function, class, or module.  
# Chebyshev Series (numpy.polynomial.chebyshev)
This module provides a number of objects (mostly functions) useful for dealing with Chebyshev series, including a `Chebyshev` class that encapsulates the usual arithmetic operations. (General information on how this module represents and works with such polynomials is in the docstring for its “parent” sub-package, `numpy.polynomial`).
## Classes
`Chebyshev`(coef[, domain, window, symbol])
A Chebyshev series class.  
## Constants
`chebdomain`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`chebzero`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`chebone`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`chebx`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Arithmetic
`chebadd`(c1, c2)
Add one Chebyshev series to another.  
`chebsub`(c1, c2)
Subtract one Chebyshev series from another.  
`chebmulx`(c)
Multiply a Chebyshev series by x.  
`chebmul`(c1, c2)
Multiply one Chebyshev series by another.  
`chebdiv`(c1, c2)
Divide one Chebyshev series by another.  
`chebpow`(c, pow[, maxpower])
Raise a Chebyshev series to a power.  
`chebval`(x, c[, tensor])
Evaluate a Chebyshev series at points x.  
`chebval2d`(x, y, c)
Evaluate a 2-D Chebyshev series at points (x, y).  
`chebval3d`(x, y, z, c)
Evaluate a 3-D Chebyshev series at points (x, y, z).  
`chebgrid2d`(x, y, c)
Evaluate a 2-D Chebyshev series on the Cartesian product of x and y.  
`chebgrid3d`(x, y, z, c)
Evaluate a 3-D Chebyshev series on the Cartesian product of x, y, and z.  
## Calculus
`chebder`(c[, m, scl, axis])
Differentiate a Chebyshev series.  
`chebint`(c[, m, k, lbnd, scl, axis])
Integrate a Chebyshev series.  
## Misc Functions
`chebfromroots`(roots)
Generate a Chebyshev series with given roots.  
`chebroots`(c)
Compute the roots of a Chebyshev series.  
`chebvander`(x, deg)
Pseudo-Vandermonde matrix of given degree.  
`chebvander2d`(x, y, deg)
Pseudo-Vandermonde matrix of given degrees.  
`chebvander3d`(x, y, z, deg)
Pseudo-Vandermonde matrix of given degrees.  
`chebgauss`(deg)
Gauss-Chebyshev quadrature.  
`chebweight`(x)
The weight function of the Chebyshev polynomials.  
`chebcompanion`(c)
Return the scaled companion matrix of c.  
`chebfit`(x, y, deg[, rcond, full, w])
Least squares fit of Chebyshev series to data.  
`chebpts1`(npts)
Chebyshev points of the first kind.  
`chebpts2`(npts)
Chebyshev points of the second kind.  
`chebtrim`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`chebline`(off, scl)
Chebyshev series whose graph is a straight line.  
`cheb2poly`(c)
Convert a Chebyshev series to a polynomial.  
`poly2cheb`(pol)
Convert a polynomial to a Chebyshev series.  
`chebinterpolate`(func, deg[, args])
Interpolate a function at the Chebyshev points of the first kind.  
## See also
`numpy.polynomial`
## Notes
The implementations of multiplication, division, integration, and differentiation use the algebraic identities [1]:
\\[\begin{split}T_n(x) = \frac{z^n + z^{-n}}{2} \\\ z\frac{dx}{dz} = \frac{z - z^{-1}}{2}.\end{split}\\]
where
\\[x = \frac{z + z^{-1}}{2}.\\]
These identities allow a Chebyshev series to be expressed as a finite, symmetric Laurent series. In this module, this sort of Laurent series is referred to as a “z-series.”
## References
[1]
A. T. Benjamin, et al., “Combinatorial Trigonometry with Chebyshev Polynomials,” Journal of Statistical Planning and Inference 14, 2008 (https://web.archive.org/web/20080221202153/https://www.math.hmc.edu/~benjamin/papers/CombTrig.pdf, pg. 4)
# Using the convenience classes
The convenience classes provided by the polynomial package are:
Name
Provides  
`Polynomial`
Power series  
`Chebyshev`
Chebyshev series  
`Legendre`
Legendre series  
`Laguerre`
Laguerre series  
`Hermite`
Hermite series  
`HermiteE`
HermiteE series  
The series in this context are finite sums of the corresponding polynomial basis functions multiplied by coefficients. For instance, a power series looks like
\\[p(x) = 1 + 2x + 3x^2\\]
and has coefficients \\([1, 2, 3]\\). The Chebyshev series with the same coefficients looks like
\\[p(x) = 1 T_0(x) + 2 T_1(x) + 3 T_2(x)\\]
and more generally
\\[p(x) = \sum_{i=0}^n c_i T_i(x)\\]
where in this case the \\(T_n\\) are the Chebyshev functions of degree \\(n\\), but could just as easily be the basis functions of any of the other classes. The convention for all the classes is that the coefficient \\(c[i]\\) goes with the basis function of degree i.
All of the classes are immutable and have the same methods, and especially they implement the Python numeric operators +, -, *, //, %, divmod, **, ==, and !=. The last two can be a bit problematic due to floating point roundoff errors. We now give a quick demonstration of the various operations using NumPy version 1.7.0.
## Basics
First we need a polynomial class and a polynomial instance to play with. The classes can be imported directly from the polynomial package or from the module of the relevant type. Here we import from the package and use the conventional Polynomial class because of its familiarity:
    
    >>> from numpy.polynomial import Polynomial as P
    >>> p = P([1,2,3])
    >>> p
    Polynomial([1., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Note that there are three parts to the long version of the printout. The first is the coefficients, the second is the domain, and the third is the window:
    
    >>> p.coef
    array([1., 2., 3.])
    >>> p.domain
    array([-1.,  1.])
    >>> p.window
    array([-1.,  1.])
    
Printing a polynomial yields the polynomial expression in a more familiar format:
    
    >>> print(p)
    1.0 + 2.0·x + 3.0·x²
    
Note that the string representation of polynomials uses Unicode characters by default (except on Windows) to express powers and subscripts. An ASCII-based representation is also available (default on Windows). The polynomial string format can be toggled at the package-level with the `set_default_printstyle` function:
    
    >>> np.polynomial.set_default_printstyle('ascii')
    >>> print(p)
    1.0 + 2.0 x + 3.0 x**2
    
or controlled for individual polynomial instances with string formatting:
    
    >>> print(f"{p:unicode}")
    1.0 + 2.0·x + 3.0·x²
    
We will deal with the domain and window when we get to fitting, for the moment we ignore them and run through the basic algebraic and arithmetic operations.
Addition and Subtraction:
    
    >>> p + p
    Polynomial([2., 4., 6.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p - p
    Polynomial([0.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Multiplication:
    
    >>> p * p
    Polynomial([ 1.,   4.,  10.,  12.,   9.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Powers:
    
    >>> p**2
    Polynomial([ 1.,   4., 10., 12.,  9.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Division:
Floor division, ‘//’, is the division operator for the polynomial classes, polynomials are treated like integers in this regard. For Python versions < 3.x the ‘/’ operator maps to ‘//’, as it does for Python, for later versions the ‘/’ will only work for division by scalars. At some point it will be deprecated:
    
    >>> p // P([-1, 1])
    Polynomial([5.,  3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Remainder:
    
    >>> p % P([-1, 1])
    Polynomial([6.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Divmod:
    
    >>> quo, rem = divmod(p, P([-1, 1]))
    >>> quo
    Polynomial([5.,  3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> rem
    Polynomial([6.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Evaluation:
    
    >>> x = np.arange(5)
    >>> p(x)
    array([  1.,   6.,  17.,  34.,  57.])
    >>> x = np.arange(6).reshape(3,2)
    >>> p(x)
    array([[ 1.,   6.],
           [17.,  34.],
           [57.,  86.]])
    
Substitution:
Substitute a polynomial for x and expand the result. Here we substitute p in itself leading to a new polynomial of degree 4 after expansion. If the polynomials are regarded as functions this is composition of functions:
    
    >>> p(p)
    Polynomial([ 6., 16., 36., 36., 27.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Roots:
    
    >>> p.roots()
    array([-0.33333333-0.47140452j, -0.33333333+0.47140452j])
    
It isn’t always convenient to explicitly use Polynomial instances, so tuples, lists, arrays, and scalars are automatically cast in the arithmetic operations:
    
    >>> p + [1, 2, 3]
    Polynomial([2., 4., 6.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> [1, 2, 3] * p
    Polynomial([ 1.,  4., 10., 12.,  9.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p / 2
    Polynomial([0.5, 1. , 1.5], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Polynomials that differ in domain, window, or class can’t be mixed in arithmetic:
    
    >>> from numpy.polynomial import Chebyshev as T
    >>> p + P([1], domain=[0,1])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 213, in __add__
    TypeError: Domains differ
    >>> p + P([1], window=[0,1])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 215, in __add__
    TypeError: Windows differ
    >>> p + T([1])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 211, in __add__
    TypeError: Polynomial types differ
    
But different types can be used for substitution. In fact, this is how conversion of Polynomial classes among themselves is done for type, domain, and window casting:
    
    >>> p(T([0, 1]))
    Chebyshev([2.5, 2. , 1.5], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Which gives the polynomial `p` in Chebyshev form. This works because \\(T_1(x) = x\\) and substituting \\(x\\) for \\(x\\) doesn’t change the original polynomial. However, all the multiplications and divisions will be done using Chebyshev series, hence the type of the result.
It is intended that all polynomial instances are immutable, therefore augmented operations (`+=`, `-=`, etc.) and any other functionality that would violate the immutablity of a polynomial instance are intentionally unimplemented.
## Calculus
Polynomial instances can be integrated and differentiated.:
    
    >>> from numpy.polynomial import Polynomial as P
    >>> p = P([2, 6])
    >>> p.integ()
    Polynomial([0., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p.integ(2)
    Polynomial([0., 0., 1., 1.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
The first example integrates `p` once, the second example integrates it twice. By default, the lower bound of the integration and the integration constant are 0, but both can be specified.:
    
    >>> p.integ(lbnd=-1)
    Polynomial([-1.,  2.,  3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p.integ(lbnd=-1, k=1)
    Polynomial([0., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
In the first case the lower bound of the integration is set to -1 and the integration constant is 0. In the second the constant of integration is set to 1 as well. Differentiation is simpler since the only option is the number of times the polynomial is differentiated:
    
    >>> p = P([1, 2, 3])
    >>> p.deriv(1)
    Polynomial([2., 6.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p.deriv(2)
    Polynomial([6.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
## Other polynomial constructors
Constructing polynomials by specifying coefficients is just one way of obtaining a polynomial instance, they may also be created by specifying their roots, by conversion from other polynomial types, and by least squares fits. Fitting is discussed in its own section, the other methods are demonstrated below:
    
    >>> from numpy.polynomial import Polynomial as P
    >>> from numpy.polynomial import Chebyshev as T
    >>> p = P.fromroots([1, 2, 3])
    >>> p
    Polynomial([-6., 11., -6.,  1.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p.convert(kind=T)
    Chebyshev([-9.  , 11.75, -3.  ,  0.25], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
The convert method can also convert domain and window:
    
    >>> p.convert(kind=T, domain=[0, 1])
    Chebyshev([-2.4375 ,  2.96875, -0.5625 ,  0.03125], domain=[0.,  1.], window=[-1.,  1.], symbol='x')
    >>> p.convert(kind=P, domain=[0, 1])
    Polynomial([-1.875,  2.875, -1.125,  0.125], domain=[0.,  1.], window=[-1.,  1.], symbol='x')
    
In numpy versions >= 1.7.0 the `basis` and `cast` class methods are also available. The cast method works like the convert method while the basis method returns the basis polynomial of given degree:
    
    >>> P.basis(3)
    Polynomial([0., 0., 0., 1.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> T.cast(p)
    Chebyshev([-9.  , 11.75, -3. ,  0.25], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
Conversions between types can be useful, but it is not recommended for routine use. The loss of numerical precision in passing from a Chebyshev series of degree 50 to a Polynomial series of the same degree can make the results of numerical evaluation essentially random.
## Fitting
Fitting is the reason that the `domain` and `window` attributes are part of the convenience classes. To illustrate the problem, the values of the Chebyshev polynomials up to degree 5 are plotted below.
    
    >>> import matplotlib.pyplot as plt
    >>> from numpy.polynomial import Chebyshev as T
    >>> x = np.linspace(-1, 1, 100)
    >>> for i in range(6):
    ...     ax = plt.plot(x, T.basis(i)(x), lw=2, label=f"$T_{i}$")
    ...
    >>> plt.legend(loc="upper left")
    >>> plt.show()
    
In the range -1 <= `x` <= 1 they are nice, equiripple functions lying between +/- 1. The same plots over the range -2 <= `x` <= 2 look very different:
    
    >>> import matplotlib.pyplot as plt
    >>> from numpy.polynomial import Chebyshev as T
    >>> x = np.linspace(-2, 2, 100)
    >>> for i in range(6):
    ...     ax = plt.plot(x, T.basis(i)(x), lw=2, label=f"$T_{i}$")
    ...
    >>> plt.legend(loc="lower right")
    >>> plt.show()
    
As can be seen, the “good” parts have shrunk to insignificance. In using Chebyshev polynomials for fitting we want to use the region where `x` is between -1 and 1 and that is what the `window` specifies. However, it is unlikely that the data to be fit has all its data points in that interval, so we use `domain` to specify the interval where the data points lie. When the fit is done, the domain is first mapped to the window by a linear transformation and the usual least squares fit is done using the mapped data points. The window and domain of the fit are part of the returned series and are automatically used when computing values, derivatives, and such. If they aren’t specified in the call the fitting routine will use the default window and the smallest domain that holds all the data points. This is illustrated below for a fit to a noisy sine curve.
    
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from numpy.polynomial import Chebyshev as T
    >>> np.random.seed(11)
    >>> x = np.linspace(0, 2*np.pi, 20)
    >>> y = np.sin(x) + np.random.normal(scale=.1, size=x.shape)
    >>> p = T.fit(x, y, 5)
    >>> plt.plot(x, y, 'o')
    >>> xx, yy = p.linspace()
    >>> plt.plot(xx, yy, lw=2)
    >>> p.domain
    array([0.        ,  6.28318531])
    >>> p.window
    array([-1.,  1.])
    >>> plt.show()
    
# Hermite Series, “Physicists” (numpy.polynomial.hermite)
This module provides a number of objects (mostly functions) useful for dealing with Hermite series, including a `Hermite` class that encapsulates the usual arithmetic operations. (General information on how this module represents and works with such polynomials is in the docstring for its “parent” sub-package, `numpy.polynomial`).
## Classes
`Hermite`(coef[, domain, window, symbol])
An Hermite series class.  
## Constants
`hermdomain`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`hermzero`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`hermone`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`hermx`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Arithmetic
`hermadd`(c1, c2)
Add one Hermite series to another.  
`hermsub`(c1, c2)
Subtract one Hermite series from another.  
`hermmulx`(c)
Multiply a Hermite series by x.  
`hermmul`(c1, c2)
Multiply one Hermite series by another.  
`hermdiv`(c1, c2)
Divide one Hermite series by another.  
`hermpow`(c, pow[, maxpower])
Raise a Hermite series to a power.  
`hermval`(x, c[, tensor])
Evaluate an Hermite series at points x.  
`hermval2d`(x, y, c)
Evaluate a 2-D Hermite series at points (x, y).  
`hermval3d`(x, y, z, c)
Evaluate a 3-D Hermite series at points (x, y, z).  
`hermgrid2d`(x, y, c)
Evaluate a 2-D Hermite series on the Cartesian product of x and y.  
`hermgrid3d`(x, y, z, c)
Evaluate a 3-D Hermite series on the Cartesian product of x, y, and z.  
## Calculus
`hermder`(c[, m, scl, axis])
Differentiate a Hermite series.  
`hermint`(c[, m, k, lbnd, scl, axis])
Integrate a Hermite series.  
## Misc Functions
`hermfromroots`(roots)
Generate a Hermite series with given roots.  
`hermroots`(c)
Compute the roots of a Hermite series.  
`hermvander`(x, deg)
Pseudo-Vandermonde matrix of given degree.  
`hermvander2d`(x, y, deg)
Pseudo-Vandermonde matrix of given degrees.  
`hermvander3d`(x, y, z, deg)
Pseudo-Vandermonde matrix of given degrees.  
`hermgauss`(deg)
Gauss-Hermite quadrature.  
`hermweight`(x)
Weight function of the Hermite polynomials.  
`hermcompanion`(c)
Return the scaled companion matrix of c.  
`hermfit`(x, y, deg[, rcond, full, w])
Least squares fit of Hermite series to data.  
`hermtrim`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`hermline`(off, scl)
Hermite series whose graph is a straight line.  
`herm2poly`(c)
Convert a Hermite series to a polynomial.  
`poly2herm`(pol)
Convert a polynomial to a Hermite series.  
## See also
`numpy.polynomial`
# HermiteE Series, “Probabilists” (numpy.polynomial.hermite_e)
This module provides a number of objects (mostly functions) useful for dealing with Hermite_e series, including a `HermiteE` class that encapsulates the usual arithmetic operations. (General information on how this module represents and works with such polynomials is in the docstring for its “parent” sub-package, `numpy.polynomial`).
## Classes
`HermiteE`(coef[, domain, window, symbol])
An HermiteE series class.  
## Constants
`hermedomain`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`hermezero`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`hermeone`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`hermex`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Arithmetic
`hermeadd`(c1, c2)
Add one Hermite series to another.  
`hermesub`(c1, c2)
Subtract one Hermite series from another.  
`hermemulx`(c)
Multiply a Hermite series by x.  
`hermemul`(c1, c2)
Multiply one Hermite series by another.  
`hermediv`(c1, c2)
Divide one Hermite series by another.  
`hermepow`(c, pow[, maxpower])
Raise a Hermite series to a power.  
`hermeval`(x, c[, tensor])
Evaluate an HermiteE series at points x.  
`hermeval2d`(x, y, c)
Evaluate a 2-D HermiteE series at points (x, y).  
`hermeval3d`(x, y, z, c)
Evaluate a 3-D Hermite_e series at points (x, y, z).  
`hermegrid2d`(x, y, c)
Evaluate a 2-D HermiteE series on the Cartesian product of x and y.  
`hermegrid3d`(x, y, z, c)
Evaluate a 3-D HermiteE series on the Cartesian product of x, y, and z.  
## Calculus
`hermeder`(c[, m, scl, axis])
Differentiate a Hermite_e series.  
`hermeint`(c[, m, k, lbnd, scl, axis])
Integrate a Hermite_e series.  
## Misc Functions
`hermefromroots`(roots)
Generate a HermiteE series with given roots.  
`hermeroots`(c)
Compute the roots of a HermiteE series.  
`hermevander`(x, deg)
Pseudo-Vandermonde matrix of given degree.  
`hermevander2d`(x, y, deg)
Pseudo-Vandermonde matrix of given degrees.  
`hermevander3d`(x, y, z, deg)
Pseudo-Vandermonde matrix of given degrees.  
`hermegauss`(deg)
Gauss-HermiteE quadrature.  
`hermeweight`(x)
Weight function of the Hermite_e polynomials.  
`hermecompanion`(c)
Return the scaled companion matrix of c.  
`hermefit`(x, y, deg[, rcond, full, w])
Least squares fit of Hermite series to data.  
`hermetrim`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`hermeline`(off, scl)
Hermite series whose graph is a straight line.  
`herme2poly`(c)
Convert a Hermite series to a polynomial.  
`poly2herme`(pol)
Convert a polynomial to a Hermite series.  
## See also
`numpy.polynomial`
# Polynomials
Polynomials in NumPy can be created, manipulated, and even fitted using the convenience classes of the `numpy.polynomial` package, introduced in NumPy 1.4.
Prior to NumPy 1.4, `numpy.poly1d` was the class of choice and it is still available in order to maintain backward compatibility. However, the newer `polynomial package` is more complete and its `convenience classes` provide a more consistent, better-behaved interface for working with polynomial expressions. Therefore `numpy.polynomial` is recommended for new coding.
Note
Terminology
The term polynomial module refers to the old API defined in `numpy.lib.polynomial`, which includes the `numpy.poly1d` class and the polynomial functions prefixed with poly accessible from the `numpy` namespace (e.g. `numpy.polyadd`, `numpy.polyval`, `numpy.polyfit`, etc.).
The term polynomial package refers to the new API defined in `numpy.polynomial`, which includes the convenience classes for the different kinds of polynomials (`Polynomial`, `Chebyshev`, etc.).
## Transitioning from numpy.poly1d to numpy.polynomial
As noted above, the `poly1d class` and associated functions defined in `numpy.lib.polynomial`, such as `numpy.polyfit` and `numpy.poly`, are considered legacy and should not be used in new code. Since NumPy version 1.4, the `numpy.polynomial` package is preferred for working with polynomials.
### Quick Reference
The following table highlights some of the main differences between the legacy polynomial module and the polynomial package for common tasks. The `Polynomial` class is imported for brevity:
    
    from numpy.polynomial import Polynomial
    
How to…
Legacy (`numpy.poly1d`)
`numpy.polynomial`  
Create a polynomial object from coefficients [1]
`p = np.poly1d([1, 2, 3])`
`p = Polynomial([3, 2, 1])`  
Create a polynomial object from roots
`r = np.poly([-1, 1])` `p = np.poly1d(r)`
`p = Polynomial.fromroots([-1, 1])`  
Fit a polynomial of degree `deg` to data
`np.polyfit(x, y, deg)`
`Polynomial.fit(x, y, deg)`  
[1]
Note the reversed ordering of the coefficients
### Transition Guide
There are significant differences between `numpy.lib.polynomial` and `numpy.polynomial`. The most significant difference is the ordering of the coefficients for the polynomial expressions. The various routines in `numpy.polynomial` all deal with series whose coefficients go from degree zero upward, which is the reverse order of the poly1d convention. The easy way to remember this is that indices correspond to degree, i.e., `coef[i]` is the coefficient of the term of degree i.
Though the difference in convention may be confusing, it is straightforward to convert from the legacy polynomial API to the new. For example, the following demonstrates how you would convert a `numpy.poly1d` instance representing the expression \\(x^{2} + 2x + 3\\) to a `Polynomial` instance representing the same expression:
    
    >>> import numpy as np
    
    
    >>> p1d = np.poly1d([1, 2, 3])
    >>> p = np.polynomial.Polynomial(p1d.coef[::-1])
    
In addition to the `coef` attribute, polynomials from the polynomial package also have `domain` and `window` attributes. These attributes are most relevant when fitting polynomials to data, though it should be noted that polynomials with different `domain` and `window` attributes are not considered equal, and can’t be mixed in arithmetic:
    
    >>> p1 = np.polynomial.Polynomial([1, 2, 3])
    >>> p1
    Polynomial([1., 2., 3.], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    >>> p2 = np.polynomial.Polynomial([1, 2, 3], domain=[-2, 2])
    >>> p1 == p2
    False
    >>> p1 + p2
    Traceback (most recent call last):
        ...
    TypeError: Domains differ
    
See the documentation for the convenience classes for further details on the `domain` and `window` attributes.
Another major difference between the legacy polynomial module and the polynomial package is polynomial fitting. In the old module, fitting was done via the `polyfit` function. In the polynomial package, the `fit` class method is preferred. For example, consider a simple linear fit to the following data:
    
    In [1]: rng = np.random.default_rng()
    
    In [2]: x = np.arange(10)
    
    In [3]: y = np.arange(10) + rng.standard_normal(10)
    
With the legacy polynomial module, a linear fit (i.e. polynomial of degree 1) could be applied to these data with `polyfit`:
    
    In [4]: np.polyfit(x, y, deg=1)
    Out[4]: array([ 1.05733523, -0.04871142])
    
With the new polynomial API, the `fit` class method is preferred:
    
    In [5]: p_fitted = np.polynomial.Polynomial.fit(x, y, deg=1)
    
    In [6]: p_fitted
    Out[6]: Polynomial([4.70929711, 4.75800853], domain=[0., 9.], window=[-1.,  1.], symbol='x')
    
Note that the coefficients are given in the scaled domain defined by the linear mapping between the `window` and `domain`. `convert` can be used to get the coefficients in the unscaled data domain.
    
    In [7]: p_fitted.convert()
    Out[7]: Polynomial([-0.04871142,  1.05733523], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')
    
## Documentation for the polynomial package
In addition to standard power series polynomials, the polynomial package provides several additional kinds of polynomials including Chebyshev, Hermite (two subtypes), Laguerre, and Legendre polynomials. Each of these has an associated `convenience class` available from the `numpy.polynomial` namespace that provides a consistent interface for working with polynomials regardless of their type.
  * Using the convenience classes


Documentation pertaining to specific functions defined for each kind of polynomial individually can be found in the corresponding module documentation:
  * Power Series (`numpy.polynomial.polynomial`)
  * Chebyshev Series (`numpy.polynomial.chebyshev`)
  * Hermite Series, “Physicists” (`numpy.polynomial.hermite`)
  * HermiteE Series, “Probabilists” (`numpy.polynomial.hermite_e`)
  * Laguerre Series (`numpy.polynomial.laguerre`)
  * Legendre Series (`numpy.polynomial.legendre`)
  * Polyutils


## Documentation for legacy polynomials
  * Poly1d
    * Basics
    * Fitting
    * Calculus
    * Arithmetic


# Laguerre Series (numpy.polynomial.laguerre)
This module provides a number of objects (mostly functions) useful for dealing with Laguerre series, including a `Laguerre` class that encapsulates the usual arithmetic operations. (General information on how this module represents and works with such polynomials is in the docstring for its “parent” sub-package, `numpy.polynomial`).
## Classes
`Laguerre`(coef[, domain, window, symbol])
A Laguerre series class.  
## Constants
`lagdomain`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`lagzero`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`lagone`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`lagx`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Arithmetic
`lagadd`(c1, c2)
Add one Laguerre series to another.  
`lagsub`(c1, c2)
Subtract one Laguerre series from another.  
`lagmulx`(c)
Multiply a Laguerre series by x.  
`lagmul`(c1, c2)
Multiply one Laguerre series by another.  
`lagdiv`(c1, c2)
Divide one Laguerre series by another.  
`lagpow`(c, pow[, maxpower])
Raise a Laguerre series to a power.  
`lagval`(x, c[, tensor])
Evaluate a Laguerre series at points x.  
`lagval2d`(x, y, c)
Evaluate a 2-D Laguerre series at points (x, y).  
`lagval3d`(x, y, z, c)
Evaluate a 3-D Laguerre series at points (x, y, z).  
`laggrid2d`(x, y, c)
Evaluate a 2-D Laguerre series on the Cartesian product of x and y.  
`laggrid3d`(x, y, z, c)
Evaluate a 3-D Laguerre series on the Cartesian product of x, y, and z.  
## Calculus
`lagder`(c[, m, scl, axis])
Differentiate a Laguerre series.  
`lagint`(c[, m, k, lbnd, scl, axis])
Integrate a Laguerre series.  
## Misc Functions
`lagfromroots`(roots)
Generate a Laguerre series with given roots.  
`lagroots`(c)
Compute the roots of a Laguerre series.  
`lagvander`(x, deg)
Pseudo-Vandermonde matrix of given degree.  
`lagvander2d`(x, y, deg)
Pseudo-Vandermonde matrix of given degrees.  
`lagvander3d`(x, y, z, deg)
Pseudo-Vandermonde matrix of given degrees.  
`laggauss`(deg)
Gauss-Laguerre quadrature.  
`lagweight`(x)
Weight function of the Laguerre polynomials.  
`lagcompanion`(c)
Return the companion matrix of c.  
`lagfit`(x, y, deg[, rcond, full, w])
Least squares fit of Laguerre series to data.  
`lagtrim`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`lagline`(off, scl)
Laguerre series whose graph is a straight line.  
`lag2poly`(c)
Convert a Laguerre series to a polynomial.  
`poly2lag`(pol)
Convert a polynomial to a Laguerre series.  
## See also
`numpy.polynomial`
# Legendre Series (numpy.polynomial.legendre)
This module provides a number of objects (mostly functions) useful for dealing with Legendre series, including a `Legendre` class that encapsulates the usual arithmetic operations. (General information on how this module represents and works with such polynomials is in the docstring for its “parent” sub-package, `numpy.polynomial`).
## Classes
`Legendre`(coef[, domain, window, symbol])
A Legendre series class.  
## Constants
`legdomain`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`legzero`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`legone`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`legx`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Arithmetic
`legadd`(c1, c2)
Add one Legendre series to another.  
`legsub`(c1, c2)
Subtract one Legendre series from another.  
`legmulx`(c)
Multiply a Legendre series by x.  
`legmul`(c1, c2)
Multiply one Legendre series by another.  
`legdiv`(c1, c2)
Divide one Legendre series by another.  
`legpow`(c, pow[, maxpower])
Raise a Legendre series to a power.  
`legval`(x, c[, tensor])
Evaluate a Legendre series at points x.  
`legval2d`(x, y, c)
Evaluate a 2-D Legendre series at points (x, y).  
`legval3d`(x, y, z, c)
Evaluate a 3-D Legendre series at points (x, y, z).  
`leggrid2d`(x, y, c)
Evaluate a 2-D Legendre series on the Cartesian product of x and y.  
`leggrid3d`(x, y, z, c)
Evaluate a 3-D Legendre series on the Cartesian product of x, y, and z.  
## Calculus
`legder`(c[, m, scl, axis])
Differentiate a Legendre series.  
`legint`(c[, m, k, lbnd, scl, axis])
Integrate a Legendre series.  
## Misc Functions
`legfromroots`(roots)
Generate a Legendre series with given roots.  
`legroots`(c)
Compute the roots of a Legendre series.  
`legvander`(x, deg)
Pseudo-Vandermonde matrix of given degree.  
`legvander2d`(x, y, deg)
Pseudo-Vandermonde matrix of given degrees.  
`legvander3d`(x, y, z, deg)
Pseudo-Vandermonde matrix of given degrees.  
`leggauss`(deg)
Gauss-Legendre quadrature.  
`legweight`(x)
Weight function of the Legendre polynomials.  
`legcompanion`(c)
Return the scaled companion matrix of c.  
`legfit`(x, y, deg[, rcond, full, w])
Least squares fit of Legendre series to data.  
`legtrim`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`legline`(off, scl)
Legendre series whose graph is a straight line.  
`leg2poly`(c)
Convert a Legendre series to a polynomial.  
`poly2leg`(pol)
Convert a polynomial to a Legendre series.  
## See also
numpy.polynomial
# Poly1d
## Basics
`poly1d`(c_or_r[, r, variable])
A one-dimensional polynomial class.  
`polyval`(p, x)
Evaluate a polynomial at specific values.  
`poly`(seq_of_zeros)
Find the coefficients of a polynomial with the given sequence of roots.  
`roots`(p)
Return the roots of a polynomial with coefficients given in p.  
## Fitting
`polyfit`(x, y, deg[, rcond, full, w, cov])
Least squares polynomial fit.  
## Calculus
`polyder`(p[, m])
Return the derivative of the specified order of a polynomial.  
`polyint`(p[, m, k])
Return an antiderivative (indefinite integral) of a polynomial.  
## Arithmetic
`polyadd`(a1, a2)
Find the sum of two polynomials.  
`polydiv`(u, v)
Returns the quotient and remainder of polynomial division.  
`polymul`(a1, a2)
Find the product of two polynomials.  
`polysub`(a1, a2)
Difference (subtraction) of two polynomials.  
# Power Series (numpy.polynomial.polynomial)
This module provides a number of objects (mostly functions) useful for dealing with polynomials, including a `Polynomial` class that encapsulates the usual arithmetic operations. (General information on how this module represents and works with polynomial objects is in the docstring for its “parent” sub-package, `numpy.polynomial`).
## Classes
`Polynomial`(coef[, domain, window, symbol])
A power series class.  
## Constants
`polydomain`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`polyzero`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`polyone`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
`polyx`
An array object represents a multidimensional, homogeneous array of fixed-size items.  
## Arithmetic
`polyadd`(c1, c2)
Add one polynomial to another.  
`polysub`(c1, c2)
Subtract one polynomial from another.  
`polymulx`(c)
Multiply a polynomial by x.  
`polymul`(c1, c2)
Multiply one polynomial by another.  
`polydiv`(c1, c2)
Divide one polynomial by another.  
`polypow`(c, pow[, maxpower])
Raise a polynomial to a power.  
`polyval`(x, c[, tensor])
Evaluate a polynomial at points x.  
`polyval2d`(x, y, c)
Evaluate a 2-D polynomial at points (x, y).  
`polyval3d`(x, y, z, c)
Evaluate a 3-D polynomial at points (x, y, z).  
`polygrid2d`(x, y, c)
Evaluate a 2-D polynomial on the Cartesian product of x and y.  
`polygrid3d`(x, y, z, c)
Evaluate a 3-D polynomial on the Cartesian product of x, y and z.  
## Calculus
`polyder`(c[, m, scl, axis])
Differentiate a polynomial.  
`polyint`(c[, m, k, lbnd, scl, axis])
Integrate a polynomial.  
## Misc Functions
`polyfromroots`(roots)
Generate a monic polynomial with given roots.  
`polyroots`(c)
Compute the roots of a polynomial.  
`polyvalfromroots`(x, r[, tensor])
Evaluate a polynomial specified by its roots at points x.  
`polyvander`(x, deg)
Vandermonde matrix of given degree.  
`polyvander2d`(x, y, deg)
Pseudo-Vandermonde matrix of given degrees.  
`polyvander3d`(x, y, z, deg)
Pseudo-Vandermonde matrix of given degrees.  
`polycompanion`(c)
Return the companion matrix of c.  
`polyfit`(x, y, deg[, rcond, full, w])
Least-squares fit of a polynomial to data.  
`polytrim`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`polyline`(off, scl)
Returns an array representing a linear polynomial.  
## See Also
`numpy.polynomial`
# Polyutils
Utility classes and functions for the polynomial modules.
This module provides: error and warning objects; a polynomial base class; and some routines used in both the `polynomial` and `chebyshev` modules.
## Functions
`as_series`(alist[, trim])
Return argument as a list of 1-d arrays.  
`trimseq`(seq)
Remove small Poly series coefficients.  
`trimcoef`(c[, tol])
Remove "small" "trailing" coefficients from a polynomial.  
`getdomain`(x)
Return a domain suitable for given abscissae.  
`mapdomain`(x, old, new)
Apply linear map to input points.  
`mapparms`(old, new)
Linear map parameters between domains.  
# Record Arrays (numpy.rec)
Record arrays expose the fields of structured arrays as properties.
Most commonly, ndarrays contain elements of a single type, e.g. floats, integers, bools etc. However, it is possible for elements to be combinations of these using structured types, such as:
    
    >>> import numpy as np
    >>> a = np.array([(1, 2.0), (1, 2.0)],
    ...     dtype=[('x', np.int64), ('y', np.float64)])
    >>> a
    array([(1, 2.), (1, 2.)], dtype=[('x', '<i8'), ('y', '<f8')])
    
Here, each element consists of two fields: x (and int), and y (a float). This is known as a structured array. The different fields are analogous to columns in a spread-sheet. The different fields can be accessed as one would a dictionary:
    
    >>> a['x']
    array([1, 1])
    
    
    >>> a['y']
    array([2., 2.])
    
Record arrays allow us to access fields as properties:
    
    >>> ar = np.rec.array(a)
    >>> ar.x
    array([1, 1])
    >>> ar.y
    array([2., 2.])
    
## Functions
`array`(obj[, dtype, shape, offset, strides, ...])
Construct a record array from a wide-variety of objects.  
`find_duplicate`(list)
Find duplication in a list, return a list of duplicated elements  
`format_parser`(formats, names, titles[, ...])
Class to convert formats, names, titles description to a dtype.  
`fromarrays`(arrayList[, dtype, shape, ...])
Create a record array from a (flat) list of arrays  
`fromfile`(fd[, dtype, shape, offset, ...])
Create an array from binary file data  
`fromrecords`(recList[, dtype, shape, ...])
Create a recarray from a list of records in text form.  
`fromstring`(datastring[, dtype, shape, ...])
Create a record array from binary data  
Also, the `numpy.recarray` class and the `numpy.record` scalar dtype are present in this namespace.
# Set routines
## Making proper sets
`unique`(ar[, return_index, return_inverse, ...])
Find the unique elements of an array.  
`unique_all`(x)
Find the unique elements of an array, and counts, inverse, and indices.  
`unique_counts`(x)
Find the unique elements and counts of an input array `x`.  
`unique_inverse`(x)
Find the unique elements of `x` and indices to reconstruct `x`.  
`unique_values`(x)
Returns the unique elements of an input array `x`.  
## Boolean operations
`in1d`(ar1, ar2[, assume_unique, invert, kind])
Test whether each element of a 1-D array is also present in a second array.  
`intersect1d`(ar1, ar2[, assume_unique, ...])
Find the intersection of two arrays.  
`isin`(element, test_elements[, ...])
Calculates `element in test_elements`, broadcasting over `element` only.  
`setdiff1d`(ar1, ar2[, assume_unique])
Find the set difference of two arrays.  
`setxor1d`(ar1, ar2[, assume_unique])
Find the set exclusive-or of two arrays.  
`union1d`(ar1, ar2)
Find the union of two arrays.  
# Sorting, searching, and counting
## Sorting
`sort`(a[, axis, kind, order, stable])
Return a sorted copy of an array.  
`lexsort`(keys[, axis])
Perform an indirect stable sort using a sequence of keys.  
`argsort`(a[, axis, kind, order, stable])
Returns the indices that would sort an array.  
`ndarray.sort`([axis, kind, order])
Sort an array in-place.  
`sort_complex`(a)
Sort a complex array using the real part first, then the imaginary part.  
`partition`(a, kth[, axis, kind, order])
Return a partitioned copy of an array.  
`argpartition`(a, kth[, axis, kind, order])
Perform an indirect partition along the given axis using the algorithm specified by the `kind` keyword.  
## Searching
`argmax`(a[, axis, out, keepdims])
Returns the indices of the maximum values along an axis.  
`nanargmax`(a[, axis, out, keepdims])
Return the indices of the maximum values in the specified axis ignoring NaNs.  
`argmin`(a[, axis, out, keepdims])
Returns the indices of the minimum values along an axis.  
`nanargmin`(a[, axis, out, keepdims])
Return the indices of the minimum values in the specified axis ignoring NaNs.  
`argwhere`(a)
Find the indices of array elements that are non-zero, grouped by element.  
`nonzero`(a)
Return the indices of the elements that are non-zero.  
`flatnonzero`(a)
Return indices that are non-zero in the flattened version of a.  
`where`(condition, [x, y], /)
Return elements chosen from `x` or `y` depending on `condition`.  
`searchsorted`(a, v[, side, sorter])
Find indices where elements should be inserted to maintain order.  
`extract`(condition, arr)
Return the elements of an array that satisfy some condition.  
## Counting
`count_nonzero`(a[, axis, keepdims])
Counts the number of non-zero values in the array `a`.  
# Statistics
## Order statistics
`ptp`(a[, axis, out, keepdims])
Range of values (maximum - minimum) along an axis.  
`percentile`(a, q[, axis, out, ...])
Compute the q-th percentile of the data along the specified axis.  
`nanpercentile`(a, q[, axis, out, ...])
Compute the qth percentile of the data along the specified axis, while ignoring nan values.  
`quantile`(a, q[, axis, out, overwrite_input, ...])
Compute the q-th quantile of the data along the specified axis.  
`nanquantile`(a, q[, axis, out, ...])
Compute the qth quantile of the data along the specified axis, while ignoring nan values.  
## Averages and variances
`median`(a[, axis, out, overwrite_input, keepdims])
Compute the median along the specified axis.  
`average`(a[, axis, weights, returned, keepdims])
Compute the weighted average along the specified axis.  
`mean`(a[, axis, dtype, out, keepdims, where])
Compute the arithmetic mean along the specified axis.  
`std`(a[, axis, dtype, out, ddof, keepdims, ...])
Compute the standard deviation along the specified axis.  
`var`(a[, axis, dtype, out, ddof, keepdims, ...])
Compute the variance along the specified axis.  
`nanmedian`(a[, axis, out, overwrite_input, ...])
Compute the median along the specified axis, while ignoring NaNs.  
`nanmean`(a[, axis, dtype, out, keepdims, where])
Compute the arithmetic mean along the specified axis, ignoring NaNs.  
`nanstd`(a[, axis, dtype, out, ddof, ...])
Compute the standard deviation along the specified axis, while ignoring NaNs.  
`nanvar`(a[, axis, dtype, out, ddof, ...])
Compute the variance along the specified axis, while ignoring NaNs.  
## Correlating
`corrcoef`(x[, y, rowvar, bias, ddof, dtype])
Return Pearson product-moment correlation coefficients.  
`correlate`(a, v[, mode])
Cross-correlation of two 1-dimensional sequences.  
`cov`(m[, y, rowvar, bias, ddof, fweights, ...])
Estimate a covariance matrix, given data and weights.  
## Histograms
`histogram`(a[, bins, range, density, weights])
Compute the histogram of a dataset.  
`histogram2d`(x, y[, bins, range, density, ...])
Compute the bi-dimensional histogram of two data samples.  
`histogramdd`(sample[, bins, range, density, ...])
Compute the multidimensional histogram of some data.  
`bincount`(x, /[, weights, minlength])
Count number of occurrences of each value in array of non-negative ints.  
`histogram_bin_edges`(a[, bins, range, weights])
Function to calculate only the edges of the bins used by the `histogram` function.  
`digitize`(x, bins[, right])
Return the indices of the bins to which each value in input array belongs.  
# String functionality
The `numpy.strings` module provides a set of universal functions operating on arrays of type `numpy.str_` or `numpy.bytes_`. For example
    
    >>> np.strings.add(["num", "doc"], ["py", "umentation"])
    array(['numpy', 'documentation'], dtype='<U13')
    
These universal functions are also used in `numpy.char`, which provides the `numpy.char.chararray` array subclass, in order for those routines to get the performance benefits as well.
Note
Prior to NumPy 2.0, all string functionality was in `numpy.char`, which only operated on fixed-width strings. That module will not be getting updates and will be deprecated at some point in the future.
## String operations
`add`(x1, x2, /[, out, where, casting, order, ...])
Add arguments element-wise.  
`center`(a, width[, fillchar])
Return a copy of `a` with its elements centered in a string of length `width`.  
`capitalize`(a)
Return a copy of `a` with only the first character of each element capitalized.  
`decode`(a[, encoding, errors])
Calls `bytes.decode` element-wise.  
`encode`(a[, encoding, errors])
Calls `str.encode` element-wise.  
`expandtabs`(a[, tabsize])
Return a copy of each string element where all tab characters are replaced by one or more spaces.  
`ljust`(a, width[, fillchar])
Return an array with the elements of `a` left-justified in a string of length `width`.  
`lower`(a)
Return an array with the elements converted to lowercase.  
`lstrip`(a[, chars])
For each element in `a`, return a copy with the leading characters removed.  
`mod`(a, values)
Return (a % i), that is pre-Python 2.6 string formatting (interpolation), element-wise for a pair of array_likes of str or unicode.  
`multiply`(a, i)
Return (a * i), that is string multiple concatenation, element-wise.  
`partition`(a, sep)
Partition each element in `a` around `sep`.  
`replace`(a, old, new[, count])
For each element in `a`, return a copy of the string with occurrences of substring `old` replaced by `new`.  
`rjust`(a, width[, fillchar])
Return an array with the elements of `a` right-justified in a string of length `width`.  
`rpartition`(a, sep)
Partition (split) each element around the right-most separator.  
`rstrip`(a[, chars])
For each element in `a`, return a copy with the trailing characters removed.  
`strip`(a[, chars])
For each element in `a`, return a copy with the leading and trailing characters removed.  
`swapcase`(a)
Return element-wise a copy of the string with uppercase characters converted to lowercase and vice versa.  
`title`(a)
Return element-wise title cased version of string or unicode.  
`translate`(a, table[, deletechars])
For each element in `a`, return a copy of the string where all characters occurring in the optional argument `deletechars` are removed, and the remaining characters have been mapped through the given translation table.  
`upper`(a)
Return an array with the elements converted to uppercase.  
`zfill`(a, width)
Return the numeric string left-filled with zeros.  
## Comparison
The `numpy.strings` module also exports the comparison universal functions that can now operate on string arrays as well.
`equal`(x1, x2, /[, out, where, casting, ...])
Return (x1 == x2) element-wise.  
`not_equal`(x1, x2, /[, out, where, casting, ...])
Return (x1 != x2) element-wise.  
`greater_equal`(x1, x2, /[, out, where, ...])
Return the truth value of (x1 >= x2) element-wise.  
`less_equal`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 <= x2) element-wise.  
`greater`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 > x2) element-wise.  
`less`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 < x2) element-wise.  
## String information
`count`(a, sub[, start, end])
Returns an array with the number of non-overlapping occurrences of substring `sub` in the range [`start`, `end`).  
`endswith`(a, suffix[, start, end])
Returns a boolean array which is `True` where the string element in `a` ends with `suffix`, otherwise `False`.  
`find`(a, sub[, start, end])
For each element, return the lowest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).  
`index`(a, sub[, start, end])
Like `find`, but raises `ValueError` when the substring is not found.  
`isalnum`(x, /[, out, where, casting, order, ...])
Returns true for each element if all characters in the string are alphanumeric and there is at least one character, false otherwise.  
`isalpha`(x, /[, out, where, casting, order, ...])
Returns true for each element if all characters in the data interpreted as a string are alphabetic and there is at least one character, false otherwise.  
`isdecimal`(x, /[, out, where, casting, ...])
For each element, return True if there are only decimal characters in the element.  
`isdigit`(x, /[, out, where, casting, order, ...])
Returns true for each element if all characters in the string are digits and there is at least one character, false otherwise.  
`islower`(x, /[, out, where, casting, order, ...])
Returns true for each element if all cased characters in the string are lowercase and there is at least one cased character, false otherwise.  
`isnumeric`(x, /[, out, where, casting, ...])
For each element, return True if there are only numeric characters in the element.  
`isspace`(x, /[, out, where, casting, order, ...])
Returns true for each element if there are only whitespace characters in the string and there is at least one character, false otherwise.  
`istitle`(x, /[, out, where, casting, order, ...])
Returns true for each element if the element is a titlecased string and there is at least one character, false otherwise.  
`isupper`(x, /[, out, where, casting, order, ...])
Return true for each element if all cased characters in the string are uppercase and there is at least one character, false otherwise.  
`rfind`(a, sub[, start, end])
For each element, return the highest index in the string where substring `sub` is found, such that `sub` is contained in the range [`start`, `end`).  
`rindex`(a, sub[, start, end])
Like `rfind`, but raises `ValueError` when the substring `sub` is not found.  
`startswith`(a, prefix[, start, end])
Returns a boolean array which is `True` where the string element in `a` starts with `prefix`, otherwise `False`.  
`str_len`(x, /[, out, where, casting, order, ...])
Returns the length of each element.  
# Test support (numpy.testing)
Common test support for all numpy test scripts.
This single module should provide all the common functionality for numpy tests in a single location, so that test scripts can just import it and work right away. For background, see the Testing guidelines
## Asserts
`assert_allclose`(actual, desired[, rtol, ...])
Raises an AssertionError if two objects are not equal up to desired tolerance.  
`assert_array_almost_equal_nulp`(x, y[, nulp])
Compare two arrays relatively to their spacing.  
`assert_array_max_ulp`(a, b[, maxulp, dtype])
Check that all items of arrays differ in at most N Units in the Last Place.  
`assert_array_equal`(actual, desired[, ...])
Raises an AssertionError if two array_like objects are not equal.  
`assert_array_less`(x, y[, err_msg, verbose, ...])
Raises an AssertionError if two array_like objects are not ordered by less than.  
`assert_equal`(actual, desired[, err_msg, ...])
Raises an AssertionError if two objects are not equal.  
`assert_raises`(assert_raises)
Fail unless an exception of class exception_class is thrown by callable when invoked with arguments args and keyword arguments kwargs.  
`assert_raises_regex`(exception_class, ...)
Fail unless an exception of class exception_class and with message that matches expected_regexp is thrown by callable when invoked with arguments args and keyword arguments kwargs.  
`assert_warns`(warning_class, *args, **kwargs)
Fail unless the given callable throws the specified warning.  
`assert_no_warnings`(*args, **kwargs)
Fail if the given callable produces any warnings.  
`assert_no_gc_cycles`(*args, **kwargs)
Fail if the given callable produces any reference cycles.  
`assert_string_equal`(actual, desired)
Test if two strings are equal.  
## Asserts (not recommended)
It is recommended to use one of `assert_allclose`, `assert_array_almost_equal_nulp` or `assert_array_max_ulp` instead of these functions for more consistent floating point comparisons.
`assert_`(val[, msg])
Assert that works in release mode.  
`assert_almost_equal`(actual, desired[, ...])
Raises an AssertionError if two items are not equal up to desired precision.  
`assert_approx_equal`(actual, desired[, ...])
Raises an AssertionError if two items are not equal up to significant digits.  
`assert_array_almost_equal`(actual, desired[, ...])
Raises an AssertionError if two objects are not equal up to desired precision.  
`print_assert_equal`(test_string, actual, desired)
Test if two objects are equal, and print an error message if test fails.  
## Decorators
`decorate_methods`(cls, decorator[, testmatch])
Apply a decorator to all methods in a class matching a regular expression.  
## Test running
`clear_and_catch_warnings`([record, modules])
Context manager that resets warning registry for catching warnings  
`measure`(code_str[, times, label])
Return elapsed time for executing code in the namespace of the caller.  
`rundocs`([filename, raise_on_error])
Run doctests found in the given file.  
`suppress_warnings`([forwarding_rule])
Context manager and decorator doing much the same as `warnings.catch_warnings`.  
## Testing custom array containers (numpy.testing.overrides)
These functions can be useful when testing custom array container implementations which make use of `__array_ufunc__`/`__array_function__`.
`allows_array_function_override`(func)
Determine if a Numpy function can be overridden via `__array_function__`  
`allows_array_ufunc_override`(func)
Determine if a function can be overridden via `__array_ufunc__`  
`get_overridable_numpy_ufuncs`()
List all numpy ufuncs overridable via `__array_ufunc__`  
`get_overridable_numpy_array_functions`()
List all numpy functions overridable via `__array_function__`  
## Guidelines
  * Testing guidelines
    * Introduction
    * Testing NumPy
      * Running tests from inside Python
      * Running tests from the command line
      * Running doctests
      * Other methods of running tests
    * Writing your own tests
      * Using C code in tests
        * `build_and_import_extension`
      * Labeling tests
      * Easier setup and teardown functions / methods
      * Parametric tests
      * Doctests
      * `tests/`
      * `__init__.py` and `setup.py`
    * Tips & Tricks
      * Known failures & skipping tests
      * Tests on random data
      * Documentation for `numpy.test`
        * `test`


# Version information
The `numpy.version` submodule includes several constants that expose more detailed information about the exact version of the installed `numpy` package:
numpy.version.version
    
Version string for the installed package - matches `numpy.__version__`.
numpy.version.full_version
    
Version string - the same as `numpy.version.version`.
numpy.version.short_version
    
Version string without any local build identifiers.
#### Examples
    
    >>> np.__version__
    '2.1.0.dev0+git20240319.2ea7ce0'  # may vary
    >>> np.version.short_version
    '2.1.0.dev0'  # may vary
    
numpy.version.git_revision
    
String containing the git hash of the commit from which `numpy` was built.
numpy.version.release
    
`True` if this version is a `numpy` release, `False` if a dev version.
# Window functions
## Various windows
`bartlett`(M)
Return the Bartlett window.  
`blackman`(M)
Return the Blackman window.  
`hamming`(M)
Return the Hamming window.  
`hanning`(M)
Return the Hanning window.  
`kaiser`(M, beta)
Return the Kaiser window.  
# NumPy security
Security issues can be reported privately as described in the project README and when opening a new issue on the issue tracker. The Python security reporting guidelines are a good resource and its notes apply also to NumPy.
NumPy’s maintainers are not security experts. However, we are conscientious about security and experts of both the NumPy codebase and how it’s used. Please do notify us before creating security advisories against NumPy as we are happy to prioritize issues or help with assessing the severity of a bug. A security advisory we are not aware of beforehand can lead to a lot of work for all involved parties.
## Advice for using NumPy on untrusted data
A user who can freely execute NumPy (or Python) functions must be considered to have the same privilege as the process/Python interpreter.
That said, NumPy should be generally safe to use on data provided by unprivileged users and read through safe API functions (e.g. loaded from a text file or `.npy` file without pickle support). Malicious values or data sizes should never lead to privilege escalation. Note that the above refers to array data. We do not currently consider for example `f2py` to be safe: it is typically used to compile a program that is then run. Any `f2py` invocation must thus use the same privilege as the later execution.
The following points may be useful or should be noted when working with untrusted data:
  * Exhausting memory can result in an out-of-memory kill, which is a possible denial of service attack. Possible causes could be:
    * Functions reading text files, which may require much more memory than the original input file size.
    * If users can create arbitrarily shaped arrays, NumPy’s broadcasting means that intermediate or result arrays can be much larger than the inputs.
  * NumPy structured dtypes allow for a large amount of complexity. Fortunately, most code fails gracefully when a structured dtype is provided unexpectedly. However, code should either disallow untrusted users to provide these (e.g. via `.npy` files) or carefully check the fields included for nested structured/subarray dtypes.
  * Passing on user input should generally be considered unsafe (except for the data being read). An example would be `np.dtype(user_string)` or `dtype=user_string`.
  * The speed of operations can depend on values and memory order can lead to larger temporary memory use and slower execution. This means that operations may be significantly slower or use more memory compared to simple test cases.
  * When reading data, consider enforcing a specific shape (e.g. one dimensional) or dtype such as `float64`, `float32`, or `int64` to reduce complexity.


When working with non-trivial untrusted data, it is advisable to sandbox the analysis to guard against potential privilege escalation. This is especially advisable if further libraries based on NumPy are used since these add additional complexity and potential security issues.
# CPU build options
## Description
The following options are mainly used to change the default behavior of optimizations that target certain CPU features:
  * `cpu-baseline`: minimal set of required CPU features.
    
Default value is `min` which provides the minimum CPU features that can safely run on a wide range of platforms within the processor family.
Note
During the runtime, NumPy modules will fail to load if any of specified features are not supported by the target CPU (raises Python runtime error).
  * `cpu-dispatch`: dispatched set of additional CPU features.
    
Default value is `max -xop -fma4` which enables all CPU features, except for AMD legacy features (in case of X86).
Note
During the runtime, NumPy modules will skip any specified features that are not available in the target CPU.


These options are accessible at build time by passing setup arguments to meson-python via the build frontend (e.g., `pip` or `build`). They accept a set of CPU features or groups of features that gather several features or special options that perform a series of procedures.
To customize CPU/build options:
    
    pip install . -Csetup-args=-Dcpu-baseline="avx2 fma3" -Csetup-args=-Dcpu-dispatch="max"
    
## Quick start
In general, the default settings tend to not impose certain CPU features that may not be available on some older processors. Raising the ceiling of the baseline features will often improve performance and may also reduce binary size.
The following are the most common scenarios that may require changing the default settings:
### I am building NumPy for my local use
And I do not intend to export the build to other users or target a different CPU than what the host has.
Set `native` for baseline, or manually specify the CPU features in case of option `native` isn’t supported by your platform:
    
    python -m build --wheel -Csetup-args=-Dcpu-baseline="native"
    
Building NumPy with extra CPU features isn’t necessary for this case, since all supported features are already defined within the baseline features:
    
    python -m build --wheel -Csetup-args=-Dcpu-baseline="native" \
    -Csetup-args=-Dcpu-dispatch="none"
    
Note
A fatal error will be raised if `native` isn’t supported by the host platform.
### I do not want to support the old processors of the x86 architecture
Since most of the CPUs nowadays support at least `AVX`, `F16C` features, you can use:
    
    python -m build --wheel -Csetup-args=-Dcpu-baseline="avx f16c"
    
Note
`cpu-baseline` force combine all implied features, so there’s no need to add SSE features.
### I’m facing the same case above but with ppc64 architecture
Then raise the ceiling of the baseline features to Power8:
    
    python -m build --wheel -Csetup-args=-Dcpu-baseline="vsx2"
    
### Having issues with AVX512 features?
You may have some reservations about including of `AVX512` or any other CPU feature and you want to exclude from the dispatched features:
    
    python -m build --wheel -Csetup-args=-Dcpu-dispatch="max -avx512f -avx512cd \
    -avx512_knl -avx512_knm -avx512_skx -avx512_clx -avx512_cnl -avx512_icl"
    
## Supported features
The names of the features can express one feature or a group of features, as shown in the following tables supported depend on the lowest interest:
Note
The following features may not be supported by all compilers, also some compilers may produce different set of implied features when it comes to features like `AVX512`, `AVX2`, and `FMA3`. See Platform differences for more details.
### On x86
Name
Implies
Gathers  
`SSE`
`SSE2`  
`SSE2`
`SSE`  
`SSE3`
`SSE` `SSE2`  
`SSSE3`
`SSE` `SSE2` `SSE3`  
`SSE41`
`SSE` `SSE2` `SSE3` `SSSE3`  
`POPCNT`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41`  
`SSE42`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT`  
`AVX`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42`  
`XOP`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX`  
`FMA4`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX`  
`F16C`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX`  
`FMA3`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C`  
`AVX2`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C`  
`AVX512F`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2`  
`AVX512CD`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F`  
`AVX512_KNL`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD`
`AVX512ER` `AVX512PF`  
`AVX512_KNM`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD` `AVX512_KNL`
`AVX5124FMAPS` `AVX5124VNNIW` `AVX512VPOPCNTDQ`  
`AVX512_SKX`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD`
`AVX512VL` `AVX512BW` `AVX512DQ`  
`AVX512_CLX`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD` `AVX512_SKX`
`AVX512VNNI`  
`AVX512_CNL`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD` `AVX512_SKX`
`AVX512IFMA` `AVX512VBMI`  
`AVX512_ICL`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD` `AVX512_SKX` `AVX512_CLX` `AVX512_CNL`
`AVX512VBMI2` `AVX512BITALG` `AVX512VPOPCNTDQ`  
`AVX512_SPR`
`SSE` `SSE2` `SSE3` `SSSE3` `SSE41` `POPCNT` `SSE42` `AVX` `F16C` `FMA3` `AVX2` `AVX512F` `AVX512CD` `AVX512_SKX` `AVX512_CLX` `AVX512_CNL` `AVX512_ICL`
`AVX512FP16`  
### On IBM/POWER big-endian
Name
Implies  
`VSX`  
`VSX2`
`VSX`  
`VSX3`
`VSX` `VSX2`  
`VSX4`
`VSX` `VSX2` `VSX3`  
### On IBM/POWER little-endian
Name
Implies  
`VSX`
`VSX2`  
`VSX2`
`VSX`  
`VSX3`
`VSX` `VSX2`  
`VSX4`
`VSX` `VSX2` `VSX3`  
### On ARMv7/A32
Name
Implies  
`NEON`  
`NEON_FP16`
`NEON`  
`NEON_VFPV4`
`NEON` `NEON_FP16`  
`ASIMD`
`NEON` `NEON_FP16` `NEON_VFPV4`  
`ASIMDHP`
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD`  
`ASIMDDP`
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD`  
`ASIMDFHM`
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD` `ASIMDHP`  
### On ARMv8/A64
Name
Implies  
`NEON`
`NEON_FP16` `NEON_VFPV4` `ASIMD`  
`NEON_FP16`
`NEON` `NEON_VFPV4` `ASIMD`  
`NEON_VFPV4`
`NEON` `NEON_FP16` `ASIMD`  
`ASIMD`
`NEON` `NEON_FP16` `NEON_VFPV4`  
`ASIMDHP`
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD`  
`ASIMDDP`
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD`  
`ASIMDFHM`
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD` `ASIMDHP`  
### On IBM/ZSYSTEM(S390X)
Name
Implies  
`VX`  
`VXE`
`VX`  
`VXE2`
`VX` `VXE`  
## Special options
  * `NONE`: enable no features.
  * `NATIVE`: Enables all CPU features that supported by the host CPU, this operation is based on the compiler flags (`-march=native`, `-xHost`, `/QxHost`)
  * `MIN`: Enables the minimum CPU features that can safely run on a wide range of platforms:
For Arch
Implies  
x86 (32-bit mode)
`SSE` `SSE2`  
x86_64
`SSE` `SSE2` `SSE3`  
IBM/POWER (big-endian mode)
`NONE`  
IBM/POWER (little-endian mode)
`VSX` `VSX2`  
ARMHF
`NONE`  
ARM64 A.K. AARCH64
`NEON` `NEON_FP16` `NEON_VFPV4` `ASIMD`  
IBM/ZSYSTEM(S390X)
`NONE`  
  * `MAX`: Enables all supported CPU features by the compiler and platform.
  * `Operators-/+`: remove or add features, useful with options `MAX`, `MIN` and `NATIVE`.


## Behaviors
  * CPU features and other options are case-insensitive, for example:
        python -m build --wheel -Csetup-args=-Dcpu-dispatch="SSE41 avx2 FMA3"
        
  * The order of the requested optimizations doesn’t matter:
        python -m build --wheel -Csetup-args=-Dcpu-dispatch="SSE41 AVX2 FMA3"
        # equivalent to
        python -m build --wheel -Csetup-args=-Dcpu-dispatch="FMA3 AVX2 SSE41"
        
  * Either commas or spaces or ‘+’ can be used as a separator, for example:
        python -m build --wheel -Csetup-args=-Dcpu-dispatch="avx2 avx512f"
        # or
        python -m build --wheel -Csetup-args=-Dcpu-dispatch=avx2,avx512f
        # or
        python -m build --wheel -Csetup-args=-Dcpu-dispatch="avx2+avx512f"
        
all works but arguments should be enclosed in quotes or escaped by backslash if any spaces are used.
  * `cpu-baseline` combines all implied CPU features, for example:
        python -m build --wheel -Csetup-args=-Dcpu-baseline=sse42
        # equivalent to
        python -m build --wheel -Csetup-args=-Dcpu-baseline="sse sse2 sse3 ssse3 sse41 popcnt sse42"
        
  * `cpu-baseline` will be treated as “native” if compiler native flag `-march=native` or `-xHost` or `/QxHost` is enabled through environment variable `CFLAGS`:
        export CFLAGS="-march=native"
        pip install .
        # is equivalent to
        pip install . -Csetup-args=-Dcpu-baseline=native
        
  * `cpu-baseline` escapes any specified features that aren’t supported by the target platform or compiler rather than raising fatal errors.
Note
Since `cpu-baseline` combines all implied features, the maximum supported of implied features will be enabled rather than escape all of them. For example:
        # Requesting `AVX2,FMA3` but the compiler only support **SSE** features
        python -m build --wheel -Csetup-args=-Dcpu-baseline="avx2 fma3"
        # is equivalent to
        python -m build --wheel -Csetup-args=-Dcpu-baseline="sse sse2 sse3 ssse3 sse41 popcnt sse42"
        
  * `cpu-dispatch` does not combine any of implied CPU features, so you must add them unless you want to disable one or all of them:
        # Only dispatches AVX2 and FMA3
        python -m build --wheel -Csetup-args=-Dcpu-dispatch=avx2,fma3
        # Dispatches AVX and SSE features
        python -m build --wheel -Csetup-args=-Dcpu-dispatch=ssse3,sse41,sse42,avx,avx2,fma3
        
  * `cpu-dispatch` escapes any specified baseline features and also escapes any features not supported by the target platform or compiler without raising fatal errors.


Eventually, you should always check the final report through the build log to verify the enabled features. See Build report for more details.
## Platform differences
Some exceptional conditions force us to link some features together when it come to certain compilers or architectures, resulting in the impossibility of building them separately.
These conditions can be divided into two parts, as follows:
Architectural compatibility
The need to align certain CPU features that are assured to be supported by successive generations of the same architecture, some cases:
  * On ppc64le `VSX(ISA 2.06)` and `VSX2(ISA 2.07)` both imply one another since the first generation that supports little-endian mode is Power-8`(ISA 2.07)`
  * On AArch64 `NEON NEON_FP16 NEON_VFPV4 ASIMD` implies each other since they are part of the hardware baseline.


For example:
    
    # On ARMv8/A64, specify NEON is going to enable Advanced SIMD
    # and all predecessor extensions
    python -m build --wheel -Csetup-args=-Dcpu-baseline=neon
    # which is equivalent to
    python -m build --wheel -Csetup-args=-Dcpu-baseline="neon neon_fp16 neon_vfpv4 asimd"
    
Note
Please take a deep look at Supported features, in order to determine the features that imply one another.
Compilation compatibility
Some compilers don’t provide independent support for all CPU features. For instance Intel’s compiler doesn’t provide separated flags for `AVX2` and `FMA3`, it makes sense since all Intel CPUs that comes with `AVX2` also support `FMA3`, but this approach is incompatible with other x86 CPUs from AMD or VIA.
For example:
    
    # Specify AVX2 will force enables FMA3 on Intel compilers
    python -m build --wheel -Csetup-args=-Dcpu-baseline=avx2
    # which is equivalent to
    python -m build --wheel -Csetup-args=-Dcpu-baseline="avx2 fma3"
    
The following tables only show the differences imposed by some compilers from the general context that been shown in the Supported features tables:
Note
Features names with strikeout represent the unsupported CPU features.
### On x86::Intel Compiler
Name
Implies
Gathers  
FMA3
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C AVX2  
AVX2
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3  
AVX512F
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512CD  
XOP
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX  
FMA4
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX  
AVX512_SPR
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD AVX512_SKX AVX512_CLX AVX512_CNL AVX512_ICL
AVX512FP16  
### On x86::Microsoft Visual C/C++
Name
Implies
Gathers  
FMA3
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C AVX2  
AVX2
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3  
AVX512F
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512CD AVX512_SKX  
AVX512CD
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512_SKX  
AVX512_KNL
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD
AVX512ER AVX512PF  
AVX512_KNM
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD AVX512_KNL
AVX5124FMAPS AVX5124VNNIW AVX512VPOPCNTDQ  
AVX512_SPR
SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD AVX512_SKX AVX512_CLX AVX512_CNL AVX512_ICL
AVX512FP16  
## Build report
In most cases, the CPU build options do not produce any fatal errors that lead to hanging the build. Most of the errors that may appear in the build log serve as heavy warnings due to the lack of some expected CPU features by the compiler.
So we strongly recommend checking the final report log, to be aware of what kind of CPU features are enabled and what are not.
You can find the final report of CPU optimizations at the end of the build log, and here is how it looks on x86_64/gcc:
    
    ########### EXT COMPILER OPTIMIZATION ###########
    Platform      :
      Architecture: x64
      Compiler    : gcc
    
    CPU baseline  :
      Requested   : 'min'
      Enabled     : SSE SSE2 SSE3
      Flags       : -msse -msse2 -msse3
      Extra checks: none
    
    CPU dispatch  :
      Requested   : 'max -xop -fma4'
      Enabled     : SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD AVX512_KNL AVX512_KNM AVX512_SKX AVX512_CLX AVX512_CNL AVX512_ICL
      Generated   :
                  :
      SSE41       : SSE SSE2 SSE3 SSSE3
      Flags       : -msse -msse2 -msse3 -mssse3 -msse4.1
      Extra checks: none
      Detect      : SSE SSE2 SSE3 SSSE3 SSE41
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_arithmetic.dispatch.c
                  : numpy/_core/src/umath/_umath_tests.dispatch.c
                  :
      SSE42       : SSE SSE2 SSE3 SSSE3 SSE41 POPCNT
      Flags       : -msse -msse2 -msse3 -mssse3 -msse4.1 -mpopcnt -msse4.2
      Extra checks: none
      Detect      : SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42
                  : build/src.linux-x86_64-3.9/numpy/_core/src/_simd/_simd.dispatch.c
                  :
      AVX2        : SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C
      Flags       : -msse -msse2 -msse3 -mssse3 -msse4.1 -mpopcnt -msse4.2 -mavx -mf16c -mavx2
      Extra checks: none
      Detect      : AVX F16C AVX2
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_arithm_fp.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_arithmetic.dispatch.c
                  : numpy/_core/src/umath/_umath_tests.dispatch.c
                  :
      (FMA3 AVX2) : SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C
      Flags       : -msse -msse2 -msse3 -mssse3 -msse4.1 -mpopcnt -msse4.2 -mavx -mf16c -mfma -mavx2
      Extra checks: none
      Detect      : AVX F16C FMA3 AVX2
                  : build/src.linux-x86_64-3.9/numpy/_core/src/_simd/_simd.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_exponent_log.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_trigonometric.dispatch.c
                  :
      AVX512F     : SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2
      Flags       : -msse -msse2 -msse3 -mssse3 -msse4.1 -mpopcnt -msse4.2 -mavx -mf16c -mfma -mavx2 -mavx512f
      Extra checks: AVX512F_REDUCE
      Detect      : AVX512F
                  : build/src.linux-x86_64-3.9/numpy/_core/src/_simd/_simd.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_arithm_fp.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_arithmetic.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_exponent_log.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_trigonometric.dispatch.c
                  :
      AVX512_SKX  : SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD
      Flags       : -msse -msse2 -msse3 -mssse3 -msse4.1 -mpopcnt -msse4.2 -mavx -mf16c -mfma -mavx2 -mavx512f -mavx512cd -mavx512vl -mavx512bw -mavx512dq
      Extra checks: AVX512BW_MASK AVX512DQ_MASK
      Detect      : AVX512_SKX
                  : build/src.linux-x86_64-3.9/numpy/_core/src/_simd/_simd.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_arithmetic.dispatch.c
                  : build/src.linux-x86_64-3.9/numpy/_core/src/umath/loops_exponent_log.dispatch.c
    CCompilerOpt.cache_flush[804] : write cache to path -> /home/seiko/work/repos/numpy/build/temp.linux-x86_64-3.9/ccompiler_opt_cache_ext.py
    
    ########### CLIB COMPILER OPTIMIZATION ###########
    Platform      :
      Architecture: x64
      Compiler    : gcc
    
    CPU baseline  :
      Requested   : 'min'
      Enabled     : SSE SSE2 SSE3
      Flags       : -msse -msse2 -msse3
      Extra checks: none
    
    CPU dispatch  :
      Requested   : 'max -xop -fma4'
      Enabled     : SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD AVX512_KNL AVX512_KNM AVX512_SKX AVX512_CLX AVX512_CNL AVX512_ICL
      Generated   : none
    
There is a separate report for each of `build_ext` and `build_clib` that includes several sections, and each section has several values, representing the following:
Platform:
  * Architecture: The architecture name of target CPU. It should be one of `x86`, `x64`, `ppc64`, `ppc64le`, `armhf`, `aarch64`, `s390x` or `unknown`.
  * Compiler: The compiler name. It should be one of gcc, clang, msvc, icc, iccw or unix-like.


CPU baseline:
  * Requested: The specific features and options to `cpu-baseline` as-is.
  * Enabled: The final set of enabled CPU features.
  * Flags: The compiler flags that were used to all NumPy C/C++ sources during the compilation except for temporary sources that have been used for generating the binary objects of dispatched features.
  * Extra checks: list of internal checks that activate certain functionality or intrinsics related to the enabled features, useful for debugging when it comes to developing SIMD kernels.


CPU dispatch:
  * Requested: The specific features and options to `cpu-dispatch` as-is.
  * Enabled: The final set of enabled CPU features.
  * Generated: At the beginning of the next row of this property, the features for which optimizations have been generated are shown in the form of several sections with similar properties explained as follows:
    * One or multiple dispatched feature: The implied CPU features.
    * Flags: The compiler flags that been used for these features.
    * Extra checks: Similar to the baseline but for these dispatched features.
    * Detect: Set of CPU features that need be detected in runtime in order to execute the generated optimizations.
    * The lines that come after the above property and end with a ‘:’ on a separate line, represent the paths of c/c++ sources that define the generated optimizations.


## Runtime dispatch
Importing NumPy triggers a scan of the available CPU features from the set of dispatchable features. This can be further restricted by setting the environment variable `NPY_DISABLE_CPU_FEATURES` to a comma-, tab-, or space-separated list of features to disable. This will raise an error if parsing fails or if the feature was not enabled. For instance, on `x86_64` this will disable `AVX2` and `FMA3`:
    
    NPY_DISABLE_CPU_FEATURES="AVX2,FMA3"
    
If the feature is not available, a warning will be emitted.
## Tracking dispatched functions
Discovering which CPU targets are enabled for different optimized functions is achievable through the Python function `numpy.lib.introspect.opt_func_info`. This function offers the flexibility of applying filters using two optional arguments: one for refining function names and the other for specifying data types in the signatures.
For example:
    
     >> func_info = numpy.lib.introspect.opt_func_info(func_name='add|abs', signature='float64|complex64')
     >> print(json.dumps(func_info, indent=2))
     {
       "absolute": {
         "dd": {
           "current": "SSE41",
           "available": "SSE41 baseline(SSE SSE2 SSE3)"
         },
         "Ff": {
           "current": "FMA3__AVX2",
           "available": "AVX512F FMA3__AVX2 baseline(SSE SSE2 SSE3)"
         },
         "Dd": {
           "current": "FMA3__AVX2",
           "available": "AVX512F FMA3__AVX2 baseline(SSE SSE2 SSE3)"
         }
       },
       "add": {
         "ddd": {
           "current": "FMA3__AVX2",
           "available": "FMA3__AVX2 baseline(SSE SSE2 SSE3)"
         },
         "FFF": {
           "current": "FMA3__AVX2",
           "available": "FMA3__AVX2 baseline(SSE SSE2 SSE3)"
         }
      }
    }
    
# How does the CPU dispatcher work?
NumPy dispatcher is based on multi-source compiling, which means taking a certain source and compiling it multiple times with different compiler flags and also with different C definitions that affect the code paths. This enables certain instruction-sets for each compiled object depending on the required optimizations and ends with linking the returned objects together.
This mechanism should support all compilers and it doesn’t require any compiler-specific extension, but at the same time it adds a few steps to normal compilation that are explained as follows.
## 1- Configuration
Configuring the required optimization by the user before starting to build the source files via the two command arguments as explained above:
  * `--cpu-baseline`: minimal set of required optimizations.
  * `--cpu-dispatch`: dispatched set of additional optimizations.


## 2- Discovering the environment
In this part, we check the compiler and platform architecture and cache some of the intermediary results to speed up rebuilding.
## 3- Validating the requested optimizations
By testing them against the compiler, and seeing what the compiler can support according to the requested optimizations.
## 4- Generating the main configuration header
The generated header `_cpu_dispatch.h` contains all the definitions and headers of instruction-sets for the required optimizations that have been validated during the previous step.
It also contains extra C definitions that are used for defining NumPy’s Python-level module attributes `__cpu_baseline__` and `__cpu_dispatch__`.
What is in this header?
The example header was dynamically generated by gcc on an X86 machine. The compiler supports `--cpu-baseline="sse sse2 sse3"` and `--cpu-dispatch="ssse3 sse41"`, and the result is below.
    
    // The header should be located at numpy/numpy/_core/src/common/_cpu_dispatch.h
    /**NOTE
     ** C definitions prefixed with "NPY_HAVE_" represent
     ** the required optimizations.
     **
     ** C definitions prefixed with 'NPY__CPU_TARGET_' are protected and
     ** shouldn't be used by any NumPy C sources.
     */
    /******* baseline features *******/
    /** SSE **/
    #define NPY_HAVE_SSE 1
    #include <xmmintrin.h>
    /** SSE2 **/
    #define NPY_HAVE_SSE2 1
    #include <emmintrin.h>
    /** SSE3 **/
    #define NPY_HAVE_SSE3 1
    #include <pmmintrin.h>
    
    /******* dispatch-able features *******/
    #ifdef NPY__CPU_TARGET_SSSE3
      /** SSSE3 **/
      #define NPY_HAVE_SSSE3 1
      #include <tmmintrin.h>
    #endif
    #ifdef NPY__CPU_TARGET_SSE41
      /** SSE41 **/
      #define NPY_HAVE_SSE41 1
      #include <smmintrin.h>
    #endif
    
Baseline features are the minimal set of required optimizations configured via `--cpu-baseline`. They have no preprocessor guards and they’re always on, which means they can be used in any source.
Does this mean NumPy’s infrastructure passes the compiler’s flags of baseline features to all sources?
Definitely, yes. But the dispatch-able sources are treated differently.
What if the user specifies certain baseline features during the build but at runtime the machine doesn’t support even these features? Will the compiled code be called via one of these definitions, or maybe the compiler itself auto-generated/vectorized certain piece of code based on the provided command line compiler flags?
During the loading of the NumPy module, there’s a validation step which detects this behavior. It will raise a Python runtime error to inform the user. This is to prevent the CPU reaching an illegal instruction error causing a segfault.
Dispatch-able features are our dispatched set of additional optimizations that were configured via `--cpu-dispatch`. They are not activated by default and are always guarded by other C definitions prefixed with `NPY__CPU_TARGET_`. C definitions `NPY__CPU_TARGET_` are only enabled within dispatch-able sources.
## 5- Dispatch-able sources and configuration statements
Dispatch-able sources are special C files that can be compiled multiple times with different compiler flags and also with different C definitions. These affect code paths to enable certain instruction-sets for each compiled object according to “the configuration statements” that must be declared between a C comment`(/**/)` and start with a special mark @targets at the top of each dispatch-able source. At the same time, dispatch-able sources will be treated as normal C sources if the optimization was disabled by the command argument `--disable-optimization` .
What are configuration statements?
Configuration statements are sort of keywords combined together to determine the required optimization for the dispatch-able source.
Example:
    
    /*@targets avx2 avx512f vsx2 vsx3 asimd asimdhp */
    // C code
    
The keywords mainly represent the additional optimizations configured through `--cpu-dispatch`, but it can also represent other options such as:
  * Target groups: pre-configured configuration statements used for managing the required optimizations from outside the dispatch-able source.
  * Policies: collections of options used for changing the default behaviors or forcing the compilers to perform certain things.
  * “baseline”: a unique keyword represents the minimal optimizations that configured through `--cpu-baseline`


Numpy’s infrastructure handles dispatch-able sources in four steps:
  * (A) Recognition: Just like source templates and F2PY, the dispatch-able sources requires a special extension `*.dispatch.c` to mark C dispatch-able source files, and for C++ `*.dispatch.cpp` or `*.dispatch.cxx` NOTE: C++ not supported yet.
  * (B) Parsing and validating: In this step, the dispatch-able sources that had been filtered by the previous step are parsed and validated by the configuration statements for each one of them one by one in order to determine the required optimizations.
  * (C) Wrapping: This is the approach taken by NumPy’s infrastructure, which has proved to be sufficiently flexible in order to compile a single source multiple times with different C definitions and flags that affect the code paths. The process is achieved by creating a temporary C source for each required optimization that related to the additional optimization, which contains the declarations of the C definitions and includes the involved source via the C directive #include. For more clarification take a look at the following code for AVX512F :
        /*
         * this definition is used by NumPy utilities as suffixes for the
         * exported symbols
         */
        #define NPY__CPU_TARGET_CURRENT AVX512F
        /*
         * The following definitions enable
         * definitions of the dispatch-able features that are defined within the main
         * configuration header. These are definitions for the implied features.
         */
        #define NPY__CPU_TARGET_SSE
        #define NPY__CPU_TARGET_SSE2
        #define NPY__CPU_TARGET_SSE3
        #define NPY__CPU_TARGET_SSSE3
        #define NPY__CPU_TARGET_SSE41
        #define NPY__CPU_TARGET_POPCNT
        #define NPY__CPU_TARGET_SSE42
        #define NPY__CPU_TARGET_AVX
        #define NPY__CPU_TARGET_F16C
        #define NPY__CPU_TARGET_FMA3
        #define NPY__CPU_TARGET_AVX2
        #define NPY__CPU_TARGET_AVX512F
        // our dispatch-able source
        #include "/the/absolute/path/of/hello.dispatch.c"
        
  * (D) Dispatch-able configuration header: The infrastructure generates a config header for each dispatch-able source, this header mainly contains two abstract C macros used for identifying the generated objects, so they can be used for runtime dispatching certain symbols from the generated objects by any C source. It is also used for forward declarations.
The generated header takes the name of the dispatch-able source after excluding the extension and replace it with `.h`, for example assume we have a dispatch-able source called `hello.dispatch.c` and contains the following:
        // hello.dispatch.c
        /*@targets baseline sse42 avx512f */
        #include <stdio.h>
        #include "numpy/utils.h" // NPY_CAT, NPY_TOSTR
        
        #ifndef NPY__CPU_TARGET_CURRENT
          // wrapping the dispatch-able source only happens to the additional optimizations
          // but if the keyword 'baseline' provided within the configuration statements,
          // the infrastructure will add extra compiling for the dispatch-able source by
          // passing it as-is to the compiler without any changes.
          #define CURRENT_TARGET(X) X
          #define NPY__CPU_TARGET_CURRENT baseline // for printing only
        #else
          // since we reach to this point, that's mean we're dealing with
            // the additional optimizations, so it could be SSE42 or AVX512F
          #define CURRENT_TARGET(X) NPY_CAT(NPY_CAT(X, _), NPY__CPU_TARGET_CURRENT)
        #endif
        // Macro 'CURRENT_TARGET' adding the current target as suffix to the exported symbols,
        // to avoid linking duplications, NumPy already has a macro called
        // 'NPY_CPU_DISPATCH_CURFX' similar to it, located at
        // numpy/numpy/_core/src/common/npy_cpu_dispatch.h
        // NOTE: we tend to not adding suffixes to the baseline exported symbols
        void CURRENT_TARGET(simd_whoami)(const char *extra_info)
        {
            printf("I'm " NPY_TOSTR(NPY__CPU_TARGET_CURRENT) ", %s\n", extra_info);
        }
        
Now assume you attached hello.dispatch.c to the source tree, then the infrastructure should generate a temporary config header called hello.dispatch.h that can be reached by any source in the source tree, and it should contain the following code :
        #ifndef NPY__CPU_DISPATCH_EXPAND_
          // To expand the macro calls in this header
            #define NPY__CPU_DISPATCH_EXPAND_(X) X
        #endif
        // Undefining the following macros, due to the possibility of including config headers
        // multiple times within the same source and since each config header represents
        // different required optimizations according to the specified configuration
        // statements in the dispatch-able source that derived from it.
        #undef NPY__CPU_DISPATCH_BASELINE_CALL
        #undef NPY__CPU_DISPATCH_CALL
        // nothing strange here, just a normal preprocessor callback
        // enabled only if 'baseline' specified within the configuration statements
        #define NPY__CPU_DISPATCH_BASELINE_CALL(CB, ...) \
          NPY__CPU_DISPATCH_EXPAND_(CB(__VA_ARGS__))
        // 'NPY__CPU_DISPATCH_CALL' is an abstract macro is used for dispatching
        // the required optimizations that specified within the configuration statements.
        //
        // @param CHK, Expected a macro that can be used to detect CPU features
        // in runtime, which takes a CPU feature name without string quotes and
        // returns the testing result in a shape of boolean value.
        // NumPy already has macro called "NPY_CPU_HAVE", which fits this requirement.
        //
        // @param CB, a callback macro that expected to be called multiple times depending
        // on the required optimizations, the callback should receive the following arguments:
        //  1- The pending calls of @param CHK filled up with the required CPU features,
        //     that need to be tested first in runtime before executing call belong to
        //     the compiled object.
        //  2- The required optimization name, same as in 'NPY__CPU_TARGET_CURRENT'
        //  3- Extra arguments in the macro itself
        //
        // By default the callback calls are sorted depending on the highest interest
        // unless the policy "$keep_sort" was in place within the configuration statements
        // see "Dive into the CPU dispatcher" for more clarification.
        #define NPY__CPU_DISPATCH_CALL(CHK, CB, ...) \
          NPY__CPU_DISPATCH_EXPAND_(CB((CHK(AVX512F)), AVX512F, __VA_ARGS__)) \
          NPY__CPU_DISPATCH_EXPAND_(CB((CHK(SSE)&&CHK(SSE2)&&CHK(SSE3)&&CHK(SSSE3)&&CHK(SSE41)), SSE41, __VA_ARGS__))
        
An example of using the config header in light of the above:
        // NOTE: The following macros are only defined for demonstration purposes only.
        // NumPy already has a collections of macros located at
        // numpy/numpy/_core/src/common/npy_cpu_dispatch.h, that covers all dispatching
        // and declarations scenarios.
        
        #include "numpy/npy_cpu_features.h" // NPY_CPU_HAVE
        #include "numpy/utils.h" // NPY_CAT, NPY_EXPAND
        
        // An example for setting a macro that calls all the exported symbols at once
        // after checking if they're supported by the running machine.
        #define DISPATCH_CALL_ALL(FN, ARGS) \
            NPY__CPU_DISPATCH_CALL(NPY_CPU_HAVE, DISPATCH_CALL_ALL_CB, FN, ARGS) \
            NPY__CPU_DISPATCH_BASELINE_CALL(DISPATCH_CALL_BASELINE_ALL_CB, FN, ARGS)
        // The preprocessor callbacks.
        // The same suffixes as we define it in the dispatch-able source.
        #define DISPATCH_CALL_ALL_CB(CHECK, TARGET_NAME, FN, ARGS) \
          if (CHECK) { NPY_CAT(NPY_CAT(FN, _), TARGET_NAME) ARGS; }
        #define DISPATCH_CALL_BASELINE_ALL_CB(FN, ARGS) \
          FN NPY_EXPAND(ARGS);
        
        // An example for setting a macro that calls the exported symbols of highest
        // interest optimization, after checking if they're supported by the running machine.
        #define DISPATCH_CALL_HIGH(FN, ARGS) \
          if (0) {} \
            NPY__CPU_DISPATCH_CALL(NPY_CPU_HAVE, DISPATCH_CALL_HIGH_CB, FN, ARGS) \
            NPY__CPU_DISPATCH_BASELINE_CALL(DISPATCH_CALL_BASELINE_HIGH_CB, FN, ARGS)
        // The preprocessor callbacks
        // The same suffixes as we define it in the dispatch-able source.
        #define DISPATCH_CALL_HIGH_CB(CHECK, TARGET_NAME, FN, ARGS) \
          else if (CHECK) { NPY_CAT(NPY_CAT(FN, _), TARGET_NAME) ARGS; }
        #define DISPATCH_CALL_BASELINE_HIGH_CB(FN, ARGS) \
          else { FN NPY_EXPAND(ARGS); }
        
        // NumPy has a macro called 'NPY_CPU_DISPATCH_DECLARE' can be used
        // for forward declarations any kind of prototypes based on
        // 'NPY__CPU_DISPATCH_CALL' and 'NPY__CPU_DISPATCH_BASELINE_CALL'.
        // However in this example, we just handle it manually.
        void simd_whoami(const char *extra_info);
        void simd_whoami_AVX512F(const char *extra_info);
        void simd_whoami_SSE41(const char *extra_info);
        
        void trigger_me(void)
        {
            // bring the auto-generated config header
            // which contains config macros 'NPY__CPU_DISPATCH_CALL' and
            // 'NPY__CPU_DISPATCH_BASELINE_CALL'.
            // it is highly recommended to include the config header before executing
          // the dispatching macros in case if there's another header in the scope.
            #include "hello.dispatch.h"
            DISPATCH_CALL_ALL(simd_whoami, ("all"))
            DISPATCH_CALL_HIGH(simd_whoami, ("the highest interest"))
            // An example of including multiple config headers in the same source
            // #include "hello2.dispatch.h"
            // DISPATCH_CALL_HIGH(another_function, ("the highest interest"))
        }
        


# CPU/SIMD optimizations
NumPy comes with a flexible working mechanism that allows it to harness the SIMD features that CPUs own, in order to provide faster and more stable performance on all popular platforms. Currently, NumPy supports the X86, IBM/Power, ARM7 and ARM8 architectures.
The optimization process in NumPy is carried out in three layers:
  * Code is written using the universal intrinsics which is a set of types, macros and functions that are mapped to each supported instruction-sets by using guards that will enable use of the them only when the compiler recognizes them. This allow us to generate multiple kernels for the same functionality, in which each generated kernel represents a set of instructions that related one or multiple certain CPU features. The first kernel represents the minimum (baseline) CPU features, and the other kernels represent the additional (dispatched) CPU features.
  * At compile time, CPU build options are used to define the minimum and additional features to support, based on user choice and compiler support. The appropriate intrinsics are overlaid with the platform / architecture intrinsics, and multiple kernels are compiled.
  * At runtime import, the CPU is probed for the set of supported CPU features. A mechanism is used to grab the pointer to the most appropriate kernel, and this will be the one called for the function.


Note
NumPy community had a deep discussion before implementing this work, please check NEP-38 for more clarification.
  * CPU build options
    * Description
    * Quick start
      * I am building NumPy for my local use
      * I do not want to support the old processors of the x86 architecture
      * I’m facing the same case above but with ppc64 architecture
      * Having issues with AVX512 features?
    * Supported features
      * On x86
      * On IBM/POWER big-endian
      * On IBM/POWER little-endian
      * On ARMv7/A32
      * On ARMv8/A64
      * On IBM/ZSYSTEM(S390X)
    * Special options
    * Behaviors
    * Platform differences
      * On x86::Intel Compiler
      * On x86::Microsoft Visual C/C++
    * Build report
    * Runtime dispatch
    * Tracking dispatched functions
  * How does the CPU dispatcher work?
    * 1- Configuration
    * 2- Discovering the environment
    * 3- Validating the requested optimizations
    * 4- Generating the main configuration header
    * 5- Dispatch-able sources and configuration statements


# NumPy and SWIG
  * numpy.i: a SWIG interface file for NumPy
    * Introduction
    * Using numpy.i
    * Available typemaps
    * NumPy array scalars and SWIG
    * Helper functions
    * Beyond the provided typemaps
    * Summary
  * Testing the numpy.i typemaps
    * Introduction
    * Testing organization
    * Testing header files
    * Testing source files
    * Testing SWIG interface files
    * Testing Python scripts


# numpy.i: a SWIG interface file for NumPy
## Introduction
The Simple Wrapper and Interface Generator (or SWIG) is a powerful tool for generating wrapper code for interfacing to a wide variety of scripting languages. SWIG can parse header files, and using only the code prototypes, create an interface to the target language. But SWIG is not omnipotent. For example, it cannot know from the prototype:
    
    double rms(double* seq, int n);
    
what exactly `seq` is. Is it a single value to be altered in-place? Is it an array, and if so what is its length? Is it input-only? Output-only? Input-output? SWIG cannot determine these details, and does not attempt to do so.
If we designed `rms`, we probably made it a routine that takes an input-only array of length `n` of `double` values called `seq` and returns the root mean square. The default behavior of SWIG, however, will be to create a wrapper function that compiles, but is nearly impossible to use from the scripting language in the way the C routine was intended.
For Python, the preferred way of handling contiguous (or technically, strided) blocks of homogeneous data is with NumPy, which provides full object-oriented access to multidimensial arrays of data. Therefore, the most logical Python interface for the `rms` function would be (including doc string):
    
    def rms(seq):
        """
        rms: return the root mean square of a sequence
        rms(numpy.ndarray) -> double
        rms(list) -> double
        rms(tuple) -> double
        """
    
where `seq` would be a NumPy array of `double` values, and its length `n` would be extracted from `seq` internally before being passed to the C routine. Even better, since NumPy supports construction of arrays from arbitrary Python sequences, `seq` itself could be a nearly arbitrary sequence (so long as each element can be converted to a `double`) and the wrapper code would internally convert it to a NumPy array before extracting its data and length.
SWIG allows these types of conversions to be defined via a mechanism called typemaps. This document provides information on how to use `numpy.i`, a SWIG interface file that defines a series of typemaps intended to make the type of array-related conversions described above relatively simple to implement. For example, suppose that the `rms` function prototype defined above was in a header file named `rms.h`. To obtain the Python interface discussed above, your SWIG interface file would need the following:
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "rms.h"
    %}
    
    %include "numpy.i"
    
    %init %{
    import_array();
    %}
    
    %apply (double* IN_ARRAY1, int DIM1) {(double* seq, int n)};
    %include "rms.h"
    
Typemaps are keyed off a list of one or more function arguments, either by type or by type and name. We will refer to such lists as signatures. One of the many typemaps defined by `numpy.i` is used above and has the signature `(double* IN_ARRAY1, int DIM1)`. The argument names are intended to suggest that the `double*` argument is an input array of one dimension and that the `int` represents the size of that dimension. This is precisely the pattern in the `rms` prototype.
Most likely, no actual prototypes to be wrapped will have the argument names `IN_ARRAY1` and `DIM1`. We use the SWIG `%apply` directive to apply the typemap for one-dimensional input arrays of type `double` to the actual prototype used by `rms`. Using `numpy.i` effectively, therefore, requires knowing what typemaps are available and what they do.
A SWIG interface file that includes the SWIG directives given above will produce wrapper code that looks something like:
    
     1 PyObject *_wrap_rms(PyObject *args) {
     2   PyObject *resultobj = 0;
     3   double *arg1 = (double *) 0 ;
     4   int arg2 ;
     5   double result;
     6   PyArrayObject *array1 = NULL ;
     7   int is_new_object1 = 0 ;
     8   PyObject * obj0 = 0 ;
     9
    10   if (!PyArg_ParseTuple(args,(char *)"O:rms",&obj0)) SWIG_fail;
    11   {
    12     array1 = obj_to_array_contiguous_allow_conversion(
    13                  obj0, NPY_DOUBLE, &is_new_object1);
    14     npy_intp size[1] = {
    15       -1
    16     };
    17     if (!array1 || !require_dimensions(array1, 1) ||
    18         !require_size(array1, size, 1)) SWIG_fail;
    19     arg1 = (double*) array1->data;
    20     arg2 = (int) array1->dimensions[0];
    21   }
    22   result = (double)rms(arg1,arg2);
    23   resultobj = SWIG_From_double((double)(result));
    24   {
    25     if (is_new_object1 && array1) Py_DECREF(array1);
    26   }
    27   return resultobj;
    28 fail:
    29   {
    30     if (is_new_object1 && array1) Py_DECREF(array1);
    31   }
    32   return NULL;
    33 }
    
The typemaps from `numpy.i` are responsible for the following lines of code: 12–20, 25 and 30. Line 10 parses the input to the `rms` function. From the format string `"O:rms"`, we can see that the argument list is expected to be a single Python object (specified by the `O` before the colon) and whose pointer is stored in `obj0`. A number of functions, supplied by `numpy.i`, are called to make and check the (possible) conversion from a generic Python object to a NumPy array. These functions are explained in the section Helper Functions, but hopefully their names are self-explanatory. At line 12 we use `obj0` to construct a NumPy array. At line 17, we check the validity of the result: that it is non-null and that it has a single dimension of arbitrary length. Once these states are verified, we extract the data buffer and length in lines 19 and 20 so that we can call the underlying C function at line 22. Line 25 performs memory management for the case where we have created a new array that is no longer needed.
This code has a significant amount of error handling. Note the `SWIG_fail` is a macro for `goto fail`, referring to the label at line 28. If the user provides the wrong number of arguments, this will be caught at line 10. If construction of the NumPy array fails or produces an array with the wrong number of dimensions, these errors are caught at line 17. And finally, if an error is detected, memory is still managed correctly at line 30.
Note that if the C function signature was in a different order:
    
    double rms(int n, double* seq);
    
that SWIG would not match the typemap signature given above with the argument list for `rms`. Fortunately, `numpy.i` has a set of typemaps with the data pointer given last:
    
    %apply (int DIM1, double* IN_ARRAY1) {(int n, double* seq)};
    
This simply has the effect of switching the definitions of `arg1` and `arg2` in lines 3 and 4 of the generated code above, and their assignments in lines 19 and 20.
## Using numpy.i
The `numpy.i` file is currently located in the `tools/swig` sub-directory under the `numpy` installation directory. Typically, you will want to copy it to the directory where you are developing your wrappers.
A simple module that only uses a single SWIG interface file should include the following:
    
    %{
    #define SWIG_FILE_WITH_INIT
    %}
    %include "numpy.i"
    %init %{
    import_array();
    %}
    
Within a compiled Python module, `import_array()` should only get called once. This could be in a C/C++ file that you have written and is linked to the module. If this is the case, then none of your interface files should `#define SWIG_FILE_WITH_INIT` or call `import_array()`. Or, this initialization call could be in a wrapper file generated by SWIG from an interface file that has the `%init` block as above. If this is the case, and you have more than one SWIG interface file, then only one interface file should `#define SWIG_FILE_WITH_INIT` and call `import_array()`.
## Available typemaps
The typemap directives provided by `numpy.i` for arrays of different data types, say `double` and `int`, and dimensions of different types, say `int` or `long`, are identical to one another except for the C and NumPy type specifications. The typemaps are therefore implemented (typically behind the scenes) via a macro:
    
    %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE)
    
that can be invoked for appropriate `(DATA_TYPE, DATA_TYPECODE, DIM_TYPE)` triplets. For example:
    
    %numpy_typemaps(double, NPY_DOUBLE, int)
    %numpy_typemaps(int,    NPY_INT   , int)
    
The `numpy.i` interface file uses the `%numpy_typemaps` macro to implement typemaps for the following C data types and `int` dimension types:
  * `signed char`
  * `unsigned char`
  * `short`
  * `unsigned short`
  * `int`
  * `unsigned int`
  * `long`
  * `unsigned long`
  * `long long`
  * `unsigned long long`
  * `float`
  * `double`


In the following descriptions, we reference a generic `DATA_TYPE`, which could be any of the C data types listed above, and `DIM_TYPE` which should be one of the many types of integers.
The typemap signatures are largely differentiated on the name given to the buffer pointer. Names with `FARRAY` are for Fortran-ordered arrays, and names with `ARRAY` are for C-ordered (or 1D arrays).
### Input Arrays
Input arrays are defined as arrays of data that are passed into a routine but are not altered in-place or returned to the user. The Python input array is therefore allowed to be almost any Python sequence (such as a list) that can be converted to the requested type of array. The input array signatures are
1D:
  * `( DATA_TYPE IN_ARRAY1[ANY] )`
  * `( DATA_TYPE* IN_ARRAY1, int DIM1 )`
  * `( int DIM1, DATA_TYPE* IN_ARRAY1 )`


2D:
  * `( DATA_TYPE IN_ARRAY2[ANY][ANY] )`
  * `( DATA_TYPE* IN_ARRAY2, int DIM1, int DIM2 )`
  * `( int DIM1, int DIM2, DATA_TYPE* IN_ARRAY2 )`
  * `( DATA_TYPE* IN_FARRAY2, int DIM1, int DIM2 )`
  * `( int DIM1, int DIM2, DATA_TYPE* IN_FARRAY2 )`


3D:
  * `( DATA_TYPE IN_ARRAY3[ANY][ANY][ANY] )`
  * `( DATA_TYPE* IN_ARRAY3, int DIM1, int DIM2, int DIM3 )`
  * `( int DIM1, int DIM2, int DIM3, DATA_TYPE* IN_ARRAY3 )`
  * `( DATA_TYPE* IN_FARRAY3, int DIM1, int DIM2, int DIM3 )`
  * `( int DIM1, int DIM2, int DIM3, DATA_TYPE* IN_FARRAY3 )`


4D:
  * `(DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])`
  * `(DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)`
  * `(DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, , DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)`
  * `(DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)`
  * `(DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)`


The first signature listed, `( DATA_TYPE IN_ARRAY[ANY] )` is for one-dimensional arrays with hard-coded dimensions. Likewise, `( DATA_TYPE IN_ARRAY2[ANY][ANY] )` is for two-dimensional arrays with hard-coded dimensions, and similarly for three-dimensional.
### In-Place Arrays
In-place arrays are defined as arrays that are modified in-place. The input values may or may not be used, but the values at the time the function returns are significant. The provided Python argument must therefore be a NumPy array of the required type. The in-place signatures are
1D:
  * `( DATA_TYPE INPLACE_ARRAY1[ANY] )`
  * `( DATA_TYPE* INPLACE_ARRAY1, int DIM1 )`
  * `( int DIM1, DATA_TYPE* INPLACE_ARRAY1 )`


2D:
  * `( DATA_TYPE INPLACE_ARRAY2[ANY][ANY] )`
  * `( DATA_TYPE* INPLACE_ARRAY2, int DIM1, int DIM2 )`
  * `( int DIM1, int DIM2, DATA_TYPE* INPLACE_ARRAY2 )`
  * `( DATA_TYPE* INPLACE_FARRAY2, int DIM1, int DIM2 )`
  * `( int DIM1, int DIM2, DATA_TYPE* INPLACE_FARRAY2 )`


3D:
  * `( DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY] )`
  * `( DATA_TYPE* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3 )`
  * `( int DIM1, int DIM2, int DIM3, DATA_TYPE* INPLACE_ARRAY3 )`
  * `( DATA_TYPE* INPLACE_FARRAY3, int DIM1, int DIM2, int DIM3 )`
  * `( int DIM1, int DIM2, int DIM3, DATA_TYPE* INPLACE_FARRAY3 )`


4D:
  * `(DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])`
  * `(DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)`
  * `(DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, , DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)`
  * `(DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)`
  * `(DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)`


These typemaps now check to make sure that the `INPLACE_ARRAY` arguments use native byte ordering. If not, an exception is raised.
There is also a “flat” in-place array for situations in which you would like to modify or process each element, regardless of the number of dimensions. One example is a “quantization” function that quantizes each element of an array in-place, be it 1D, 2D or whatever. This form checks for continuity but allows either C or Fortran ordering.
ND:
  * `(DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT)`


### Argout Arrays
Argout arrays are arrays that appear in the input arguments in C, but are in fact output arrays. This pattern occurs often when there is more than one output variable and the single return argument is therefore not sufficient. In Python, the conventional way to return multiple arguments is to pack them into a sequence (tuple, list, etc.) and return the sequence. This is what the argout typemaps do. If a wrapped function that uses these argout typemaps has more than one return argument, they are packed into a tuple or list, depending on the version of Python. The Python user does not pass these arrays in, they simply get returned. For the case where a dimension is specified, the python user must provide that dimension as an argument. The argout signatures are
1D:
  * `( DATA_TYPE ARGOUT_ARRAY1[ANY] )`
  * `( DATA_TYPE* ARGOUT_ARRAY1, int DIM1 )`
  * `( int DIM1, DATA_TYPE* ARGOUT_ARRAY1 )`


2D:
  * `( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )`


3D:
  * `( DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY] )`


4D:
  * `( DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY] )`


These are typically used in situations where in C/C++, you would allocate a(n) array(s) on the heap, and call the function to fill the array(s) values. In Python, the arrays are allocated for you and returned as new array objects.
Note that we support `DATA_TYPE*` argout typemaps in 1D, but not 2D or 3D. This is because of a quirk with the SWIG typemap syntax and cannot be avoided. Note that for these types of 1D typemaps, the Python function will take a single argument representing `DIM1`.
### Argout View Arrays
Argoutview arrays are for when your C code provides you with a view of its internal data and does not require any memory to be allocated by the user. This can be dangerous. There is almost no way to guarantee that the internal data from the C code will remain in existence for the entire lifetime of the NumPy array that encapsulates it. If the user destroys the object that provides the view of the data before destroying the NumPy array, then using that array may result in bad memory references or segmentation faults. Nevertheless, there are situations, working with large data sets, where you simply have no other choice.
The C code to be wrapped for argoutview arrays are characterized by pointers: pointers to the dimensions and double pointers to the data, so that these values can be passed back to the user. The argoutview typemap signatures are therefore
1D:
  * `( DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1 )`
  * `( DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1 )`


2D:
  * `( DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2 )`
  * `( DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2 )`
  * `( DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2 )`
  * `( DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2 )`


3D:
  * `( DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)`
  * `( DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)`
  * `( DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)`
  * `( DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3)`


4D:
  * `(DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4)`
  * `(DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4)`


Note that arrays with hard-coded dimensions are not supported. These cannot follow the double pointer signatures of these typemaps.
### Memory Managed Argout View Arrays
A recent addition to `numpy.i` are typemaps that permit argout arrays with views into memory that is managed.
1D:
  * `(DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)`
  * `(DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)`


2D:
  * `(DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)`
  * `(DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)`


3D:
  * `(DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3)`
  * `(DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3)`


4D:
  * `(DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)`
  * `(DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)`
  * `(DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)`


### Output Arrays
The `numpy.i` interface file does not support typemaps for output arrays, for several reasons. First, C/C++ return arguments are limited to a single value. This prevents obtaining dimension information in a general way. Second, arrays with hard-coded lengths are not permitted as return arguments. In other words:
    
    double[3] newVector(double x, double y, double z);
    
is not legal C/C++ syntax. Therefore, we cannot provide typemaps of the form:
    
    %typemap(out) (TYPE[ANY]);
    
If you run into a situation where a function or method is returning a pointer to an array, your best bet is to write your own version of the function to be wrapped, either with `%extend` for the case of class methods or `%ignore` and `%rename` for the case of functions.
### Other Common Types: bool
Note that C++ type `bool` is not supported in the list in the Available Typemaps section. NumPy bools are a single byte, while the C++ `bool` is four bytes (at least on my system). Therefore:
    
    %numpy_typemaps(bool, NPY_BOOL, int)
    
will result in typemaps that will produce code that reference improper data lengths. You can implement the following macro expansion:
    
    %numpy_typemaps(bool, NPY_UINT, int)
    
to fix the data length problem, and Input Arrays will work fine, but In-Place Arrays might fail type-checking.
### Other Common Types: complex
Typemap conversions for complex floating-point types is also not supported automatically. This is because Python and NumPy are written in C, which does not have native complex types. Both Python and NumPy implement their own (essentially equivalent) `struct` definitions for complex variables:
    
    /* Python */
    typedef struct {double real; double imag;} Py_complex;
    
    /* NumPy */
    typedef struct {float  real, imag;} npy_cfloat;
    typedef struct {double real, imag;} npy_cdouble;
    
We could have implemented:
    
    %numpy_typemaps(Py_complex , NPY_CDOUBLE, int)
    %numpy_typemaps(npy_cfloat , NPY_CFLOAT , int)
    %numpy_typemaps(npy_cdouble, NPY_CDOUBLE, int)
    
which would have provided automatic type conversions for arrays of type `Py_complex`, `npy_cfloat` and `npy_cdouble`. However, it seemed unlikely that there would be any independent (non-Python, non-NumPy) application code that people would be using SWIG to generate a Python interface to, that also used these definitions for complex types. More likely, these application codes will define their own complex types, or in the case of C++, use `std::complex`. Assuming these data structures are compatible with Python and NumPy complex types, `%numpy_typemap` expansions as above (with the user’s complex type substituted for the first argument) should work.
## NumPy array scalars and SWIG
SWIG has sophisticated type checking for numerical types. For example, if your C/C++ routine expects an integer as input, the code generated by SWIG will check for both Python integers and Python long integers, and raise an overflow error if the provided Python integer is too big to cast down to a C integer. With the introduction of NumPy scalar arrays into your Python code, you might conceivably extract an integer from a NumPy array and attempt to pass this to a SWIG-wrapped C/C++ function that expects an `int`, but the SWIG type checking will not recognize the NumPy array scalar as an integer. (Often, this does in fact work – it depends on whether NumPy recognizes the integer type you are using as inheriting from the Python integer type on the platform you are using. Sometimes, this means that code that works on a 32-bit machine will fail on a 64-bit machine.)
If you get a Python error that looks like the following:
    
    TypeError: in method 'MyClass_MyMethod', argument 2 of type 'int'
    
and the argument you are passing is an integer extracted from a NumPy array, then you have stumbled upon this problem. The solution is to modify the SWIG type conversion system to accept NumPy array scalars in addition to the standard integer types. Fortunately, this capability has been provided for you. Simply copy the file:
    
    pyfragments.swg
    
to the working build directory for you project, and this problem will be fixed. It is suggested that you do this anyway, as it only increases the capabilities of your Python interface.
### Why is There a Second File?
The SWIG type checking and conversion system is a complicated combination of C macros, SWIG macros, SWIG typemaps and SWIG fragments. Fragments are a way to conditionally insert code into your wrapper file if it is needed, and not insert it if not needed. If multiple typemaps require the same fragment, the fragment only gets inserted into your wrapper code once.
There is a fragment for converting a Python integer to a C `long`. There is a different fragment that converts a Python integer to a C `int`, that calls the routine defined in the `long` fragment. We can make the changes we want here by changing the definition for the `long` fragment. SWIG determines the active definition for a fragment using a “first come, first served” system. That is, we need to define the fragment for `long` conversions prior to SWIG doing it internally. SWIG allows us to do this by putting our fragment definitions in the file `pyfragments.swg`. If we were to put the new fragment definitions in `numpy.i`, they would be ignored.
## Helper functions
The `numpy.i` file contains several macros and routines that it uses internally to build its typemaps. However, these functions may be useful elsewhere in your interface file. These macros and routines are implemented as fragments, which are described briefly in the previous section. If you try to use one or more of the following macros or functions, but your compiler complains that it does not recognize the symbol, then you need to force these fragments to appear in your code using:
    
    %fragment("NumPy_Fragments");
    
in your SWIG interface file.
### Macros
is_array(a)
    
Evaluates as true if `a` is non-`NULL` and can be cast to a `PyArrayObject*`.
array_type(a)
    
Evaluates to the integer data type code of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_numdims(a)
    
Evaluates to the integer number of dimensions of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_dimensions(a)
    
Evaluates to an array of type `npy_intp` and length `array_numdims(a)`, giving the lengths of all of the dimensions of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_size(a,i)
    
Evaluates to the `i`-th dimension size of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_strides(a)
    
Evaluates to an array of type `npy_intp` and length `array_numdims(a)`, giving the stridess of all of the dimensions of `a`, assuming `a` can be cast to a `PyArrayObject*`. A stride is the distance in bytes between an element and its immediate neighbor along the same axis.
array_stride(a,i)
    
Evaluates to the `i`-th stride of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_data(a)
    
Evaluates to a pointer of type `void*` that points to the data buffer of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_descr(a)
    
Returns a borrowed reference to the dtype property (`PyArray_Descr*`) of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_flags(a)
    
Returns an integer representing the flags of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_enableflags(a,f)
    
Sets the flag represented by `f` of `a`, assuming `a` can be cast to a `PyArrayObject*`.
array_is_contiguous(a)
    
Evaluates as true if `a` is a contiguous array. Equivalent to `(PyArray_ISCONTIGUOUS(a))`.
array_is_native(a)
    
Evaluates as true if the data buffer of `a` uses native byte order. Equivalent to `(PyArray_ISNOTSWAPPED(a))`.
array_is_fortran(a)
    
Evaluates as true if `a` is FORTRAN ordered.
### Routines
pytype_string()
    
Return type: `const char*`
Arguments:
  * `PyObject* py_obj`, a general Python object.


Return a string describing the type of `py_obj`.
typecode_string()
    
Return type: `const char*`
Arguments:
  * `int typecode`, a NumPy integer typecode.


Return a string describing the type corresponding to the NumPy `typecode`.
type_match()
    
Return type: `int`
Arguments:
  * `int actual_type`, the NumPy typecode of a NumPy array.
  * `int desired_type`, the desired NumPy typecode.


Make sure that `actual_type` is compatible with `desired_type`. For example, this allows character and byte types, or int and long types, to match. This is now equivalent to `PyArray_EquivTypenums()`.
obj_to_array_no_conversion()
    
Return type: `PyArrayObject*`
Arguments:
  * `PyObject* input`, a general Python object.
  * `int typecode`, the desired NumPy typecode.


Cast `input` to a `PyArrayObject*` if legal, and ensure that it is of type `typecode`. If `input` cannot be cast, or the `typecode` is wrong, set a Python error and return `NULL`.
obj_to_array_allow_conversion()
    
Return type: `PyArrayObject*`
Arguments:
  * `PyObject* input`, a general Python object.
  * `int typecode`, the desired NumPy typecode of the resulting array.
  * `int* is_new_object`, returns a value of 0 if no conversion performed, else 1.


Convert `input` to a NumPy array with the given `typecode`. On success, return a valid `PyArrayObject*` with the correct type. On failure, the Python error string will be set and the routine returns `NULL`.
make_contiguous()
    
Return type: `PyArrayObject*`
Arguments:
  * `PyArrayObject* ary`, a NumPy array.
  * `int* is_new_object`, returns a value of 0 if no conversion performed, else 1.
  * `int min_dims`, minimum allowable dimensions.
  * `int max_dims`, maximum allowable dimensions.


Check to see if `ary` is contiguous. If so, return the input pointer and flag it as not a new object. If it is not contiguous, create a new `PyArrayObject*` using the original data, flag it as a new object and return the pointer.
make_fortran()
    
Return type: `PyArrayObject*`
Arguments
  * `PyArrayObject* ary`, a NumPy array.
  * `int* is_new_object`, returns a value of 0 if no conversion performed, else 1.


Check to see if `ary` is Fortran contiguous. If so, return the input pointer and flag it as not a new object. If it is not Fortran contiguous, create a new `PyArrayObject*` using the original data, flag it as a new object and return the pointer.
obj_to_array_contiguous_allow_conversion()
    
Return type: `PyArrayObject*`
Arguments:
  * `PyObject* input`, a general Python object.
  * `int typecode`, the desired NumPy typecode of the resulting array.
  * `int* is_new_object`, returns a value of 0 if no conversion performed, else 1.


Convert `input` to a contiguous `PyArrayObject*` of the specified type. If the input object is not a contiguous `PyArrayObject*`, a new one will be created and the new object flag will be set.
obj_to_array_fortran_allow_conversion()
    
Return type: `PyArrayObject*`
Arguments:
  * `PyObject* input`, a general Python object.
  * `int typecode`, the desired NumPy typecode of the resulting array.
  * `int* is_new_object`, returns a value of 0 if no conversion performed, else 1.


Convert `input` to a Fortran contiguous `PyArrayObject*` of the specified type. If the input object is not a Fortran contiguous `PyArrayObject*`, a new one will be created and the new object flag will be set.
require_contiguous()
    
Return type: `int`
Arguments:
  * `PyArrayObject* ary`, a NumPy array.


Test whether `ary` is contiguous. If so, return 1. Otherwise, set a Python error and return 0.
require_native()
    
Return type: `int`
Arguments:
  * `PyArray_Object* ary`, a NumPy array.


Require that `ary` is not byte-swapped. If the array is not byte-swapped, return 1. Otherwise, set a Python error and return 0.
require_dimensions()
    
Return type: `int`
Arguments:
  * `PyArrayObject* ary`, a NumPy array.
  * `int exact_dimensions`, the desired number of dimensions.


Require `ary` to have a specified number of dimensions. If the array has the specified number of dimensions, return 1. Otherwise, set a Python error and return 0.
require_dimensions_n()
    
Return type: `int`
Arguments:
  * `PyArrayObject* ary`, a NumPy array.
  * `int* exact_dimensions`, an array of integers representing acceptable numbers of dimensions.
  * `int n`, the length of `exact_dimensions`.


Require `ary` to have one of a list of specified number of dimensions. If the array has one of the specified number of dimensions, return 1. Otherwise, set the Python error string and return 0.
require_size()
    
Return type: `int`
Arguments:
  * `PyArrayObject* ary`, a NumPy array.
  * `npy_int* size`, an array representing the desired lengths of each dimension.
  * `int n`, the length of `size`.


Require `ary` to have a specified shape. If the array has the specified shape, return 1. Otherwise, set the Python error string and return 0.
require_fortran()
    
Return type: `int`
Arguments:
  * `PyArrayObject* ary`, a NumPy array.


Require the given `PyArrayObject` to be Fortran ordered. If the `PyArrayObject` is already Fortran ordered, do nothing. Else, set the Fortran ordering flag and recompute the strides.
## Beyond the provided typemaps
There are many C or C++ array/NumPy array situations not covered by a simple `%include "numpy.i"` and subsequent `%apply` directives.
### A Common Example
Consider a reasonable prototype for a dot product function:
    
    double dot(int len, double* vec1, double* vec2);
    
The Python interface that we want is:
    
    def dot(vec1, vec2):
        """
        dot(PyObject,PyObject) -> double
        """
    
The problem here is that there is one dimension argument and two array arguments, and our typemaps are set up for dimensions that apply to a single array (in fact, SWIG does not provide a mechanism for associating `len` with `vec2` that takes two Python input arguments). The recommended solution is the following:
    
    %apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1),
                                          (int len2, double* vec2)}
    %rename (dot) my_dot;
    %exception my_dot {
        $action
        if (PyErr_Occurred()) SWIG_fail;
    }
    %inline %{
    double my_dot(int len1, double* vec1, int len2, double* vec2) {
        if (len1 != len2) {
            PyErr_Format(PyExc_ValueError,
                         "Arrays of lengths (%d,%d) given",
                         len1, len2);
            return 0.0;
        }
        return dot(len1, vec1, vec2);
    }
    %}
    
If the header file that contains the prototype for `double dot()` also contains other prototypes that you want to wrap, so that you need to `%include` this header file, then you will also need a `%ignore dot;` directive, placed after the `%rename` and before the `%include` directives. Or, if the function in question is a class method, you will want to use `%extend` rather than `%inline` in addition to `%ignore`.
A note on error handling: Note that `my_dot` returns a `double` but that it can also raise a Python error. The resulting wrapper function will return a Python float representation of 0.0 when the vector lengths do not match. Since this is not `NULL`, the Python interpreter will not know to check for an error. For this reason, we add the `%exception` directive above for `my_dot` to get the behavior we want (note that `$action` is a macro that gets expanded to a valid call to `my_dot`). In general, you will probably want to write a SWIG macro to perform this task.
### Other Situations
There are other wrapping situations in which `numpy.i` may be helpful when you encounter them.
  * In some situations, it is possible that you could use the `%numpy_typemaps` macro to implement typemaps for your own types. See the Other Common Types: bool or Other Common Types: complex sections for examples. Another situation is if your dimensions are of a type other than `int` (say `long` for example):
        %numpy_typemaps(double, NPY_DOUBLE, long)
        
  * You can use the code in `numpy.i` to write your own typemaps. For example, if you had a five-dimensional array as a function argument, you could cut-and-paste the appropriate four-dimensional typemaps into your interface file. The modifications for the fourth dimension would be trivial.
  * Sometimes, the best approach is to use the `%extend` directive to define new methods for your classes (or overload existing ones) that take a `PyObject*` (that either is or can be converted to a `PyArrayObject*`) instead of a pointer to a buffer. In this case, the helper routines in `numpy.i` can be very useful.
  * Writing typemaps can be a bit nonintuitive. If you have specific questions about writing SWIG typemaps for NumPy, the developers of `numpy.i` do monitor the Numpy-discussion and Swig-user mail lists.


### A Final Note
When you use the `%apply` directive, as is usually necessary to use `numpy.i`, it will remain in effect until you tell SWIG that it shouldn’t be. If the arguments to the functions or methods that you are wrapping have common names, such as `length` or `vector`, these typemaps may get applied in situations you do not expect or want. Therefore, it is always a good idea to add a `%clear` directive after you are done with a specific typemap:
    
    %apply (double* IN_ARRAY1, int DIM1) {(double* vector, int length)}
    %include "my_header.h"
    %clear (double* vector, int length);
    
In general, you should target these typemap signatures specifically where you want them, and then clear them after you are done.
## Summary
Out of the box, `numpy.i` provides typemaps that support conversion between NumPy arrays and C arrays:
  * That can be one of 12 different scalar types: `signed char`, `unsigned char`, `short`, `unsigned short`, `int`, `unsigned int`, `long`, `unsigned long`, `long long`, `unsigned long long`, `float` and `double`.
  * That support 74 different argument signatures for each data type, including:
    * One-dimensional, two-dimensional, three-dimensional and four-dimensional arrays.
    * Input-only, in-place, argout, argoutview, and memory managed argoutview behavior.
    * Hard-coded dimensions, data-buffer-then-dimensions specification, and dimensions-then-data-buffer specification.
    * Both C-ordering (“last dimension fastest”) or Fortran-ordering (“first dimension fastest”) support for 2D, 3D and 4D arrays.


The `numpy.i` interface file also provides additional tools for wrapper developers, including:
  * A SWIG macro (`%numpy_typemaps`) with three arguments for implementing the 74 argument signatures for the user’s choice of (1) C data type, (2) NumPy data type (assuming they match), and (3) dimension type.
  * Fourteen C macros and fifteen C functions that can be used to write specialized typemaps, extensions, or inlined functions that handle cases not covered by the provided typemaps. Note that the macros and functions are coded specifically to work with the NumPy C/API regardless of NumPy version number, both before and after the deprecation of some aspects of the API after version 1.6.


# Testing the numpy.i typemaps
## Introduction
Writing tests for the `numpy.i` SWIG interface file is a combinatorial headache. At present, 12 different data types are supported, each with 74 different argument signatures, for a total of 888 typemaps supported “out of the box”. Each of these typemaps, in turn, might require several unit tests in order to verify expected behavior for both proper and improper inputs. Currently, this results in more than 1,000 individual unit tests executed when `make test` is run in the `numpy/tools/swig` subdirectory.
To facilitate this many similar unit tests, some high-level programming techniques are employed, including C and SWIG macros, as well as Python inheritance. The purpose of this document is to describe the testing infrastructure employed to verify that the `numpy.i` typemaps are working as expected.
## Testing organization
There are three independent testing frameworks supported, for one-, two-, and three-dimensional arrays respectively. For one-dimensional arrays, there are two C++ files, a header and a source, named:
    
    Vector.h
    Vector.cxx
    
that contain prototypes and code for a variety of functions that have one-dimensional arrays as function arguments. The file:
    
    Vector.i
    
is a SWIG interface file that defines a python module `Vector` that wraps the functions in `Vector.h` while utilizing the typemaps in `numpy.i` to correctly handle the C arrays.
The `Makefile` calls `swig` to generate `Vector.py` and `Vector_wrap.cxx`, and also executes the `setup.py` script that compiles `Vector_wrap.cxx` and links together the extension module `_Vector.so` or `_Vector.dylib`, depending on the platform. This extension module and the proxy file `Vector.py` are both placed in a subdirectory under the `build` directory.
The actual testing takes place with a Python script named:
    
    testVector.py
    
that uses the standard Python library module `unittest`, which performs several tests of each function defined in `Vector.h` for each data type supported.
Two-dimensional arrays are tested in exactly the same manner. The above description applies, but with `Matrix` substituted for `Vector`. For three-dimensional tests, substitute `Tensor` for `Vector`. For four-dimensional tests, substitute `SuperTensor` for `Vector`. For flat in-place array tests, substitute `Flat` for `Vector`. For the descriptions that follow, we will reference the `Vector` tests, but the same information applies to `Matrix`, `Tensor` and `SuperTensor` tests.
The command `make test` will ensure that all of the test software is built and then run all three test scripts.
## Testing header files
`Vector.h` is a C++ header file that defines a C macro called `TEST_FUNC_PROTOS` that takes two arguments: `TYPE`, which is a data type name such as `unsigned int`; and `SNAME`, which is a short name for the same data type with no spaces, e.g. `uint`. This macro defines several function prototypes that have the prefix `SNAME` and have at least one argument that is an array of type `TYPE`. Those functions that have return arguments return a `TYPE` value.
`TEST_FUNC_PROTOS` is then implemented for all of the data types supported by `numpy.i`:
  * `signed char`
  * `unsigned char`
  * `short`
  * `unsigned short`
  * `int`
  * `unsigned int`
  * `long`
  * `unsigned long`
  * `long long`
  * `unsigned long long`
  * `float`
  * `double`


## Testing source files
`Vector.cxx` is a C++ source file that implements compilable code for each of the function prototypes specified in `Vector.h`. It defines a C macro `TEST_FUNCS` that has the same arguments and works in the same way as `TEST_FUNC_PROTOS` does in `Vector.h`. `TEST_FUNCS` is implemented for each of the 12 data types as above.
## Testing SWIG interface files
`Vector.i` is a SWIG interface file that defines python module `Vector`. It follows the conventions for using `numpy.i` as described in this chapter. It defines a SWIG macro `%apply_numpy_typemaps` that has a single argument `TYPE`. It uses the SWIG directive `%apply` to apply the provided typemaps to the argument signatures found in `Vector.h`. This macro is then implemented for all of the data types supported by `numpy.i`. It then does a `%include "Vector.h"` to wrap all of the function prototypes in `Vector.h` using the typemaps in `numpy.i`.
## Testing Python scripts
After `make` is used to build the testing extension modules, `testVector.py` can be run to execute the tests. As with other scripts that use `unittest` to facilitate unit testing, `testVector.py` defines a class that inherits from `unittest.TestCase`:
    
    class VectorTestCase(unittest.TestCase):
    
However, this class is not run directly. Rather, it serves as a base class to several other python classes, each one specific to a particular data type. The `VectorTestCase` class stores two strings for typing information:
self.typeStr
    
A string that matches one of the `SNAME` prefixes used in `Vector.h` and `Vector.cxx`. For example, `"double"`.
self.typeCode
    
A short (typically single-character) string that represents a data type in numpy and corresponds to `self.typeStr`. For example, if `self.typeStr` is `"double"`, then `self.typeCode` should be `"d"`.
Each test defined by the `VectorTestCase` class extracts the python function it is trying to test by accessing the `Vector` module’s dictionary:
    
    length = Vector.__dict__[self.typeStr + "Length"]
    
In the case of double precision tests, this will return the python function `Vector.doubleLength`.
We then define a new test case class for each supported data type with a short definition such as:
    
    class doubleTestCase(VectorTestCase):
        def __init__(self, methodName="runTest"):
            VectorTestCase.__init__(self, methodName)
            self.typeStr  = "double"
            self.typeCode = "d"
    
Each of these 12 classes is collected into a `unittest.TestSuite`, which is then executed. Errors and failures are summed together and returned as the exit argument. Any non-zero result indicates that at least one test did not pass.
# Testing guidelines
## Introduction
Until the 1.15 release, NumPy used the nose testing framework, it now uses the pytest framework. The older framework is still maintained in order to support downstream projects that use the old numpy framework, but all tests for NumPy should use pytest.
Our goal is that every module and package in NumPy should have a thorough set of unit tests. These tests should exercise the full functionality of a given routine as well as its robustness to erroneous or unexpected input arguments. Well-designed tests with good coverage make an enormous difference to the ease of refactoring. Whenever a new bug is found in a routine, you should write a new test for that specific case and add it to the test suite to prevent that bug from creeping back in unnoticed.
Note
SciPy uses the testing framework from `numpy.testing`, so all of the NumPy examples shown below are also applicable to SciPy
## Testing NumPy
NumPy can be tested in a number of ways, choose any way you feel comfortable.
### Running tests from inside Python
You can test an installed NumPy by `numpy.test`, for example, To run NumPy’s full test suite, use the following:
    
    >>> import numpy
    >>> numpy.test(label='slow')
    
The test method may take two or more arguments; the first `label` is a string specifying what should be tested and the second `verbose` is an integer giving the level of output verbosity. See the docstring `numpy.test` for details. The default value for `label` is ‘fast’ - which will run the standard tests. The string ‘full’ will run the full battery of tests, including those identified as being slow to run. If `verbose` is 1 or less, the tests will just show information messages about the tests that are run; but if it is greater than 1, then the tests will also provide warnings on missing tests. So if you want to run every test and get messages about which modules don’t have tests:
    
    >>> numpy.test(label='full', verbose=2)  # or numpy.test('full', 2)
    
Finally, if you are only interested in testing a subset of NumPy, for example, the `_core` module, use the following:
    
    >>> numpy._core.test()
    
### Running tests from the command line
If you want to build NumPy in order to work on NumPy itself, use the `spin` utility. To run NumPy’s full test suite:
    
    $ spin test -m full
    
Testing a subset of NumPy:
    
    $ spin test -t numpy/_core/tests
    
For detailed info on testing, see Testing builds
### Running doctests
NumPy documentation contains code examples, “doctests”. To check that the examples are correct, install the `scipy-doctest` package:
    
    $ pip install scipy-doctest
    
and run one of:
    
    $ spin check-docs -v
    $ spin check-docs numpy/linalg
    $ spin check-docs -- -k 'det and not slogdet'
    
Note that the doctests are not run when you use `spin test`.
### Other methods of running tests
Run tests using your favourite IDE such as vscode or pycharm
## Writing your own tests
If you are writing code that you’d like to become part of NumPy, please write the tests as you develop your code. Every Python module, extension module, or subpackage in the NumPy package directory should have a corresponding `test_<name>.py` file. Pytest examines these files for test methods (named `test*`) and test classes (named `Test*`).
Suppose you have a NumPy module `numpy/xxx/yyy.py` containing a function `zzz()`. To test this function you would create a test module called `test_yyy.py`. If you only need to test one aspect of `zzz`, you can simply add a test function:
    
    def test_zzz():
        assert zzz() == 'Hello from zzz'
    
More often, we need to group a number of tests together, so we create a test class:
    
    import pytest
    
    # import xxx symbols
    from numpy.xxx.yyy import zzz
    import pytest
    
    class TestZzz:
        def test_simple(self):
            assert zzz() == 'Hello from zzz'
    
        def test_invalid_parameter(self):
            with pytest.raises(ValueError, match='.*some matching regex.*'):
                ...
    
Within these test methods, the `assert` statement or a specialized assertion function is used to test whether a certain assumption is valid. If the assertion fails, the test fails. Common assertion functions include:
  * `numpy.testing.assert_equal` for testing exact elementwise equality between a result array and a reference,
  * `numpy.testing.assert_allclose` for testing near elementwise equality between a result array and a reference (i.e. with specified relative and absolute tolerances), and
  * `numpy.testing.assert_array_less` for testing (strict) elementwise ordering between a result array and a reference.


By default, these assertion functions only compare the numerical values in the arrays. Consider using the `strict=True` option to check the array dtype and shape, too.
When you need custom assertions, use the Python `assert` statement. Note that `pytest` internally rewrites `assert` statements to give informative output when it fails, so it should be preferred over the legacy variant `numpy.testing.assert_`. Whereas plain `assert` statements are ignored when running Python in optimized mode with `-O`, this is not an issue when running tests with pytest.
Similarly, the pytest functions `pytest.raises` and `pytest.warns` should be preferred over their legacy counterparts `numpy.testing.assert_raises` and `numpy.testing.assert_warns`, which are more broadly used. These versions also accept a `match` parameter, which should always be used to precisely target the intended warning or error.
Note that `test_` functions or methods should not have a docstring, because that makes it hard to identify the test from the output of running the test suite with `verbose=2` (or similar verbosity setting). Use plain comments (`#`) to describe the intent of the test and help the unfamiliar reader to interpret the code.
Also, since much of NumPy is legacy code that was originally written without unit tests, there are still several modules that don’t have tests yet. Please feel free to choose one of these modules and develop tests for it.
### Using C code in tests
NumPy exposes a rich C-API . These are tested using c-extension modules written “as-if” they know nothing about the internals of NumPy, rather using the official C-API interfaces only. Examples of such modules are tests for a user-defined `rational` dtype in `_rational_tests` or the ufunc machinery tests in `_umath_tests` which are part of the binary distribution. Starting from version 1.21, you can also write snippets of C code in tests that will be compiled locally into c-extension modules and loaded into python.
numpy.testing.extbuild.build_and_import_extension(modname, functions, *, prologue='', build_dir=None, include_dirs=[], more_init='')
    
Build and imports a c-extension module `modname` from a list of function fragments `functions`.
Parameters:
    
functionslist of fragments
    
Each fragment is a sequence of func_name, calling convention, snippet.
prologuestring
    
Code to precede the rest, usually extra `#include` or `#define` macros.
build_dirpathlib.Path
    
Where to build the module, usually a temporary directory
include_dirslist
    
Extra directories to find include files when compiling
more_initstring
    
Code to appear in the module PyMODINIT_FUNC
Returns:
    
out: module
    
The module will have been loaded and is ready for use
#### Examples
    
    >>> functions = [("test_bytes", "METH_O", """
        if ( !PyBytesCheck(args)) {
            Py_RETURN_FALSE;
        }
        Py_RETURN_TRUE;
    """)]
    >>> mod = build_and_import_extension("testme", functions)
    >>> assert not mod.test_bytes('abc')
    >>> assert mod.test_bytes(b'abc')
    
### Labeling tests
Unlabeled tests like the ones above are run in the default `numpy.test()` run. If you want to label your test as slow - and therefore reserved for a full `numpy.test(label='full')` run, you can label it with `pytest.mark.slow`:
    
    import pytest
    
    @pytest.mark.slow
    def test_big(self):
        print('Big, slow test')
    
Similarly for methods:
    
    class test_zzz:
        @pytest.mark.slow
        def test_simple(self):
            assert_(zzz() == 'Hello from zzz')
    
### Easier setup and teardown functions / methods
Testing looks for module-level or class method-level setup and teardown functions by name; thus:
    
    def setup_module():
        """Module-level setup"""
        print('doing setup')
    
    def teardown_module():
        """Module-level teardown"""
        print('doing teardown')
    
    
    class TestMe:
        def setup_method(self):
            """Class-level setup"""
            print('doing setup')
    
        def teardown_method():
            """Class-level teardown"""
            print('doing teardown')
    
Setup and teardown functions to functions and methods are known as “fixtures”, and they should be used sparingly. `pytest` supports more general fixture at various scopes which may be used automatically via special arguments. For example, the special argument name `tmpdir` is used in test to create a temporary directory.
### Parametric tests
One very nice feature of `pytest` is the ease of testing across a range of parameter values using the `pytest.mark.parametrize` decorator. For example, suppose you wish to test `linalg.solve` for all combinations of three array sizes and two data types:
    
    @pytest.mark.parametrize('dimensionality', [3, 10, 25])
    @pytest.mark.parametrize('dtype', [np.float32, np.float64])
    def test_solve(dimensionality, dtype):
        np.random.seed(842523)
        A = np.random.random(size=(dimensionality, dimensionality)).astype(dtype)
        b = np.random.random(size=dimensionality).astype(dtype)
        x = np.linalg.solve(A, b)
        eps = np.finfo(dtype).eps
        assert_allclose(A @ x, b, rtol=eps*1e2, atol=0)
        assert x.dtype == np.dtype(dtype)
    
### Doctests
Doctests are a convenient way of documenting the behavior of a function and allowing that behavior to be tested at the same time. The output of an interactive Python session can be included in the docstring of a function, and the test framework can run the example and compare the actual output to the expected output.
The doctests can be run by adding the `doctests` argument to the `test()` call; for example, to run all tests (including doctests) for numpy.lib:
    
    >>> import numpy as np
    >>> np.lib.test(doctests=True)
    
The doctests are run as if they are in a fresh Python instance which has executed `import numpy as np`. Tests that are part of a NumPy subpackage will have that subpackage already imported. E.g. for a test in `numpy/linalg/tests/`, the namespace will be created such that `from numpy import linalg` has already executed.
### `tests/`
Rather than keeping the code and the tests in the same directory, we put all the tests for a given subpackage in a `tests/` subdirectory. For our example, if it doesn’t already exist you will need to create a `tests/` directory in `numpy/xxx/`. So the path for `test_yyy.py` is `numpy/xxx/tests/test_yyy.py`.
Once the `numpy/xxx/tests/test_yyy.py` is written, its possible to run the tests by going to the `tests/` directory and typing:
    
    python test_yyy.py
    
Or if you add `numpy/xxx/tests/` to the Python path, you could run the tests interactively in the interpreter like this:
    
    >>> import test_yyy
    >>> test_yyy.test()
    
###  `__init__.py` and `setup.py`
Usually, however, adding the `tests/` directory to the python path isn’t desirable. Instead it would better to invoke the test straight from the module `xxx`. To this end, simply place the following lines at the end of your package’s `__init__.py` file:
    
    ...
    def test(level=1, verbosity=1):
        from numpy.testing import Tester
        return Tester().test(level, verbosity)
    
You will also need to add the tests directory in the configuration section of your setup.py:
    
    ...
    def configuration(parent_package='', top_path=None):
        ...
        config.add_subpackage('tests')
        return config
    ...
    
Now you can do the following to test your module:
    
    >>> import numpy
    >>> numpy.xxx.test()
    
Also, when invoking the entire NumPy test suite, your tests will be found and run:
    
    >>> import numpy
    >>> numpy.test()
    # your tests are included and run automatically!
    
## Tips & Tricks
### Known failures & skipping tests
Sometimes you might want to skip a test or mark it as a known failure, such as when the test suite is being written before the code it’s meant to test, or if a test only fails on a particular architecture.
To skip a test, simply use `skipif`:
    
    import pytest
    
    @pytest.mark.skipif(SkipMyTest, reason="Skipping this test because...")
    def test_something(foo):
        ...
    
The test is marked as skipped if `SkipMyTest` evaluates to nonzero, and the message in verbose test output is the second argument given to `skipif`. Similarly, a test can be marked as a known failure by using `xfail`:
    
    import pytest
    
    @pytest.mark.xfail(MyTestFails, reason="This test is known to fail because...")
    def test_something_else(foo):
        ...
    
Of course, a test can be unconditionally skipped or marked as a known failure by using `skip` or `xfail` without argument, respectively.
A total of the number of skipped and known failing tests is displayed at the end of the test run. Skipped tests are marked as `'S'` in the test results (or `'SKIPPED'` for `verbose > 1`), and known failing tests are marked as `'x'` (or `'XFAIL'` if `verbose > 1`).
### Tests on random data
Tests on random data are good, but since test failures are meant to expose new bugs or regressions, a test that passes most of the time but fails occasionally with no code changes is not helpful. Make the random data deterministic by setting the random number seed before generating it. Use either Python’s `random.seed(some_number)` or NumPy’s `numpy.random.seed(some_number)`, depending on the source of random numbers.
Alternatively, you can use Hypothesis to generate arbitrary data. Hypothesis manages both Python’s and Numpy’s random seeds for you, and provides a very concise and powerful way to describe data (including `hypothesis.extra.numpy`, e.g. for a set of mutually-broadcastable shapes).
The advantages over random generation include tools to replay and share failures without requiring a fixed seed, reporting minimal examples for each failure, and better-than-naive-random techniques for triggering bugs.
### Documentation for `numpy.test`
numpy.test(label='fast', verbose=1, extra_argv=None, doctests=False, coverage=False, durations=-1, tests=None)
    
Pytest test runner.
A test function is typically added to a package’s __init__.py like so:
    
    from numpy._pytesttester import PytestTester
    test = PytestTester(__name__).test
    del PytestTester
    
Calling this test function finds and runs all tests associated with the module and all its sub-modules.
Parameters:
    
module_namemodule name
    
The name of the module to test.
#### Notes
Unlike the previous `nose`-based implementation, this class is not publicly exposed as it performs some `numpy`-specific warning suppression.
Attributes:
    
module_namestr
    
Full path to the package to test.
# Thread Safety
NumPy supports use in a multithreaded context via the `threading` module in the standard library. Many NumPy operations release the GIL, so unlike many situations in Python, it is possible to improve parallel performance by exploiting multithreaded parallelism in Python.
The easiest performance gains happen when each worker thread owns its own array or set of array objects, with no data directly shared between threads. Because NumPy releases the GIL for many low-level operations, threads that spend most of the time in low-level code will run in parallel.
It is possible to share NumPy arrays between threads, but extreme care must be taken to avoid creating thread safety issues when mutating arrays that are shared between multiple threads. If two threads simultaneously read from and write to the same array, they will at best produce inconsistent, racey results that are not reproducible, let alone correct. It is also possible to crash the Python interpreter by, for example, resizing an array while another thread is reading from it to compute a ufunc operation.
In the future, we may add locking to ndarray to make writing multithreaded algorithms using NumPy arrays safer, but for now we suggest focusing on read-only access of arrays that are shared between threads, or adding your own locking if you need to mutation and multithreading.
Note that operations that do not release the GIL will see no performance gains from use of the `threading` module, and instead might be better served with `multiprocessing`. In particular, operations on arrays with `dtype=object` do not release the GIL.
## Free-threaded Python
New in version 2.1.
Starting with NumPy 2.1 and CPython 3.13, NumPy also has experimental support for python runtimes with the GIL disabled. See https://py-free-threading.github.io for more information about installing and using free-threaded Python, as well as information about supporting it in libraries that depend on NumPy.
Because free-threaded Python does not have a global interpreter lock to serialize access to Python objects, there are more opportunities for threads to mutate shared state and create thread safety issues. In addition to the limitations about locking of the ndarray object noted above, this also means that arrays with `dtype=object` are not protected by the GIL, creating data races for python objects that are not possible outside free-threaded python.
# Typing (numpy.typing)
New in version 1.20.
Large parts of the NumPy API have PEP 484-style type annotations. In addition a number of type aliases are available to users, most prominently the two below:
  * `ArrayLike`: objects that can be converted to arrays
  * `DTypeLike`: objects that can be converted to dtypes


## Mypy plugin
New in version 1.21.
A mypy plugin for managing a number of platform-specific annotations. Its functionality can be split into three distinct parts:
  * Assigning the (platform-dependent) precisions of certain `number` subclasses, including the likes of `int_`, `intp` and `longlong`. See the documentation on scalar types for a comprehensive overview of the affected classes. Without the plugin the precision of all relevant classes will be inferred as `Any`.
  * Removing all extended-precision `number` subclasses that are unavailable for the platform in question. Most notably this includes the likes of `float128` and `complex256`. Without the plugin all extended-precision types will, as far as mypy is concerned, be available to all platforms.
  * Assigning the (platform-dependent) precision of `c_intp`. Without the plugin the type will default to `ctypes.c_int64`.
New in version 1.22.


### Examples
To enable the plugin, one must add it to their mypy configuration file:
    
    [mypy]
    plugins = numpy.typing.mypy_plugin
    
## Differences from the runtime NumPy API
NumPy is very flexible. Trying to describe the full range of possibilities statically would result in types that are not very helpful. For that reason, the typed NumPy API is often stricter than the runtime NumPy API. This section describes some notable differences.
### ArrayLike
The `ArrayLike` type tries to avoid creating object arrays. For example,
    
    >>> np.array(x**2 for x in range(10))
    array(<generator object <genexpr> at ...>, dtype=object)
    
is valid NumPy code which will create a 0-dimensional object array. Type checkers will complain about the above example when using the NumPy types however. If you really intended to do the above, then you can either use a `# type: ignore` comment:
    
    >>> np.array(x**2 for x in range(10))  # type: ignore
    
or explicitly type the array like object as `Any`:
    
    >>> from typing import Any
    >>> array_like: Any = (x**2 for x in range(10))
    >>> np.array(array_like)
    array(<generator object <genexpr> at ...>, dtype=object)
    
### ndarray
It’s possible to mutate the dtype of an array at runtime. For example, the following code is valid:
    
    >>> x = np.array([1, 2])
    >>> x.dtype = np.bool
    
This sort of mutation is not allowed by the types. Users who want to write statically typed code should instead use the `numpy.ndarray.view` method to create a view of the array with a different dtype.
### DTypeLike
The `DTypeLike` type tries to avoid creation of dtype objects using dictionary of fields like below:
    
    >>> x = np.dtype({"field1": (float, 1), "field2": (int, 3)})
    
Although this is valid NumPy code, the type checker will complain about it, since its usage is discouraged. Please see : Data type objects
### Number precision
The precision of `numpy.number` subclasses is treated as a invariant generic parameter (see `NBitBase`), simplifying the annotating of processes involving precision-based casting.
    
    >>> from typing import TypeVar
    >>> import numpy as np
    >>> import numpy.typing as npt
    
    >>> T = TypeVar("T", bound=npt.NBitBase)
    >>> def func(a: "np.floating[T]", b: "np.floating[T]") -> "np.floating[T]":
    ...     ...
    
Consequently, the likes of `float16`, `float32` and `float64` are still sub-types of `floating`, but, contrary to runtime, they’re not necessarily considered as sub-classes.
### Timedelta64
The `timedelta64` class is not considered a subclass of `signedinteger`, the former only inheriting from `generic` while static type checking.
### 0D arrays
During runtime numpy aggressively casts any passed 0D arrays into their corresponding `generic` instance. Until the introduction of shape typing (see PEP 646) it is unfortunately not possible to make the necessary distinction between 0D and >0D arrays. While thus not strictly correct, all operations are that can potentially perform a 0D-array -> scalar cast are currently annotated as exclusively returning an `ndarray`.
If it is known in advance that an operation will perform a 0D-array -> scalar cast, then one can consider manually remedying the situation with either `typing.cast` or a `# type: ignore` comment.
### Record array dtypes
The dtype of `numpy.recarray`, and the Creating record arrays functions in general, can be specified in one of two ways:
  * Directly via the `dtype` argument.
  * With up to five helper arguments that operate via `numpy.rec.format_parser`: `formats`, `names`, `titles`, `aligned` and `byteorder`.


These two approaches are currently typed as being mutually exclusive, i.e. if `dtype` is specified than one may not specify `formats`. While this mutual exclusivity is not (strictly) enforced during runtime, combining both dtype specifiers can lead to unexpected or even downright buggy behavior.
## API
numpy.typing.ArrayLike=typing.Union[...] 
    
A `Union` representing objects that can be coerced into an `ndarray`.
Among others this includes the likes of:
  * Scalars.
  * (Nested) sequences.
  * Objects implementing the `__array__` protocol.


New in version 1.20.
See Also
array_like:
    
Any scalar or sequence that can be interpreted as an ndarray.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.typing as npt
    
    >>> def as_array(a: npt.ArrayLike) -> np.ndarray:
    ...     return np.array(a)
    
numpy.typing.DTypeLike=typing.Union[...] 
    
A `Union` representing objects that can be coerced into a `dtype`.
Among others this includes the likes of:
  * `type` objects.
  * Character codes or the names of `type` objects.
  * Objects with the `.dtype` attribute.


New in version 1.20.
See Also
Specifying and constructing data types
    
A comprehensive overview of all objects that can be coerced into data types.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.typing as npt
    
    >>> def as_dtype(d: npt.DTypeLike) -> np.dtype:
    ...     return np.dtype(d)
    
numpy.typing.NDArray=numpy.ndarray[tuple[int, ...], numpy.dtype[+_ScalarType_co]][source]
    
A `np.ndarray[tuple[int, ...], np.dtype[+ScalarType]]` type alias generic w.r.t. its `dtype.type`.
Can be used during runtime for typing arrays with a given dtype and unspecified shape.
New in version 1.21.
#### Examples
    
    >>> import numpy as np
    >>> import numpy.typing as npt
    
    >>> print(npt.NDArray)
    numpy.ndarray[tuple[int, ...], numpy.dtype[+_ScalarType_co]]
    
    >>> print(npt.NDArray[np.float64])
    numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.float64]]
    
    >>> NDArrayInt = npt.NDArray[np.int_]
    >>> a: NDArrayInt = np.arange(10)
    
    >>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
    ...     return np.array(a)
    
classnumpy.typing.NBitBase[source]
    
A type representing `numpy.number` precision during static type checking.
Used exclusively for the purpose static type checking, `NBitBase` represents the base of a hierarchical set of subclasses. Each subsequent subclass is herein used for representing a lower level of precision, e.g. `64Bit > 32Bit > 16Bit`.
New in version 1.20.
#### Examples
Below is a typical usage example: `NBitBase` is herein used for annotating a function that takes a float and integer of arbitrary precision as arguments and returns a new float of whichever precision is largest (e.g. `np.float16 + np.int64 -> np.float64`).
    
    >>> from __future__ import annotations
    >>> from typing import TypeVar, TYPE_CHECKING
    >>> import numpy as np
    >>> import numpy.typing as npt
    
    >>> S = TypeVar("S", bound=npt.NBitBase)
    >>> T = TypeVar("T", bound=npt.NBitBase)
    
    >>> def add(a: np.floating[S], b: np.integer[T]) -> np.floating[S | T]:
    ...     return a + b
    
    >>> a = np.float16()
    >>> b = np.int64()
    >>> out = add(a, b)
    
    >>> if TYPE_CHECKING:
    ...     reveal_locals()
    ...     # note: Revealed local types are:
    ...     # note:     a: numpy.floating[numpy.typing._16Bit*]
    ...     # note:     b: numpy.signedinteger[numpy.typing._64Bit*]
    ...     # note:     out: numpy.floating[numpy.typing._64Bit*]
    
# Universal functions (ufunc)
See also
Universal functions (ufunc) basics
A universal function (or ufunc for short) is a function that operates on `ndarrays` in an element-by-element fashion, supporting array broadcasting, type casting, and several other standard features. That is, a ufunc is a “vectorized” wrapper for a function that takes a fixed number of specific inputs and produces a fixed number of specific outputs. For detailed information on universal functions, see Universal functions (ufunc) basics.
## ufunc
`numpy.ufunc`()
Functions that operate element by element on whole arrays.  
### Optional keyword arguments
All ufuncs take optional keyword arguments. Most of these represent advanced usage and will not typically be used.
#### out
The first output can be provided as either a positional or a keyword parameter. Keyword ‘out’ arguments are incompatible with positional ones.
The ‘out’ keyword argument is expected to be a tuple with one entry per output (which can be None for arrays to be allocated by the ufunc). For ufuncs with a single output, passing a single array (instead of a tuple holding a single array) is also valid.
Passing a single array in the ‘out’ keyword argument to a ufunc with multiple outputs is deprecated, and will raise a warning in numpy 1.10, and an error in a future release.
If ‘out’ is None (the default), a uninitialized return array is created. The output array is then filled with the results of the ufunc in the places that the broadcast ‘where’ is True. If ‘where’ is the scalar True (the default), then this corresponds to the entire output being filled. Note that outputs not explicitly filled are left with their uninitialized values.
Operations where ufunc input and output operands have memory overlap are defined to be the same as for equivalent operations where there is no memory overlap. Operations affected make temporary copies as needed to eliminate data dependency. As detecting these cases is computationally expensive, a heuristic is used, which may in rare cases result in needless temporary copies. For operations where the data dependency is simple enough for the heuristic to analyze, temporary copies will not be made even if the arrays overlap, if it can be deduced copies are not necessary. As an example, `np.add(a, b, out=a)` will not involve copies.
#### where
Accepts a boolean array which is broadcast together with the operands. Values of True indicate to calculate the ufunc at that position, values of False indicate to leave the value in the output alone. This argument cannot be used for generalized ufuncs as those take non-scalar input.
Note that if an uninitialized return array is created, values of False will leave those values uninitialized.
#### axes
A list of tuples with indices of axes a generalized ufunc should operate on. For instance, for a signature of `(i,j),(j,k)->(i,k)` appropriate for matrix multiplication, the base elements are two-dimensional matrices and these are taken to be stored in the two last axes of each argument. The corresponding axes keyword would be `[(-2, -1), (-2, -1), (-2, -1)]`. For simplicity, for generalized ufuncs that operate on 1-dimensional arrays (vectors), a single integer is accepted instead of a single-element tuple, and for generalized ufuncs for which all outputs are scalars, the output tuples can be omitted.
#### axis
A single axis over which a generalized ufunc should operate. This is a short-cut for ufuncs that operate over a single, shared core dimension, equivalent to passing in `axes` with entries of `(axis,)` for each single-core-dimension argument and `()` for all others. For instance, for a signature `(i),(i)->()`, it is equivalent to passing in `axes=[(axis,), (axis,), ()]`.
#### keepdims
If this is set to `True`, axes which are reduced over will be left in the result as a dimension with size one, so that the result will broadcast correctly against the inputs. This option can only be used for generalized ufuncs that operate on inputs that all have the same number of core dimensions and with outputs that have no core dimensions, i.e., with signatures like `(i),(i)->()` or `(m,m)->()`. If used, the location of the dimensions in the output can be controlled with `axes` and `axis`.
#### casting
May be ‘no’, ‘equiv’, ‘safe’, ‘same_kind’, or ‘unsafe’. See `can_cast` for explanations of the parameter values.
Provides a policy for what kind of casting is permitted. For compatibility with previous versions of NumPy, this defaults to ‘unsafe’ for numpy < 1.7. In numpy 1.7 a transition to ‘same_kind’ was begun where ufuncs produce a DeprecationWarning for calls which are allowed under the ‘unsafe’ rules, but not under the ‘same_kind’ rules. From numpy 1.10 and onwards, the default is ‘same_kind’.
#### order
Specifies the calculation iteration order/memory layout of the output array. Defaults to ‘K’. ‘C’ means the output should be C-contiguous, ‘F’ means F-contiguous, ‘A’ means F-contiguous if the inputs are F-contiguous and not also not C-contiguous, C-contiguous otherwise, and ‘K’ means to match the element ordering of the inputs as closely as possible.
#### dtype
Overrides the DType of the output arrays the same way as the signature. This should ensure a matching precision of the calculation. The exact calculation DTypes chosen may depend on the ufunc and the inputs may be cast to this DType to perform the calculation.
#### subok
Defaults to true. If set to false, the output will always be a strict array, not a subtype.
#### signature
Either a Dtype, a tuple of DTypes, or a special signature string indicating the input and output types of a ufunc.
This argument allows the user to specify exact DTypes to be used for the calculation. Casting will be used as necessary. The actual DType of the input arrays is not considered unless `signature` is `None` for that array.
When all DTypes are fixed, a specific loop is chosen or an error raised if no matching loop exists. If some DTypes are not specified and left `None`, the behaviour may depend on the ufunc. At this time, a list of available signatures is provided by the types attribute of the ufunc. (This list may be missing DTypes not defined by NumPy.)
The `signature` only specifies the DType class/type. For example, it can specify that the operation should be `datetime64` or `float64` operation. It does not specify the `datetime64` time-unit or the `float64` byte-order.
For backwards compatibility this argument can also be provided as sig, although the long form is preferred. Note that this should not be confused with the generalized ufunc signature that is stored in the signature attribute of the of the ufunc object.
### Attributes
There are some informational attributes that universal functions possess. None of the attributes can be set.
__doc__
A docstring for each ufunc. The first part of the docstring is dynamically generated from the number of outputs, the name, and the number of inputs. The second part of the docstring is provided at creation time and stored with the ufunc.  
__name__
The name of the ufunc.  
`ufunc.nin`
The number of inputs.  
`ufunc.nout`
The number of outputs.  
`ufunc.nargs`
The number of arguments.  
`ufunc.ntypes`
The number of types.  
`ufunc.types`
Returns a list with types grouped input->output.  
`ufunc.identity`
The identity value.  
`ufunc.signature`
Definition of the core elements a generalized ufunc operates on.  
### Methods
`ufunc.reduce`(array[, axis, dtype, out, ...])
Reduces `array`'s dimension by one, by applying ufunc along one axis.  
`ufunc.accumulate`(array[, axis, dtype, out])
Accumulate the result of applying the operator to all elements.  
`ufunc.reduceat`(array, indices[, axis, ...])
Performs a (local) reduce with specified slices over a single axis.  
`ufunc.outer`(A, B, /, **kwargs)
Apply the ufunc `op` to all pairs (a, b) with a in `A` and b in `B`.  
`ufunc.at`(a, indices[, b])
Performs unbuffered in place operation on operand 'a' for elements specified by 'indices'.  
Warning
A reduce-like operation on an array with a data-type that has a range “too small” to handle the result will silently wrap. One should use `dtype` to increase the size of the data-type over which reduction takes place.
## Available ufuncs
There are currently more than 60 universal functions defined in `numpy` on one or more types, covering a wide variety of operations. Some of these ufuncs are called automatically on arrays when the relevant infix notation is used (e.g., `add(a, b)` is called internally when `a + b` is written and a or b is an `ndarray`). Nevertheless, you may still want to use the ufunc call in order to use the optional output argument(s) to place the output(s) in an object (or objects) of your choice.
Recall that each ufunc operates element-by-element. Therefore, each scalar ufunc will be described as if acting on a set of scalar inputs to return a set of scalar outputs.
Note
The ufunc still returns its output(s) even if you use the optional output argument(s).
### Math operations
`add`(x1, x2, /[, out, where, casting, order, ...])
Add arguments element-wise.  
`subtract`(x1, x2, /[, out, where, casting, ...])
Subtract arguments, element-wise.  
`multiply`(x1, x2, /[, out, where, casting, ...])
Multiply arguments element-wise.  
`matmul`(x1, x2, /[, out, casting, order, ...])
Matrix product of two arrays.  
`divide`(x1, x2, /[, out, where, casting, ...])
Divide arguments element-wise.  
`logaddexp`(x1, x2, /[, out, where, casting, ...])
Logarithm of the sum of exponentiations of the inputs.  
`logaddexp2`(x1, x2, /[, out, where, casting, ...])
Logarithm of the sum of exponentiations of the inputs in base-2.  
`true_divide`(x1, x2, /[, out, where, ...])
Divide arguments element-wise.  
`floor_divide`(x1, x2, /[, out, where, ...])
Return the largest integer smaller or equal to the division of the inputs.  
`negative`(x, /[, out, where, casting, order, ...])
Numerical negative, element-wise.  
`positive`(x, /[, out, where, casting, order, ...])
Numerical positive, element-wise.  
`power`(x1, x2, /[, out, where, casting, ...])
First array elements raised to powers from second array, element-wise.  
`float_power`(x1, x2, /[, out, where, ...])
First array elements raised to powers from second array, element-wise.  
`remainder`(x1, x2, /[, out, where, casting, ...])
Returns the element-wise remainder of division.  
`mod`(x1, x2, /[, out, where, casting, order, ...])
Returns the element-wise remainder of division.  
`fmod`(x1, x2, /[, out, where, casting, ...])
Returns the element-wise remainder of division.  
`divmod`(x1, x2[, out1, out2], / [[, out, ...])
Return element-wise quotient and remainder simultaneously.  
`absolute`(x, /[, out, where, casting, order, ...])
Calculate the absolute value element-wise.  
`fabs`(x, /[, out, where, casting, order, ...])
Compute the absolute values element-wise.  
`rint`(x, /[, out, where, casting, order, ...])
Round elements of the array to the nearest integer.  
`sign`(x, /[, out, where, casting, order, ...])
Returns an element-wise indication of the sign of a number.  
`heaviside`(x1, x2, /[, out, where, casting, ...])
Compute the Heaviside step function.  
`conj`(x, /[, out, where, casting, order, ...])
Return the complex conjugate, element-wise.  
`conjugate`(x, /[, out, where, casting, ...])
Return the complex conjugate, element-wise.  
`exp`(x, /[, out, where, casting, order, ...])
Calculate the exponential of all elements in the input array.  
`exp2`(x, /[, out, where, casting, order, ...])
Calculate `2**p` for all `p` in the input array.  
`log`(x, /[, out, where, casting, order, ...])
Natural logarithm, element-wise.  
`log2`(x, /[, out, where, casting, order, ...])
Base-2 logarithm of `x`.  
`log10`(x, /[, out, where, casting, order, ...])
Return the base 10 logarithm of the input array, element-wise.  
`expm1`(x, /[, out, where, casting, order, ...])
Calculate `exp(x) - 1` for all elements in the array.  
`log1p`(x, /[, out, where, casting, order, ...])
Return the natural logarithm of one plus the input array, element-wise.  
`sqrt`(x, /[, out, where, casting, order, ...])
Return the non-negative square-root of an array, element-wise.  
`square`(x, /[, out, where, casting, order, ...])
Return the element-wise square of the input.  
`cbrt`(x, /[, out, where, casting, order, ...])
Return the cube-root of an array, element-wise.  
`reciprocal`(x, /[, out, where, casting, ...])
Return the reciprocal of the argument, element-wise.  
`gcd`(x1, x2, /[, out, where, casting, order, ...])
Returns the greatest common divisor of `|x1|` and `|x2|`  
`lcm`(x1, x2, /[, out, where, casting, order, ...])
Returns the lowest common multiple of `|x1|` and `|x2|`  
Tip
The optional output arguments can be used to help you save memory for large calculations. If your arrays are large, complicated expressions can take longer than absolutely necessary due to the creation and (later) destruction of temporary calculation spaces. For example, the expression `G = A * B + C` is equivalent to `T1 = A * B; G = T1 + C; del T1`. It will be more quickly executed as `G = A * B; add(G, C, G)` which is the same as `G = A * B; G += C`.
### Trigonometric functions
All trigonometric functions use radians when an angle is called for. The ratio of degrees to radians is \\(180^{\circ}/\pi.\\)
`sin`(x, /[, out, where, casting, order, ...])
Trigonometric sine, element-wise.  
`cos`(x, /[, out, where, casting, order, ...])
Cosine element-wise.  
`tan`(x, /[, out, where, casting, order, ...])
Compute tangent element-wise.  
`arcsin`(x, /[, out, where, casting, order, ...])
Inverse sine, element-wise.  
`arccos`(x, /[, out, where, casting, order, ...])
Trigonometric inverse cosine, element-wise.  
`arctan`(x, /[, out, where, casting, order, ...])
Trigonometric inverse tangent, element-wise.  
`arctan2`(x1, x2, /[, out, where, casting, ...])
Element-wise arc tangent of `x1/x2` choosing the quadrant correctly.  
`hypot`(x1, x2, /[, out, where, casting, ...])
Given the "legs" of a right triangle, return its hypotenuse.  
`sinh`(x, /[, out, where, casting, order, ...])
Hyperbolic sine, element-wise.  
`cosh`(x, /[, out, where, casting, order, ...])
Hyperbolic cosine, element-wise.  
`tanh`(x, /[, out, where, casting, order, ...])
Compute hyperbolic tangent element-wise.  
`arcsinh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic sine element-wise.  
`arccosh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic cosine, element-wise.  
`arctanh`(x, /[, out, where, casting, order, ...])
Inverse hyperbolic tangent element-wise.  
`degrees`(x, /[, out, where, casting, order, ...])
Convert angles from radians to degrees.  
`radians`(x, /[, out, where, casting, order, ...])
Convert angles from degrees to radians.  
`deg2rad`(x, /[, out, where, casting, order, ...])
Convert angles from degrees to radians.  
`rad2deg`(x, /[, out, where, casting, order, ...])
Convert angles from radians to degrees.  
### Bit-twiddling functions
These function all require integer arguments and they manipulate the bit-pattern of those arguments.
`bitwise_and`(x1, x2, /[, out, where, ...])
Compute the bit-wise AND of two arrays element-wise.  
`bitwise_or`(x1, x2, /[, out, where, casting, ...])
Compute the bit-wise OR of two arrays element-wise.  
`bitwise_xor`(x1, x2, /[, out, where, ...])
Compute the bit-wise XOR of two arrays element-wise.  
`invert`(x, /[, out, where, casting, order, ...])
Compute bit-wise inversion, or bit-wise NOT, element-wise.  
`left_shift`(x1, x2, /[, out, where, casting, ...])
Shift the bits of an integer to the left.  
`right_shift`(x1, x2, /[, out, where, ...])
Shift the bits of an integer to the right.  
### Comparison functions
`greater`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 > x2) element-wise.  
`greater_equal`(x1, x2, /[, out, where, ...])
Return the truth value of (x1 >= x2) element-wise.  
`less`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 < x2) element-wise.  
`less_equal`(x1, x2, /[, out, where, casting, ...])
Return the truth value of (x1 <= x2) element-wise.  
`not_equal`(x1, x2, /[, out, where, casting, ...])
Return (x1 != x2) element-wise.  
`equal`(x1, x2, /[, out, where, casting, ...])
Return (x1 == x2) element-wise.  
Warning
Do not use the Python keywords `and` and `or` to combine logical array expressions. These keywords will test the truth value of the entire array (not element-by-element as you might expect). Use the bitwise operators & and | instead.
`logical_and`(x1, x2, /[, out, where, ...])
Compute the truth value of x1 AND x2 element-wise.  
`logical_or`(x1, x2, /[, out, where, casting, ...])
Compute the truth value of x1 OR x2 element-wise.  
`logical_xor`(x1, x2, /[, out, where, ...])
Compute the truth value of x1 XOR x2, element-wise.  
`logical_not`(x, /[, out, where, casting, ...])
Compute the truth value of NOT x element-wise.  
Warning
The bit-wise operators & and | are the proper way to perform element-by-element array comparisons. Be sure you understand the operator precedence: `(a > 2) & (a < 5)` is the proper syntax because `a > 2 & a < 5` will result in an error due to the fact that `2 & a` is evaluated first.
`maximum`(x1, x2, /[, out, where, casting, ...])
Element-wise maximum of array elements.  
Tip
The Python function `max()` will find the maximum over a one-dimensional array, but it will do so using a slower sequence interface. The reduce method of the maximum ufunc is much faster. Also, the `max()` method will not give answers you might expect for arrays with greater than one dimension. The reduce method of minimum also allows you to compute a total minimum over an array.
`minimum`(x1, x2, /[, out, where, casting, ...])
Element-wise minimum of array elements.  
Warning
the behavior of `maximum(a, b)` is different than that of `max(a, b)`. As a ufunc, `maximum(a, b)` performs an element-by-element comparison of `a` and `b` and chooses each element of the result according to which element in the two arrays is larger. In contrast, `max(a, b)` treats the objects `a` and `b` as a whole, looks at the (total) truth value of `a > b` and uses it to return either `a` or `b` (as a whole). A similar difference exists between `minimum(a, b)` and `min(a, b)`.
`fmax`(x1, x2, /[, out, where, casting, ...])
Element-wise maximum of array elements.  
`fmin`(x1, x2, /[, out, where, casting, ...])
Element-wise minimum of array elements.  
### Floating functions
Recall that all of these functions work element-by-element over an array, returning an array output. The description details only a single operation.
`isfinite`(x, /[, out, where, casting, order, ...])
Test element-wise for finiteness (not infinity and not Not a Number).  
`isinf`(x, /[, out, where, casting, order, ...])
Test element-wise for positive or negative infinity.  
`isnan`(x, /[, out, where, casting, order, ...])
Test element-wise for NaN and return result as a boolean array.  
`isnat`(x, /[, out, where, casting, order, ...])
Test element-wise for NaT (not a time) and return result as a boolean array.  
`fabs`(x, /[, out, where, casting, order, ...])
Compute the absolute values element-wise.  
`signbit`(x, /[, out, where, casting, order, ...])
Returns element-wise True where signbit is set (less than zero).  
`copysign`(x1, x2, /[, out, where, casting, ...])
Change the sign of x1 to that of x2, element-wise.  
`nextafter`(x1, x2, /[, out, where, casting, ...])
Return the next floating-point value after x1 towards x2, element-wise.  
`spacing`(x, /[, out, where, casting, order, ...])
Return the distance between x and the nearest adjacent number.  
`modf`(x[, out1, out2], / [[, out, where, ...])
Return the fractional and integral parts of an array, element-wise.  
`ldexp`(x1, x2, /[, out, where, casting, ...])
Returns x1 * 2**x2, element-wise.  
`frexp`(x[, out1, out2], / [[, out, where, ...])
Decompose the elements of x into mantissa and twos exponent.  
`fmod`(x1, x2, /[, out, where, casting, ...])
Returns the element-wise remainder of division.  
`floor`(x, /[, out, where, casting, order, ...])
Return the floor of the input, element-wise.  
`ceil`(x, /[, out, where, casting, order, ...])
Return the ceiling of the input, element-wise.  
`trunc`(x, /[, out, where, casting, order, ...])
Return the truncated value of the input, element-wise.  
# NumPy: the absolute basics for beginners
Welcome to the absolute beginner’s guide to NumPy!
NumPy (Numerical Python) is an open source Python library that’s widely used in science and engineering. The NumPy library contains multidimensional array data structures, such as the homogeneous, N-dimensional `ndarray`, and a large library of functions that operate efficiently on these data structures. Learn more about NumPy at What is NumPy, and if you have comments or suggestions, please reach out!
## How to import NumPy
After installing NumPy, it may be imported into Python code like:
    
    import numpy as np
    
This widespread convention allows access to NumPy features with a short, recognizable prefix (`np.`) while distinguishing NumPy features from others that have the same name.
## Reading the example code
Throughout the NumPy documentation, you will find blocks that look like:
    
    >>> a = np.array([[1, 2, 3],
    ...               [4, 5, 6]])
    >>> a.shape
    (2, 3)
    
Text preceded by `>>>` or `...` is input, the code that you would enter in a script or at a Python prompt. Everything else is output, the results of running your code. Note that `>>>` and `...` are not part of the code and may cause an error if entered at a Python prompt.
## Why use NumPy?
Python lists are excellent, general-purpose containers. They can be “heterogeneous”, meaning that they can contain elements of a variety of types, and they are quite fast when used to perform individual operations on a handful of elements.
Depending on the characteristics of the data and the types of operations that need to be performed, other containers may be more appropriate; by exploiting these characteristics, we can improve speed, reduce memory consumption, and offer a high-level syntax for performing a variety of common processing tasks. NumPy shines when there are large quantities of “homogeneous” (same-type) data to be processed on the CPU.
## What is an “array”?
In computer programming, an array is a structure for storing and retrieving data. We often talk about an array as if it were a grid in space, with each cell storing one element of the data. For instance, if each element of the data were a number, we might visualize a “one-dimensional” array like a list:
\\[\begin{split}\begin{array}{|c||c|c|c|} \hline 1 & 5 & 2 & 0 \\\ \hline \end{array}\end{split}\\]
A two-dimensional array would be like a table:
\\[\begin{split}\begin{array}{|c||c|c|c|} \hline 1 & 5 & 2 & 0 \\\ \hline 8 & 3 & 6 & 1 \\\ \hline 1 & 7 & 2 & 9 \\\ \hline \end{array}\end{split}\\]
A three-dimensional array would be like a set of tables, perhaps stacked as though they were printed on separate pages. In NumPy, this idea is generalized to an arbitrary number of dimensions, and so the fundamental array class is called `ndarray`: it represents an “N-dimensional array”.
Most NumPy arrays have some restrictions. For instance:
  * All elements of the array must be of the same type of data.
  * Once created, the total size of the array can’t change.
  * The shape must be “rectangular”, not “jagged”; e.g., each row of a two-dimensional array must have the same number of columns.


When these conditions are met, NumPy exploits these characteristics to make the array faster, more memory efficient, and more convenient to use than less restrictive data structures.
For the remainder of this document, we will use the word “array” to refer to an instance of `ndarray`.
## Array fundamentals
One way to initialize an array is using a Python sequence, such as a list. For example:
    
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    >>> a
    array([1, 2, 3, 4, 5, 6])
    
Elements of an array can be accessed in various ways. For instance, we can access an individual element of this array as we would access an element in the original list: using the integer index of the element within square brackets.
    
    >>> a[0]
    1
    
Note
As with built-in Python sequences, NumPy arrays are “0-indexed”: the first element of the array is accessed using index `0`, not `1`.
Like the original list, the array is mutable.
    
    >>> a[0] = 10
    >>> a
    array([10,  2,  3,  4,  5,  6])
    
Also like the original list, Python slice notation can be used for indexing.
    
    >>> a[:3]
    array([10, 2, 3])
    
One major difference is that slice indexing of a list copies the elements into a new list, but slicing an array returns a view: an object that refers to the data in the original array. The original array can be mutated using the view.
    
    >>> b = a[3:]
    >>> b
    array([4, 5, 6])
    >>> b[0] = 40
    >>> a
    array([ 10,  2,  3, 40,  5,  6])
    
See Copies and views for a more comprehensive explanation of when array operations return views rather than copies.
Two- and higher-dimensional arrays can be initialized from nested Python sequences:
    
    >>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    >>> a
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    
In NumPy, a dimension of an array is sometimes referred to as an “axis”. This terminology may be useful to disambiguate between the dimensionality of an array and the dimensionality of the data represented by the array. For instance, the array `a` could represent three points, each lying within a four-dimensional space, but `a` has only two “axes”.
Another difference between an array and a list of lists is that an element of the array can be accessed by specifying the index along each axis within a single set of square brackets, separated by commas. For instance, the element `8` is in row `1` and column `3`:
    
    >>> a[1, 3]
    8
    
Note
It is familiar practice in mathematics to refer to elements of a matrix by the row index first and the column index second. This happens to be true for two-dimensional arrays, but a better mental model is to think of the column index as coming last and the row index as second to last. This generalizes to arrays with any number of dimensions.
Note
You might hear of a 0-D (zero-dimensional) array referred to as a “scalar”, a 1-D (one-dimensional) array as a “vector”, a 2-D (two-dimensional) array as a “matrix”, or an N-D (N-dimensional, where “N” is typically an integer greater than 2) array as a “tensor”. For clarity, it is best to avoid the mathematical terms when referring to an array because the mathematical objects with these names behave differently than arrays (e.g. “matrix” multiplication is fundamentally different from “array” multiplication), and there are other objects in the scientific Python ecosystem that have these names (e.g. the fundamental data structure of PyTorch is the “tensor”).
## Array attributes
This section covers the `ndim`, `shape`, `size`, and `dtype` attributes of an array.
The number of dimensions of an array is contained in the `ndim` attribute.
    
    >>> a.ndim
    2
    
The shape of an array is a tuple of non-negative integers that specify the number of elements along each dimension.
    
    >>> a.shape
    (3, 4)
    >>> len(a.shape) == a.ndim
    True
    
The fixed, total number of elements in array is contained in the `size` attribute.
    
    >>> a.size
    12
    >>> import math
    >>> a.size == math.prod(a.shape)
    True
    
Arrays are typically “homogeneous”, meaning that they contain elements of only one “data type”. The data type is recorded in the `dtype` attribute.
    
    >>> a.dtype
    dtype('int64')  # "int" for integer, "64" for 64-bit
    
Read more about array attributes here and learn about array objects here.
## How to create a basic array
This section covers `np.zeros()`, `np.ones()`, `np.empty()`, `np.arange()`, `np.linspace()`
Besides creating an array from a sequence of elements, you can easily create an array filled with `0`’s:
    
    >>> np.zeros(2)
    array([0., 0.])
    
Or an array filled with `1`’s:
    
    >>> np.ones(2)
    array([1., 1.])
    
Or even an empty array! The function `empty` creates an array whose initial content is random and depends on the state of the memory. The reason to use `empty` over `zeros` (or something similar) is speed - just make sure to fill every element afterwards!
    
    >>> # Create an empty array with 2 elements
    >>> np.empty(2) 
    array([3.14, 42.  ])  # may vary
    
You can create an array with a range of elements:
    
    >>> np.arange(4)
    array([0, 1, 2, 3])
    
And even an array that contains a range of evenly spaced intervals. To do this, you will specify the first number, last number, and the step size.
    
    >>> np.arange(2, 9, 2)
    array([2, 4, 6, 8])
    
You can also use `np.linspace()` to create an array with values that are spaced linearly in a specified interval:
    
    >>> np.linspace(0, 10, num=5)
    array([ 0. ,  2.5,  5. ,  7.5, 10. ])
    
Specifying your data type
While the default data type is floating point (`np.float64`), you can explicitly specify which data type you want using the `dtype` keyword.
    
    >>> x = np.ones(2, dtype=np.int64)
    >>> x
    array([1, 1])
    
Learn more about creating arrays here
## Adding, removing, and sorting elements
This section covers `np.sort()`, `np.concatenate()`
Sorting an array is simple with `np.sort()`. You can specify the axis, kind, and order when you call the function.
If you start with this array:
    
    >>> arr = np.array([2, 1, 5, 3, 7, 4, 6, 8])
    
You can quickly sort the numbers in ascending order with:
    
    >>> np.sort(arr)
    array([1, 2, 3, 4, 5, 6, 7, 8])
    
In addition to sort, which returns a sorted copy of an array, you can use:
  * `argsort`, which is an indirect sort along a specified axis,
  * `lexsort`, which is an indirect stable sort on multiple keys,
  * `searchsorted`, which will find elements in a sorted array, and
  * `partition`, which is a partial sort.


To read more about sorting an array, see: `sort`.
If you start with these arrays:
    
    >>> a = np.array([1, 2, 3, 4])
    >>> b = np.array([5, 6, 7, 8])
    
You can concatenate them with `np.concatenate()`.
    
    >>> np.concatenate((a, b))
    array([1, 2, 3, 4, 5, 6, 7, 8])
    
Or, if you start with these arrays:
    
    >>> x = np.array([[1, 2], [3, 4]])
    >>> y = np.array([[5, 6]])
    
You can concatenate them with:
    
    >>> np.concatenate((x, y), axis=0)
    array([[1, 2],
           [3, 4],
           [5, 6]])
    
In order to remove elements from an array, it’s simple to use indexing to select the elements that you want to keep.
To read more about concatenate, see: `concatenate`.
## How do you know the shape and size of an array?
This section covers `ndarray.ndim`, `ndarray.size`, `ndarray.shape`
`ndarray.ndim` will tell you the number of axes, or dimensions, of the array.
`ndarray.size` will tell you the total number of elements of the array. This is the product of the elements of the array’s shape.
`ndarray.shape` will display a tuple of integers that indicate the number of elements stored along each dimension of the array. If, for example, you have a 2-D array with 2 rows and 3 columns, the shape of your array is `(2, 3)`.
For example, if you create this array:
    
    >>> array_example = np.array([[[0, 1, 2, 3],
    ...                            [4, 5, 6, 7]],
    ...
    ...                           [[0, 1, 2, 3],
    ...                            [4, 5, 6, 7]],
    ...
    ...                           [[0 ,1 ,2, 3],
    ...                            [4, 5, 6, 7]]])
    
To find the number of dimensions of the array, run:
    
    >>> array_example.ndim
    3
    
To find the total number of elements in the array, run:
    
    >>> array_example.size
    24
    
And to find the shape of your array, run:
    
    >>> array_example.shape
    (3, 2, 4)
    
## Can you reshape an array?
This section covers `arr.reshape()`
Yes!
Using `arr.reshape()` will give a new shape to an array without changing the data. Just remember that when you use the reshape method, the array you want to produce needs to have the same number of elements as the original array. If you start with an array with 12 elements, you’ll need to make sure that your new array also has a total of 12 elements.
If you start with this array:
    
    >>> a = np.arange(6)
    >>> print(a)
    [0 1 2 3 4 5]
    
You can use `reshape()` to reshape your array. For example, you can reshape this array to an array with three rows and two columns:
    
    >>> b = a.reshape(3, 2)
    >>> print(b)
    [[0 1]
     [2 3]
     [4 5]]
    
With `np.reshape`, you can specify a few optional parameters:
    
    >>> np.reshape(a, shape=(1, 6), order='C')
    array([[0, 1, 2, 3, 4, 5]])
    
`a` is the array to be reshaped.
`shape` is the new shape you want. You can specify an integer or a tuple of integers. If you specify an integer, the result will be an array of that length. The shape should be compatible with the original shape.
`order:` `C` means to read/write the elements using C-like index order, `F` means to read/write the elements using Fortran-like index order, `A` means to read/write the elements in Fortran-like index order if a is Fortran contiguous in memory, C-like order otherwise. (This is an optional parameter and doesn’t need to be specified.)
If you want to learn more about C and Fortran order, you can read more about the internal organization of NumPy arrays here. Essentially, C and Fortran orders have to do with how indices correspond to the order the array is stored in memory. In Fortran, when moving through the elements of a two-dimensional array as it is stored in memory, the first index is the most rapidly varying index. As the first index moves to the next row as it changes, the matrix is stored one column at a time. This is why Fortran is thought of as a Column-major language. In C on the other hand, the last index changes the most rapidly. The matrix is stored by rows, making it a Row-major language. What you do for C or Fortran depends on whether it’s more important to preserve the indexing convention or not reorder the data.
Learn more about shape manipulation here.
## How to convert a 1D array into a 2D array (how to add a new axis to an array)
This section covers `np.newaxis`, `np.expand_dims`
You can use `np.newaxis` and `np.expand_dims` to increase the dimensions of your existing array.
Using `np.newaxis` will increase the dimensions of your array by one dimension when used once. This means that a 1D array will become a 2D array, a 2D array will become a 3D array, and so on.
For example, if you start with this array:
    
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    >>> a.shape
    (6,)
    
You can use `np.newaxis` to add a new axis:
    
    >>> a2 = a[np.newaxis, :]
    >>> a2.shape
    (1, 6)
    
You can explicitly convert a 1D array to either a row vector or a column vector using `np.newaxis`. For example, you can convert a 1D array to a row vector by inserting an axis along the first dimension:
    
    >>> row_vector = a[np.newaxis, :]
    >>> row_vector.shape
    (1, 6)
    
Or, for a column vector, you can insert an axis along the second dimension:
    
    >>> col_vector = a[:, np.newaxis]
    >>> col_vector.shape
    (6, 1)
    
You can also expand an array by inserting a new axis at a specified position with `np.expand_dims`.
For example, if you start with this array:
    
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    >>> a.shape
    (6,)
    
You can use `np.expand_dims` to add an axis at index position 1 with:
    
    >>> b = np.expand_dims(a, axis=1)
    >>> b.shape
    (6, 1)
    
You can add an axis at index position 0 with:
    
    >>> c = np.expand_dims(a, axis=0)
    >>> c.shape
    (1, 6)
    
Find more information about newaxis here and `expand_dims` at `expand_dims`.
## Indexing and slicing
You can index and slice NumPy arrays in the same ways you can slice Python lists.
    
    >>> data = np.array([1, 2, 3])
    
    >>> data[1]
    2
    >>> data[0:2]
    array([1, 2])
    >>> data[1:]
    array([2, 3])
    >>> data[-2:]
    array([2, 3])
    
You can visualize it this way:
You may want to take a section of your array or specific array elements to use in further analysis or additional operations. To do that, you’ll need to subset, slice, and/or index your arrays.
If you want to select values from your array that fulfill certain conditions, it’s straightforward with NumPy.
For example, if you start with this array:
    
    >>> a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
You can easily print all of the values in the array that are less than 5.
    
    >>> print(a[a < 5])
    [1 2 3 4]
    
You can also select, for example, numbers that are equal to or greater than 5, and use that condition to index an array.
    
    >>> five_up = (a >= 5)
    >>> print(a[five_up])
    [ 5  6  7  8  9 10 11 12]
    
You can select elements that are divisible by 2:
    
    >>> divisible_by_2 = a[a%2==0]
    >>> print(divisible_by_2)
    [ 2  4  6  8 10 12]
    
Or you can select elements that satisfy two conditions using the `&` and `|` operators:
    
    >>> c = a[(a > 2) & (a < 11)]
    >>> print(c)
    [ 3  4  5  6  7  8  9 10]
    
You can also make use of the logical operators & and | in order to return boolean values that specify whether or not the values in an array fulfill a certain condition. This can be useful with arrays that contain names or other categorical values.
    
    >>> five_up = (a > 5) | (a == 5)
    >>> print(five_up)
    [[False False False False]
     [ True  True  True  True]
     [ True  True  True True]]
    
You can also use `np.nonzero()` to select elements or indices from an array.
Starting with this array:
    
    >>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
You can use `np.nonzero()` to print the indices of elements that are, for example, less than 5:
    
    >>> b = np.nonzero(a < 5)
    >>> print(b)
    (array([0, 0, 0, 0]), array([0, 1, 2, 3]))
    
In this example, a tuple of arrays was returned: one for each dimension. The first array represents the row indices where these values are found, and the second array represents the column indices where the values are found.
If you want to generate a list of coordinates where the elements exist, you can zip the arrays, iterate over the list of coordinates, and print them. For example:
    
    >>> list_of_coordinates= list(zip(b[0], b[1]))
    
    >>> for coord in list_of_coordinates:
    ...     print(coord)
    (np.int64(0), np.int64(0))
    (np.int64(0), np.int64(1))
    (np.int64(0), np.int64(2))
    (np.int64(0), np.int64(3))
    
You can also use `np.nonzero()` to print the elements in an array that are less than 5 with:
    
    >>> print(a[b])
    [1 2 3 4]
    
If the element you’re looking for doesn’t exist in the array, then the returned array of indices will be empty. For example:
    
    >>> not_there = np.nonzero(a == 42)
    >>> print(not_there)
    (array([], dtype=int64), array([], dtype=int64))
    
Learn more about indexing and slicing here and here.
Read more about using the nonzero function at: `nonzero`.
## How to create an array from existing data
This section covers `slicing and indexing`, `np.vstack()`, `np.hstack()`, `np.hsplit()`, `.view()`, `copy()`
You can easily create a new array from a section of an existing array.
Let’s say you have this array:
    
    >>> a = np.array([1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
    
You can create a new array from a section of your array any time by specifying where you want to slice your array.
    
    >>> arr1 = a[3:8]
    >>> arr1
    array([4, 5, 6, 7, 8])
    
Here, you grabbed a section of your array from index position 3 through index position 8 but not including position 8 itself.
Reminder: Array indexes begin at 0. This means the first element of the array is at index 0, the second element is at index 1, and so on.
You can also stack two existing arrays, both vertically and horizontally. Let’s say you have two arrays, `a1` and `a2`:
    
    >>> a1 = np.array([[1, 1],
    ...                [2, 2]])
    
    >>> a2 = np.array([[3, 3],
    ...                [4, 4]])
    
You can stack them vertically with `vstack`:
    
    >>> np.vstack((a1, a2))
    array([[1, 1],
           [2, 2],
           [3, 3],
           [4, 4]])
    
Or stack them horizontally with `hstack`:
    
    >>> np.hstack((a1, a2))
    array([[1, 1, 3, 3],
           [2, 2, 4, 4]])
    
You can split an array into several smaller arrays using `hsplit`. You can specify either the number of equally shaped arrays to return or the columns after which the division should occur.
Let’s say you have this array:
    
    >>> x = np.arange(1, 25).reshape(2, 12)
    >>> x
    array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
           [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])
    
If you wanted to split this array into three equally shaped arrays, you would run:
    
    >>> np.hsplit(x, 3)
      [array([[ 1,  2,  3,  4],
             [13, 14, 15, 16]]), array([[ 5,  6,  7,  8],
             [17, 18, 19, 20]]), array([[ 9, 10, 11, 12],
             [21, 22, 23, 24]])]
    
If you wanted to split your array after the third and fourth column, you’d run:
    
    >>> np.hsplit(x, (3, 4))
      [array([[ 1,  2,  3],
             [13, 14, 15]]), array([[ 4],
             [16]]), array([[ 5,  6,  7,  8,  9, 10, 11, 12],
             [17, 18, 19, 20, 21, 22, 23, 24]])]
    
Learn more about stacking and splitting arrays here.
You can use the `view` method to create a new array object that looks at the same data as the original array (a shallow copy).
Views are an important NumPy concept! NumPy functions, as well as operations like indexing and slicing, will return views whenever possible. This saves memory and is faster (no copy of the data has to be made). However it’s important to be aware of this - modifying data in a view also modifies the original array!
Let’s say you create this array:
    
    >>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
Now we create an array `b1` by slicing `a` and modify the first element of `b1`. This will modify the corresponding element in `a` as well!
    
    >>> b1 = a[0, :]
    >>> b1
    array([1, 2, 3, 4])
    >>> b1[0] = 99
    >>> b1
    array([99,  2,  3,  4])
    >>> a
    array([[99,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    
Using the `copy` method will make a complete copy of the array and its data (a deep copy). To use this on your array, you could run:
    
    >>> b2 = a.copy()
    
Learn more about copies and views here.
## Basic array operations
This section covers addition, subtraction, multiplication, division, and more
Once you’ve created your arrays, you can start to work with them. Let’s say, for example, that you’ve created two arrays, one called “data” and one called “ones”
You can add the arrays together with the plus sign.
    
    >>> data = np.array([1, 2])
    >>> ones = np.ones(2, dtype=int)
    >>> data + ones
    array([2, 3])
    
You can, of course, do more than just addition!
    
    >>> data - ones
    array([0, 1])
    >>> data * data
    array([1, 4])
    >>> data / data
    array([1., 1.])
    
Basic operations are simple with NumPy. If you want to find the sum of the elements in an array, you’d use `sum()`. This works for 1D arrays, 2D arrays, and arrays in higher dimensions.
    
    >>> a = np.array([1, 2, 3, 4])
    
    >>> a.sum()
    10
    
To add the rows or the columns in a 2D array, you would specify the axis.
If you start with this array:
    
    >>> b = np.array([[1, 1], [2, 2]])
    
You can sum over the axis of rows with:
    
    >>> b.sum(axis=0)
    array([3, 3])
    
You can sum over the axis of columns with:
    
    >>> b.sum(axis=1)
    array([2, 4])
    
Learn more about basic operations here.
## Broadcasting
There are times when you might want to carry out an operation between an array and a single number (also called an operation between a vector and a scalar) or between arrays of two different sizes. For example, your array (we’ll call it “data”) might contain information about distance in miles but you want to convert the information to kilometers. You can perform this operation with:
    
    >>> data = np.array([1.0, 2.0])
    >>> data * 1.6
    array([1.6, 3.2])
    
NumPy understands that the multiplication should happen with each cell. That concept is called broadcasting. Broadcasting is a mechanism that allows NumPy to perform operations on arrays of different shapes. The dimensions of your array must be compatible, for example, when the dimensions of both arrays are equal or when one of them is 1. If the dimensions are not compatible, you will get a `ValueError`.
Learn more about broadcasting here.
## More useful array operations
This section covers maximum, minimum, sum, mean, product, standard deviation, and more
NumPy also performs aggregation functions. In addition to `min`, `max`, and `sum`, you can easily run `mean` to get the average, `prod` to get the result of multiplying the elements together, `std` to get the standard deviation, and more.
    
    >>> data.max()
    2.0
    >>> data.min()
    1.0
    >>> data.sum()
    3.0
    
Let’s start with this array, called “a”
    
    >>> a = np.array([[0.45053314, 0.17296777, 0.34376245, 0.5510652],
    ...               [0.54627315, 0.05093587, 0.40067661, 0.55645993],
    ...               [0.12697628, 0.82485143, 0.26590556, 0.56917101]])
    
It’s very common to want to aggregate along a row or column. By default, every NumPy aggregation function will return the aggregate of the entire array. To find the sum or the minimum of the elements in your array, run:
    
    >>> a.sum()
    4.8595784
    
Or:
    
    >>> a.min()
    0.05093587
    
You can specify on which axis you want the aggregation function to be computed. For example, you can find the minimum value within each column by specifying `axis=0`.
    
    >>> a.min(axis=0)
    array([0.12697628, 0.05093587, 0.26590556, 0.5510652 ])
    
The four values listed above correspond to the number of columns in your array. With a four-column array, you will get four values as your result.
Read more about array methods here.
## Creating matrices
You can pass Python lists of lists to create a 2-D array (or “matrix”) to represent them in NumPy.
    
    >>> data = np.array([[1, 2], [3, 4], [5, 6]])
    >>> data
    array([[1, 2],
           [3, 4],
           [5, 6]])
    
Indexing and slicing operations are useful when you’re manipulating matrices:
    
    >>> data[0, 1]
    2
    >>> data[1:3]
    array([[3, 4],
           [5, 6]])
    >>> data[0:2, 0]
    array([1, 3])
    
You can aggregate matrices the same way you aggregated vectors:
    
    >>> data.max()
    6
    >>> data.min()
    1
    >>> data.sum()
    21
    
You can aggregate all the values in a matrix and you can aggregate them across columns or rows using the `axis` parameter. To illustrate this point, let’s look at a slightly modified dataset:
    
    >>> data = np.array([[1, 2], [5, 3], [4, 6]])
    >>> data
    array([[1, 2],
           [5, 3],
           [4, 6]])
    >>> data.max(axis=0)
    array([5, 6])
    >>> data.max(axis=1)
    array([2, 5, 6])
    
Once you’ve created your matrices, you can add and multiply them using arithmetic operators if you have two matrices that are the same size.
    
    >>> data = np.array([[1, 2], [3, 4]])
    >>> ones = np.array([[1, 1], [1, 1]])
    >>> data + ones
    array([[2, 3],
           [4, 5]])
    
You can do these arithmetic operations on matrices of different sizes, but only if one matrix has only one column or one row. In this case, NumPy will use its broadcast rules for the operation.
    
    >>> data = np.array([[1, 2], [3, 4], [5, 6]])
    >>> ones_row = np.array([[1, 1]])
    >>> data + ones_row
    array([[2, 3],
           [4, 5],
           [6, 7]])
    
Be aware that when NumPy prints N-dimensional arrays, the last axis is looped over the fastest while the first axis is the slowest. For instance:
    
    >>> np.ones((4, 3, 2))
    array([[[1., 1.],
            [1., 1.],
            [1., 1.]],
    
           [[1., 1.],
            [1., 1.],
            [1., 1.]],
    
           [[1., 1.],
            [1., 1.],
            [1., 1.]],
    
           [[1., 1.],
            [1., 1.],
            [1., 1.]]])
    
There are often instances where we want NumPy to initialize the values of an array. NumPy offers functions like `ones()` and `zeros()`, and the `random.Generator` class for random number generation for that. All you need to do is pass in the number of elements you want it to generate:
    
    >>> np.ones(3)
    array([1., 1., 1.])
    >>> np.zeros(3)
    array([0., 0., 0.])
    >>> rng = np.random.default_rng()  # the simplest way to generate random numbers
    >>> rng.random(3) 
    array([0.63696169, 0.26978671, 0.04097352])
    
You can also use `ones()`, `zeros()`, and `random()` to create a 2D array if you give them a tuple describing the dimensions of the matrix:
    
    >>> np.ones((3, 2))
    array([[1., 1.],
           [1., 1.],
           [1., 1.]])
    >>> np.zeros((3, 2))
    array([[0., 0.],
           [0., 0.],
           [0., 0.]])
    >>> rng.random((3, 2)) 
    array([[0.01652764, 0.81327024],
           [0.91275558, 0.60663578],
           [0.72949656, 0.54362499]])  # may vary
    
Read more about creating arrays, filled with `0`’s, `1`’s, other values or uninitialized, at array creation routines.
## Generating random numbers
The use of random number generation is an important part of the configuration and evaluation of many numerical and machine learning algorithms. Whether you need to randomly initialize weights in an artificial neural network, split data into random sets, or randomly shuffle your dataset, being able to generate random numbers (actually, repeatable pseudo-random numbers) is essential.
With `Generator.integers`, you can generate random integers from low (remember that this is inclusive with NumPy) to high (exclusive). You can set `endpoint=True` to make the high number inclusive.
You can generate a 2 x 4 array of random integers between 0 and 4 with:
    
    >>> rng.integers(5, size=(2, 4)) 
    array([[2, 1, 1, 0],
           [0, 0, 0, 4]])  # may vary
    
Read more about random number generation here.
## How to get unique items and counts
This section covers `np.unique()`
You can find the unique elements in an array easily with `np.unique`.
For example, if you start with this array:
    
    >>> a = np.array([11, 11, 12, 13, 14, 15, 16, 17, 12, 13, 11, 14, 18, 19, 20])
    
you can use `np.unique` to print the unique values in your array:
    
    >>> unique_values = np.unique(a)
    >>> print(unique_values)
    [11 12 13 14 15 16 17 18 19 20]
    
To get the indices of unique values in a NumPy array (an array of first index positions of unique values in the array), just pass the `return_index` argument in `np.unique()` as well as your array.
    
    >>> unique_values, indices_list = np.unique(a, return_index=True)
    >>> print(indices_list)
    [ 0  2  3  4  5  6  7 12 13 14]
    
You can pass the `return_counts` argument in `np.unique()` along with your array to get the frequency count of unique values in a NumPy array.
    
    >>> unique_values, occurrence_count = np.unique(a, return_counts=True)
    >>> print(occurrence_count)
    [3 2 2 2 1 1 1 1 1 1]
    
This also works with 2D arrays! If you start with this array:
    
    >>> a_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 4]])
    
You can find unique values with:
    
    >>> unique_values = np.unique(a_2d)
    >>> print(unique_values)
    [ 1  2  3  4  5  6  7  8  9 10 11 12]
    
If the axis argument isn’t passed, your 2D array will be flattened.
If you want to get the unique rows or columns, make sure to pass the `axis` argument. To find the unique rows, specify `axis=0` and for columns, specify `axis=1`.
    
    >>> unique_rows = np.unique(a_2d, axis=0)
    >>> print(unique_rows)
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    
To get the unique rows, index position, and occurrence count, you can use:
    
    >>> unique_rows, indices, occurrence_count = np.unique(
    ...      a_2d, axis=0, return_counts=True, return_index=True)
    >>> print(unique_rows)
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    >>> print(indices)
    [0 1 2]
    >>> print(occurrence_count)
    [2 1 1]
    
To learn more about finding the unique elements in an array, see `unique`.
## Transposing and reshaping a matrix
This section covers `arr.reshape()`, `arr.transpose()`, `arr.T`
It’s common to need to transpose your matrices. NumPy arrays have the property `T` that allows you to transpose a matrix.
You may also need to switch the dimensions of a matrix. This can happen when, for example, you have a model that expects a certain input shape that is different from your dataset. This is where the `reshape` method can be useful. You simply need to pass in the new dimensions that you want for the matrix.
    
    >>> data.reshape(2, 3)
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> data.reshape(3, 2)
    array([[1, 2],
           [3, 4],
           [5, 6]])
    
You can also use `.transpose()` to reverse or change the axes of an array according to the values you specify.
If you start with this array:
    
    >>> arr = np.arange(6).reshape((2, 3))
    >>> arr
    array([[0, 1, 2],
           [3, 4, 5]])
    
You can transpose your array with `arr.transpose()`.
    
    >>> arr.transpose()
    array([[0, 3],
           [1, 4],
           [2, 5]])
    
You can also use `arr.T`:
    
    >>> arr.T
    array([[0, 3],
           [1, 4],
           [2, 5]])
    
To learn more about transposing and reshaping arrays, see `transpose` and `reshape`.
## How to reverse an array
This section covers `np.flip()`
NumPy’s `np.flip()` function allows you to flip, or reverse, the contents of an array along an axis. When using `np.flip()`, specify the array you would like to reverse and the axis. If you don’t specify the axis, NumPy will reverse the contents along all of the axes of your input array.
Reversing a 1D array
If you begin with a 1D array like this one:
    
    >>> arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
    
You can reverse it with:
    
    >>> reversed_arr = np.flip(arr)
    
If you want to print your reversed array, you can run:
    
    >>> print('Reversed Array: ', reversed_arr)
    Reversed Array:  [8 7 6 5 4 3 2 1]
    
Reversing a 2D array
A 2D array works much the same way.
If you start with this array:
    
    >>> arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
You can reverse the content in all of the rows and all of the columns with:
    
    >>> reversed_arr = np.flip(arr_2d)
    >>> print(reversed_arr)
    [[12 11 10  9]
     [ 8  7  6  5]
     [ 4  3  2  1]]
    
You can easily reverse only the rows with:
    
    >>> reversed_arr_rows = np.flip(arr_2d, axis=0)
    >>> print(reversed_arr_rows)
    [[ 9 10 11 12]
     [ 5  6  7  8]
     [ 1  2  3  4]]
    
Or reverse only the columns with:
    
    >>> reversed_arr_columns = np.flip(arr_2d, axis=1)
    >>> print(reversed_arr_columns)
    [[ 4  3  2  1]
     [ 8  7  6  5]
     [12 11 10  9]]
    
You can also reverse the contents of only one column or row. For example, you can reverse the contents of the row at index position 1 (the second row):
    
    >>> arr_2d[1] = np.flip(arr_2d[1])
    >>> print(arr_2d)
    [[ 1  2  3  4]
     [ 8  7  6  5]
     [ 9 10 11 12]]
    
You can also reverse the column at index position 1 (the second column):
    
    >>> arr_2d[:,1] = np.flip(arr_2d[:,1])
    >>> print(arr_2d)
    [[ 1 10  3  4]
     [ 8  7  6  5]
     [ 9  2 11 12]]
    
Read more about reversing arrays at `flip`.
## Reshaping and flattening multidimensional arrays
This section covers `.flatten()`, `ravel()`
There are two popular ways to flatten an array: `.flatten()` and `.ravel()`. The primary difference between the two is that the new array created using `ravel()` is actually a reference to the parent array (i.e., a “view”). This means that any changes to the new array will affect the parent array as well. Since `ravel` does not create a copy, it’s memory efficient.
If you start with this array:
    
    >>> x = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
You can use `flatten` to flatten your array into a 1D array.
    
    >>> x.flatten()
    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    
When you use `flatten`, changes to your new array won’t change the parent array.
For example:
    
    >>> a1 = x.flatten()
    >>> a1[0] = 99
    >>> print(x)  # Original array
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    >>> print(a1)  # New array
    [99  2  3  4  5  6  7  8  9 10 11 12]
    
But when you use `ravel`, the changes you make to the new array will affect the parent array.
For example:
    
    >>> a2 = x.ravel()
    >>> a2[0] = 98
    >>> print(x)  # Original array
    [[98  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    >>> print(a2)  # New array
    [98  2  3  4  5  6  7  8  9 10 11 12]
    
Read more about `flatten` at `ndarray.flatten` and `ravel` at `ravel`.
## How to access the docstring for more information
This section covers `help()`, `?`, `??`
When it comes to the data science ecosystem, Python and NumPy are built with the user in mind. One of the best examples of this is the built-in access to documentation. Every object contains the reference to a string, which is known as the docstring. In most cases, this docstring contains a quick and concise summary of the object and how to use it. Python has a built-in `help()` function that can help you access this information. This means that nearly any time you need more information, you can use `help()` to quickly find the information that you need.
For example:
    
    >>> help(max)
    Help on built-in function max in module builtins:
    
    max(...)
        max(iterable, *[, default=obj, key=func]) -> value
        max(arg1, arg2, *args, *[, key=func]) -> value
    
        With a single iterable argument, return its biggest item. The
        default keyword-only argument specifies an object to return if
        the provided iterable is empty.
        With two or more arguments, return the largest argument.
    
Because access to additional information is so useful, IPython uses the `?` character as a shorthand for accessing this documentation along with other relevant information. IPython is a command shell for interactive computing in multiple languages. You can find more information about IPython here.
For example:
    
    In [0]: max?
    max(iterable, *[, default=obj, key=func]) -> value
    max(arg1, arg2, *args, *[, key=func]) -> value
    
    With a single iterable argument, return its biggest item. The
    default keyword-only argument specifies an object to return if
    the provided iterable is empty.
    With two or more arguments, return the largest argument.
    Type:      builtin_function_or_method
    
You can even use this notation for object methods and objects themselves.
Let’s say you create this array:
    
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    
Then you can obtain a lot of useful information (first details about `a` itself, followed by the docstring of `ndarray` of which `a` is an instance):
    
    In [1]: a?
    Type:            ndarray
    String form:     [1 2 3 4 5 6]
    Length:          6
    File:            ~/anaconda3/lib/python3.9/site-packages/numpy/__init__.py
    Docstring:       <no docstring>
    Class docstring:
    ndarray(shape, dtype=float, buffer=None, offset=0,
            strides=None, order=None)
    
    An array object represents a multidimensional, homogeneous array
    of fixed-size items.  An associated data-type object describes the
    format of each element in the array (its byte-order, how many bytes it
    occupies in memory, whether it is an integer, a floating point number,
    or something else, etc.)
    
    Arrays should be constructed using `array`, `zeros` or `empty` (refer
    to the See Also section below).  The parameters given here refer to
    a low-level method (`ndarray(...)`) for instantiating an array.
    
    For more information, refer to the `numpy` module and examine the
    methods and attributes of an array.
    
    Parameters
    ----------
    (for the __new__ method; see Notes below)
    
    shape : tuple of ints
            Shape of created array.
    ...
    
This also works for functions and other objects that you create. Just remember to include a docstring with your function using a string literal (`""" """` or `''' '''` around your documentation).
For example, if you create this function:
    
    >>> def double(a):
    ...   '''Return a * 2'''
    ...   return a * 2
    
You can obtain information about the function:
    
    In [2]: double?
    Signature: double(a)
    Docstring: Return a * 2
    File:      ~/Desktop/<ipython-input-23-b5adf20be596>
    Type:      function
    
You can reach another level of information by reading the source code of the object you’re interested in. Using a double question mark (`??`) allows you to access the source code.
For example:
    
    In [3]: double??
    Signature: double(a)
    Source:
    def double(a):
        '''Return a * 2'''
        return a * 2
    File:      ~/Desktop/<ipython-input-23-b5adf20be596>
    Type:      function
    
If the object in question is compiled in a language other than Python, using `??` will return the same information as `?`. You’ll find this with a lot of built-in objects and types, for example:
    
    In [4]: len?
    Signature: len(obj, /)
    Docstring: Return the number of items in a container.
    Type:      builtin_function_or_method
    
and :
    
    In [5]: len??
    Signature: len(obj, /)
    Docstring: Return the number of items in a container.
    Type:      builtin_function_or_method
    
have the same output because they were compiled in a programming language other than Python.
## Working with mathematical formulas
The ease of implementing mathematical formulas that work on arrays is one of the things that make NumPy so widely used in the scientific Python community.
For example, this is the mean square error formula (a central formula used in supervised machine learning models that deal with regression):
Implementing this formula is simple and straightforward in NumPy:
What makes this work so well is that `predictions` and `labels` can contain one or a thousand values. They only need to be the same size.
You can visualize it this way:
In this example, both the predictions and labels vectors contain three values, meaning `n` has a value of three. After we carry out subtractions the values in the vector are squared. Then NumPy sums the values, and your result is the error value for that prediction and a score for the quality of the model.
## How to save and load NumPy objects
This section covers `np.save`, `np.savez`, `np.savetxt`, `np.load`, `np.loadtxt`
You will, at some point, want to save your arrays to disk and load them back without having to re-run the code. Fortunately, there are several ways to save and load objects with NumPy. The ndarray objects can be saved to and loaded from the disk files with `loadtxt` and `savetxt` functions that handle normal text files, `load` and `save` functions that handle NumPy binary files with a .npy file extension, and a `savez` function that handles NumPy files with a .npz file extension.
The .npy and .npz files store data, shape, dtype, and other information required to reconstruct the ndarray in a way that allows the array to be correctly retrieved, even when the file is on another machine with different architecture.
If you want to store a single ndarray object, store it as a .npy file using `np.save`. If you want to store more than one ndarray object in a single file, save it as a .npz file using `np.savez`. You can also save several arrays into a single file in compressed npz format with `savez_compressed`.
It’s easy to save and load an array with `np.save()`. Just make sure to specify the array you want to save and a file name. For example, if you create this array:
    
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    
You can save it as “filename.npy” with:
    
    >>> np.save('filename', a)
    
You can use `np.load()` to reconstruct your array.
    
    >>> b = np.load('filename.npy')
    
If you want to check your array, you can run:
    
    >>> print(b)
    [1 2 3 4 5 6]
    
You can save a NumPy array as a plain text file like a .csv or .txt file with `np.savetxt`.
For example, if you create this array:
    
    >>> csv_arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
    
You can easily save it as a .csv file with the name “new_file.csv” like this:
    
    >>> np.savetxt('new_file.csv', csv_arr)
    
You can quickly and easily load your saved text file using `loadtxt()`:
    
    >>> np.loadtxt('new_file.csv')
    array([1., 2., 3., 4., 5., 6., 7., 8.])
    
The `savetxt()` and `loadtxt()` functions accept additional optional parameters such as header, footer, and delimiter. While text files can be easier for sharing, .npy and .npz files are smaller and faster to read. If you need more sophisticated handling of your text file (for example, if you need to work with lines that contain missing values), you will want to use the `genfromtxt` function.
With `savetxt`, you can specify headers, footers, comments, and more.
Learn more about input and output routines here.
## Importing and exporting a CSV
It’s simple to read in a CSV that contains existing information. The best and easiest way to do this is to use Pandas.
    
    >>> import pandas as pd
    
    >>> # If all of your columns are the same type:
    >>> x = pd.read_csv('music.csv', header=0).values
    >>> print(x)
    [['Billie Holiday' 'Jazz' 1300000 27000000]
     ['Jimmie Hendrix' 'Rock' 2700000 70000000]
     ['Miles Davis' 'Jazz' 1500000 48000000]
     ['SIA' 'Pop' 2000000 74000000]]
    
    >>> # You can also simply select the columns you need:
    >>> x = pd.read_csv('music.csv', usecols=['Artist', 'Plays']).values
    >>> print(x)
    [['Billie Holiday' 27000000]
     ['Jimmie Hendrix' 70000000]
     ['Miles Davis' 48000000]
     ['SIA' 74000000]]
    
It’s simple to use Pandas in order to export your array as well. If you are new to NumPy, you may want to create a Pandas dataframe from the values in your array and then write the data frame to a CSV file with Pandas.
If you created this array “a”
    
    >>> a = np.array([[-2.58289208,  0.43014843, -1.24082018, 1.59572603],
    ...               [ 0.99027828, 1.17150989,  0.94125714, -0.14692469],
    ...               [ 0.76989341,  0.81299683, -0.95068423, 0.11769564],
    ...               [ 0.20484034,  0.34784527,  1.96979195, 0.51992837]])
    
You could create a Pandas dataframe
    
    >>> df = pd.DataFrame(a)
    >>> print(df)
              0         1         2         3
    0 -2.582892  0.430148 -1.240820  1.595726
    1  0.990278  1.171510  0.941257 -0.146925
    2  0.769893  0.812997 -0.950684  0.117696
    3  0.204840  0.347845  1.969792  0.519928
    
You can easily save your dataframe with:
    
    >>> df.to_csv('pd.csv')
    
And read your CSV with:
    
    >>> data = pd.read_csv('pd.csv')
    
You can also save your array with the NumPy `savetxt` method.
    
    >>> np.savetxt('np.csv', a, fmt='%.2f', delimiter=',', header='1,  2,  3,  4')
    
If you’re using the command line, you can read your saved CSV any time with a command such as:
    
    $ cat np.csv
    #  1,  2,  3,  4
    -2.58,0.43,-1.24,1.60
    0.99,1.17,0.94,-0.15
    0.77,0.81,-0.95,0.12
    0.20,0.35,1.97,0.52
    
Or you can open the file any time with a text editor!
If you’re interested in learning more about Pandas, take a look at the official Pandas documentation. Learn how to install Pandas with the official Pandas installation information.
## Plotting arrays with Matplotlib
If you need to generate a plot for your values, it’s very simple with Matplotlib.
For example, you may have an array like this one:
    
    >>> a = np.array([2, 1, 5, 7, 4, 6, 8, 14, 10, 9, 18, 20, 22])
    
If you already have Matplotlib installed, you can import it with:
    
    >>> import matplotlib.pyplot as plt
    
    # If you're using Jupyter Notebook, you may also want to run the following
    # line of code to display your code in the notebook:
    
    %matplotlib inline
    
All you need to do to plot your values is run:
    
    >>> plt.plot(a)
    
    # If you are running from a command line, you may need to do this:
    # >>> plt.show()
    
For example, you can plot a 1D array like this:
    
    >>> x = np.linspace(0, 5, 20)
    >>> y = np.linspace(0, 10, 20)
    >>> plt.plot(x, y, 'purple') # line
    >>> plt.plot(x, y, 'o')      # dots
    
With Matplotlib, you have access to an enormous number of visualization options.
    
    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(projection='3d')
    >>> X = np.arange(-5, 5, 0.15)
    >>> Y = np.arange(-5, 5, 0.15)
    >>> X, Y = np.meshgrid(X, Y)
    >>> R = np.sqrt(X**2 + Y**2)
    >>> Z = np.sin(R)
    
    >>> ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis')
    
To read more about Matplotlib and what it can do, take a look at the official documentation. For directions regarding installing Matplotlib, see the official installation section.
Image credits: Jay Alammar https://jalammar.github.io/
# Broadcasting
See also
`numpy.broadcast`
The term broadcasting describes how NumPy treats arrays with different shapes during arithmetic operations. Subject to certain constraints, the smaller array is “broadcast” across the larger array so that they have compatible shapes. Broadcasting provides a means of vectorizing array operations so that looping occurs in C instead of Python. It does this without making needless copies of data and usually leads to efficient algorithm implementations. There are, however, cases where broadcasting is a bad idea because it leads to inefficient use of memory that slows computation.
NumPy operations are usually done on pairs of arrays on an element-by-element basis. In the simplest case, the two arrays must have exactly the same shape, as in the following example:
    
    >>> import numpy as np
    >>> a = np.array([1.0, 2.0, 3.0])
    >>> b = np.array([2.0, 2.0, 2.0])
    >>> a * b
    array([2.,  4.,  6.])
    
NumPy’s broadcasting rule relaxes this constraint when the arrays’ shapes meet certain constraints. The simplest broadcasting example occurs when an array and a scalar value are combined in an operation:
    
    >>> import numpy as np
    >>> a = np.array([1.0, 2.0, 3.0])
    >>> b = 2.0
    >>> a * b
    array([2.,  4.,  6.])
    
The result is equivalent to the previous example where `b` was an array. We can think of the scalar `b` being stretched during the arithmetic operation into an array with the same shape as `a`. The new elements in `b`, as shown in Figure 1, are simply copies of the original scalar. The stretching analogy is only conceptual. NumPy is smart enough to use the original scalar value without actually making copies so that broadcasting operations are as memory and computationally efficient as possible.
Figure 1
In the simplest example of broadcasting, the scalar `b` is stretched to become an array of same shape as `a` so the shapes are compatible for element-by-element multiplication.
The code in the second example is more efficient than that in the first because broadcasting moves less memory around during the multiplication (`b` is a scalar rather than an array).
## General broadcasting rules
When operating on two arrays, NumPy compares their shapes element-wise. It starts with the trailing (i.e. rightmost) dimension and works its way left. Two dimensions are compatible when
  1. they are equal, or
  2. one of them is 1.


If these conditions are not met, a `ValueError: operands could not be broadcast together` exception is thrown, indicating that the arrays have incompatible shapes.
Input arrays do not need to have the same number of dimensions. The resulting array will have the same number of dimensions as the input array with the greatest number of dimensions, where the size of each dimension is the largest size of the corresponding dimension among the input arrays. Note that missing dimensions are assumed to have size one.
For example, if you have a `256x256x3` array of RGB values, and you want to scale each color in the image by a different value, you can multiply the image by a one-dimensional array with 3 values. Lining up the sizes of the trailing axes of these arrays according to the broadcast rules, shows that they are compatible:
    
    Image  (3d array): 256 x 256 x 3
    Scale  (1d array):             3
    Result (3d array): 256 x 256 x 3
    
When either of the dimensions compared is one, the other is used. In other words, dimensions with size 1 are stretched or “copied” to match the other.
In the following example, both the `A` and `B` arrays have axes with length one that are expanded to a larger size during the broadcast operation:
    
    A      (4d array):  8 x 1 x 6 x 1
    B      (3d array):      7 x 1 x 5
    Result (4d array):  8 x 7 x 6 x 5
    
## Broadcastable arrays
A set of arrays is called “broadcastable” to the same shape if the above rules produce a valid result.
For example, if `a.shape` is (5,1), `b.shape` is (1,6), `c.shape` is (6,) and `d.shape` is () so that d is a scalar, then a, b, c, and d are all broadcastable to dimension (5,6); and
  * a acts like a (5,6) array where `a[:,0]` is broadcast to the other columns,
  * b acts like a (5,6) array where `b[0,:]` is broadcast to the other rows,
  * c acts like a (1,6) array and therefore like a (5,6) array where `c[:]` is broadcast to every row, and finally,
  * d acts like a (5,6) array where the single value is repeated.


Here are some more examples:
    
    A      (2d array):  5 x 4
    B      (1d array):      1
    Result (2d array):  5 x 4
    
    A      (2d array):  5 x 4
    B      (1d array):      4
    Result (2d array):  5 x 4
    
    A      (3d array):  15 x 3 x 5
    B      (3d array):  15 x 1 x 5
    Result (3d array):  15 x 3 x 5
    
    A      (3d array):  15 x 3 x 5
    B      (2d array):       3 x 5
    Result (3d array):  15 x 3 x 5
    
    A      (3d array):  15 x 3 x 5
    B      (2d array):       3 x 1
    Result (3d array):  15 x 3 x 5
    
Here are examples of shapes that do not broadcast:
    
    A      (1d array):  3
    B      (1d array):  4 # trailing dimensions do not match
    
    A      (2d array):      2 x 1
    B      (3d array):  8 x 4 x 3 # second from last dimensions mismatched
    
An example of broadcasting when a 1-d array is added to a 2-d array:
    
    >>> import numpy as np
    >>> a = np.array([[ 0.0,  0.0,  0.0],
    ...               [10.0, 10.0, 10.0],
    ...               [20.0, 20.0, 20.0],
    ...               [30.0, 30.0, 30.0]])
    >>> b = np.array([1.0, 2.0, 3.0])
    >>> a + b
    array([[  1.,   2.,   3.],
            [11.,  12.,  13.],
            [21.,  22.,  23.],
            [31.,  32.,  33.]])
    >>> b = np.array([1.0, 2.0, 3.0, 4.0])
    >>> a + b
    Traceback (most recent call last):
    ValueError: operands could not be broadcast together with shapes (4,3) (4,)
    
As shown in Figure 2, `b` is added to each row of `a`. In Figure 3, an exception is raised because of the incompatible shapes.
Figure 2
A one dimensional array added to a two dimensional array results in broadcasting if number of 1-d array elements matches the number of 2-d array columns.
Figure 3
When the trailing dimensions of the arrays are unequal, broadcasting fails because it is impossible to align the values in the rows of the 1st array with the elements of the 2nd arrays for element-by-element addition.
Broadcasting provides a convenient way of taking the outer product (or any other outer operation) of two arrays. The following example shows an outer addition operation of two 1-d arrays:
    
    >>> import numpy as np
    >>> a = np.array([0.0, 10.0, 20.0, 30.0])
    >>> b = np.array([1.0, 2.0, 3.0])
    >>> a[:, np.newaxis] + b
    array([[ 1.,   2.,   3.],
           [11.,  12.,  13.],
           [21.,  22.,  23.],
           [31.,  32.,  33.]])
    
Figure 4
In some cases, broadcasting stretches both arrays to form an output array larger than either of the initial arrays.
Here the `newaxis` index operator inserts a new axis into `a`, making it a two-dimensional `4x1` array. Combining the `4x1` array with `b`, which has shape `(3,)`, yields a `4x3` array.
## A practical example: vector quantization
Broadcasting comes up quite often in real world problems. A typical example occurs in the vector quantization (VQ) algorithm used in information theory, classification, and other related areas. The basic operation in VQ finds the closest point in a set of points, called `codes` in VQ jargon, to a given point, called the `observation`. In the very simple, two-dimensional case shown below, the values in `observation` describe the weight and height of an athlete to be classified. The `codes` represent different classes of athletes. [1] Finding the closest point requires calculating the distance between observation and each of the codes. The shortest distance provides the best match. In this example, `codes[0]` is the closest class indicating that the athlete is likely a basketball player.
    
    >>> from numpy import array, argmin, sqrt, sum
    >>> observation = array([111.0, 188.0])
    >>> codes = array([[102.0, 203.0],
    ...                [132.0, 193.0],
    ...                [45.0, 155.0],
    ...                [57.0, 173.0]])
    >>> diff = codes - observation    # the broadcast happens here
    >>> dist = sqrt(sum(diff**2,axis=-1))
    >>> argmin(dist)
    0
    
In this example, the `observation` array is stretched to match the shape of the `codes` array:
    
    Observation      (1d array):      2
    Codes            (2d array):  4 x 2
    Diff             (2d array):  4 x 2
    
Figure 5
The basic operation of vector quantization calculates the distance between an object to be classified, the dark square, and multiple known codes, the gray circles. In this simple case, the codes represent individual classes. More complex cases use multiple codes per class.
Typically, a large number of `observations`, perhaps read from a database, are compared to a set of `codes`. Consider this scenario:
    
    Observation      (2d array):      10 x 3
    Codes            (3d array):   5 x 1 x 3
    Diff             (3d array):  5 x 10 x 3
    
The three-dimensional array, `diff`, is a consequence of broadcasting, not a necessity for the calculation. Large data sets will generate a large intermediate array that is computationally inefficient. Instead, if each observation is calculated individually using a Python loop around the code in the two-dimensional example above, a much smaller array is used.
Broadcasting is a powerful tool for writing short and usually intuitive code that does its computations very efficiently in C. However, there are cases when broadcasting uses unnecessarily large amounts of memory for a particular algorithm. In these cases, it is better to write the algorithm’s outer loop in Python. This may also produce more readable code, as algorithms that use broadcasting tend to become more difficult to interpret as the number of dimensions in the broadcast increases.
#### Footnotes
[1]
In this example, weight has more impact on the distance calculation than height because of the larger values. In practice, it is important to normalize the height and weight, often by their standard deviation across the data set, so that both have equal influence on the distance calculation.
# Copies and views
When operating on NumPy arrays, it is possible to access the internal data buffer directly using a view without copying data around. This ensures good performance but can also cause unwanted problems if the user is not aware of how this works. Hence, it is important to know the difference between these two terms and to know which operations return copies and which return views.
The NumPy array is a data structure consisting of two parts: the contiguous data buffer with the actual data elements and the metadata that contains information about the data buffer. The metadata includes data type, strides, and other important information that helps manipulate the `ndarray` easily. See the Internal organization of NumPy arrays section for a detailed look.
## View
It is possible to access the array differently by just changing certain metadata like stride and dtype without changing the data buffer. This creates a new way of looking at the data and these new arrays are called views. The data buffer remains the same, so any changes made to a view reflects in the original copy. A view can be forced through the `ndarray.view` method.
## Copy
When a new array is created by duplicating the data buffer as well as the metadata, it is called a copy. Changes made to the copy do not reflect on the original array. Making a copy is slower and memory-consuming but sometimes necessary. A copy can be forced by using `ndarray.copy`.
## Indexing operations
See also
Indexing on ndarrays
Views are created when elements can be addressed with offsets and strides in the original array. Hence, basic indexing always creates views. For example:
    
    >>> import numpy as np
    >>> x = np.arange(10)
    >>> x
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> y = x[1:3]  # creates a view
    >>> y
    array([1, 2])
    >>> x[1:3] = [10, 11]
    >>> x
    array([ 0, 10, 11,  3,  4,  5,  6,  7,  8,  9])
    >>> y
    array([10, 11])
    
Here, `y` gets changed when `x` is changed because it is a view.
Advanced indexing, on the other hand, always creates copies. For example:
    
    >>> import numpy as np
    >>> x = np.arange(9).reshape(3, 3)
    >>> x
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> y = x[[1, 2]]
    >>> y
    array([[3, 4, 5],
           [6, 7, 8]])
    >>> y.base is None
    True
    
    Here, ``y`` is a copy, as signified by the :attr:`base <.ndarray.base>`
    attribute. We can also confirm this by assigning new values to ``x[[1, 2]]``
    which in turn will not affect ``y`` at all::
    
    >>> x[[1, 2]] = [[10, 11, 12], [13, 14, 15]]
    >>> x
    array([[ 0,  1,  2],
           [10, 11, 12],
           [13, 14, 15]])
    >>> y
    array([[3, 4, 5],
           [6, 7, 8]])
    
It must be noted here that during the assignment of `x[[1, 2]]` no view or copy is created as the assignment happens in-place.
## Other operations
The `numpy.reshape` function creates a view where possible or a copy otherwise. In most cases, the strides can be modified to reshape the array with a view. However, in some cases where the array becomes non-contiguous (perhaps after a `ndarray.transpose` operation), the reshaping cannot be done by modifying strides and requires a copy. In these cases, we can raise an error by assigning the new shape to the shape attribute of the array. For example:
    
    >>> import numpy as np
    >>> x = np.ones((2, 3))
    >>> y = x.T  # makes the array non-contiguous
    >>> y
    array([[1., 1.],
           [1., 1.],
           [1., 1.]])
    >>> z = y.view()
    >>> z.shape = 6
    Traceback (most recent call last):
       ...
    AttributeError: Incompatible shape for in-place modification. Use
    `.reshape()` to make a copy with the desired shape.
    
Taking the example of another operation, `ravel` returns a contiguous flattened view of the array wherever possible. On the other hand, `ndarray.flatten` always returns a flattened copy of the array. However, to guarantee a view in most cases, `x.reshape(-1)` may be preferable.
## How to tell if the array is a view or a copy
The `base` attribute of the ndarray makes it easy to tell if an array is a view or a copy. The base attribute of a view returns the original array while it returns `None` for a copy.
    
    >>> import numpy as np
    >>> x = np.arange(9)
    >>> x
    array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    >>> y = x.reshape(3, 3)
    >>> y
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> y.base  # .reshape() creates a view
    array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    >>> z = y[[2, 1]]
    >>> z
    array([[6, 7, 8],
           [3, 4, 5]])
    >>> z.base is None  # advanced indexing creates a copy
    True
    
Note that the `base` attribute should not be used to determine if an ndarray object is new; only if it is a view or a copy of another ndarray.
# Array creation
See also
Array creation routines
## Introduction
There are 6 general mechanisms for creating arrays:
  1. Conversion from other Python structures (i.e. lists and tuples)
  2. Intrinsic NumPy array creation functions (e.g. arange, ones, zeros, etc.)
  3. Replicating, joining, or mutating existing arrays
  4. Reading arrays from disk, either from standard or custom formats
  5. Creating arrays from raw bytes through the use of strings or buffers
  6. Use of special library functions (e.g., random)


You can use these methods to create ndarrays or Structured arrays. This document will cover general methods for ndarray creation.
## 1) Converting Python sequences to NumPy arrays
NumPy arrays can be defined using Python sequences such as lists and tuples. Lists and tuples are defined using `[...]` and `(...)`, respectively. Lists and tuples can define ndarray creation:
  * a list of numbers will create a 1D array,
  * a list of lists will create a 2D array,
  * further nested lists will create higher-dimensional arrays. In general, any array object is called an ndarray in NumPy.


    
    >>> import numpy as np
    >>> a1D = np.array([1, 2, 3, 4])
    >>> a2D = np.array([[1, 2], [3, 4]])
    >>> a3D = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    
When you use `numpy.array` to define a new array, you should consider the dtype of the elements in the array, which can be specified explicitly. This feature gives you more control over the underlying data structures and how the elements are handled in C/C++ functions. When values do not fit and you are using a `dtype`, NumPy may raise an error:
    
    >>> import numpy as np
    >>> np.array([127, 128, 129], dtype=np.int8)
    Traceback (most recent call last):
    ...
    OverflowError: Python integer 128 out of bounds for int8
    
An 8-bit signed integer represents integers from -128 to 127. Assigning the `int8` array to integers outside of this range results in overflow. This feature can often be misunderstood. If you perform calculations with mismatching `dtypes`, you can get unwanted results, for example:
    
    >>> import numpy as np
    >>> a = np.array([2, 3, 4], dtype=np.uint32)
    >>> b = np.array([5, 6, 7], dtype=np.uint32)
    >>> c_unsigned32 = a - b
    >>> print('unsigned c:', c_unsigned32, c_unsigned32.dtype)
    unsigned c: [4294967293 4294967293 4294967293] uint32
    >>> c_signed32 = a - b.astype(np.int32)
    >>> print('signed c:', c_signed32, c_signed32.dtype)
    signed c: [-3 -3 -3] int64
    
Notice when you perform operations with two arrays of the same `dtype`: `uint32`, the resulting array is the same type. When you perform operations with different `dtype`, NumPy will assign a new type that satisfies all of the array elements involved in the computation, here `uint32` and `int32` can both be represented in as `int64`.
The default NumPy behavior is to create arrays in either 32 or 64-bit signed integers (platform dependent and matches C `long` size) or double precision floating point numbers. If you expect your integer arrays to be a specific type, then you need to specify the dtype while you create the array.
## 2) Intrinsic NumPy array creation functions
NumPy has over 40 built-in functions for creating arrays as laid out in the Array creation routines. These functions can be split into roughly three categories, based on the dimension of the array they create:
  1. 1D arrays
  2. 2D arrays
  3. ndarrays


### 1 - 1D array creation functions
The 1D array creation functions e.g. `numpy.linspace` and `numpy.arange` generally need at least two inputs, `start` and `stop`.
`numpy.arange` creates arrays with regularly incrementing values. Check the documentation for complete information and examples. A few examples are shown:
    
    >>> import numpy as np
    >>> np.arange(10)
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> np.arange(2, 10, dtype=float)
    array([2., 3., 4., 5., 6., 7., 8., 9.])
    >>> np.arange(2, 3, 0.1)
    array([2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])
    
Note: best practice for `numpy.arange` is to use integer start, end, and step values. There are some subtleties regarding `dtype`. In the second example, the `dtype` is defined. In the third example, the array is `dtype=float` to accommodate the step size of `0.1`. Due to roundoff error, the `stop` value is sometimes included.
`numpy.linspace` will create arrays with a specified number of elements, and spaced equally between the specified beginning and end values. For example:
    
    >>> import numpy as np
    >>> np.linspace(1., 4., 6)
    array([1. ,  1.6,  2.2,  2.8,  3.4,  4. ])
    
The advantage of this creation function is that you guarantee the number of elements and the starting and end point. The previous `arange(start, stop, step)` will not include the value `stop`.
### 2 - 2D array creation functions
The 2D array creation functions e.g. `numpy.eye`, `numpy.diag`, and `numpy.vander` define properties of special matrices represented as 2D arrays.
`np.eye(n, m)` defines a 2D identity matrix. The elements where i=j (row index and column index are equal) are 1 and the rest are 0, as such:
    
    >>> import numpy as np
    >>> np.eye(3)
    array([[1., 0., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])
    >>> np.eye(3, 5)
    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.]])
    
`numpy.diag` can define either a square 2D array with given values along the diagonal or if given a 2D array returns a 1D array that is only the diagonal elements. The two array creation functions can be helpful while doing linear algebra, as such:
    
    >>> import numpy as np
    >>> np.diag([1, 2, 3])
    array([[1, 0, 0],
           [0, 2, 0],
           [0, 0, 3]])
    >>> np.diag([1, 2, 3], 1)
    array([[0, 1, 0, 0],
           [0, 0, 2, 0],
           [0, 0, 0, 3],
           [0, 0, 0, 0]])
    >>> a = np.array([[1, 2], [3, 4]])
    >>> np.diag(a)
    array([1, 4])
    
`vander(x, n)` defines a Vandermonde matrix as a 2D NumPy array. Each column of the Vandermonde matrix is a decreasing power of the input 1D array or list or tuple, `x` where the highest polynomial order is `n-1`. This array creation routine is helpful in generating linear least squares models, as such:
    
    >>> import numpy as np
    >>> np.vander(np.linspace(0, 2, 5), 2)
    array([[0. , 1. ],
          [0.5, 1. ],
          [1. , 1. ],
          [1.5, 1. ],
          [2. , 1. ]])
    >>> np.vander([1, 2, 3, 4], 2)
    array([[1, 1],
           [2, 1],
           [3, 1],
           [4, 1]])
    >>> np.vander((1, 2, 3, 4), 4)
    array([[ 1,  1,  1,  1],
           [ 8,  4,  2,  1],
           [27,  9,  3,  1],
           [64, 16,  4,  1]])
    
### 3 - general ndarray creation functions
The ndarray creation functions e.g. `numpy.ones`, `numpy.zeros`, and `random` define arrays based upon the desired shape. The ndarray creation functions can create arrays with any dimension by specifying how many dimensions and length along that dimension in a tuple or list.
`numpy.zeros` will create an array filled with 0 values with the specified shape. The default dtype is `float64`:
    
    >>> import numpy as np
    >>> np.zeros((2, 3))
    array([[0., 0., 0.],
           [0., 0., 0.]])
    >>> np.zeros((2, 3, 2))
    array([[[0., 0.],
            [0., 0.],
            [0., 0.]],
    
           [[0., 0.],
            [0., 0.],
            [0., 0.]]])
    
`numpy.ones` will create an array filled with 1 values. It is identical to `zeros` in all other respects as such:
    
    >>> import numpy as np
    >>> np.ones((2, 3))
    array([[1., 1., 1.],
           [1., 1., 1.]])
    >>> np.ones((2, 3, 2))
    array([[[1., 1.],
            [1., 1.],
            [1., 1.]],
    
           [[1., 1.],
            [1., 1.],
            [1., 1.]]])
    
The `random` method of the result of `default_rng` will create an array filled with random values between 0 and 1. It is included with the `numpy.random` library. Below, two arrays are created with shapes (2,3) and (2,3,2), respectively. The seed is set to 42 so you can reproduce these pseudorandom numbers:
    
    >>> import numpy as np
    >>> from numpy.random import default_rng
    >>> default_rng(42).random((2,3))
    array([[0.77395605, 0.43887844, 0.85859792],
           [0.69736803, 0.09417735, 0.97562235]])
    >>> default_rng(42).random((2,3,2))
    array([[[0.77395605, 0.43887844],
            [0.85859792, 0.69736803],
            [0.09417735, 0.97562235]],
           [[0.7611397 , 0.78606431],
            [0.12811363, 0.45038594],
            [0.37079802, 0.92676499]]])
    
`numpy.indices` will create a set of arrays (stacked as a one-higher dimensioned array), one per dimension with each representing variation in that dimension:
    
    >>> import numpy as np
    >>> np.indices((3,3))
    array([[[0, 0, 0],
            [1, 1, 1],
            [2, 2, 2]],
           [[0, 1, 2],
            [0, 1, 2],
            [0, 1, 2]]])
    
This is particularly useful for evaluating functions of multiple dimensions on a regular grid.
## 3) Replicating, joining, or mutating existing arrays
Once you have created arrays, you can replicate, join, or mutate those existing arrays to create new arrays. When you assign an array or its elements to a new variable, you have to explicitly `numpy.copy` the array, otherwise the variable is a view into the original array. Consider the following example:
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3, 4, 5, 6])
    >>> b = a[:2]
    >>> b += 1
    >>> print('a =', a, '; b =', b)
    a = [2 3 3 4 5 6] ; b = [2 3]
    
In this example, you did not create a new array. You created a variable, `b` that viewed the first 2 elements of `a`. When you added 1 to `b` you would get the same result by adding 1 to `a[:2]`. If you want to create a new array, use the `numpy.copy` array creation routine as such:
    
    >>> import numpy as np
    >>> a = np.array([1, 2, 3, 4])
    >>> b = a[:2].copy()
    >>> b += 1
    >>> print('a = ', a, 'b = ', b)
    a =  [1 2 3 4] b =  [2 3]
    
For more information and examples look at Copies and Views.
There are a number of routines to join existing arrays e.g. `numpy.vstack`, `numpy.hstack`, and `numpy.block`. Here is an example of joining four 2-by-2 arrays into a 4-by-4 array using `block`:
    
    >>> import numpy as np
    >>> A = np.ones((2, 2))
    >>> B = np.eye(2, 2)
    >>> C = np.zeros((2, 2))
    >>> D = np.diag((-3, -4))
    >>> np.block([[A, B], [C, D]])
    array([[ 1.,  1.,  1.,  0.],
           [ 1.,  1.,  0.,  1.],
           [ 0.,  0., -3.,  0.],
           [ 0.,  0.,  0., -4.]])
    
Other routines use similar syntax to join ndarrays. Check the routine’s documentation for further examples and syntax.
## 4) Reading arrays from disk, either from standard or custom formats
This is the most common case of large array creation. The details depend greatly on the format of data on disk. This section gives general pointers on how to handle various formats. For more detailed examples of IO look at How to Read and Write files.
### Standard binary formats
Various fields have standard formats for array data. The following lists the ones with known Python libraries to read them and return NumPy arrays (there may be others for which it is possible to read and convert to NumPy arrays so check the last section as well)
    
    HDF5: h5py
    FITS: Astropy
    
Examples of formats that cannot be read directly but for which it is not hard to convert are those formats supported by libraries like PIL (able to read and write many image formats such as jpg, png, etc).
### Common ASCII formats
Delimited files such as comma separated value (csv) and tab separated value (tsv) files are used for programs like Excel and LabView. Python functions can read and parse these files line-by-line. NumPy has two standard routines for importing a file with delimited data `numpy.loadtxt` and `numpy.genfromtxt`. These functions have more involved use cases in Reading and writing files. A simple example given a `simple.csv`:
    
    $ cat simple.csv
    x, y
    0, 0
    1, 1
    2, 4
    3, 9
    
Importing `simple.csv` is accomplished using `numpy.loadtxt`:
    
    >>> import numpy as np
    >>> np.loadtxt('simple.csv', delimiter = ',', skiprows = 1) 
    array([[0., 0.],
           [1., 1.],
           [2., 4.],
           [3., 9.]])
    
More generic ASCII files can be read using `scipy.io` and Pandas.
## 5) Creating arrays from raw bytes through the use of strings or buffers
There are a variety of approaches one can use. If the file has a relatively simple format then one can write a simple I/O library and use the NumPy `fromfile()` function and `.tofile()` method to read and write NumPy arrays directly (mind your byteorder though!) If a good C or C++ library exists that read the data, one can wrap that library with a variety of techniques though that certainly is much more work and requires significantly more advanced knowledge to interface with C or C++.
## 6) Use of special library functions (e.g., SciPy, pandas, and OpenCV)
NumPy is the fundamental library for array containers in the Python Scientific Computing stack. Many Python libraries, including SciPy, Pandas, and OpenCV, use NumPy ndarrays as the common format for data exchange, These libraries can create, operate on, and work with NumPy arrays.
# Writing custom array containers
Numpy’s dispatch mechanism, introduced in numpy version v1.16 is the recommended approach for writing custom N-dimensional array containers that are compatible with the numpy API and provide custom implementations of numpy functionality. Applications include dask arrays, an N-dimensional array distributed across multiple nodes, and cupy arrays, an N-dimensional array on a GPU.
To get a feel for writing custom array containers, we’ll begin with a simple example that has rather narrow utility but illustrates the concepts involved.
    
    >>> import numpy as np
    >>> class DiagonalArray:
    ...     def __init__(self, N, value):
    ...         self._N = N
    ...         self._i = value
    ...     def __repr__(self):
    ...         return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
    ...     def __array__(self, dtype=None, copy=None):
    ...         if copy is False:
    ...             raise ValueError(
    ...                 "`copy=False` isn't supported. A copy is always created."
    ...             )
    ...         return self._i * np.eye(self._N, dtype=dtype)
    
Our custom array can be instantiated like:
    
    >>> arr = DiagonalArray(5, 1)
    >>> arr
    DiagonalArray(N=5, value=1)
    
We can convert to a numpy array using `numpy.array` or `numpy.asarray`, which will call its `__array__` method to obtain a standard `numpy.ndarray`.
    
    >>> np.asarray(arr)
    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])
    
If we operate on `arr` with a numpy function, numpy will again use the `__array__` interface to convert it to an array and then apply the function in the usual way.
    
    >>> np.multiply(arr, 2)
    array([[2., 0., 0., 0., 0.],
           [0., 2., 0., 0., 0.],
           [0., 0., 2., 0., 0.],
           [0., 0., 0., 2., 0.],
           [0., 0., 0., 0., 2.]])
    
Notice that the return type is a standard `numpy.ndarray`.
    
    >>> type(np.multiply(arr, 2))
    <class 'numpy.ndarray'>
    
How can we pass our custom array type through this function? Numpy allows a class to indicate that it would like to handle computations in a custom-defined way through the interfaces `__array_ufunc__` and `__array_function__`. Let’s take one at a time, starting with `__array_ufunc__`. This method covers Universal functions (ufunc), a class of functions that includes, for example, `numpy.multiply` and `numpy.sin`.
The `__array_ufunc__` receives:
  * `ufunc`, a function like `numpy.multiply`
  * `method`, a string, differentiating between `numpy.multiply(...)` and variants like `numpy.multiply.outer`, `numpy.multiply.accumulate`, and so on. For the common case, `numpy.multiply(...)`, `method == '__call__'`.
  * `inputs`, which could be a mixture of different types
  * `kwargs`, keyword arguments passed to the function


For this example we will only handle the method `__call__`
    
    >>> from numbers import Number
    >>> class DiagonalArray:
    ...     def __init__(self, N, value):
    ...         self._N = N
    ...         self._i = value
    ...     def __repr__(self):
    ...         return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
    ...     def __array__(self, dtype=None, copy=None):
    ...         if copy is False:
    ...             raise ValueError(
    ...                 "`copy=False` isn't supported. A copy is always created."
    ...             )
    ...         return self._i * np.eye(self._N, dtype=dtype)
    ...     def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
    ...         if method == '__call__':
    ...             N = None
    ...             scalars = []
    ...             for input in inputs:
    ...                 if isinstance(input, Number):
    ...                     scalars.append(input)
    ...                 elif isinstance(input, self.__class__):
    ...                     scalars.append(input._i)
    ...                     if N is not None:
    ...                         if N != input._N:
    ...                             raise TypeError("inconsistent sizes")
    ...                     else:
    ...                         N = input._N
    ...                 else:
    ...                     return NotImplemented
    ...             return self.__class__(N, ufunc(*scalars, **kwargs))
    ...         else:
    ...             return NotImplemented
    
Now our custom array type passes through numpy functions.
    
    >>> arr = DiagonalArray(5, 1)
    >>> np.multiply(arr, 3)
    DiagonalArray(N=5, value=3)
    >>> np.add(arr, 3)
    DiagonalArray(N=5, value=4)
    >>> np.sin(arr)
    DiagonalArray(N=5, value=0.8414709848078965)
    
At this point `arr + 3` does not work.
    
    >>> arr + 3
    Traceback (most recent call last):
    ...
    TypeError: unsupported operand type(s) for +: 'DiagonalArray' and 'int'
    
To support it, we need to define the Python interfaces `__add__`, `__lt__`, and so on to dispatch to the corresponding ufunc. We can achieve this conveniently by inheriting from the mixin `NDArrayOperatorsMixin`.
    
    >>> import numpy.lib.mixins
    >>> class DiagonalArray(numpy.lib.mixins.NDArrayOperatorsMixin):
    ...     def __init__(self, N, value):
    ...         self._N = N
    ...         self._i = value
    ...     def __repr__(self):
    ...         return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
    ...     def __array__(self, dtype=None, copy=None):
    ...         if copy is False:
    ...             raise ValueError(
    ...                 "`copy=False` isn't supported. A copy is always created."
    ...             )
    ...         return self._i * np.eye(self._N, dtype=dtype)
    ...     def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
    ...         if method == '__call__':
    ...             N = None
    ...             scalars = []
    ...             for input in inputs:
    ...                 if isinstance(input, Number):
    ...                     scalars.append(input)
    ...                 elif isinstance(input, self.__class__):
    ...                     scalars.append(input._i)
    ...                     if N is not None:
    ...                         if N != input._N:
    ...                             raise TypeError("inconsistent sizes")
    ...                     else:
    ...                         N = input._N
    ...                 else:
    ...                     return NotImplemented
    ...             return self.__class__(N, ufunc(*scalars, **kwargs))
    ...         else:
    ...             return NotImplemented
    
    
    >>> arr = DiagonalArray(5, 1)
    >>> arr + 3
    DiagonalArray(N=5, value=4)
    >>> arr > 0
    DiagonalArray(N=5, value=True)
    
Now let’s tackle `__array_function__`. We’ll create dict that maps numpy functions to our custom variants.
    
    >>> HANDLED_FUNCTIONS = {}
    >>> class DiagonalArray(numpy.lib.mixins.NDArrayOperatorsMixin):
    ...     def __init__(self, N, value):
    ...         self._N = N
    ...         self._i = value
    ...     def __repr__(self):
    ...         return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
    ...     def __array__(self, dtype=None, copy=None):
    ...         if copy is False:
    ...             raise ValueError(
    ...                 "`copy=False` isn't supported. A copy is always created."
    ...             )
    ...         return self._i * np.eye(self._N, dtype=dtype)
    ...     def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
    ...         if method == '__call__':
    ...             N = None
    ...             scalars = []
    ...             for input in inputs:
    ...                 # In this case we accept only scalar numbers or DiagonalArrays.
    ...                 if isinstance(input, Number):
    ...                     scalars.append(input)
    ...                 elif isinstance(input, self.__class__):
    ...                     scalars.append(input._i)
    ...                     if N is not None:
    ...                         if N != input._N:
    ...                             raise TypeError("inconsistent sizes")
    ...                     else:
    ...                         N = input._N
    ...                 else:
    ...                     return NotImplemented
    ...             return self.__class__(N, ufunc(*scalars, **kwargs))
    ...         else:
    ...             return NotImplemented
    ...     def __array_function__(self, func, types, args, kwargs):
    ...         if func not in HANDLED_FUNCTIONS:
    ...             return NotImplemented
    ...         # Note: this allows subclasses that don't override
    ...         # __array_function__ to handle DiagonalArray objects.
    ...         if not all(issubclass(t, self.__class__) for t in types):
    ...             return NotImplemented
    ...         return HANDLED_FUNCTIONS[func](*args, **kwargs)
    ...
    
A convenient pattern is to define a decorator `implements` that can be used to add functions to `HANDLED_FUNCTIONS`.
    
    >>> def implements(np_function):
    ...    "Register an __array_function__ implementation for DiagonalArray objects."
    ...    def decorator(func):
    ...        HANDLED_FUNCTIONS[np_function] = func
    ...        return func
    ...    return decorator
    ...
    
Now we write implementations of numpy functions for `DiagonalArray`. For completeness, to support the usage `arr.sum()` add a method `sum` that calls `numpy.sum(self)`, and the same for `mean`.
    
    >>> @implements(np.sum)
    ... def sum(arr):
    ...     "Implementation of np.sum for DiagonalArray objects"
    ...     return arr._i * arr._N
    ...
    >>> @implements(np.mean)
    ... def mean(arr):
    ...     "Implementation of np.mean for DiagonalArray objects"
    ...     return arr._i / arr._N
    ...
    >>> arr = DiagonalArray(5, 1)
    >>> np.sum(arr)
    5
    >>> np.mean(arr)
    0.2
    
If the user tries to use any numpy functions not included in `HANDLED_FUNCTIONS`, a `TypeError` will be raised by numpy, indicating that this operation is not supported. For example, concatenating two `DiagonalArrays` does not produce another diagonal array, so it is not supported.
    
    >>> np.concatenate([arr, arr])
    Traceback (most recent call last):
    ...
    TypeError: no implementation found for 'numpy.concatenate' on types that implement __array_function__: [<class '__main__.DiagonalArray'>]
    
Additionally, our implementations of `sum` and `mean` do not accept the optional arguments that numpy’s implementation does.
    
    >>> np.sum(arr, axis=0)
    Traceback (most recent call last):
    ...
    TypeError: sum() got an unexpected keyword argument 'axis'
    
The user always has the option of converting to a normal `numpy.ndarray` with `numpy.asarray` and using standard numpy from there.
    
    >>> np.concatenate([np.asarray(arr), np.asarray(arr)])
    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.],
           [1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])
    
The implementation of `DiagonalArray` in this example only handles the `np.sum` and `np.mean` functions for brevity. Many other functions in the Numpy API are also available to wrap and a full-fledged custom array container can explicitly support all functions that Numpy makes available to wrap.
Numpy provides some utilities to aid testing of custom array containers that implement the `__array_ufunc__` and `__array_function__` protocols in the `numpy.testing.overrides` namespace.
To check if a Numpy function can be overridden via `__array_ufunc__`, you can use `allows_array_ufunc_override`:
    
    >>> from numpy.testing.overrides import allows_array_ufunc_override
    >>> allows_array_ufunc_override(np.add)
    True
    
Similarly, you can check if a function can be overridden via `__array_function__` using `allows_array_function_override`.
Lists of every overridable function in the Numpy API are also available via `get_overridable_numpy_array_functions` for functions that support the `__array_function__` protocol and `get_overridable_numpy_ufuncs` for functions that support the `__array_ufunc__` protocol. Both functions return sets of functions that are present in the Numpy public API. User-defined ufuncs or ufuncs defined in other libraries that depend on Numpy are not present in these sets.
Refer to the dask source code and cupy source code for more fully-worked examples of custom array containers.
See also NEP 18.
# NumPy fundamentals
These documents clarify concepts, design decisions, and technical constraints in NumPy. This is a great place to understand the fundamental NumPy ideas and philosophy.
  * Array creation
  * Indexing on `ndarrays`
  * I/O with NumPy
  * Data types
  * Broadcasting
  * Copies and views
  * Working with Arrays of Strings And Bytes
  * Structured arrays
  * Universal functions (`ufunc`) basics


# Indexing on ndarrays
See also
Indexing routines
`ndarrays` can be indexed using the standard Python `x[obj]` syntax, where x is the array and obj the selection. There are different kinds of indexing available depending on obj: basic indexing, advanced indexing and field access.
Most of the following examples show the use of indexing when referencing data in an array. The examples work just as well when assigning to an array. See Assigning values to indexed arrays for specific examples and explanations on how assignments work.
Note that in Python, `x[(exp1, exp2, ..., expN)]` is equivalent to `x[exp1, exp2, ..., expN]`; the latter is just syntactic sugar for the former.
## Basic indexing
### Single element indexing
Single element indexing works exactly like that for other standard Python sequences. It is 0-based, and accepts negative indices for indexing from the end of the array.
    
    >>> x = np.arange(10)
    >>> x[2]
    2
    >>> x[-2]
    8
    
It is not necessary to separate each dimension’s index into its own set of square brackets.
    
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
Note that if one indexes a multidimensional array with fewer indices than dimensions, one gets a subdimensional array. For example:
    
    >>> x[0]
    array([0, 1, 2, 3, 4])
    
That is, each index specified selects the array corresponding to the rest of the dimensions selected. In the above example, choosing 0 means that the remaining dimension of length 5 is being left unspecified, and that what is returned is an array of that dimensionality and size. It must be noted that the returned array is a view, i.e., it is not a copy of the original, but points to the same values in memory as does the original array. In this case, the 1-D array at the first position (0) is returned. So using a single index on the returned array, results in a single element being returned. That is:
    
    >>> x[0][2]
    2
    
So note that `x[0, 2] == x[0][2]` though the second case is more inefficient as a new temporary array is created after the first index that is subsequently indexed by 2.
Note
NumPy uses C-order indexing. That means that the last index usually represents the most rapidly changing memory location, unlike Fortran or IDL, where the first index represents the most rapidly changing location in memory. This difference represents a great potential for confusion.
### Slicing and striding
Basic slicing extends Python’s basic concept of slicing to N dimensions. Basic slicing occurs when obj is a `slice` object (constructed by `start:stop:step` notation inside of brackets), an integer, or a tuple of slice objects and integers. `Ellipsis` and `newaxis` objects can be interspersed with these as well.
The simplest case of indexing with N integers returns an array scalar representing the corresponding item. As in Python, all indices are zero-based: for the i-th index \\(n_i\\), the valid range is \\(0 \le n_i < d_i\\) where \\(d_i\\) is the i-th element of the shape of the array. Negative indices are interpreted as counting from the end of the array (i.e., if \\(n_i < 0\\), it means \\(n_i + d_i\\)).
All arrays generated by basic slicing are always views of the original array.
Note
NumPy slicing creates a view instead of a copy as in the case of built-in Python sequences such as string, tuple and list. Care must be taken when extracting a small portion from a large array which becomes useless after the extraction, because the small portion extracted contains a reference to the large original array whose memory will not be released until all arrays derived from it are garbage-collected. In such cases an explicit `copy()` is recommended.
The standard rules of sequence slicing apply to basic slicing on a per-dimension basis (including using a step index). Some useful concepts to remember include:
  * The basic slice syntax is `i:j:k` where i is the starting index, j is the stopping index, and k is the step (\\(k\neq0\\)). This selects the m elements (in the corresponding dimension) with index values i, i + k, …, i + (m - 1) k where \\(m = q + (r\neq0)\\) and q and r are the quotient and remainder obtained by dividing j - i by k: j - i = q k + r, so that i + (m - 1) k < j. For example:
        >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        >>> x[1:7:2]
        array([1, 3, 5])
        
  * Negative i and j are interpreted as n + i and n + j where n is the number of elements in the corresponding dimension. Negative k makes stepping go towards smaller indices. From the above example:
        >>> x[-2:10]
        array([8, 9])
        >>> x[-3:3:-1]
        array([7, 6, 5, 4])
        
  * Assume n is the number of elements in the dimension being sliced. Then, if i is not given it defaults to 0 for k > 0 and n - 1 for k < 0 . If j is not given it defaults to n for k > 0 and -n-1 for k < 0 . If k is not given it defaults to 1. Note that `::` is the same as `:` and means select all indices along this axis. From the above example:
        >>> x[5:]
        array([5, 6, 7, 8, 9])
        
  * If the number of objects in the selection tuple is less than N, then `:` is assumed for any subsequent dimensions. For example:
        >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
        >>> x.shape
        (2, 3, 1)
        >>> x[1:2]
        array([[[4],
                [5],
                [6]]])
        
  * An integer, i, returns the same values as `i:i+1` except the dimensionality of the returned object is reduced by 1. In particular, a selection tuple with the p-th element an integer (and all other entries `:`) returns the corresponding sub-array with dimension N - 1. If N = 1 then the returned object is an array scalar. These objects are explained in Scalars.
  * If the selection tuple has all entries `:` except the p-th entry which is a slice object `i:j:k`, then the returned array has dimension N formed by stacking, along the p-th axis, the sub-arrays returned by integer indexing of elements i, i+k, …, i + (m - 1) k < j.
  * Basic slicing with more than one non-`:` entry in the slicing tuple, acts like repeated application of slicing using a single non-`:` entry, where the non-`:` entries are successively taken (with all other non-`:` entries replaced by `:`). Thus, `x[ind1, ..., ind2,:]` acts like `x[ind1][..., ind2, :]` under basic slicing.
Warning
The above is not true for advanced indexing.
  * You may use slicing to set values in the array, but (unlike lists) you can never grow the array. The size of the value to be set in `x[obj] = value` must be (broadcastable to) the same shape as `x[obj]`.
  * A slicing tuple can always be constructed as obj and used in the `x[obj]` notation. Slice objects can be used in the construction in place of the `[start:stop:step]` notation. For example, `x[1:10:5, ::-1]` can also be implemented as `obj = (slice(1, 10, 5), slice(None, None, -1)); x[obj]` . This can be useful for constructing generic code that works on arrays of arbitrary dimensions. See Dealing with variable numbers of indices within programs for more information.


### Dimensional indexing tools
There are some tools to facilitate the easy matching of array shapes with expressions and in assignments.
`Ellipsis` expands to the number of `:` objects needed for the selection tuple to index all dimensions. In most cases, this means that the length of the expanded selection tuple is `x.ndim`. There may only be a single ellipsis present. From the above example:
    
    >>> x[..., 0]
    array([[1, 2, 3],
          [4, 5, 6]])
    
This is equivalent to:
    
    >>> x[:, :, 0]
    array([[1, 2, 3],
          [4, 5, 6]])
    
Each `newaxis` object in the selection tuple serves to expand the dimensions of the resulting selection by one unit-length dimension. The added dimension is the position of the `newaxis` object in the selection tuple. `newaxis` is an alias for `None`, and `None` can be used in place of this with the same result. From the above example:
    
    >>> x[:, np.newaxis, :, :].shape
    (2, 1, 3, 1)
    >>> x[:, None, :, :].shape
    (2, 1, 3, 1)
    
This can be handy to combine two arrays in a way that otherwise would require explicit reshaping operations. For example:
    
    >>> x = np.arange(5)
    >>> x[:, np.newaxis] + x[np.newaxis, :]
    array([[0, 1, 2, 3, 4],
          [1, 2, 3, 4, 5],
          [2, 3, 4, 5, 6],
          [3, 4, 5, 6, 7],
          [4, 5, 6, 7, 8]])
    
## Advanced indexing
Advanced indexing is triggered when the selection object, obj, is a non-tuple sequence object, an `ndarray` (of data type integer or bool), or a tuple with at least one sequence object or ndarray (of data type integer or bool). There are two types of advanced indexing: integer and Boolean.
Advanced indexing always returns a copy of the data (contrast with basic slicing that returns a view).
Warning
The definition of advanced indexing means that `x[(1, 2, 3),]` is fundamentally different than `x[(1, 2, 3)]`. The latter is equivalent to `x[1, 2, 3]` which will trigger basic selection while the former will trigger advanced indexing. Be sure to understand why this occurs.
### Integer array indexing
Integer array indexing allows selection of arbitrary items in the array based on their N-dimensional index. Each integer array represents a number of indices into that dimension.
Negative values are permitted in the index arrays and work as they do with single indices or slices:
    
    >>> x = np.arange(10, 1, -1)
    >>> x
    array([10,  9,  8,  7,  6,  5,  4,  3,  2])
    >>> x[np.array([3, 3, 1, 8])]
    array([7, 7, 9, 2])
    >>> x[np.array([3, 3, -3, 8])]
    array([7, 7, 4, 2])
    
If the index values are out of bounds then an `IndexError` is thrown:
    
    >>> x = np.array([[1, 2], [3, 4], [5, 6]])
    >>> x[np.array([1, -1])]
    array([[3, 4],
          [5, 6]])
    >>> x[np.array([3, 4])]
    Traceback (most recent call last):
      ...
    IndexError: index 3 is out of bounds for axis 0 with size 3
    
When the index consists of as many integer arrays as dimensions of the array being indexed, the indexing is straightforward, but different from slicing.
Advanced indices always are broadcast and iterated as one:
    
    result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
                               ..., ind_N[i_1, ..., i_M]]
    
Note that the resulting shape is identical to the (broadcast) indexing array shapes `ind_1, ..., ind_N`. If the indices cannot be broadcast to the same shape, an exception `IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes...` is raised.
Indexing with multidimensional index arrays tend to be more unusual uses, but they are permitted, and they are useful for some problems. We’ll start with the simplest multidimensional case:
    
    >>> y = np.arange(35).reshape(5, 7)
    >>> y
    array([[ 0,  1,  2,  3,  4,  5,  6],
           [ 7,  8,  9, 10, 11, 12, 13],
           [14, 15, 16, 17, 18, 19, 20],
           [21, 22, 23, 24, 25, 26, 27],
           [28, 29, 30, 31, 32, 33, 34]])
    >>> y[np.array([0, 2, 4]), np.array([0, 1, 2])]
    array([ 0, 15, 30])
    
In this case, if the index arrays have a matching shape, and there is an index array for each dimension of the array being indexed, the resultant array has the same shape as the index arrays, and the values correspond to the index set for each position in the index arrays. In this example, the first index value is 0 for both index arrays, and thus the first value of the resultant array is `y[0, 0]`. The next value is `y[2, 1]`, and the last is `y[4, 2]`.
If the index arrays do not have the same shape, there is an attempt to broadcast them to the same shape. If they cannot be broadcast to the same shape, an exception is raised:
    
    >>> y[np.array([0, 2, 4]), np.array([0, 1])]
    Traceback (most recent call last):
      ...
    IndexError: shape mismatch: indexing arrays could not be broadcast
    together with shapes (3,) (2,)
    
The broadcasting mechanism permits index arrays to be combined with scalars for other indices. The effect is that the scalar value is used for all the corresponding values of the index arrays:
    
    >>> y[np.array([0, 2, 4]), 1]
    array([ 1, 15, 29])
    
Jumping to the next level of complexity, it is possible to only partially index an array with index arrays. It takes a bit of thought to understand what happens in such cases. For example if we just use one index array with y:
    
    >>> y[np.array([0, 2, 4])]
    array([[ 0,  1,  2,  3,  4,  5,  6],
           [14, 15, 16, 17, 18, 19, 20],
           [28, 29, 30, 31, 32, 33, 34]])
    
It results in the construction of a new array where each value of the index array selects one row from the array being indexed and the resultant array has the resulting shape (number of index elements, size of row).
In general, the shape of the resultant array will be the concatenation of the shape of the index array (or the shape that all the index arrays were broadcast to) with the shape of any unused dimensions (those not indexed) in the array being indexed.
#### Example
From each row, a specific element should be selected. The row index is just `[0, 1, 2]` and the column index specifies the element to choose for the corresponding row, here `[0, 1, 0]`. Using both together the task can be solved using advanced indexing:
    
    >>> x = np.array([[1, 2], [3, 4], [5, 6]])
    >>> x[[0, 1, 2], [0, 1, 0]]
    array([1, 4, 5])
    
To achieve a behaviour similar to the basic slicing above, broadcasting can be used. The function `ix_` can help with this broadcasting. This is best understood with an example.
#### Example
From a 4x3 array the corner elements should be selected using advanced indexing. Thus all elements for which the column is one of `[0, 2]` and the row is one of `[0, 3]` need to be selected. To use advanced indexing one needs to select all elements explicitly. Using the method explained previously one could write:
    
    >>> x = np.array([[ 0,  1,  2],
    ...               [ 3,  4,  5],
    ...               [ 6,  7,  8],
    ...               [ 9, 10, 11]])
    >>> rows = np.array([[0, 0],
    ...                  [3, 3]], dtype=np.intp)
    >>> columns = np.array([[0, 2],
    ...                     [0, 2]], dtype=np.intp)
    >>> x[rows, columns]
    array([[ 0,  2],
           [ 9, 11]])
    
However, since the indexing arrays above just repeat themselves, broadcasting can be used (compare operations such as `rows[:, np.newaxis] + columns`) to simplify this:
    
    >>> rows = np.array([0, 3], dtype=np.intp)
    >>> columns = np.array([0, 2], dtype=np.intp)
    >>> rows[:, np.newaxis]
    array([[0],
           [3]])
    >>> x[rows[:, np.newaxis], columns]
    array([[ 0,  2],
           [ 9, 11]])
    
This broadcasting can also be achieved using the function `ix_`:
    
    >>> x[np.ix_(rows, columns)]
    array([[ 0,  2],
           [ 9, 11]])
    
Note that without the `np.ix_` call, only the diagonal elements would be selected:
    
    >>> x[rows, columns]
    array([ 0, 11])
    
This difference is the most important thing to remember about indexing with multiple advanced indices.
#### Example
A real-life example of where advanced indexing may be useful is for a color lookup table where we want to map the values of an image into RGB triples for display. The lookup table could have a shape (nlookup, 3). Indexing such an array with an image with shape (ny, nx) with dtype=np.uint8 (or any integer type so long as values are with the bounds of the lookup table) will result in an array of shape (ny, nx, 3) where a triple of RGB values is associated with each pixel location.
### Boolean array indexing
This advanced indexing occurs when obj is an array object of Boolean type, such as may be returned from comparison operators. A single boolean index array is practically identical to `x[obj.nonzero()]` where, as described above, `obj.nonzero()` returns a tuple (of length `obj.ndim`) of integer index arrays showing the `True` elements of obj. However, it is faster when `obj.shape == x.shape`.
If `obj.ndim == x.ndim`, `x[obj]` returns a 1-dimensional array filled with the elements of x corresponding to the `True` values of obj. The search order will be row-major, C-style. An index error will be raised if the shape of obj does not match the corresponding dimensions of x, regardless of whether those values are `True` or `False`.
A common use case for this is filtering for desired element values. For example, one may wish to select all entries from an array which are not `numpy.nan`:
    
    >>> x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
    >>> x[~np.isnan(x)]
    array([1., 2., 3.])
    
Or wish to add a constant to all negative elements:
    
    >>> x = np.array([1., -1., -2., 3])
    >>> x[x < 0] += 20
    >>> x
    array([ 1., 19., 18., 3.])
    
In general if an index includes a Boolean array, the result will be identical to inserting `obj.nonzero()` into the same position and using the integer array indexing mechanism described above. `x[ind_1, boolean_array, ind_2]` is equivalent to `x[(ind_1,) + boolean_array.nonzero() + (ind_2,)]`.
If there is only one Boolean array and no integer indexing array present, this is straightforward. Care must only be taken to make sure that the boolean index has exactly as many dimensions as it is supposed to work with.
In general, when the boolean array has fewer dimensions than the array being indexed, this is equivalent to `x[b, ...]`, which means x is indexed by b followed by as many `:` as are needed to fill out the rank of x. Thus the shape of the result is one dimension containing the number of True elements of the boolean array, followed by the remaining dimensions of the array being indexed:
    
    >>> x = np.arange(35).reshape(5, 7)
    >>> b = x > 20
    >>> b[:, 5]
    array([False, False, False,  True,  True])
    >>> x[b[:, 5]]
    array([[21, 22, 23, 24, 25, 26, 27],
          [28, 29, 30, 31, 32, 33, 34]])
    
Here the 4th and 5th rows are selected from the indexed array and combined to make a 2-D array.
#### Example
From an array, select all rows which sum up to less or equal two:
    
    >>> x = np.array([[0, 1], [1, 1], [2, 2]])
    >>> rowsum = x.sum(-1)
    >>> x[rowsum <= 2, :]
    array([[0, 1],
           [1, 1]])
    
Combining multiple Boolean indexing arrays or a Boolean with an integer indexing array can best be understood with the `obj.nonzero()` analogy. The function `ix_` also supports boolean arrays and will work without any surprises.
#### Example
Use boolean indexing to select all rows adding up to an even number. At the same time columns 0 and 2 should be selected with an advanced integer index. Using the `ix_` function this can be done with:
    
    >>> x = np.array([[ 0,  1,  2],
    ...               [ 3,  4,  5],
    ...               [ 6,  7,  8],
    ...               [ 9, 10, 11]])
    >>> rows = (x.sum(-1) % 2) == 0
    >>> rows
    array([False,  True, False,  True])
    >>> columns = [0, 2]
    >>> x[np.ix_(rows, columns)]
    array([[ 3,  5],
           [ 9, 11]])
    
Without the `np.ix_` call, only the diagonal elements would be selected.
Or without `np.ix_` (compare the integer array examples):
    
    >>> rows = rows.nonzero()[0]
    >>> x[rows[:, np.newaxis], columns]
    array([[ 3,  5],
           [ 9, 11]])
    
#### Example
Use a 2-D boolean array of shape (2, 3) with four True elements to select rows from a 3-D array of shape (2, 3, 5) results in a 2-D result of shape (4, 5):
    
    >>> x = np.arange(30).reshape(2, 3, 5)
    >>> x
    array([[[ 0,  1,  2,  3,  4],
            [ 5,  6,  7,  8,  9],
            [10, 11, 12, 13, 14]],
          [[15, 16, 17, 18, 19],
            [20, 21, 22, 23, 24],
            [25, 26, 27, 28, 29]]])
    >>> b = np.array([[True, True, False], [False, True, True]])
    >>> x[b]
    array([[ 0,  1,  2,  3,  4],
          [ 5,  6,  7,  8,  9],
          [20, 21, 22, 23, 24],
          [25, 26, 27, 28, 29]])
    
### Combining advanced and basic indexing
When there is at least one slice (`:`), ellipsis (`...`) or `newaxis` in the index (or the array has more dimensions than there are advanced indices), then the behaviour can be more complicated. It is like concatenating the indexing result for each advanced index element.
In the simplest case, there is only a single advanced index combined with a slice. For example:
    
    >>> y = np.arange(35).reshape(5,7)
    >>> y[np.array([0, 2, 4]), 1:3]
    array([[ 1,  2],
           [15, 16],
           [29, 30]])
    
In effect, the slice and index array operation are independent. The slice operation extracts columns with index 1 and 2, (i.e. the 2nd and 3rd columns), followed by the index array operation which extracts rows with index 0, 2 and 4 (i.e the first, third and fifth rows). This is equivalent to:
    
    >>> y[:, 1:3][np.array([0, 2, 4]), :]
    array([[ 1,  2],
           [15, 16],
           [29, 30]])
    
A single advanced index can, for example, replace a slice and the result array will be the same. However, it is a copy and may have a different memory layout. A slice is preferable when it is possible. For example:
    
    >>> x = np.array([[ 0,  1,  2],
    ...               [ 3,  4,  5],
    ...               [ 6,  7,  8],
    ...               [ 9, 10, 11]])
    >>> x[1:2, 1:3]
    array([[4, 5]])
    >>> x[1:2, [1, 2]]
    array([[4, 5]])
    
The easiest way to understand a combination of multiple advanced indices may be to think in terms of the resulting shape. There are two parts to the indexing operation, the subspace defined by the basic indexing (excluding integers) and the subspace from the advanced indexing part. Two cases of index combination need to be distinguished:
  * The advanced indices are separated by a slice, `Ellipsis` or `newaxis`. For example `x[arr1, :, arr2]`.
  * The advanced indices are all next to each other. For example `x[..., arr1, arr2, :]` but not `x[arr1, :, 1]` since `1` is an advanced index in this regard.


In the first case, the dimensions resulting from the advanced indexing operation come first in the result array, and the subspace dimensions after that. In the second case, the dimensions from the advanced indexing operations are inserted into the result array at the same spot as they were in the initial array (the latter logic is what makes simple advanced indexing behave just like slicing).
#### Example
Suppose `x.shape` is (10, 20, 30) and `ind` is a (2, 5, 2)-shaped indexing `intp` array, then `result = x[..., ind, :]` has shape (10, 2, 5, 2, 30) because the (20,)-shaped subspace has been replaced with a (2, 5, 2)-shaped broadcasted indexing subspace. If we let i, j, k loop over the (2, 5, 2)-shaped subspace then `result[..., i, j, k, :] = x[..., ind[i, j, k], :]`. This example produces the same result as `x.take(ind, axis=-2)`.
#### Example
Let `x.shape` be (10, 20, 30, 40, 50) and suppose `ind_1` and `ind_2` can be broadcast to the shape (2, 3, 4). Then `x[:, ind_1, ind_2]` has shape (10, 2, 3, 4, 40, 50) because the (20, 30)-shaped subspace from X has been replaced with the (2, 3, 4) subspace from the indices. However, `x[:, ind_1, :, ind_2]` has shape (2, 3, 4, 10, 30, 50) because there is no unambiguous place to drop in the indexing subspace, thus it is tacked-on to the beginning. It is always possible to use `.transpose()` to move the subspace anywhere desired. Note that this example cannot be replicated using `take`.
#### Example
Slicing can be combined with broadcasted boolean indices:
    
    >>> x = np.arange(35).reshape(5, 7)
    >>> b = x > 20
    >>> b
    array([[False, False, False, False, False, False, False],
          [False, False, False, False, False, False, False],
          [False, False, False, False, False, False, False],
          [ True,  True,  True,  True,  True,  True,  True],
          [ True,  True,  True,  True,  True,  True,  True]])
    >>> x[b[:, 5], 1:3]
    array([[22, 23],
          [29, 30]])
    
## Field access
See also
Structured arrays
If the `ndarray` object is a structured array the fields of the array can be accessed by indexing the array with strings, dictionary-like.
Indexing `x['field-name']` returns a new view to the array, which is of the same shape as x (except when the field is a sub-array) but of data type `x.dtype['field-name']` and contains only the part of the data in the specified field. Also, record array scalars can be “indexed” this way.
Indexing into a structured array can also be done with a list of field names, e.g. `x[['field-name1', 'field-name2']]`. As of NumPy 1.16, this returns a view containing only those fields. In older versions of NumPy, it returned a copy. See the user guide section on Structured arrays for more information on multifield indexing.
If the accessed field is a sub-array, the dimensions of the sub-array are appended to the shape of the result. For example:
    
    >>> x = np.zeros((2, 2), dtype=[('a', np.int32), ('b', np.float64, (3, 3))])
    >>> x['a'].shape
    (2, 2)
    >>> x['a'].dtype
    dtype('int32')
    >>> x['b'].shape
    (2, 2, 3, 3)
    >>> x['b'].dtype
    dtype('float64')
    
## Flat iterator indexing
`x.flat` returns an iterator that will iterate over the entire array (in C-contiguous style with the last index varying the fastest). This iterator object can also be indexed using basic slicing or advanced indexing as long as the selection object is not a tuple. This should be clear from the fact that `x.flat` is a 1-dimensional view. It can be used for integer indexing with 1-dimensional C-style-flat indices. The shape of any returned array is therefore the shape of the integer indexing object.
## Assigning values to indexed arrays
As mentioned, one can select a subset of an array to assign to using a single index, slices, and index and mask arrays. The value being assigned to the indexed array must be shape consistent (the same shape or broadcastable to the shape the index produces). For example, it is permitted to assign a constant to a slice:
    
    >>> x = np.arange(10)
    >>> x[2:7] = 1
    
or an array of the right size:
    
    >>> x[2:7] = np.arange(5)
    
Note that assignments may result in changes if assigning higher types to lower types (like floats to ints) or even exceptions (assigning complex to floats or ints):
    
    >>> x[1] = 1.2
    >>> x[1]
    1
    >>> x[1] = 1.2j  
    Traceback (most recent call last):
      ...
    TypeError: can't convert complex to int
    
Unlike some of the references (such as array and mask indices) assignments are always made to the original data in the array (indeed, nothing else would make sense!). Note though, that some actions may not work as one may naively expect. This particular example is often surprising to people:
    
    >>> x = np.arange(0, 50, 10)
    >>> x
    array([ 0, 10, 20, 30, 40])
    >>> x[np.array([1, 1, 3, 1])] += 1
    >>> x
    array([ 0, 11, 20, 31, 40])
    
Where people expect that the 1st location will be incremented by 3. In fact, it will only be incremented by 1. The reason is that a new array is extracted from the original (as a temporary) containing the values at 1, 1, 3, 1, then the value 1 is added to the temporary, and then the temporary is assigned back to the original array. Thus the value of the array at `x[1] + 1` is assigned to `x[1]` three times, rather than being incremented 3 times.
## Dealing with variable numbers of indices within programs
The indexing syntax is very powerful but limiting when dealing with a variable number of indices. For example, if you want to write a function that can handle arguments with various numbers of dimensions without having to write special case code for each number of possible dimensions, how can that be done? If one supplies to the index a tuple, the tuple will be interpreted as a list of indices. For example:
    
    >>> z = np.arange(81).reshape(3, 3, 3, 3)
    >>> indices = (1, 1, 1, 1)
    >>> z[indices]
    40
    
So one can use code to construct tuples of any number of indices and then use these within an index.
Slices can be specified within programs by using the slice() function in Python. For example:
    
    >>> indices = (1, 1, 1, slice(0, 2))  # same as [1, 1, 1, 0:2]
    >>> z[indices]
    array([39, 40])
    
Likewise, ellipsis can be specified by code by using the Ellipsis object:
    
    >>> indices = (1, Ellipsis, 1)  # same as [1, ..., 1]
    >>> z[indices]
    array([[28, 31, 34],
           [37, 40, 43],
           [46, 49, 52]])
    
For this reason, it is possible to use the output from the `np.nonzero()` function directly as an index since it always returns a tuple of index arrays.
Because of the special treatment of tuples, they are not automatically converted to an array as a list would be. As an example:
    
    >>> z[[1, 1, 1, 1]]  # produces a large array
    array([[[[27, 28, 29],
             [30, 31, 32], ...
    >>> z[(1, 1, 1, 1)]  # returns a single value
    40
    
## Detailed notes
These are some detailed notes, which are not of importance for day to day indexing (in no particular order):
  * The native NumPy indexing type is `intp` and may differ from the default integer array type. `intp` is the smallest data type sufficient to safely index any array; for advanced indexing it may be faster than other types.
  * For advanced assignments, there is in general no guarantee for the iteration order. This means that if an element is set more than once, it is not possible to predict the final result.
  * An empty (tuple) index is a full scalar index into a zero-dimensional array. `x[()]` returns a scalar if `x` is zero-dimensional and a view otherwise. On the other hand, `x[...]` always returns a view.
  * If a zero-dimensional array is present in the index and it is a full integer index the result will be a scalar and not a zero-dimensional array. (Advanced indexing is not triggered.)
  * When an ellipsis (`...`) is present but has no size (i.e. replaces zero `:`) the result will still always be an array. A view if no advanced index is present, otherwise a copy.
  * The `nonzero` equivalence for Boolean arrays does not hold for zero dimensional boolean arrays.
  * When the result of an advanced indexing operation has no elements but an individual index is out of bounds, whether or not an `IndexError` is raised is undefined (e.g. `x[[], [123]]` with `123` being out of bounds).
  * When a casting error occurs during assignment (for example updating a numerical array using a sequence of strings), the array being assigned to may end up in an unpredictable partially updated state. However, if any other error (such as an out of bounds index) occurs, the array will remain unchanged.
  * The memory layout of an advanced indexing result is optimized for each indexing operation and no particular memory order can be assumed.
  * When using a subclass (especially one which manipulates its shape), the default `ndarray.__setitem__` behaviour will call `__getitem__` for basic indexing but not for advanced indexing. For such a subclass it may be preferable to call `ndarray.__setitem__` with a base class ndarray view on the data. This must be done if the subclasses `__getitem__` does not return views.


# Interoperability with NumPy
NumPy’s ndarray objects provide both a high-level API for operations on array-structured data and a concrete implementation of the API based on strided in-RAM storage. While this API is powerful and fairly general, its concrete implementation has limitations. As datasets grow and NumPy becomes used in a variety of new environments and architectures, there are cases where the strided in-RAM storage strategy is inappropriate, which has caused different libraries to reimplement this API for their own uses. This includes GPU arrays (CuPy), Sparse arrays (`scipy.sparse`, PyData/Sparse) and parallel arrays (Dask arrays) as well as various NumPy-like implementations in deep learning frameworks, like TensorFlow and PyTorch. Similarly, there are many projects that build on top of the NumPy API for labeled and indexed arrays (XArray), automatic differentiation (JAX), masked arrays (`numpy.ma`), physical units (astropy.units, pint, unyt), among others that add additional functionality on top of the NumPy API.
Yet, users still want to work with these arrays using the familiar NumPy API and reuse existing code with minimal (ideally zero) porting overhead. With this goal in mind, various protocols are defined for implementations of multi-dimensional arrays with high-level APIs matching NumPy.
Broadly speaking, there are three groups of features used for interoperability with NumPy:
  1. Methods of turning a foreign object into an ndarray;
  2. Methods of deferring execution from a NumPy function to another array library;
  3. Methods that use NumPy functions and return an instance of a foreign object.


We describe these features below.
## 1\. Using arbitrary objects in NumPy
The first set of interoperability features from the NumPy API allows foreign objects to be treated as NumPy arrays whenever possible. When NumPy functions encounter a foreign object, they will try (in order):
  1. The buffer protocol, described in the Python C-API documentation.
  2. The `__array_interface__` protocol, described in this page. A precursor to Python’s buffer protocol, it defines a way to access the contents of a NumPy array from other C extensions.
  3. The `__array__()` method, which asks an arbitrary object to convert itself into an array.


For both the buffer and the `__array_interface__` protocols, the object describes its memory layout and NumPy does everything else (zero-copy if possible). If that’s not possible, the object itself is responsible for returning a `ndarray` from `__array__()`.
DLPack is yet another protocol to convert foreign objects to NumPy arrays in a language and device agnostic manner. NumPy doesn’t implicitly convert objects to ndarrays using DLPack. It provides the function `numpy.from_dlpack` that accepts any object implementing the `__dlpack__` method and outputs a NumPy ndarray (which is generally a view of the input object’s data buffer). The Python Specification for DLPack page explains the `__dlpack__` protocol in detail.
### The array interface protocol
The array interface protocol defines a way for array-like objects to reuse each other’s data buffers. Its implementation relies on the existence of the following attributes or methods:
  * `__array_interface__`: a Python dictionary containing the shape, the element type, and optionally, the data buffer address and the strides of an array-like object;
  * `__array__()`: a method returning the NumPy ndarray copy or a view of an array-like object;


The `__array_interface__` attribute can be inspected directly:
    
    >>> import numpy as np
    >>> x = np.array([1, 2, 5.0, 8])
    >>> x.__array_interface__
    {'data': (94708397920832, False), 'strides': None, 'descr': [('', '<f8')], 'typestr': '<f8', 'shape': (4,), 'version': 3}
    
The `__array_interface__` attribute can also be used to manipulate the object data in place:
    
    >>> class wrapper():
    ...     pass
    ...
    >>> arr = np.array([1, 2, 3, 4])
    >>> buf = arr.__array_interface__
    >>> buf
    {'data': (140497590272032, False), 'strides': None, 'descr': [('', '<i8')], 'typestr': '<i8', 'shape': (4,), 'version': 3}
    >>> buf['shape'] = (2, 2)
    >>> w = wrapper()
    >>> w.__array_interface__ = buf
    >>> new_arr = np.array(w, copy=False)
    >>> new_arr
    array([[1, 2],
           [3, 4]])
    
We can check that `arr` and `new_arr` share the same data buffer:
    
    >>> new_arr[0, 0] = 1000
    >>> new_arr
    array([[1000,    2],
           [   3,    4]])
    >>> arr
    array([1000, 2, 3, 4])
    
### The `__array__()` method
The `__array__()` method ensures that any NumPy-like object (an array, any object exposing the array interface, an object whose `__array__()` method returns an array or any nested sequence) that implements it can be used as a NumPy array. If possible, this will mean using `__array__()` to create a NumPy ndarray view of the array-like object. Otherwise, this copies the data into a new ndarray object. This is not optimal, as coercing arrays into ndarrays may cause performance problems or create the need for copies and loss of metadata, as the original object and any attributes/behavior it may have had, is lost.
The signature of the method should be `__array__(self, dtype=None, copy=None)`. If a passed `dtype` isn’t `None` and different than the object’s data type, a casting should happen to a specified type. If `copy` is `None`, a copy should be made only if `dtype` argument enforces it. For `copy=True`, a copy should always be made, where `copy=False` should raise an exception if a copy is needed.
If a class implements the old signature `__array__(self)`, for `np.array(a)` a warning will be raised saying that `dtype` and `copy` arguments are missing.
To see an example of a custom array implementation including the use of `__array__()`, see Writing custom array containers.
### The DLPack Protocol
The DLPack protocol defines a memory-layout of strided n-dimensional array objects. It offers the following syntax for data exchange:
  1. A `numpy.from_dlpack` function, which accepts (array) objects with a `__dlpack__` method and uses that method to construct a new array containing the data from `x`.
  2. `__dlpack__(self, stream=None)` and `__dlpack_device__` methods on the array object, which will be called from within `from_dlpack`, to query what device the array is on (may be needed to pass in the correct stream, e.g. in the case of multiple GPUs) and to access the data.


Unlike the buffer protocol, DLPack allows exchanging arrays containing data on devices other than the CPU (e.g. Vulkan or GPU). Since NumPy only supports CPU, it can only convert objects whose data exists on the CPU. But other libraries, like PyTorch and CuPy, may exchange data on GPU using this protocol.
## 2\. Operating on foreign objects without converting
A second set of methods defined by the NumPy API allows us to defer the execution from a NumPy function to another array library.
Consider the following function.
    
    >>> import numpy as np
    >>> def f(x):
    ...     return np.mean(np.exp(x))
    
Note that `np.exp` is a ufunc, which means that it operates on ndarrays in an element-by-element fashion. On the other hand, `np.mean` operates along one of the array’s axes.
We can apply `f` to a NumPy ndarray object directly:
    
    >>> x = np.array([1, 2, 3, 4])
    >>> f(x)
    21.1977562209304
    
We would like this function to work equally well with any NumPy-like array object.
NumPy allows a class to indicate that it would like to handle computations in a custom-defined way through the following interfaces:
  * `__array_ufunc__`: allows third-party objects to support and override ufuncs.
  * `__array_function__`: a catch-all for NumPy functionality that is not covered by the `__array_ufunc__` protocol for universal functions.


As long as foreign objects implement the `__array_ufunc__` or `__array_function__` protocols, it is possible to operate on them without the need for explicit conversion.
### The `__array_ufunc__` protocol
A universal function (or ufunc for short) is a “vectorized” wrapper for a function that takes a fixed number of specific inputs and produces a fixed number of specific outputs. The output of the ufunc (and its methods) is not necessarily a ndarray, if not all input arguments are ndarrays. Indeed, if any input defines an `__array_ufunc__` method, control will be passed completely to that function, i.e., the ufunc is overridden. The `__array_ufunc__` method defined on that (non-ndarray) object has access to the NumPy ufunc. Because ufuncs have a well-defined structure, the foreign `__array_ufunc__` method may rely on ufunc attributes like `.at()`, `.reduce()`, and others.
A subclass can override what happens when executing NumPy ufuncs on it by overriding the default `ndarray.__array_ufunc__` method. This method is executed instead of the ufunc and should return either the result of the operation, or `NotImplemented` if the operation requested is not implemented.
### The `__array_function__` protocol
To achieve enough coverage of the NumPy API to support downstream projects, there is a need to go beyond `__array_ufunc__` and implement a protocol that allows arguments of a NumPy function to take control and divert execution to another function (for example, a GPU or parallel implementation) in a way that is safe and consistent across projects.
The semantics of `__array_function__` are very similar to `__array_ufunc__`, except the operation is specified by an arbitrary callable object rather than a ufunc instance and method. For more details, see NEP 18 — A dispatch mechanism for NumPy’s high level array functions.
## 3\. Returning foreign objects
A third type of feature set is meant to use the NumPy function implementation and then convert the return value back into an instance of the foreign object. The `__array_finalize__` and `__array_wrap__` methods act behind the scenes to ensure that the return type of a NumPy function can be specified as needed.
The `__array_finalize__` method is the mechanism that NumPy provides to allow subclasses to handle the various ways that new instances get created. This method is called whenever the system internally allocates a new array from an object which is a subclass (subtype) of the ndarray. It can be used to change attributes after construction, or to update meta-information from the “parent.”
The `__array_wrap__` method “wraps up the action” in the sense of allowing any object (such as user-defined functions) to set the type of its return value and update attributes and metadata. This can be seen as the opposite of the `__array__` method. At the end of every object that implements `__array_wrap__`, this method is called on the input object with the highest array priority, or the output object if one was specified. The `__array_priority__` attribute is used to determine what type of object to return in situations where there is more than one possibility for the Python type of the returned object. For example, subclasses may opt to use this method to transform the output array into an instance of the subclass and update metadata before returning the array to the user.
For more information on these methods, see Subclassing ndarray and Specific features of ndarray sub-typing.
## Interoperability examples
### Example: Pandas `Series` objects
Consider the following:
    
    >>> import pandas as pd
    >>> ser = pd.Series([1, 2, 3, 4])
    >>> type(ser)
    pandas.core.series.Series
    
Now, `ser` is not a ndarray, but because it implements the __array_ufunc__ protocol, we can apply ufuncs to it as if it were a ndarray:
    
    >>> np.exp(ser)
       0     2.718282
       1     7.389056
       2    20.085537
       3    54.598150
       dtype: float64
    >>> np.sin(ser)
       0    0.841471
       1    0.909297
       2    0.141120
       3   -0.756802
       dtype: float64
    
We can even do operations with other ndarrays:
    
    >>> np.add(ser, np.array([5, 6, 7, 8]))
       0     6
       1     8
       2    10
       3    12
       dtype: int64
    >>> f(ser)
    21.1977562209304
    >>> result = ser.__array__()
    >>> type(result)
    numpy.ndarray
    
### Example: PyTorch tensors
PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. PyTorch arrays are commonly called tensors. Tensors are similar to NumPy’s ndarrays, except that tensors can run on GPUs or other hardware accelerators. In fact, tensors and NumPy arrays can often share the same underlying memory, eliminating the need to copy data.
    
    >>> import torch
    >>> data = [[1, 2],[3, 4]]
    >>> x_np = np.array(data)
    >>> x_tensor = torch.tensor(data)
    
Note that `x_np` and `x_tensor` are different kinds of objects:
    
    >>> x_np
    array([[1, 2],
           [3, 4]])
    >>> x_tensor
    tensor([[1, 2],
            [3, 4]])
    
However, we can treat PyTorch tensors as NumPy arrays without the need for explicit conversion:
    
    >>> np.exp(x_tensor)
    tensor([[ 2.7183,  7.3891],
            [20.0855, 54.5982]], dtype=torch.float64)
    
Also, note that the return type of this function is compatible with the initial data type.
Warning
While this mixing of ndarrays and tensors may be convenient, it is not recommended. It will not work for non-CPU tensors, and will have unexpected behavior in corner cases. Users should prefer explicitly converting the ndarray to a tensor.
Note
PyTorch does not implement `__array_function__` or `__array_ufunc__`. Under the hood, the `Tensor.__array__()` method returns a NumPy ndarray as a view of the tensor data buffer. See this issue and the __torch_function__ implementation for details.
Note also that we can see `__array_wrap__` in action here, even though `torch.Tensor` is not a subclass of ndarray:
    
    >>> import torch
    >>> t = torch.arange(4)
    >>> np.abs(t)
    tensor([0, 1, 2, 3])
    
PyTorch implements `__array_wrap__` to be able to get tensors back from NumPy functions, and we can modify it directly to control which type of objects are returned from these functions.
### Example: CuPy arrays
CuPy is a NumPy/SciPy-compatible array library for GPU-accelerated computing with Python. CuPy implements a subset of the NumPy interface by implementing `cupy.ndarray`, a counterpart to NumPy ndarrays.
    
    >>> import cupy as cp
    >>> x_gpu = cp.array([1, 2, 3, 4])
    
The `cupy.ndarray` object implements the `__array_ufunc__` interface. This enables NumPy ufuncs to be applied to CuPy arrays (this will defer operation to the matching CuPy CUDA/ROCm implementation of the ufunc):
    
    >>> np.mean(np.exp(x_gpu))
    array(21.19775622)
    
Note that the return type of these operations is still consistent with the initial type:
    
    >>> arr = cp.random.randn(1, 2, 3, 4).astype(cp.float32)
    >>> result = np.sum(arr)
    >>> print(type(result))
    <class 'cupy._core.core.ndarray'>
    
See this page in the CuPy documentation for details.
`cupy.ndarray` also implements the `__array_function__` interface, meaning it is possible to do operations such as
    
    >>> a = np.random.randn(100, 100)
    >>> a_gpu = cp.asarray(a)
    >>> qr_gpu = np.linalg.qr(a_gpu)
    
CuPy implements many NumPy functions on `cupy.ndarray` objects, but not all. See the CuPy documentation for details.
### Example: Dask arrays
Dask is a flexible library for parallel computing in Python. Dask Array implements a subset of the NumPy ndarray interface using blocked algorithms, cutting up the large array into many small arrays. This allows computations on larger-than-memory arrays using multiple cores.
Dask supports `__array__()` and `__array_ufunc__`.
    
    >>> import dask.array as da
    >>> x = da.random.normal(1, 0.1, size=(20, 20), chunks=(10, 10))
    >>> np.mean(np.exp(x))
    dask.array<mean_agg-aggregate, shape=(), dtype=float64, chunksize=(), chunktype=numpy.ndarray>
    >>> np.mean(np.exp(x)).compute()
    5.090097550553843
    
Note
Dask is lazily evaluated, and the result from a computation isn’t computed until you ask for it by invoking `compute()`.
See the Dask array documentation and the scope of Dask arrays interoperability with NumPy arrays for details.
### Example: DLPack
Several Python data science libraries implement the `__dlpack__` protocol. Among them are PyTorch and CuPy. A full list of libraries that implement this protocol can be found on this page of DLPack documentation.
Convert a PyTorch CPU tensor to NumPy array:
    
    >>> import torch
    >>> x_torch = torch.arange(5)
    >>> x_torch
    tensor([0, 1, 2, 3, 4])
    >>> x_np = np.from_dlpack(x_torch)
    >>> x_np
    array([0, 1, 2, 3, 4])
    >>> # note that x_np is a view of x_torch
    >>> x_torch[1] = 100
    >>> x_torch
    tensor([  0, 100,   2,   3,   4])
    >>> x_np
    array([  0, 100,   2,   3,   4])
    
The imported arrays are read-only so writing or operating in-place will fail:
    
    >>> x.flags.writeable
    False
    >>> x_np[1] = 1
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: assignment destination is read-only
    
A copy must be created in order to operate on the imported arrays in-place, but will mean duplicating the memory. Do not do this for very large arrays:
    
    >>> x_np_copy = x_np.copy()
    >>> x_np_copy.sort()  # works
    
Note
Note that GPU tensors can’t be converted to NumPy arrays since NumPy doesn’t support GPU devices:
    
    >>> x_torch = torch.arange(5, device='cuda')
    >>> np.from_dlpack(x_torch)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    RuntimeError: Unsupported device in DLTensor.
    
But, if both libraries support the device the data buffer is on, it is possible to use the `__dlpack__` protocol (e.g. PyTorch and CuPy):
    
    >>> x_torch = torch.arange(5, device='cuda')
    >>> x_cupy = cupy.from_dlpack(x_torch)
    
Similarly, a NumPy array can be converted to a PyTorch tensor:
    
    >>> x_np = np.arange(5)
    >>> x_torch = torch.from_dlpack(x_np)
    
Read-only arrays cannot be exported:
    
    >>> x_np = np.arange(5)
    >>> x_np.flags.writeable = False
    >>> torch.from_dlpack(x_np)  
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File ".../site-packages/torch/utils/dlpack.py", line 63, in from_dlpack
        dlpack = ext_tensor.__dlpack__()
    TypeError: NumPy currently only supports dlpack for writeable arrays
    
## Further reading
  * The array interface protocol
  * Writing custom array containers
  * Special attributes and methods (details on the `__array_ufunc__` and `__array_function__` protocols)
  * Subclassing ndarray (details on the `__array_wrap__` and `__array_finalize__` methods)
  * Specific features of ndarray sub-typing (more details on the implementation of `__array_finalize__`, `__array_wrap__` and `__array_priority__`)
  * NumPy roadmap: interoperability
  * PyTorch documentation on the Bridge with NumPy


# Importing data with genfromtxt
NumPy provides several functions to create arrays from tabular data. We focus here on the `genfromtxt` function.
In a nutshell, `genfromtxt` runs two main loops. The first loop converts each line of the file in a sequence of strings. The second loop converts each string to the appropriate data type. This mechanism is slower than a single loop, but gives more flexibility. In particular, `genfromtxt` is able to take missing data into account, when other faster and simpler functions like `loadtxt` cannot.
Note
When giving examples, we will use the following conventions:
    
    >>> import numpy as np
    >>> from io import StringIO
    
## Defining the input
The only mandatory argument of `genfromtxt` is the source of the data. It can be a string, a list of strings, a generator or an open file-like object with a `read` method, for example, a file or `io.StringIO` object. If a single string is provided, it is assumed to be the name of a local or remote file. If a list of strings or a generator returning strings is provided, each string is treated as one line in a file. When the URL of a remote file is passed, the file is automatically downloaded to the current directory and opened.
Recognized file types are text files and archives. Currently, the function recognizes `gzip` and `bz2` (`bzip2`) archives. The type of the archive is determined from the extension of the file: if the filename ends with `'.gz'`, a `gzip` archive is expected; if it ends with `'bz2'`, a `bzip2` archive is assumed.
## Splitting the lines into columns
### The `delimiter` argument
Once the file is defined and open for reading, `genfromtxt` splits each non-empty line into a sequence of strings. Empty or commented lines are just skipped. The `delimiter` keyword is used to define how the splitting should take place.
Quite often, a single character marks the separation between columns. For example, comma-separated files (CSV) use a comma (`,`) or a semicolon (`;`) as delimiter:
    
    >>> data = "1, 2, 3\n4, 5, 6"
    >>> np.genfromtxt(StringIO(data), delimiter=",")
    array([[1.,  2.,  3.],
           [4.,  5.,  6.]])
    
Another common separator is `"\t"`, the tabulation character. However, we are not limited to a single character, any string will do. By default, `genfromtxt` assumes `delimiter=None`, meaning that the line is split along white spaces (including tabs) and that consecutive white spaces are considered as a single white space.
Alternatively, we may be dealing with a fixed-width file, where columns are defined as a given number of characters. In that case, we need to set `delimiter` to a single integer (if all the columns have the same size) or to a sequence of integers (if columns can have different sizes):
    
    >>> data = "  1  2  3\n  4  5 67\n890123  4"
    >>> np.genfromtxt(StringIO(data), delimiter=3)
    array([[  1.,    2.,    3.],
           [  4.,    5.,   67.],
           [890.,  123.,    4.]])
    >>> data = "123456789\n   4  7 9\n   4567 9"
    >>> np.genfromtxt(StringIO(data), delimiter=(4, 3, 2))
    array([[1234.,   567.,    89.],
           [   4.,     7.,     9.],
           [   4.,   567.,     9.]])
    
### The `autostrip` argument
By default, when a line is decomposed into a series of strings, the individual entries are not stripped of leading nor trailing white spaces. This behavior can be overwritten by setting the optional argument `autostrip` to a value of `True`:
    
    >>> data = "1, abc , 2\n 3, xxx, 4"
    >>> # Without autostrip
    >>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5")
    array([['1', ' abc ', ' 2'],
           ['3', ' xxx', ' 4']], dtype='<U5')
    >>> # With autostrip
    >>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5", autostrip=True)
    array([['1', 'abc', '2'],
           ['3', 'xxx', '4']], dtype='<U5')
    
### The `comments` argument
The optional argument `comments` is used to define a character string that marks the beginning of a comment. By default, `genfromtxt` assumes `comments='#'`. The comment marker may occur anywhere on the line. Any character present after the comment marker(s) is simply ignored:
    
    >>> data = """#
    ... # Skip me !
    ... # Skip me too !
    ... 1, 2
    ... 3, 4
    ... 5, 6 #This is the third line of the data
    ... 7, 8
    ... # And here comes the last line
    ... 9, 0
    ... """
    >>> np.genfromtxt(StringIO(data), comments="#", delimiter=",")
    array([[1., 2.],
           [3., 4.],
           [5., 6.],
           [7., 8.],
           [9., 0.]])
    
Note
There is one notable exception to this behavior: if the optional argument `names=True`, the first commented line will be examined for names.
## Skipping lines and choosing columns
### The `skip_header` and `skip_footer` arguments
The presence of a header in the file can hinder data processing. In that case, we need to use the `skip_header` optional argument. The values of this argument must be an integer which corresponds to the number of lines to skip at the beginning of the file, before any other action is performed. Similarly, we can skip the last `n` lines of the file by using the `skip_footer` attribute and giving it a value of `n`:
    
    >>> data = "\n".join(str(i) for i in range(10))
    >>> np.genfromtxt(StringIO(data),)
    array([0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
    >>> np.genfromtxt(StringIO(data),
    ...               skip_header=3, skip_footer=5)
    array([3.,  4.])
    
By default, `skip_header=0` and `skip_footer=0`, meaning that no lines are skipped.
### The `usecols` argument
In some cases, we are not interested in all the columns of the data but only a few of them. We can select which columns to import with the `usecols` argument. This argument accepts a single integer or a sequence of integers corresponding to the indices of the columns to import. Remember that by convention, the first column has an index of 0. Negative integers behave the same as regular Python negative indexes.
For example, if we want to import only the first and the last columns, we can use `usecols=(0, -1)`:
    
    >>> data = "1 2 3\n4 5 6"
    >>> np.genfromtxt(StringIO(data), usecols=(0, -1))
    array([[1.,  3.],
           [4.,  6.]])
    
If the columns have names, we can also select which columns to import by giving their name to the `usecols` argument, either as a sequence of strings or a comma-separated string:
    
    >>> data = "1 2 3\n4 5 6"
    >>> np.genfromtxt(StringIO(data),
    ...               names="a, b, c", usecols=("a", "c"))
    array([(1., 3.), (4., 6.)], dtype=[('a', '<f8'), ('c', '<f8')])
    >>> np.genfromtxt(StringIO(data),
    ...               names="a, b, c", usecols=("a, c"))
        array([(1., 3.), (4., 6.)], dtype=[('a', '<f8'), ('c', '<f8')])
    
## Choosing the data type
The main way to control how the sequences of strings we have read from the file are converted to other types is to set the `dtype` argument. Acceptable values for this argument are:
  * a single type, such as `dtype=float`. The output will be 2D with the given dtype, unless a name has been associated with each column with the use of the `names` argument (see below). Note that `dtype=float` is the default for `genfromtxt`.
  * a sequence of types, such as `dtype=(int, float, float)`.
  * a comma-separated string, such as `dtype="i4,f8,|U3"`.
  * a dictionary with two keys `'names'` and `'formats'`.
  * a sequence of tuples `(name, type)`, such as `dtype=[('A', int), ('B', float)]`.
  * an existing `numpy.dtype` object.
  * the special value `None`. In that case, the type of the columns will be determined from the data itself (see below).


In all the cases but the first one, the output will be a 1D array with a structured dtype. This dtype has as many fields as items in the sequence. The field names are defined with the `names` keyword.
When `dtype=None`, the type of each column is determined iteratively from its data. We start by checking whether a string can be converted to a boolean (that is, if the string matches `true` or `false` in lower cases); then whether it can be converted to an integer, then to a float, then to a complex and eventually to a string.
The option `dtype=None` is provided for convenience. However, it is significantly slower than setting the dtype explicitly.
## Setting the names
### The `names` argument
A natural approach when dealing with tabular data is to allocate a name to each column. A first possibility is to use an explicit structured dtype, as mentioned previously:
    
    >>> data = StringIO("1 2 3\n 4 5 6")
    >>> np.genfromtxt(data, dtype=[(_, int) for _ in "abc"])
    array([(1, 2, 3), (4, 5, 6)],
          dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')])
    
Another simpler possibility is to use the `names` keyword with a sequence of strings or a comma-separated string:
    
    >>> data = StringIO("1 2 3\n 4 5 6")
    >>> np.genfromtxt(data, names="A, B, C")
    array([(1., 2., 3.), (4., 5., 6.)],
          dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
    
In the example above, we used the fact that by default, `dtype=float`. By giving a sequence of names, we are forcing the output to a structured dtype.
We may sometimes need to define the column names from the data itself. In that case, we must use the `names` keyword with a value of `True`. The names will then be read from the first line (after the `skip_header` ones), even if the line is commented out:
    
    >>> data = StringIO("So it goes\n#a b c\n1 2 3\n 4 5 6")
    >>> np.genfromtxt(data, skip_header=1, names=True)
    array([(1., 2., 3.), (4., 5., 6.)],
          dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
    
The default value of `names` is `None`. If we give any other value to the keyword, the new names will overwrite the field names we may have defined with the dtype:
    
    >>> data = StringIO("1 2 3\n 4 5 6")
    >>> ndtype=[('a',int), ('b', float), ('c', int)]
    >>> names = ["A", "B", "C"]
    >>> np.genfromtxt(data, names=names, dtype=ndtype)
    array([(1, 2., 3), (4, 5., 6)],
          dtype=[('A', '<i8'), ('B', '<f8'), ('C', '<i8')])
    
### The `defaultfmt` argument
If `names=None` but a structured dtype is expected, names are defined with the standard NumPy default of `"f%i"`, yielding names like `f0`, `f1` and so forth:
    
    >>> data = StringIO("1 2 3\n 4 5 6")
    >>> np.genfromtxt(data, dtype=(int, float, int))
    array([(1, 2., 3), (4, 5., 6)],
          dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<i8')])
    
In the same way, if we don’t give enough names to match the length of the dtype, the missing names will be defined with this default template:
    
    >>> data = StringIO("1 2 3\n 4 5 6")
    >>> np.genfromtxt(data, dtype=(int, float, int), names="a")
    array([(1, 2., 3), (4, 5., 6)],
          dtype=[('a', '<i8'), ('f0', '<f8'), ('f1', '<i8')])
    
We can overwrite this default with the `defaultfmt` argument, that takes any format string:
    
    >>> data = StringIO("1 2 3\n 4 5 6")
    >>> np.genfromtxt(data, dtype=(int, float, int), defaultfmt="var_%02i")
    array([(1, 2., 3), (4, 5., 6)],
          dtype=[('var_00', '<i8'), ('var_01', '<f8'), ('var_02', '<i8')])
    
Note
We need to keep in mind that `defaultfmt` is used only if some names are expected but not defined.
### Validating names
NumPy arrays with a structured dtype can also be viewed as `recarray`, where a field can be accessed as if it were an attribute. For that reason, we may need to make sure that the field name doesn’t contain any space or invalid character, or that it does not correspond to the name of a standard attribute (like `size` or `shape`), which would confuse the interpreter. `genfromtxt` accepts three optional arguments that provide a finer control on the names:
`deletechars`
    
Gives a string combining all the characters that must be deleted from the name. By default, invalid characters are `~!@#$%^&*()-=+~\|]}[{';: /?.>,<`.
`excludelist`
    
Gives a list of the names to exclude, such as `return`, `file`, `print`… If one of the input name is part of this list, an underscore character (`'_'`) will be appended to it.
`case_sensitive`
    
Whether the names should be case-sensitive (`case_sensitive=True`), converted to upper case (`case_sensitive=False` or `case_sensitive='upper'`) or to lower case (`case_sensitive='lower'`).
## Tweaking the conversion
### The `converters` argument
Usually, defining a dtype is sufficient to define how the sequence of strings must be converted. However, some additional control may sometimes be required. For example, we may want to make sure that a date in a format `YYYY/MM/DD` is converted to a `datetime` object, or that a string like `xx%` is properly converted to a float between 0 and 1. In such cases, we should define conversion functions with the `converters` arguments.
The value of this argument is typically a dictionary with column indices or column names as keys and a conversion functions as values. These conversion functions can either be actual functions or lambda functions. In any case, they should accept only a string as input and output only a single element of the wanted type.
In the following example, the second column is converted from as string representing a percentage to a float between 0 and 1:
    
    >>> convertfunc = lambda x: float(x.strip("%"))/100.
    >>> data = "1, 2.3%, 45.\n6, 78.9%, 0"
    >>> names = ("i", "p", "n")
    >>> # General case .....
    >>> np.genfromtxt(StringIO(data), delimiter=",", names=names)
    array([(1., nan, 45.), (6., nan, 0.)],
          dtype=[('i', '<f8'), ('p', '<f8'), ('n', '<f8')])
    
We need to keep in mind that by default, `dtype=float`. A float is therefore expected for the second column. However, the strings `' 2.3%'` and `' 78.9%'` cannot be converted to float and we end up having `np.nan` instead. Let’s now use a converter:
    
    >>> # Converted case ...
    >>> np.genfromtxt(StringIO(data), delimiter=",", names=names,
    ...               converters={1: convertfunc})
    array([(1., 0.023, 45.), (6., 0.789, 0.)],
          dtype=[('i', '<f8'), ('p', '<f8'), ('n', '<f8')])
    
The same results can be obtained by using the name of the second column (`"p"`) as key instead of its index (1):
    
    >>> # Using a name for the converter ...
    >>> np.genfromtxt(StringIO(data), delimiter=",", names=names,
    ...               converters={"p": convertfunc})
    array([(1., 0.023, 45.), (6., 0.789, 0.)],
          dtype=[('i', '<f8'), ('p', '<f8'), ('n', '<f8')])
    
Converters can also be used to provide a default for missing entries. In the following example, the converter `convert` transforms a stripped string into the corresponding float or into -999 if the string is empty. We need to explicitly strip the string from white spaces as it is not done by default:
    
    >>> data = "1, , 3\n 4, 5, 6"
    >>> convert = lambda x: float(x.strip() or -999)
    >>> np.genfromtxt(StringIO(data), delimiter=",",
    ...               converters={1: convert})
    array([[   1., -999.,    3.],
           [   4.,    5.,    6.]])
    
### Using missing and filling values
Some entries may be missing in the dataset we are trying to import. In a previous example, we used a converter to transform an empty string into a float. However, user-defined converters may rapidly become cumbersome to manage.
The `genfromtxt` function provides two other complementary mechanisms: the `missing_values` argument is used to recognize missing data and a second argument, `filling_values`, is used to process these missing data.
### `missing_values`
By default, any empty string is marked as missing. We can also consider more complex strings, such as `"N/A"` or `"???"` to represent missing or invalid data. The `missing_values` argument accepts three kinds of values:
a string or a comma-separated string
    
This string will be used as the marker for missing data for all the columns
a sequence of strings
    
In that case, each item is associated to a column, in order.
a dictionary
    
Values of the dictionary are strings or sequence of strings. The corresponding keys can be column indices (integers) or column names (strings). In addition, the special key `None` can be used to define a default applicable to all columns.
### `filling_values`
We know how to recognize missing data, but we still need to provide a value for these missing entries. By default, this value is determined from the expected dtype according to this table:
Expected type
Default  
`bool`
`False`  
`int`
`-1`  
`float`
`np.nan`  
`complex`
`np.nan+0j`  
`string`
`'???'`  
We can get a finer control on the conversion of missing values with the `filling_values` optional argument. Like `missing_values`, this argument accepts different kind of values:
a single value
    
This will be the default for all columns
a sequence of values
    
Each entry will be the default for the corresponding column
a dictionary
    
Each key can be a column index or a column name, and the corresponding value should be a single object. We can use the special key `None` to define a default for all columns.
In the following example, we suppose that the missing values are flagged with `"N/A"` in the first column and by `"???"` in the third column. We wish to transform these missing values to 0 if they occur in the first and second column, and to -999 if they occur in the last column:
    
    >>> data = "N/A, 2, 3\n4, ,???"
    >>> kwargs = dict(delimiter=",",
    ...               dtype=int,
    ...               names="a,b,c",
    ...               missing_values={0:"N/A", 'b':" ", 2:"???"},
    ...               filling_values={0:0, 'b':0, 2:-999})
    >>> np.genfromtxt(StringIO(data), **kwargs)
    array([(0, 2, 3), (4, 0, -999)],
          dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')])
    
### `usemask`
We may also want to keep track of the occurrence of missing data by constructing a boolean mask, with `True` entries where data was missing and `False` otherwise. To do that, we just have to set the optional argument `usemask` to `True` (the default is `False`). The output array will then be a `MaskedArray`.
# I/O with NumPy
  * Importing data with `genfromtxt`
    * Defining the input
    * Splitting the lines into columns
    * Skipping lines and choosing columns
    * Choosing the data type
    * Setting the names
    * Tweaking the conversion


# Structured arrays
## Introduction
Structured arrays are ndarrays whose datatype is a composition of simpler datatypes organized as a sequence of named fields. For example,
    
    >>> x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)],
    ...              dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
    >>> x
    array([('Rex', 9, 81.), ('Fido', 3, 27.)],
          dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f4')])
    
Here `x` is a one-dimensional array of length two whose datatype is a structure with three fields: 1. A string of length 10 or less named ‘name’, 2. a 32-bit integer named ‘age’, and 3. a 32-bit float named ‘weight’.
If you index `x` at position 1 you get a structure:
    
    >>> x[1]
    np.void(('Fido', 3, 27.0), dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f4')])
    
You can access and modify individual fields of a structured array by indexing with the field name:
    
    >>> x['age']
    array([9, 3], dtype=int32)
    >>> x['age'] = 5
    >>> x
    array([('Rex', 5, 81.), ('Fido', 5, 27.)],
          dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f4')])
    
Structured datatypes are designed to be able to mimic ‘structs’ in the C language, and share a similar memory layout. They are meant for interfacing with C code and for low-level manipulation of structured buffers, for example for interpreting binary blobs. For these purposes they support specialized features such as subarrays, nested datatypes, and unions, and allow control over the memory layout of the structure.
Users looking to manipulate tabular data, such as stored in csv files, may find other pydata projects more suitable, such as xarray, pandas, or DataArray. These provide a high-level interface for tabular data analysis and are better optimized for that use. For instance, the C-struct-like memory layout of structured arrays in numpy can lead to poor cache behavior in comparison.
## Structured datatypes
A structured datatype can be thought of as a sequence of bytes of a certain length (the structure’s itemsize) which is interpreted as a collection of fields. Each field has a name, a datatype, and a byte offset within the structure. The datatype of a field may be any numpy datatype including other structured datatypes, and it may also be a subarray data type which behaves like an ndarray of a specified shape. The offsets of the fields are arbitrary, and fields may even overlap. These offsets are usually determined automatically by numpy, but can also be specified.
### Structured datatype creation
Structured datatypes may be created using the function `numpy.dtype`. There are 4 alternative forms of specification which vary in flexibility and conciseness. These are further documented in the Data Type Objects reference page, and in summary they are:
  1. A list of tuples, one tuple per field
Each tuple has the form `(fieldname, datatype, shape)` where shape is optional. `fieldname` is a string (or tuple if titles are used, see Field Titles below), `datatype` may be any object convertible to a datatype, and `shape` is a tuple of integers specifying subarray shape.
         >>> np.dtype([('x', 'f4'), ('y', np.float32), ('z', 'f4', (2, 2))])
         dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4', (2, 2))])
         
If `fieldname` is the empty string `''`, the field will be given a default name of the form `f#`, where `#` is the integer index of the field, counting from 0 from the left:
         >>> np.dtype([('x', 'f4'), ('', 'i4'), ('z', 'i8')])
         dtype([('x', '<f4'), ('f1', '<i4'), ('z', '<i8')])
         
The byte offsets of the fields within the structure and the total structure itemsize are determined automatically.
  2. A string of comma-separated dtype specifications
In this shorthand notation any of the string dtype specifications may be used in a string and separated by commas. The itemsize and byte offsets of the fields are determined automatically, and the field names are given the default names `f0`, `f1`, etc.
         >>> np.dtype('i8, f4, S3')
         dtype([('f0', '<i8'), ('f1', '<f4'), ('f2', 'S3')])
         >>> np.dtype('3int8, float32, (2, 3)float64')
         dtype([('f0', 'i1', (3,)), ('f1', '<f4'), ('f2', '<f8', (2, 3))])
         
  3. A dictionary of field parameter arrays
This is the most flexible form of specification since it allows control over the byte-offsets of the fields and the itemsize of the structure.
The dictionary has two required keys, ‘names’ and ‘formats’, and four optional keys, ‘offsets’, ‘itemsize’, ‘aligned’ and ‘titles’. The values for ‘names’ and ‘formats’ should respectively be a list of field names and a list of dtype specifications, of the same length. The optional ‘offsets’ value should be a list of integer byte-offsets, one for each field within the structure. If ‘offsets’ is not given the offsets are determined automatically. The optional ‘itemsize’ value should be an integer describing the total size in bytes of the dtype, which must be large enough to contain all the fields.
         >>> np.dtype({'names': ['col1', 'col2'], 'formats': ['i4', 'f4']})
         dtype([('col1', '<i4'), ('col2', '<f4')])
         >>> np.dtype({'names': ['col1', 'col2'],
         ...           'formats': ['i4', 'f4'],
         ...           'offsets': [0, 4],
         ...           'itemsize': 12})
         dtype({'names': ['col1', 'col2'], 'formats': ['<i4', '<f4'], 'offsets': [0, 4], 'itemsize': 12})
         
Offsets may be chosen such that the fields overlap, though this will mean that assigning to one field may clobber any overlapping field’s data. As an exception, fields of `numpy.object_` type cannot overlap with other fields, because of the risk of clobbering the internal object pointer and then dereferencing it.
The optional ‘aligned’ value can be set to `True` to make the automatic offset computation use aligned offsets (see Automatic byte offsets and alignment), as if the ‘align’ keyword argument of `numpy.dtype` had been set to True.
The optional ‘titles’ value should be a list of titles of the same length as ‘names’, see Field Titles below.
  4. A dictionary of field names
The keys of the dictionary are the field names and the values are tuples specifying type and offset:
         >>> np.dtype({'col1': ('i1', 0), 'col2': ('f4', 1)})
         dtype([('col1', 'i1'), ('col2', '<f4')])
         
This form was discouraged because Python dictionaries did not preserve order in Python versions before Python 3.6. Field Titles may be specified by using a 3-tuple, see below.


### Manipulating and displaying structured datatypes
The list of field names of a structured datatype can be found in the `names` attribute of the dtype object:
    
    >>> d = np.dtype([('x', 'i8'), ('y', 'f4')])
    >>> d.names
    ('x', 'y')
    
The dtype of each individual field can be looked up by name:
    
    >>> d['x']
    dtype('int64')
    
The field names may be modified by assigning to the `names` attribute using a sequence of strings of the same length.
The dtype object also has a dictionary-like attribute, `fields`, whose keys are the field names (and Field Titles, see below) and whose values are tuples containing the dtype and byte offset of each field.
    
    >>> d.fields
    mappingproxy({'x': (dtype('int64'), 0), 'y': (dtype('float32'), 8)})
    
Both the `names` and `fields` attributes will equal `None` for unstructured arrays. The recommended way to test if a dtype is structured is with `if dt.names is not None` rather than `if dt.names`, to account for dtypes with 0 fields.
The string representation of a structured datatype is shown in the “list of tuples” form if possible, otherwise numpy falls back to using the more general dictionary form.
### Automatic byte offsets and alignment
Numpy uses one of two methods to automatically determine the field byte offsets and the overall itemsize of a structured datatype, depending on whether `align=True` was specified as a keyword argument to `numpy.dtype`.
By default (`align=False`), numpy will pack the fields together such that each field starts at the byte offset the previous field ended, and the fields are contiguous in memory.
    
    >>> def print_offsets(d):
    ...     print("offsets:", [d.fields[name][1] for name in d.names])
    ...     print("itemsize:", d.itemsize)
    >>> print_offsets(np.dtype('u1, u1, i4, u1, i8, u2'))
    offsets: [0, 1, 2, 6, 7, 15]
    itemsize: 17
    
If `align=True` is set, numpy will pad the structure in the same way many C compilers would pad a C-struct. Aligned structures can give a performance improvement in some cases, at the cost of increased datatype size. Padding bytes are inserted between fields such that each field’s byte offset will be a multiple of that field’s alignment, which is usually equal to the field’s size in bytes for simple datatypes, see `PyArray_Descr.alignment`. The structure will also have trailing padding added so that its itemsize is a multiple of the largest field’s alignment.
    
    >>> print_offsets(np.dtype('u1, u1, i4, u1, i8, u2', align=True))
    offsets: [0, 1, 4, 8, 16, 24]
    itemsize: 32
    
Note that although almost all modern C compilers pad in this way by default, padding in C structs is C-implementation-dependent so this memory layout is not guaranteed to exactly match that of a corresponding struct in a C program. Some work may be needed, either on the numpy side or the C side, to obtain exact correspondence.
If offsets were specified using the optional `offsets` key in the dictionary-based dtype specification, setting `align=True` will check that each field’s offset is a multiple of its size and that the itemsize is a multiple of the largest field size, and raise an exception if not.
If the offsets of the fields and itemsize of a structured array satisfy the alignment conditions, the array will have the `ALIGNED` `flag` set.
A convenience function `numpy.lib.recfunctions.repack_fields` converts an aligned dtype or array to a packed one and vice versa. It takes either a dtype or structured ndarray as an argument, and returns a copy with fields re-packed, with or without padding bytes.
### Field titles
In addition to field names, fields may also have an associated title, an alternate name, which is sometimes used as an additional description or alias for the field. The title may be used to index an array, just like a field name.
To add titles when using the list-of-tuples form of dtype specification, the field name may be specified as a tuple of two strings instead of a single string, which will be the field’s title and field name respectively. For example:
    
    >>> np.dtype([(('my title', 'name'), 'f4')])
    dtype([(('my title', 'name'), '<f4')])
    
When using the first form of dictionary-based specification, the titles may be supplied as an extra `'titles'` key as described above. When using the second (discouraged) dictionary-based specification, the title can be supplied by providing a 3-element tuple `(datatype, offset, title)` instead of the usual 2-element tuple:
    
    >>> np.dtype({'name': ('i4', 0, 'my title')})
    dtype([(('my title', 'name'), '<i4')])
    
The `dtype.fields` dictionary will contain titles as keys, if any titles are used. This means effectively that a field with a title will be represented twice in the fields dictionary. The tuple values for these fields will also have a third element, the field title. Because of this, and because the `names` attribute preserves the field order while the `fields` attribute may not, it is recommended to iterate through the fields of a dtype using the `names` attribute of the dtype, which will not list titles, as in:
    
    >>> for name in d.names:
    ...     print(d.fields[name][:2])
    (dtype('int64'), 0)
    (dtype('float32'), 8)
    
### Union types
Structured datatypes are implemented in numpy to have base type `numpy.void` by default, but it is possible to interpret other numpy types as structured types using the `(base_dtype, dtype)` form of dtype specification described in Data Type Objects. Here, `base_dtype` is the desired underlying dtype, and fields and flags will be copied from `dtype`. This dtype is similar to a ‘union’ in C.
## Indexing and assignment to structured arrays
### Assigning data to a structured array
There are a number of ways to assign values to a structured array: Using python tuples, using scalar values, or using other structured arrays.
#### Assignment from Python Native Types (Tuples)
The simplest way to assign values to a structured array is using python tuples. Each assigned value should be a tuple of length equal to the number of fields in the array, and not a list or array as these will trigger numpy’s broadcasting rules. The tuple’s elements are assigned to the successive fields of the array, from left to right:
    
    >>> x = np.array([(1, 2, 3), (4, 5, 6)], dtype='i8, f4, f8')
    >>> x[1] = (7, 8, 9)
    >>> x
    array([(1, 2., 3.), (7, 8., 9.)],
         dtype=[('f0', '<i8'), ('f1', '<f4'), ('f2', '<f8')])
    
#### Assignment from Scalars
A scalar assigned to a structured element will be assigned to all fields. This happens when a scalar is assigned to a structured array, or when an unstructured array is assigned to a structured array:
    
    >>> x = np.zeros(2, dtype='i8, f4, ?, S1')
    >>> x[:] = 3
    >>> x
    array([(3, 3., True, b'3'), (3, 3., True, b'3')],
          dtype=[('f0', '<i8'), ('f1', '<f4'), ('f2', '?'), ('f3', 'S1')])
    >>> x[:] = np.arange(2)
    >>> x
    array([(0, 0., False, b'0'), (1, 1., True, b'1')],
          dtype=[('f0', '<i8'), ('f1', '<f4'), ('f2', '?'), ('f3', 'S1')])
    
Structured arrays can also be assigned to unstructured arrays, but only if the structured datatype has just a single field:
    
    >>> twofield = np.zeros(2, dtype=[('A', 'i4'), ('B', 'i4')])
    >>> onefield = np.zeros(2, dtype=[('A', 'i4')])
    >>> nostruct = np.zeros(2, dtype='i4')
    >>> nostruct[:] = twofield
    Traceback (most recent call last):
    ...
    TypeError: Cannot cast array data from dtype([('A', '<i4'), ('B', '<i4')]) to dtype('int32') according to the rule 'unsafe'
    
#### Assignment from other Structured Arrays
Assignment between two structured arrays occurs as if the source elements had been converted to tuples and then assigned to the destination elements. That is, the first field of the source array is assigned to the first field of the destination array, and the second field likewise, and so on, regardless of field names. Structured arrays with a different number of fields cannot be assigned to each other. Bytes of the destination structure which are not included in any of the fields are unaffected.
    
    >>> a = np.zeros(3, dtype=[('a', 'i8'), ('b', 'f4'), ('c', 'S3')])
    >>> b = np.ones(3, dtype=[('x', 'f4'), ('y', 'S3'), ('z', 'O')])
    >>> b[:] = a
    >>> b
    array([(0., b'0.0', b''), (0., b'0.0', b''), (0., b'0.0', b'')],
          dtype=[('x', '<f4'), ('y', 'S3'), ('z', 'O')])
    
#### Assignment involving subarrays
When assigning to fields which are subarrays, the assigned value will first be broadcast to the shape of the subarray.
### Indexing structured arrays
#### Accessing Individual Fields
Individual fields of a structured array may be accessed and modified by indexing the array with the field name.
    
    >>> x = np.array([(1, 2), (3, 4)], dtype=[('foo', 'i8'), ('bar', 'f4')])
    >>> x['foo']
    array([1, 3])
    >>> x['foo'] = 10
    >>> x
    array([(10, 2.), (10, 4.)],
          dtype=[('foo', '<i8'), ('bar', '<f4')])
    
The resulting array is a view into the original array. It shares the same memory locations and writing to the view will modify the original array.
    
    >>> y = x['bar']
    >>> y[:] = 11
    >>> x
    array([(10, 11.), (10, 11.)],
          dtype=[('foo', '<i8'), ('bar', '<f4')])
    
This view has the same dtype and itemsize as the indexed field, so it is typically a non-structured array, except in the case of nested structures.
    
    >>> y.dtype, y.shape, y.strides
    (dtype('float32'), (2,), (12,))
    
If the accessed field is a subarray, the dimensions of the subarray are appended to the shape of the result:
    
    >>> x = np.zeros((2, 2), dtype=[('a', np.int32), ('b', np.float64, (3, 3))])
    >>> x['a'].shape
    (2, 2)
    >>> x['b'].shape
    (2, 2, 3, 3)
    
#### Accessing Multiple Fields
One can index and assign to a structured array with a multi-field index, where the index is a list of field names.
Warning
The behavior of multi-field indexes changed from Numpy 1.15 to Numpy 1.16.
The result of indexing with a multi-field index is a view into the original array, as follows:
    
    >>> a = np.zeros(3, dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'f4')])
    >>> a[['a', 'c']]
    array([(0, 0.), (0, 0.), (0, 0.)],
         dtype={'names': ['a', 'c'], 'formats': ['<i4', '<f4'], 'offsets': [0, 8], 'itemsize': 12})
    
Assignment to the view modifies the original array. The view’s fields will be in the order they were indexed. Note that unlike for single-field indexing, the dtype of the view has the same itemsize as the original array, and has fields at the same offsets as in the original array, and unindexed fields are merely missing.
Warning
In Numpy 1.15, indexing an array with a multi-field index returned a copy of the result above, but with fields packed together in memory as if passed through `numpy.lib.recfunctions.repack_fields`.
The new behavior as of Numpy 1.16 leads to extra “padding” bytes at the location of unindexed fields compared to 1.15. You will need to update any code which depends on the data having a “packed” layout. For instance code such as:
    
    >>> a[['a', 'c']].view('i8')  # Fails in Numpy 1.16
    Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
    ValueError: When changing to a smaller dtype, its size must be a divisor of the size of original dtype
    
will need to be changed. This code has raised a `FutureWarning` since Numpy 1.12, and similar code has raised `FutureWarning` since 1.7.
In 1.16 a number of functions have been introduced in the `numpy.lib.recfunctions` module to help users account for this change. These are `numpy.lib.recfunctions.repack_fields`. `numpy.lib.recfunctions.structured_to_unstructured`, `numpy.lib.recfunctions.unstructured_to_structured`, `numpy.lib.recfunctions.apply_along_fields`, `numpy.lib.recfunctions.assign_fields_by_name`, and `numpy.lib.recfunctions.require_fields`.
The function `numpy.lib.recfunctions.repack_fields` can always be used to reproduce the old behavior, as it will return a packed copy of the structured array. The code above, for example, can be replaced with:
    
    >>> from numpy.lib.recfunctions import repack_fields
    >>> repack_fields(a[['a', 'c']]).view('i8')  # supported in 1.16
    array([0, 0, 0])
    
Furthermore, numpy now provides a new function `numpy.lib.recfunctions.structured_to_unstructured` which is a safer and more efficient alternative for users who wish to convert structured arrays to unstructured arrays, as the view above is often intended to do. This function allows safe conversion to an unstructured type taking into account padding, often avoids a copy, and also casts the datatypes as needed, unlike the view. Code such as:
    
    >>> b = np.zeros(3, dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')])
    >>> b[['x', 'z']].view('f4')
    array([0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
    
can be made safer by replacing with:
    
    >>> from numpy.lib.recfunctions import structured_to_unstructured
    >>> structured_to_unstructured(b[['x', 'z']])
    array([[0., 0.],
           [0., 0.],
           [0., 0.]], dtype=float32)
    
Assignment to an array with a multi-field index modifies the original array:
    
    >>> a[['a', 'c']] = (2, 3)
    >>> a
    array([(2, 0, 3.), (2, 0, 3.), (2, 0, 3.)],
          dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<f4')])
    
This obeys the structured array assignment rules described above. For example, this means that one can swap the values of two fields using appropriate multi-field indexes:
    
    >>> a[['a', 'c']] = a[['c', 'a']]
    
#### Indexing with an Integer to get a Structured Scalar
Indexing a single element of a structured array (with an integer index) returns a structured scalar:
    
    >>> x = np.array([(1, 2., 3.)], dtype='i, f, f')
    >>> scalar = x[0]
    >>> scalar
    np.void((1, 2.0, 3.0), dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4')])
    >>> type(scalar)
    <class 'numpy.void'>
    
Unlike other numpy scalars, structured scalars are mutable and act like views into the original array, such that modifying the scalar will modify the original array. Structured scalars also support access and assignment by field name:
    
    >>> x = np.array([(1, 2), (3, 4)], dtype=[('foo', 'i8'), ('bar', 'f4')])
    >>> s = x[0]
    >>> s['bar'] = 100
    >>> x
    array([(1, 100.), (3, 4.)],
          dtype=[('foo', '<i8'), ('bar', '<f4')])
    
Similarly to tuples, structured scalars can also be indexed with an integer:
    
    >>> scalar = np.array([(1, 2., 3.)], dtype='i, f, f')[0]
    >>> scalar[0]
    np.int32(1)
    >>> scalar[1] = 4
    
Thus, tuples might be thought of as the native Python equivalent to numpy’s structured types, much like native python integers are the equivalent to numpy’s integer types. Structured scalars may be converted to a tuple by calling `numpy.ndarray.item`:
    
    >>> scalar.item(), type(scalar.item())
    ((1, 4.0, 3.0), <class 'tuple'>)
    
### Viewing structured arrays containing objects
In order to prevent clobbering object pointers in fields of `object` type, numpy currently does not allow views of structured arrays containing objects.
### Structure comparison and promotion
If the dtypes of two void structured arrays are equal, testing the equality of the arrays will result in a boolean array with the dimensions of the original arrays, with elements set to `True` where all fields of the corresponding structures are equal:
    
    >>> a = np.array([(1, 1), (2, 2)], dtype=[('a', 'i4'), ('b', 'i4')])
    >>> b = np.array([(1, 1), (2, 3)], dtype=[('a', 'i4'), ('b', 'i4')])
    >>> a == b
    array([True, False])
    
NumPy will promote individual field datatypes to perform the comparison. So the following is also valid (note the `'f4'` dtype for the `'a'` field):
    
    >>> b = np.array([(1.0, 1), (2.5, 2)], dtype=[("a", "f4"), ("b", "i4")])
    >>> a == b
    array([True, False])
    
To compare two structured arrays, it must be possible to promote them to a common dtype as returned by `numpy.result_type` and `numpy.promote_types`. This enforces that the number of fields, the field names, and the field titles must match precisely. When promotion is not possible, for example due to mismatching field names, NumPy will raise an error. Promotion between two structured dtypes results in a canonical dtype that ensures native byte-order for all fields:
    
    >>> np.result_type(np.dtype("i,>i"))
    dtype([('f0', '<i4'), ('f1', '<i4')])
    >>> np.result_type(np.dtype("i,>i"), np.dtype("i,i"))
    dtype([('f0', '<i4'), ('f1', '<i4')])
    
The resulting dtype from promotion is also guaranteed to be packed, meaning that all fields are ordered contiguously and any unnecessary padding is removed:
    
    >>> dt = np.dtype("i1,V3,i4,V1")[["f0", "f2"]]
    >>> dt
    dtype({'names': ['f0', 'f2'], 'formats': ['i1', '<i4'], 'offsets': [0, 4], 'itemsize': 9})
    >>> np.result_type(dt)
    dtype([('f0', 'i1'), ('f2', '<i4')])
    
Note that the result prints without `offsets` or `itemsize` indicating no additional padding. If a structured dtype is created with `align=True` ensuring that `dtype.isalignedstruct` is true, this property is preserved:
    
    >>> dt = np.dtype("i1,V3,i4,V1", align=True)[["f0", "f2"]]
    >>> dt
    dtype({'names': ['f0', 'f2'], 'formats': ['i1', '<i4'], 'offsets': [0, 4], 'itemsize': 12}, align=True)
    
    >>> np.result_type(dt)
    dtype([('f0', 'i1'), ('f2', '<i4')], align=True)
    >>> np.result_type(dt).isalignedstruct
    True
    
When promoting multiple dtypes, the result is aligned if any of the inputs is:
    
    >>> np.result_type(np.dtype("i,i"), np.dtype("i,i", align=True))
    dtype([('f0', '<i4'), ('f1', '<i4')], align=True)
    
The `<` and `>` operators always return `False` when comparing void structured arrays, and arithmetic and bitwise operations are not supported.
Changed in version 1.23: Before NumPy 1.23, a warning was given and `False` returned when promotion to a common dtype failed. Further, promotion was much more restrictive: It would reject the mixed float/integer comparison example above.
## Record arrays
As an optional convenience numpy provides an ndarray subclass, `numpy.recarray` that allows access to fields of structured arrays by attribute instead of only by index. Record arrays use a special datatype, `numpy.record`, that allows field access by attribute on the structured scalars obtained from the array. The `numpy.rec` module provides functions for creating recarrays from various objects. Additional helper functions for creating and manipulating structured arrays can be found in `numpy.lib.recfunctions`.
The simplest way to create a record array is with `numpy.rec.array`:
    
    >>> recordarr = np.rec.array([(1, 2., 'Hello'), (2, 3., "World")],
    ...                    dtype=[('foo', 'i4'),('bar', 'f4'), ('baz', 'S10')])
    >>> recordarr.bar
    array([2., 3.], dtype=float32)
    >>> recordarr[1:2]
    rec.array([(2, 3., b'World')],
          dtype=[('foo', '<i4'), ('bar', '<f4'), ('baz', 'S10')])
    >>> recordarr[1:2].foo
    array([2], dtype=int32)
    >>> recordarr.foo[1:2]
    array([2], dtype=int32)
    >>> recordarr[1].baz
    b'World'
    
`numpy.rec.array` can convert a wide variety of arguments into record arrays, including structured arrays:
    
    >>> arr = np.array([(1, 2., 'Hello'), (2, 3., "World")],
    ...             dtype=[('foo', 'i4'), ('bar', 'f4'), ('baz', 'S10')])
    >>> recordarr = np.rec.array(arr)
    
The `numpy.rec` module provides a number of other convenience functions for creating record arrays, see record array creation routines.
A record array representation of a structured array can be obtained using the appropriate `view`:
    
    >>> arr = np.array([(1, 2., 'Hello'), (2, 3., "World")],
    ...                dtype=[('foo', 'i4'),('bar', 'f4'), ('baz', 'S10')])
    >>> recordarr = arr.view(dtype=np.dtype((np.record, arr.dtype)),
    ...                      type=np.recarray)
    
For convenience, viewing an ndarray as type `numpy.recarray` will automatically convert to `numpy.record` datatype, so the dtype can be left out of the view:
    
    >>> recordarr = arr.view(np.recarray)
    >>> recordarr.dtype
    dtype((numpy.record, [('foo', '<i4'), ('bar', '<f4'), ('baz', 'S10')]))
    
To get back to a plain ndarray both the dtype and type must be reset. The following view does so, taking into account the unusual case that the recordarr was not a structured type:
    
    >>> arr2 = recordarr.view(recordarr.dtype.fields or recordarr.dtype, np.ndarray)
    
Record array fields accessed by index or by attribute are returned as a record array if the field has a structured type but as a plain ndarray otherwise.
    
    >>> recordarr = np.rec.array([('Hello', (1, 2)), ("World", (3, 4))],
    ...                 dtype=[('foo', 'S6'),('bar', [('A', int), ('B', int)])])
    >>> type(recordarr.foo)
    <class 'numpy.ndarray'>
    >>> type(recordarr.bar)
    <class 'numpy.rec.recarray'>
    
Note that if a field has the same name as an ndarray attribute, the ndarray attribute takes precedence. Such fields will be inaccessible by attribute but will still be accessible by index.
### Recarray helper functions
Collection of utilities to manipulate structured arrays.
Most of these functions were initially implemented by John Hunter for matplotlib. They have been rewritten and extended for convenience.
numpy.lib.recfunctions.append_fields(base, names, data, dtypes=None, fill_value=-1, usemask=True, asrecarray=False)[source]
    
Add new fields to an existing array.
The names of the fields are given with the `names` arguments, the corresponding values with the `data` arguments. If a single field is appended, `names`, `data` and `dtypes` do not have to be lists but just values.
Parameters:
    
basearray
    
Input array to extend.
namesstring, sequence
    
String or sequence of strings corresponding to the names of the new fields.
dataarray or sequence of arrays
    
Array or sequence of arrays storing the fields to add to the base.
dtypessequence of datatypes, optional
    
Datatype or sequence of datatypes. If None, the datatypes are estimated from the `data`.
fill_value{float}, optional
    
Filling value used to pad missing data on the shorter arrays.
usemask{False, True}, optional
    
Whether to return a masked array or not.
asrecarray{False, True}, optional
    
Whether to return a recarray (MaskedRecords) or not.
numpy.lib.recfunctions.apply_along_fields(func, arr)[source]
    
Apply function ‘func’ as a reduction across fields of a structured array.
This is similar to `numpy.apply_along_axis`, but treats the fields of a structured array as an extra axis. The fields are all first cast to a common type following the type-promotion rules from `numpy.result_type` applied to the field’s dtypes.
Parameters:
    
funcfunction
    
Function to apply on the “field” dimension. This function must support an `axis` argument, like `numpy.mean`, `numpy.sum`, etc.
arrndarray
    
Structured array for which to apply func.
Returns:
    
outndarray
    
Result of the reduction operation
#### Examples
    
    >>> import numpy as np
    
    
    >>> from numpy.lib import recfunctions as rfn
    >>> b = np.array([(1, 2, 5), (4, 5, 7), (7, 8 ,11), (10, 11, 12)],
    ...              dtype=[('x', 'i4'), ('y', 'f4'), ('z', 'f8')])
    >>> rfn.apply_along_fields(np.mean, b)
    array([ 2.66666667,  5.33333333,  8.66666667, 11.        ])
    >>> rfn.apply_along_fields(np.mean, b[['x', 'z']])
    array([ 3. ,  5.5,  9. , 11. ])
    
numpy.lib.recfunctions.assign_fields_by_name(dst, src, zero_unassigned=True)[source]
    
Assigns values from one structured array to another by field name.
Normally in numpy >= 1.14, assignment of one structured array to another copies fields “by position”, meaning that the first field from the src is copied to the first field of the dst, and so on, regardless of field name.
This function instead copies “by field name”, such that fields in the dst are assigned from the identically named field in the src. This applies recursively for nested structures. This is how structure assignment worked in numpy >= 1.6 to <= 1.13.
Parameters:
    
dstndarray
srcndarray
    
The source and destination arrays during assignment.
zero_unassignedbool, optional
    
If True, fields in the dst for which there was no matching field in the src are filled with the value 0 (zero). This was the behavior of numpy <= 1.13. If False, those fields are not modified.
numpy.lib.recfunctions.drop_fields(base, drop_names, usemask=True, asrecarray=False)[source]
    
Return a new array with fields in `drop_names` dropped.
Nested fields are supported.
Parameters:
    
basearray
    
Input array
drop_namesstring or sequence
    
String or sequence of strings corresponding to the names of the fields to drop.
usemask{False, True}, optional
    
Whether to return a masked array or not.
asrecarraystring or sequence, optional
    
Whether to return a recarray or a mrecarray (`asrecarray=True`) or a plain ndarray or masked array with flexible dtype. The default is False.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> a = np.array([(1, (2, 3.0)), (4, (5, 6.0))],
    ...   dtype=[('a', np.int64), ('b', [('ba', np.double), ('bb', np.int64)])])
    >>> rfn.drop_fields(a, 'a')
    array([((2., 3),), ((5., 6),)],
          dtype=[('b', [('ba', '<f8'), ('bb', '<i8')])])
    >>> rfn.drop_fields(a, 'ba')
    array([(1, (3,)), (4, (6,))], dtype=[('a', '<i8'), ('b', [('bb', '<i8')])])
    >>> rfn.drop_fields(a, ['ba', 'bb'])
    array([(1,), (4,)], dtype=[('a', '<i8')])
    
numpy.lib.recfunctions.find_duplicates(a, key=None, ignoremask=True, return_index=False)[source]
    
Find the duplicates in a structured array along a given key
Parameters:
    
aarray-like
    
Input array
key{string, None}, optional
    
Name of the fields along which to check the duplicates. If None, the search is performed by records
ignoremask{True, False}, optional
    
Whether masked data should be discarded or considered as duplicates.
return_index{False, True}, optional
    
Whether to return the indices of the duplicated values.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> ndtype = [('a', int)]
    >>> a = np.ma.array([1, 1, 1, 2, 2, 3, 3],
    ...         mask=[0, 0, 1, 0, 0, 0, 1]).view(ndtype)
    >>> rfn.find_duplicates(a, ignoremask=True, return_index=True)
    (masked_array(data=[(1,), (1,), (2,), (2,)],
                 mask=[(False,), (False,), (False,), (False,)],
           fill_value=(999999,),
                dtype=[('a', '<i8')]), array([0, 1, 3, 4]))
    
numpy.lib.recfunctions.flatten_descr(ndtype)[source]
    
Flatten a structured data-type description.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> ndtype = np.dtype([('a', '<i4'), ('b', [('ba', '<f8'), ('bb', '<i4')])])
    >>> rfn.flatten_descr(ndtype)
    (('a', dtype('int32')), ('ba', dtype('float64')), ('bb', dtype('int32')))
    
numpy.lib.recfunctions.get_fieldstructure(adtype, lastname=None, parents=None)[source]
    
Returns a dictionary with fields indexing lists of their parent fields.
This function is used to simplify access to fields nested in other fields.
Parameters:
    
adtypenp.dtype
    
Input datatype
lastnameoptional
    
Last processed field name (used internally during recursion).
parentsdictionary
    
Dictionary of parent fields (used internally during recursion).
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> ndtype =  np.dtype([('A', int),
    ...                     ('B', [('BA', int),
    ...                            ('BB', [('BBA', int), ('BBB', int)])])])
    >>> rfn.get_fieldstructure(ndtype)
    ... # XXX: possible regression, order of BBA and BBB is swapped
    {'A': [], 'B': [], 'BA': ['B'], 'BB': ['B'], 'BBA': ['B', 'BB'], 'BBB': ['B', 'BB']}
    
numpy.lib.recfunctions.get_names(adtype)[source]
    
Returns the field names of the input datatype as a tuple. Input datatype must have fields otherwise error is raised.
Parameters:
    
adtypedtype
    
Input datatype
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> rfn.get_names(np.empty((1,), dtype=[('A', int)]).dtype)
    ('A',)
    >>> rfn.get_names(np.empty((1,), dtype=[('A',int), ('B', float)]).dtype)
    ('A', 'B')
    >>> adtype = np.dtype([('a', int), ('b', [('ba', int), ('bb', int)])])
    >>> rfn.get_names(adtype)
    ('a', ('b', ('ba', 'bb')))
    
numpy.lib.recfunctions.get_names_flat(adtype)[source]
    
Returns the field names of the input datatype as a tuple. Input datatype must have fields otherwise error is raised. Nested structure are flattened beforehand.
Parameters:
    
adtypedtype
    
Input datatype
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> rfn.get_names_flat(np.empty((1,), dtype=[('A', int)]).dtype) is None
    False
    >>> rfn.get_names_flat(np.empty((1,), dtype=[('A',int), ('B', str)]).dtype)
    ('A', 'B')
    >>> adtype = np.dtype([('a', int), ('b', [('ba', int), ('bb', int)])])
    >>> rfn.get_names_flat(adtype)
    ('a', 'b', 'ba', 'bb')
    
numpy.lib.recfunctions.join_by(key, r1, r2, jointype='inner', r1postfix='1', r2postfix='2', defaults=None, usemask=True, asrecarray=False)[source]
    
Join arrays `r1` and `r2` on key `key`.
The key should be either a string or a sequence of string corresponding to the fields used to join the array. An exception is raised if the `key` field cannot be found in the two input arrays. Neither `r1` nor `r2` should have any duplicates along `key`: the presence of duplicates will make the output quite unreliable. Note that duplicates are not looked for by the algorithm.
Parameters:
    
key{string, sequence}
    
A string or a sequence of strings corresponding to the fields used for comparison.
r1, r2arrays
    
Structured arrays.
jointype{‘inner’, ‘outer’, ‘leftouter’}, optional
    
If ‘inner’, returns the elements common to both r1 and r2. If ‘outer’, returns the common elements as well as the elements of r1 not in r2 and the elements of not in r2. If ‘leftouter’, returns the common elements and the elements of r1 not in r2.
r1postfixstring, optional
    
String appended to the names of the fields of r1 that are present in r2 but absent of the key.
r2postfixstring, optional
    
String appended to the names of the fields of r2 that are present in r1 but absent of the key.
defaults{dictionary}, optional
    
Dictionary mapping field names to the corresponding default values.
usemask{True, False}, optional
    
Whether to return a MaskedArray (or MaskedRecords is `asrecarray==True`) or a ndarray.
asrecarray{False, True}, optional
    
Whether to return a recarray (or MaskedRecords if `usemask==True`) or just a flexible-type ndarray.
#### Notes
  * The output is sorted along the key.
  * A temporary array is formed by dropping the fields not in the key for the two arrays and concatenating the result. This array is then sorted, and the common entries selected. The output is constructed by filling the fields with the selected entries. Matching is not preserved if there are some duplicates…


numpy.lib.recfunctions.merge_arrays(seqarrays, fill_value=-1, flatten=False, usemask=False, asrecarray=False)[source]
    
Merge arrays field by field.
Parameters:
    
seqarrayssequence of ndarrays
    
Sequence of arrays
fill_value{float}, optional
    
Filling value used to pad missing data on the shorter arrays.
flatten{False, True}, optional
    
Whether to collapse nested fields.
usemask{False, True}, optional
    
Whether to return a masked array or not.
asrecarray{False, True}, optional
    
Whether to return a recarray (MaskedRecords) or not.
#### Notes
  * Without a mask, the missing value will be filled with something, depending on what its corresponding type:
    * `-1` for integers
    * `-1.0` for floating point numbers
    * `'-'` for characters
    * `'-1'` for strings
    * `True` for boolean values
  * XXX: I just obtained these values empirically


#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> rfn.merge_arrays((np.array([1, 2]), np.array([10., 20., 30.])))
    array([( 1, 10.), ( 2, 20.), (-1, 30.)],
          dtype=[('f0', '<i8'), ('f1', '<f8')])
    
    
    >>> rfn.merge_arrays((np.array([1, 2], dtype=np.int64),
    ...         np.array([10., 20., 30.])), usemask=False)
     array([(1, 10.0), (2, 20.0), (-1, 30.0)],
             dtype=[('f0', '<i8'), ('f1', '<f8')])
    >>> rfn.merge_arrays((np.array([1, 2]).view([('a', np.int64)]),
    ...               np.array([10., 20., 30.])),
    ...              usemask=False, asrecarray=True)
    rec.array([( 1, 10.), ( 2, 20.), (-1, 30.)],
              dtype=[('a', '<i8'), ('f1', '<f8')])
    
numpy.lib.recfunctions.rec_append_fields(base, names, data, dtypes=None)[source]
    
Add new fields to an existing array.
The names of the fields are given with the `names` arguments, the corresponding values with the `data` arguments. If a single field is appended, `names`, `data` and `dtypes` do not have to be lists but just values.
Parameters:
    
basearray
    
Input array to extend.
namesstring, sequence
    
String or sequence of strings corresponding to the names of the new fields.
dataarray or sequence of arrays
    
Array or sequence of arrays storing the fields to add to the base.
dtypessequence of datatypes, optional
    
Datatype or sequence of datatypes. If None, the datatypes are estimated from the `data`.
Returns:
    
appended_arraynp.recarray
See also
`append_fields`
numpy.lib.recfunctions.rec_drop_fields(base, drop_names)[source]
    
Returns a new numpy.recarray with fields in `drop_names` dropped.
numpy.lib.recfunctions.rec_join(key, r1, r2, jointype='inner', r1postfix='1', r2postfix='2', defaults=None)[source]
    
Join arrays `r1` and `r2` on keys. Alternative to join_by, that always returns a np.recarray.
See also
`join_by`
    
equivalent function
numpy.lib.recfunctions.recursive_fill_fields(input, output)[source]
    
Fills fields from output with fields from input, with support for nested structures.
Parameters:
    
inputndarray
    
Input array.
outputndarray
    
Output array.
#### Notes
  * `output` should be at least the same size as `input`


#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> a = np.array([(1, 10.), (2, 20.)], dtype=[('A', np.int64), ('B', np.float64)])
    >>> b = np.zeros((3,), dtype=a.dtype)
    >>> rfn.recursive_fill_fields(a, b)
    array([(1, 10.), (2, 20.), (0,  0.)], dtype=[('A', '<i8'), ('B', '<f8')])
    
numpy.lib.recfunctions.rename_fields(base, namemapper)[source]
    
Rename the fields from a flexible-datatype ndarray or recarray.
Nested fields are supported.
Parameters:
    
basendarray
    
Input array whose fields must be modified.
namemapperdictionary
    
Dictionary mapping old field names to their new version.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> a = np.array([(1, (2, [3.0, 30.])), (4, (5, [6.0, 60.]))],
    ...   dtype=[('a', int),('b', [('ba', float), ('bb', (float, 2))])])
    >>> rfn.rename_fields(a, {'a':'A', 'bb':'BB'})
    array([(1, (2., [ 3., 30.])), (4, (5., [ 6., 60.]))],
          dtype=[('A', '<i8'), ('b', [('ba', '<f8'), ('BB', '<f8', (2,))])])
    
numpy.lib.recfunctions.repack_fields(a, align=False, recurse=False)[source]
    
Re-pack the fields of a structured array or dtype in memory.
The memory layout of structured datatypes allows fields at arbitrary byte offsets. This means the fields can be separated by padding bytes, their offsets can be non-monotonically increasing, and they can overlap.
This method removes any overlaps and reorders the fields in memory so they have increasing byte offsets, and adds or removes padding bytes depending on the `align` option, which behaves like the `align` option to `numpy.dtype`.
If `align=False`, this method produces a “packed” memory layout in which each field starts at the byte the previous field ended, and any padding bytes are removed.
If `align=True`, this methods produces an “aligned” memory layout in which each field’s offset is a multiple of its alignment, and the total itemsize is a multiple of the largest alignment, by adding padding bytes as needed.
Parameters:
    
andarray or dtype
    
array or dtype for which to repack the fields.
alignboolean
    
If true, use an “aligned” memory layout, otherwise use a “packed” layout.
recurseboolean
    
If True, also repack nested structures.
Returns:
    
repackedndarray or dtype
    
Copy of `a` with fields repacked, or `a` itself if no repacking was needed.
#### Examples
    
    >>> import numpy as np
    
    
    >>> from numpy.lib import recfunctions as rfn
    >>> def print_offsets(d):
    ...     print("offsets:", [d.fields[name][1] for name in d.names])
    ...     print("itemsize:", d.itemsize)
    ...
    >>> dt = np.dtype('u1, <i8, <f8', align=True)
    >>> dt
    dtype({'names': ['f0', 'f1', 'f2'], 'formats': ['u1', '<i8', '<f8'], 'offsets': [0, 8, 16], 'itemsize': 24}, align=True)
    >>> print_offsets(dt)
    offsets: [0, 8, 16]
    itemsize: 24
    >>> packed_dt = rfn.repack_fields(dt)
    >>> packed_dt
    dtype([('f0', 'u1'), ('f1', '<i8'), ('f2', '<f8')])
    >>> print_offsets(packed_dt)
    offsets: [0, 1, 9]
    itemsize: 17
    
numpy.lib.recfunctions.require_fields(array, required_dtype)[source]
    
Casts a structured array to a new dtype using assignment by field-name.
This function assigns from the old to the new array by name, so the value of a field in the output array is the value of the field with the same name in the source array. This has the effect of creating a new ndarray containing only the fields “required” by the required_dtype.
If a field name in the required_dtype does not exist in the input array, that field is created and set to 0 in the output array.
Parameters:
    
andarray
    
array to cast
required_dtypedtype
    
datatype for output array
Returns:
    
outndarray
    
array with the new dtype, with field values copied from the fields in the input array with the same name
#### Examples
    
    >>> import numpy as np
    
    
    >>> from numpy.lib import recfunctions as rfn
    >>> a = np.ones(4, dtype=[('a', 'i4'), ('b', 'f8'), ('c', 'u1')])
    >>> rfn.require_fields(a, [('b', 'f4'), ('c', 'u1')])
    array([(1., 1), (1., 1), (1., 1), (1., 1)],
      dtype=[('b', '<f4'), ('c', 'u1')])
    >>> rfn.require_fields(a, [('b', 'f4'), ('newf', 'u1')])
    array([(1., 0), (1., 0), (1., 0), (1., 0)],
      dtype=[('b', '<f4'), ('newf', 'u1')])
    
numpy.lib.recfunctions.stack_arrays(arrays, defaults=None, usemask=True, asrecarray=False, autoconvert=False)[source]
    
Superposes arrays fields by fields
Parameters:
    
arraysarray or sequence
    
Sequence of input arrays.
defaultsdictionary, optional
    
Dictionary mapping field names to the corresponding default values.
usemask{True, False}, optional
    
Whether to return a MaskedArray (or MaskedRecords is `asrecarray==True`) or a ndarray.
asrecarray{False, True}, optional
    
Whether to return a recarray (or MaskedRecords if `usemask==True`) or just a flexible-type ndarray.
autoconvert{False, True}, optional
    
Whether automatically cast the type of the field to the maximum.
#### Examples
    
    >>> import numpy as np
    >>> from numpy.lib import recfunctions as rfn
    >>> x = np.array([1, 2,])
    >>> rfn.stack_arrays(x) is x
    True
    >>> z = np.array([('A', 1), ('B', 2)], dtype=[('A', '|S3'), ('B', float)])
    >>> zz = np.array([('a', 10., 100.), ('b', 20., 200.), ('c', 30., 300.)],
    ...   dtype=[('A', '|S3'), ('B', np.double), ('C', np.double)])
    >>> test = rfn.stack_arrays((z,zz))
    >>> test
    masked_array(data=[(b'A', 1.0, --), (b'B', 2.0, --), (b'a', 10.0, 100.0),
                       (b'b', 20.0, 200.0), (b'c', 30.0, 300.0)],
                 mask=[(False, False,  True), (False, False,  True),
                       (False, False, False), (False, False, False),
                       (False, False, False)],
           fill_value=(b'N/A', 1e+20, 1e+20),
                dtype=[('A', 'S3'), ('B', '<f8'), ('C', '<f8')])
    
numpy.lib.recfunctions.structured_to_unstructured(arr, dtype=None, copy=False, casting='unsafe')[source]
    
Converts an n-D structured array into an (n+1)-D unstructured array.
The new array will have a new last dimension equal in size to the number of field-elements of the input array. If not supplied, the output datatype is determined from the numpy type promotion rules applied to all the field datatypes.
Nested fields, as well as each element of any subarray fields, all count as a single field-elements.
Parameters:
    
arrndarray
    
Structured array or dtype to convert. Cannot contain object datatype.
dtypedtype, optional
    
The dtype of the output unstructured array.
copybool, optional
    
If true, always return a copy. If false, a view is returned if possible, such as when the `dtype` and strides of the fields are suitable and the array subtype is one of `numpy.ndarray`, `numpy.recarray` or `numpy.memmap`.
Changed in version 1.25.0: A view can now be returned if the fields are separated by a uniform stride.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
See casting argument of `numpy.ndarray.astype`. Controls what kind of data casting may occur.
Returns:
    
unstructuredndarray
    
Unstructured array with one more dimension.
#### Examples
    
    >>> import numpy as np
    
    
    >>> from numpy.lib import recfunctions as rfn
    >>> a = np.zeros(4, dtype=[('a', 'i4'), ('b', 'f4,u2'), ('c', 'f4', 2)])
    >>> a
    array([(0, (0., 0), [0., 0.]), (0, (0., 0), [0., 0.]),
           (0, (0., 0), [0., 0.]), (0, (0., 0), [0., 0.])],
          dtype=[('a', '<i4'), ('b', [('f0', '<f4'), ('f1', '<u2')]), ('c', '<f4', (2,))])
    >>> rfn.structured_to_unstructured(a)
    array([[0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.]])
    
    
    >>> b = np.array([(1, 2, 5), (4, 5, 7), (7, 8 ,11), (10, 11, 12)],
    ...              dtype=[('x', 'i4'), ('y', 'f4'), ('z', 'f8')])
    >>> np.mean(rfn.structured_to_unstructured(b[['x', 'z']]), axis=-1)
    array([ 3. ,  5.5,  9. , 11. ])
    
numpy.lib.recfunctions.unstructured_to_structured(arr, dtype=None, names=None, align=False, copy=False, casting='unsafe')[source]
    
Converts an n-D unstructured array into an (n-1)-D structured array.
The last dimension of the input array is converted into a structure, with number of field-elements equal to the size of the last dimension of the input array. By default all output fields have the input array’s dtype, but an output structured dtype with an equal number of fields-elements can be supplied instead.
Nested fields, as well as each element of any subarray fields, all count towards the number of field-elements.
Parameters:
    
arrndarray
    
Unstructured array or dtype to convert.
dtypedtype, optional
    
The structured dtype of the output array
nameslist of strings, optional
    
If dtype is not supplied, this specifies the field names for the output dtype, in order. The field dtypes will be the same as the input array.
alignboolean, optional
    
Whether to create an aligned memory layout.
copybool, optional
    
See copy argument to `numpy.ndarray.astype`. If true, always return a copy. If false, and `dtype` requirements are satisfied, a view is returned.
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional
    
See casting argument of `numpy.ndarray.astype`. Controls what kind of data casting may occur.
Returns:
    
structuredndarray
    
Structured array with fewer dimensions.
#### Examples
    
    >>> import numpy as np
    
    
    >>> from numpy.lib import recfunctions as rfn
    >>> dt = np.dtype([('a', 'i4'), ('b', 'f4,u2'), ('c', 'f4', 2)])
    >>> a = np.arange(20).reshape((4,5))
    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19]])
    >>> rfn.unstructured_to_structured(a, dt)
    array([( 0, ( 1.,  2), [ 3.,  4.]), ( 5, ( 6.,  7), [ 8.,  9.]),
           (10, (11., 12), [13., 14.]), (15, (16., 17), [18., 19.])],
          dtype=[('a', '<i4'), ('b', [('f0', '<f4'), ('f1', '<u2')]), ('c', '<f4', (2,))])
    
# Working with Arrays of Strings And Bytes
While NumPy is primarily a numerical library, it is often convenient to work with NumPy arrays of strings or bytes. The two most common use cases are:
  * Working with data loaded or memory-mapped from a data file, where one or more of the fields in the data is a string or bytestring, and the maximum length of the field is known ahead of time. This often is used for a name or label field.
  * Using NumPy indexing and broadcasting with arrays of Python strings of unknown length, which may or may not have data defined for every value.


For the first use case, NumPy provides the fixed-width `numpy.void`, `numpy.str_` and `numpy.bytes_` data types. For the second use case, numpy provides `numpy.dtypes.StringDType`. Below we describe how to work with both fixed-width and variable-width string arrays, how to convert between the two representations, and provide some advice for most efficiently working with string data in NumPy.
## Fixed-width data types
Before NumPy 2.0, the fixed-width `numpy.str_`, `numpy.bytes_`, and `numpy.void` data types were the only types available for working with strings and bytestrings in NumPy. For this reason, they are used as the default dtype for strings and bytestrings, respectively:
    
    >>> np.array(["hello", "world"])
    array(['hello', 'world'], dtype='<U5')
    
Here the detected data type is `'<U5'`, or little-endian unicode string data, with a maximum length of 5 unicode code points.
Similarly for bytestrings:
    
    >>> np.array([b"hello", b"world"])
    array([b'hello', b'world'], dtype='|S5')
    
Since this is a one-byte encoding, the byteorder is `‘|’` (not applicable), and the data type detected is a maximum 5 character bytestring.
You can also use `numpy.void` to represent bytestrings:
    
    >>> np.array([b"hello", b"world"]).astype(np.void)
    array([b'\x68\x65\x6C\x6C\x6F', b'\x77\x6F\x72\x6C\x64'], dtype='|V5')
    
This is most useful when working with byte streams that are not well represented as bytestrings, and instead are better thought of as collections of 8-bit integers.
## Variable-width strings
New in version 2.0.
Note
`numpy.dtypes.StringDType` is a new addition to NumPy, implemented using the new support in NumPy for flexible user-defined data types and is not as extensively tested in production workflows as the older NumPy data types.
Often, real-world string data does not have a predictable length. In these cases it is awkward to use fixed-width strings, since storing all the data without truncation requires knowing the length of the longest string one would like to store in the array before the array is created.
To support situations like this, NumPy provides `numpy.dtypes.StringDType`, which stores variable-width string data in a UTF-8 encoding in a NumPy array:
    
    >>> from numpy.dtypes import StringDType
    >>> data = ["this is a longer string", "short string"]
    >>> arr = np.array(data, dtype=StringDType())
    >>> arr
    array(['this is a longer string', 'short string'], dtype=StringDType())
    
Note that unlike fixed-width strings, `StringDType` is not parameterized by the maximum length of an array element, arbitrarily long or short strings can live in the same array without needing to reserve storage for padding bytes in the short strings.
Also note that unlike fixed-width strings and most other NumPy data types, `StringDType` does not store the string data in the “main” `ndarray` data buffer. Instead, the array buffer is used to store metadata about where the string data are stored in memory. This difference means that code expecting the array buffer to contain string data will not function correctly, and will need to be updated to support `StringDType`.
### Missing data support
Often string datasets are not complete, and a special label is needed to indicate that a value is missing. By default `StringDType` does not have any special support for missing values, besides the fact that empty strings are used to populate empty arrays:
    
    >>> np.empty(3, dtype=StringDType())
    array(['', '', ''], dtype=StringDType())
    
Optionally, you can pass create an instance of `StringDType` with support for missing values by passing `na_object` as a keyword argument for the initializer:
    
    >>> dt = StringDType(na_object=None)
    >>> arr = np.array(["this array has", None, "as an entry"], dtype=dt)
    >>> arr
    array(['this array has', None, 'as an entry'],
          dtype=StringDType(na_object=None))
    >>> arr[1] is None
    True
    
The `na_object` can be any arbitrary python object. Common choices are `numpy.nan`, `float('nan')`, `None`, an object specifically intended to represent missing data like `pandas.NA`, or a (hopefully) unique string like `"__placeholder__"`.
NumPy has special handling for NaN-like sentinels and string sentinels.
#### NaN-like Missing Data Sentinels
A NaN-like sentinel returns itself as the result of arithmetic operations. This includes the python `nan` float and the Pandas missing data sentinel `pd.NA`. NaN-like sentinels inherit these behaviors in string operations. This means that, for example, the result of addition with any other string is the sentinel:
    
    >>> dt = StringDType(na_object=np.nan)
    >>> arr = np.array(["hello", np.nan, "world"], dtype=dt)
    >>> arr + arr
    array(['hellohello', nan, 'worldworld'], dtype=StringDType(na_object=nan))
    
Following the behavior of `nan` in float arrays, NaN-like sentinels sort to the end of the array:
    
    >>> np.sort(arr)
    array(['hello', 'world', nan], dtype=StringDType(na_object=nan))
    
#### String Missing Data Sentinels
A string missing data value is an instance of `str` or subtype of `str`. If such an array is passed to a string operation or a cast, “missing” entries are treated as if they have a value given by the string sentinel. Comparison operations similarly use the sentinel value directly for missing entries.
#### Other Sentinels
Other objects, such as `None` are also supported as missing data sentinels. If any missing data are present in an array using such a sentinel, then string operations will raise an error:
    
    >>> dt = StringDType(na_object=None)
    >>> arr = np.array(["this array has", None, "as an entry"])
    >>> np.sort(arr)
    Traceback (most recent call last):
    ...
    TypeError: '<' not supported between instances of 'NoneType' and 'str'
    
### Coercing Non-strings
By default, non-string data are coerced to strings:
    
    >>> np.array([1, object(), 3.4], dtype=StringDType())
    array(['1', '<object object at 0x7faa2497dde0>', '3.4'], dtype=StringDType())
    
If this behavior is not desired, an instance of the DType can be created that disables string coercion by setting `coerce=False` in the initializer:
    
    >>> np.array([1, object(), 3.4], dtype=StringDType(coerce=False))
    Traceback (most recent call last):
    ...
    ValueError: StringDType only allows string data when string coercion is disabled.
    
This allows strict data validation in the same pass over the data NumPy uses to create the array. Setting `coerce=True` recovers the default behavior allowing coercion to strings.
### Casting To and From Fixed-Width Strings
`StringDType` supports round-trip casts between `numpy.str_`, `numpy.bytes_`, and `numpy.void`. Casting to a fixed-width string is most useful when strings need to be memory-mapped in an ndarray or when a fixed-width string is needed for reading and writing to a columnar data format with a known maximum string length.
In all cases, casting to a fixed-width string requires specifying the maximum allowed string length:
    
    >>> arr = np.array(["hello", "world"], dtype=StringDType())
    >>> arr.astype(np.str_)  
    Traceback (most recent call last):
    ...
    TypeError: Casting from StringDType to a fixed-width dtype with an
    unspecified size is not currently supported, specify an explicit
    size for the output dtype instead.
    
    The above exception was the direct cause of the following
    exception:
    
    TypeError: cannot cast dtype StringDType() to <class 'numpy.dtypes.StrDType'>.
    >>> arr.astype("U5")
    array(['hello', 'world'], dtype='<U5')
    
The `numpy.bytes_` cast is most useful for string data that is known to contain only ASCII characters, as characters outside this range cannot be represented in a single byte in the UTF-8 encoding and are rejected.
Any valid unicode string can be cast to `numpy.str_`, although since `numpy.str_` uses a 32-bit UCS4 encoding for all characters, this will often waste memory for real-world textual data that can be well-represented by a more memory-efficient encoding.
Additionally, any valid unicode string can be cast to `numpy.void`, storing the UTF-8 bytes directly in the output array:
    
    >>> arr = np.array(["hello", "world"], dtype=StringDType())
    >>> arr.astype("V5")
    array([b'\x68\x65\x6C\x6C\x6F', b'\x77\x6F\x72\x6C\x64'], dtype='|V5')
    
Care must be taken to ensure that the output array has enough space for the UTF-8 bytes in the string, since the size of a UTF-8 bytestream in bytes is not necessarily the same as the number of characters in the string.
# Subclassing ndarray
## Introduction
Subclassing ndarray is relatively simple, but it has some complications compared to other Python objects. On this page we explain the machinery that allows you to subclass ndarray, and the implications for implementing a subclass.
### ndarrays and object creation
Subclassing ndarray is complicated by the fact that new instances of ndarray classes can come about in three different ways. These are:
  1. Explicit constructor call - as in `MySubClass(params)`. This is the usual route to Python instance creation.
  2. View casting - casting an existing ndarray as a given subclass
  3. New from template - creating a new instance from a template instance. Examples include returning slices from a subclassed array, creating return types from ufuncs, and copying arrays. See Creating new from template for more details


The last two are characteristics of ndarrays - in order to support things like array slicing. The complications of subclassing ndarray are due to the mechanisms numpy has to support these latter two routes of instance creation.
### When to use subclassing
Besides the additional complexities of subclassing a NumPy array, subclasses can run into unexpected behaviour because some functions may convert the subclass to a baseclass and “forget” any additional information associated with the subclass. This can result in surprising behavior if you use NumPy methods or functions you have not explicitly tested.
On the other hand, compared to other interoperability approaches, subclassing can be useful because many things will “just work”.
This means that subclassing can be a convenient approach and for a long time it was also often the only available approach. However, NumPy now provides additional interoperability protocols described in “Interoperability with NumPy”. For many use-cases these interoperability protocols may now be a better fit or supplement the use of subclassing.
Subclassing can be a good fit if:
  * you are less worried about maintainability or users other than yourself: Subclass will be faster to implement and additional interoperability can be added “as-needed”. And with few users, possible surprises are not an issue.
  * you do not think it is problematic if the subclass information is ignored or lost silently. An example is `np.memmap` where “forgetting” about data being memory mapped cannot lead to a wrong result. An example of a subclass that sometimes confuses users are NumPy’s masked arrays. When they were introduced, subclassing was the only approach for implementation. However, today we would possibly try to avoid subclassing and rely only on interoperability protocols.


Note that also subclass authors may wish to study Interoperability with NumPy to support more complex use-cases or work around the surprising behavior.
`astropy.units.Quantity` and `xarray` are examples for array-like objects that interoperate well with NumPy. Astropy’s `Quantity` is an example which uses a dual approach of both subclassing and interoperability protocols.
## View casting
View casting is the standard ndarray mechanism by which you take an ndarray of any subclass, and return a view of the array as another (specified) subclass:
    
    >>> import numpy as np
    >>> # create a completely useless ndarray subclass
    >>> class C(np.ndarray): pass
    >>> # create a standard ndarray
    >>> arr = np.zeros((3,))
    >>> # take a view of it, as our useless subclass
    >>> c_arr = arr.view(C)
    >>> type(c_arr)
    <class '__main__.C'>
    
## Creating new from template
New instances of an ndarray subclass can also come about by a very similar mechanism to View casting, when numpy finds it needs to create a new instance from a template instance. The most obvious place this has to happen is when you are taking slices of subclassed arrays. For example:
    
    >>> v = c_arr[1:]
    >>> type(v) # the view is of type 'C'
    <class '__main__.C'>
    >>> v is c_arr # but it's a new instance
    False
    
The slice is a view onto the original `c_arr` data. So, when we take a view from the ndarray, we return a new ndarray, of the same class, that points to the data in the original.
There are other points in the use of ndarrays where we need such views, such as copying arrays (`c_arr.copy()`), creating ufunc output arrays (see also __array_wrap__ for ufuncs and other functions), and reducing methods (like `c_arr.mean()`).
## Relationship of view casting and new-from-template
These paths both use the same machinery. We make the distinction here, because they result in different input to your methods. Specifically, View casting means you have created a new instance of your array type from any potential subclass of ndarray. Creating new from template means you have created a new instance of your class from a pre-existing instance, allowing you - for example - to copy across attributes that are particular to your subclass.
## Implications for subclassing
If we subclass ndarray, we need to deal not only with explicit construction of our array type, but also View casting or Creating new from template. NumPy has the machinery to do this, and it is this machinery that makes subclassing slightly non-standard.
There are two aspects to the machinery that ndarray uses to support views and new-from-template in subclasses.
The first is the use of the `ndarray.__new__` method for the main work of object initialization, rather then the more usual `__init__` method. The second is the use of the `__array_finalize__` method to allow subclasses to clean up after the creation of views and new instances from templates.
### A brief Python primer on `__new__` and `__init__`
`__new__` is a standard Python method, and, if present, is called before `__init__` when we create a class instance. See the python __new__ documentation for more detail.
For example, consider the following Python code:
    
    >>> class C:
    ...     def __new__(cls, *args):
    ...         print('Cls in __new__:', cls)
    ...         print('Args in __new__:', args)
    ...         # The `object` type __new__ method takes a single argument.
    ...         return object.__new__(cls)
    ...     def __init__(self, *args):
    ...         print('type(self) in __init__:', type(self))
    ...         print('Args in __init__:', args)
    
meaning that we get:
    
    >>> c = C('hello')
    Cls in __new__: <class '__main__.C'>
    Args in __new__: ('hello',)
    type(self) in __init__: <class '__main__.C'>
    Args in __init__: ('hello',)
    
When we call `C('hello')`, the `__new__` method gets its own class as first argument, and the passed argument, which is the string `'hello'`. After python calls `__new__`, it usually (see below) calls our `__init__` method, with the output of `__new__` as the first argument (now a class instance), and the passed arguments following.
As you can see, the object can be initialized in the `__new__` method or the `__init__` method, or both, and in fact ndarray does not have an `__init__` method, because all the initialization is done in the `__new__` method.
Why use `__new__` rather than just the usual `__init__`? Because in some cases, as for ndarray, we want to be able to return an object of some other class. Consider the following:
    
    class D(C):
        def __new__(cls, *args):
            print('D cls is:', cls)
            print('D args in __new__:', args)
            return C.__new__(C, *args)
    
        def __init__(self, *args):
            # we never get here
            print('In D __init__')
    
meaning that:
    
    >>> obj = D('hello')
    D cls is: <class 'D'>
    D args in __new__: ('hello',)
    Cls in __new__: <class 'C'>
    Args in __new__: ('hello',)
    >>> type(obj)
    <class 'C'>
    
The definition of `C` is the same as before, but for `D`, the `__new__` method returns an instance of class `C` rather than `D`. Note that the `__init__` method of `D` does not get called. In general, when the `__new__` method returns an object of class other than the class in which it is defined, the `__init__` method of that class is not called.
This is how subclasses of the ndarray class are able to return views that preserve the class type. When taking a view, the standard ndarray machinery creates the new ndarray object with something like:
    
    obj = ndarray.__new__(subtype, shape, ...
    
where `subtype` is the subclass. Thus the returned view is of the same class as the subclass, rather than being of class `ndarray`.
That solves the problem of returning views of the same type, but now we have a new problem. The machinery of ndarray can set the class this way, in its standard methods for taking views, but the ndarray `__new__` method knows nothing of what we have done in our own `__new__` method in order to set attributes, and so on. (Aside - why not call `obj = subdtype.__new__(...` then? Because we may not have a `__new__` method with the same call signature).
### The role of `__array_finalize__`
`__array_finalize__` is the mechanism that numpy provides to allow subclasses to handle the various ways that new instances get created.
Remember that subclass instances can come about in these three ways:
  1. explicit constructor call (`obj = MySubClass(params)`). This will call the usual sequence of `MySubClass.__new__` then (if it exists) `MySubClass.__init__`.
  2. View casting
  3. Creating new from template


Our `MySubClass.__new__` method only gets called in the case of the explicit constructor call, so we can’t rely on `MySubClass.__new__` or `MySubClass.__init__` to deal with the view casting and new-from-template. It turns out that `MySubClass.__array_finalize__` does get called for all three methods of object creation, so this is where our object creation housekeeping usually goes.
  * For the explicit constructor call, our subclass will need to create a new ndarray instance of its own class. In practice this means that we, the authors of the code, will need to make a call to `ndarray.__new__(MySubClass,...)`, a class-hierarchy prepared call to `super().__new__(cls, ...)`, or do view casting of an existing array (see below)
  * For view casting and new-from-template, the equivalent of `ndarray.__new__(MySubClass,...` is called, at the C level.


The arguments that `__array_finalize__` receives differ for the three methods of instance creation above.
The following code allows us to look at the call sequences and arguments:
    
    import numpy as np
    
    class C(np.ndarray):
        def __new__(cls, *args, **kwargs):
            print('In __new__ with class %s' % cls)
            return super().__new__(cls, *args, **kwargs)
    
        def __init__(self, *args, **kwargs):
            # in practice you probably will not need or want an __init__
            # method for your subclass
            print('In __init__ with class %s' % self.__class__)
    
        def __array_finalize__(self, obj):
            print('In array_finalize:')
            print('   self type is %s' % type(self))
            print('   obj type is %s' % type(obj))
    
Now:
    
    >>> # Explicit constructor
    >>> c = C((10,))
    In __new__ with class <class 'C'>
    In array_finalize:
       self type is <class 'C'>
       obj type is <type 'NoneType'>
    In __init__ with class <class 'C'>
    >>> # View casting
    >>> a = np.arange(10)
    >>> cast_a = a.view(C)
    In array_finalize:
       self type is <class 'C'>
       obj type is <type 'numpy.ndarray'>
    >>> # Slicing (example of new-from-template)
    >>> cv = c[:1]
    In array_finalize:
       self type is <class 'C'>
       obj type is <class 'C'>
    
The signature of `__array_finalize__` is:
    
    def __array_finalize__(self, obj):
    
One sees that the `super` call, which goes to `ndarray.__new__`, passes `__array_finalize__` the new object, of our own class (`self`) as well as the object from which the view has been taken (`obj`). As you can see from the output above, the `self` is always a newly created instance of our subclass, and the type of `obj` differs for the three instance creation methods:
  * When called from the explicit constructor, `obj` is `None`
  * When called from view casting, `obj` can be an instance of any subclass of ndarray, including our own.
  * When called in new-from-template, `obj` is another instance of our own subclass, that we might use to update the new `self` instance.


Because `__array_finalize__` is the only method that always sees new instances being created, it is the sensible place to fill in instance defaults for new object attributes, among other tasks.
This may be clearer with an example.
## Simple example - adding an extra attribute to ndarray
    
    import numpy as np
    
    class InfoArray(np.ndarray):
    
        def __new__(subtype, shape, dtype=float, buffer=None, offset=0,
                    strides=None, order=None, info=None):
            # Create the ndarray instance of our type, given the usual
            # ndarray input arguments.  This will call the standard
            # ndarray constructor, but return an object of our type.
            # It also triggers a call to InfoArray.__array_finalize__
            obj = super().__new__(subtype, shape, dtype,
                                  buffer, offset, strides, order)
            # set the new 'info' attribute to the value passed
            obj.info = info
            # Finally, we must return the newly created object:
            return obj
    
        def __array_finalize__(self, obj):
            # ``self`` is a new object resulting from
            # ndarray.__new__(InfoArray, ...), therefore it only has
            # attributes that the ndarray.__new__ constructor gave it -
            # i.e. those of a standard ndarray.
            #
            # We could have got to the ndarray.__new__ call in 3 ways:
            # From an explicit constructor - e.g. InfoArray():
            #    obj is None
            #    (we're in the middle of the InfoArray.__new__
            #    constructor, and self.info will be set when we return to
            #    InfoArray.__new__)
            if obj is None: return
            # From view casting - e.g arr.view(InfoArray):
            #    obj is arr
            #    (type(obj) can be InfoArray)
            # From new-from-template - e.g infoarr[:3]
            #    type(obj) is InfoArray
            #
            # Note that it is here, rather than in the __new__ method,
            # that we set the default value for 'info', because this
            # method sees all creation of default objects - with the
            # InfoArray.__new__ constructor, but also with
            # arr.view(InfoArray).
            self.info = getattr(obj, 'info', None)
            # We do not need to return anything
    
Using the object looks like this:
    
    >>> obj = InfoArray(shape=(3,)) # explicit constructor
    >>> type(obj)
    <class 'InfoArray'>
    >>> obj.info is None
    True
    >>> obj = InfoArray(shape=(3,), info='information')
    >>> obj.info
    'information'
    >>> v = obj[1:] # new-from-template - here - slicing
    >>> type(v)
    <class 'InfoArray'>
    >>> v.info
    'information'
    >>> arr = np.arange(10)
    >>> cast_arr = arr.view(InfoArray) # view casting
    >>> type(cast_arr)
    <class 'InfoArray'>
    >>> cast_arr.info is None
    True
    
This class isn’t very useful, because it has the same constructor as the bare ndarray object, including passing in buffers and shapes and so on. We would probably prefer the constructor to be able to take an already formed ndarray from the usual numpy calls to `np.array` and return an object.
## Slightly more realistic example - attribute added to existing array
Here is a class that takes a standard ndarray that already exists, casts as our type, and adds an extra attribute.
    
    import numpy as np
    
    class RealisticInfoArray(np.ndarray):
    
        def __new__(cls, input_array, info=None):
            # Input array is an already formed ndarray instance
            # We first cast to be our class type
            obj = np.asarray(input_array).view(cls)
            # add the new attribute to the created instance
            obj.info = info
            # Finally, we must return the newly created object:
            return obj
    
        def __array_finalize__(self, obj):
            # see InfoArray.__array_finalize__ for comments
            if obj is None: return
            self.info = getattr(obj, 'info', None)
    
So:
    
    >>> arr = np.arange(5)
    >>> obj = RealisticInfoArray(arr, info='information')
    >>> type(obj)
    <class 'RealisticInfoArray'>
    >>> obj.info
    'information'
    >>> v = obj[1:]
    >>> type(v)
    <class 'RealisticInfoArray'>
    >>> v.info
    'information'
    
##  `__array_ufunc__` for ufuncs
A subclass can override what happens when executing numpy ufuncs on it by overriding the default `ndarray.__array_ufunc__` method. This method is executed instead of the ufunc and should return either the result of the operation, or `NotImplemented` if the operation requested is not implemented.
The signature of `__array_ufunc__` is:
    
    def __array_ufunc__(ufunc, method, *inputs, **kwargs):
    
  * ufunc is the ufunc object that was called.
  * method is a string indicating how the Ufunc was called, either `"__call__"` to indicate it was called directly, or one of its methods: `"reduce"`, `"accumulate"`, `"reduceat"`, `"outer"`, or `"at"`.
  * inputs is a tuple of the input arguments to the `ufunc`
  * kwargs contains any optional or keyword arguments passed to the function. This includes any `out` arguments, which are always contained in a tuple.


A typical implementation would convert any inputs or outputs that are instances of one’s own class, pass everything on to a superclass using `super()`, and finally return the results after possible back-conversion. An example, taken from the test case `test_ufunc_override_with_super` in `_core/tests/test_umath.py`, is the following.
    
    input numpy as np
    
    class A(np.ndarray):
        def __array_ufunc__(self, ufunc, method, *inputs, out=None, **kwargs):
            args = []
            in_no = []
            for i, input_ in enumerate(inputs):
                if isinstance(input_, A):
                    in_no.append(i)
                    args.append(input_.view(np.ndarray))
                else:
                    args.append(input_)
    
            outputs = out
            out_no = []
            if outputs:
                out_args = []
                for j, output in enumerate(outputs):
                    if isinstance(output, A):
                        out_no.append(j)
                        out_args.append(output.view(np.ndarray))
                    else:
                        out_args.append(output)
                kwargs['out'] = tuple(out_args)
            else:
                outputs = (None,) * ufunc.nout
    
            info = {}
            if in_no:
                info['inputs'] = in_no
            if out_no:
                info['outputs'] = out_no
    
            results = super().__array_ufunc__(ufunc, method, *args, **kwargs)
            if results is NotImplemented:
                return NotImplemented
    
            if method == 'at':
                if isinstance(inputs[0], A):
                    inputs[0].info = info
                return
    
            if ufunc.nout == 1:
                results = (results,)
    
            results = tuple((np.asarray(result).view(A)
                             if output is None else output)
                            for result, output in zip(results, outputs))
            if results and isinstance(results[0], A):
                results[0].info = info
    
            return results[0] if len(results) == 1 else results
    
So, this class does not actually do anything interesting: it just converts any instances of its own to regular ndarray (otherwise, we’d get infinite recursion!), and adds an `info` dictionary that tells which inputs and outputs it converted. Hence, e.g.,
    
    >>> a = np.arange(5.).view(A)
    >>> b = np.sin(a)
    >>> b.info
    {'inputs': [0]}
    >>> b = np.sin(np.arange(5.), out=(a,))
    >>> b.info
    {'outputs': [0]}
    >>> a = np.arange(5.).view(A)
    >>> b = np.ones(1).view(A)
    >>> c = a + b
    >>> c.info
    {'inputs': [0, 1]}
    >>> a += b
    >>> a.info
    {'inputs': [0, 1], 'outputs': [0]}
    
Note that another approach would be to use `getattr(ufunc, methods)(*inputs, **kwargs)` instead of the `super` call. For this example, the result would be identical, but there is a difference if another operand also defines `__array_ufunc__`. E.g., lets assume that we evaluate `np.add(a, b)`, where `b` is an instance of another class `B` that has an override. If you use `super` as in the example, `ndarray.__array_ufunc__` will notice that `b` has an override, which means it cannot evaluate the result itself. Thus, it will return `NotImplemented` and so will our class `A`. Then, control will be passed over to `b`, which either knows how to deal with us and produces a result, or does not and returns `NotImplemented`, raising a `TypeError`.
If instead, we replace our `super` call with `getattr(ufunc, method)`, we effectively do `np.add(a.view(np.ndarray), b)`. Again, `B.__array_ufunc__` will be called, but now it sees an `ndarray` as the other argument. Likely, it will know how to handle this, and return a new instance of the `B` class to us. Our example class is not set up to handle this, but it might well be the best approach if, e.g., one were to re-implement `MaskedArray` using `__array_ufunc__`.
As a final note: if the `super` route is suited to a given class, an advantage of using it is that it helps in constructing class hierarchies. E.g., suppose that our other class `B` also used the `super` in its `__array_ufunc__` implementation, and we created a class `C` that depended on both, i.e., `class C(A, B)` (with, for simplicity, not another `__array_ufunc__` override). Then any ufunc on an instance of `C` would pass on to `A.__array_ufunc__`, the `super` call in `A` would go to `B.__array_ufunc__`, and the `super` call in `B` would go to `ndarray.__array_ufunc__`, thus allowing `A` and `B` to collaborate.
##  `__array_wrap__` for ufuncs and other functions
Prior to numpy 1.13, the behaviour of ufuncs could only be tuned using `__array_wrap__` and `__array_prepare__` (the latter is now removed). These two allowed one to change the output type of a ufunc, but, in contrast to `__array_ufunc__`, did not allow one to make any changes to the inputs. It is hoped to eventually deprecate these, but `__array_wrap__` is also used by other numpy functions and methods, such as `squeeze`, so at the present time is still needed for full functionality.
Conceptually, `__array_wrap__` “wraps up the action” in the sense of allowing a subclass to set the type of the return value and update attributes and metadata. Let’s show how this works with an example. First we return to the simpler example subclass, but with a different name and some print statements:
    
    import numpy as np
    
    class MySubClass(np.ndarray):
    
        def __new__(cls, input_array, info=None):
            obj = np.asarray(input_array).view(cls)
            obj.info = info
            return obj
    
        def __array_finalize__(self, obj):
            print('In __array_finalize__:')
            print('   self is %s' % repr(self))
            print('   obj is %s' % repr(obj))
            if obj is None: return
            self.info = getattr(obj, 'info', None)
    
        def __array_wrap__(self, out_arr, context=None, return_scalar=False):
            print('In __array_wrap__:')
            print('   self is %s' % repr(self))
            print('   arr is %s' % repr(out_arr))
            # then just call the parent
            return super().__array_wrap__(self, out_arr, context, return_scalar)
    
We run a ufunc on an instance of our new array:
    
    >>> obj = MySubClass(np.arange(5), info='spam')
    In __array_finalize__:
       self is MySubClass([0, 1, 2, 3, 4])
       obj is array([0, 1, 2, 3, 4])
    >>> arr2 = np.arange(5)+1
    >>> ret = np.add(arr2, obj)
    In __array_wrap__:
       self is MySubClass([0, 1, 2, 3, 4])
       arr is array([1, 3, 5, 7, 9])
    In __array_finalize__:
       self is MySubClass([1, 3, 5, 7, 9])
       obj is MySubClass([0, 1, 2, 3, 4])
    >>> ret
    MySubClass([1, 3, 5, 7, 9])
    >>> ret.info
    'spam'
    
Note that the ufunc (`np.add`) has called the `__array_wrap__` method with arguments `self` as `obj`, and `out_arr` as the (ndarray) result of the addition. In turn, the default `__array_wrap__` (`ndarray.__array_wrap__`) has cast the result to class `MySubClass`, and called `__array_finalize__` \- hence the copying of the `info` attribute. This has all happened at the C level.
But, we could do anything we wanted:
    
    class SillySubClass(np.ndarray):
    
        def __array_wrap__(self, arr, context=None, return_scalar=False):
            return 'I lost your data'
    
    
    >>> arr1 = np.arange(5)
    >>> obj = arr1.view(SillySubClass)
    >>> arr2 = np.arange(5)
    >>> ret = np.multiply(obj, arr2)
    >>> ret
    'I lost your data'
    
So, by defining a specific `__array_wrap__` method for our subclass, we can tweak the output from ufuncs. The `__array_wrap__` method requires `self`, then an argument - which is the result of the ufunc or another NumPy function - and an optional parameter context. This parameter is passed by ufuncs as a 3-element tuple: (name of the ufunc, arguments of the ufunc, domain of the ufunc), but is not passed by other numpy functions. Though, as seen above, it is possible to do otherwise, `__array_wrap__` should return an instance of its containing class. See the masked array subclass for an implementation. `__array_wrap__` is always passed a NumPy array which may or may not be a subclass (usually of the caller).
## Extra gotchas - custom `__del__` methods and ndarray.base
One of the problems that ndarray solves is keeping track of memory ownership of ndarrays and their views. Consider the case where we have created an ndarray, `arr` and have taken a slice with `v = arr[1:]`. The two objects are looking at the same memory. NumPy keeps track of where the data came from for a particular array or view, with the `base` attribute:
    
    >>> # A normal ndarray, that owns its own data
    >>> arr = np.zeros((4,))
    >>> # In this case, base is None
    >>> arr.base is None
    True
    >>> # We take a view
    >>> v1 = arr[1:]
    >>> # base now points to the array that it derived from
    >>> v1.base is arr
    True
    >>> # Take a view of a view
    >>> v2 = v1[1:]
    >>> # base points to the original array that it was derived from
    >>> v2.base is arr
    True
    
In general, if the array owns its own memory, as for `arr` in this case, then `arr.base` will be None - there are some exceptions to this - see the numpy book for more details.
The `base` attribute is useful in being able to tell whether we have a view or the original array. This in turn can be useful if we need to know whether or not to do some specific cleanup when the subclassed array is deleted. For example, we may only want to do the cleanup if the original array is deleted, but not the views. For an example of how this can work, have a look at the `memmap` class in `numpy._core`.
## Subclassing and downstream compatibility
When sub-classing `ndarray` or creating duck-types that mimic the `ndarray` interface, it is your responsibility to decide how aligned your APIs will be with those of numpy. For convenience, many numpy functions that have a corresponding `ndarray` method (e.g., `sum`, `mean`, `take`, `reshape`) work by checking if the first argument to a function has a method of the same name. If it exists, the method is called instead of coercing the arguments to a numpy array.
For example, if you want your sub-class or duck-type to be compatible with numpy’s `sum` function, the method signature for this object’s `sum` method should be the following:
    
    def sum(self, axis=None, dtype=None, out=None, keepdims=False):
    ...
    
This is the exact same method signature for `np.sum`, so now if a user calls `np.sum` on this object, numpy will call the object’s own `sum` method and pass in these arguments enumerated above in the signature, and no errors will be raised because the signatures are completely compatible with each other.
If, however, you decide to deviate from this signature and do something like this:
    
    def sum(self, axis=None, dtype=None):
    ...
    
This object is no longer compatible with `np.sum` because if you call `np.sum`, it will pass in unexpected arguments `out` and `keepdims`, causing a TypeError to be raised.
If you wish to maintain compatibility with numpy and its subsequent versions (which might add new keyword arguments) but do not want to surface all of numpy’s arguments, your function’s signature should accept `**kwargs`. For example:
    
    def sum(self, axis=None, dtype=None, **unused_kwargs):
    ...
    
This object is now compatible with `np.sum` again because any extraneous arguments (i.e. keywords that are not `axis` or `dtype`) will be hidden away in the `**unused_kwargs` parameter.
# Data types
See also
Data type objects
## Array types and conversions between types
NumPy supports a much greater variety of numerical types than Python does. This section shows which are available, and how to modify an array’s data-type.
NumPy numerical types are instances of `numpy.dtype` (data-type) objects, each having unique characteristics. Once you have imported NumPy using `import numpy as np` you can create arrays with a specified dtype using the scalar types in the numpy top-level API, e.g. `numpy.bool`, `numpy.float32`, etc.
These scalar types as arguments to the dtype keyword that many numpy functions or methods accept. For example:
    
    >>> z = np.arange(3, dtype=np.uint8)
    >>> z
    array([0, 1, 2], dtype=uint8)
    
Array types can also be referred to by character codes, for example:
    
    >>> np.array([1, 2, 3], dtype='f')
    array([1.,  2.,  3.], dtype=float32)
    >>> np.array([1, 2, 3], dtype='d')
    array([1.,  2.,  3.], dtype=float64)
    
See Specifying and constructing data types for more information about specifying and constructing data type objects, including how to specify parameters like the byte order.
To convert the type of an array, use the .astype() method. For example:
    
    >>> z.astype(np.float64)                 
    array([0.,  1.,  2.])
    
Note that, above, we could have used the Python float object as a dtype instead of `numpy.float64`. NumPy knows that `int` refers to `numpy.int_`, `bool` means `numpy.bool`, that `float` is `numpy.float64` and `complex` is `numpy.complex128`. The other data-types do not have Python equivalents.
To determine the type of an array, look at the dtype attribute:
    
    >>> z.dtype
    dtype('uint8')
    
dtype objects also contain information about the type, such as its bit-width and its byte-order. The data type can also be used indirectly to query properties of the type, such as whether it is an integer:
    
    >>> d = np.dtype(np.int64)
    >>> d
    dtype('int64')
    
    >>> np.issubdtype(d, np.integer)
    True
    
    >>> np.issubdtype(d, np.floating)
    False
    
### Numerical Data Types
There are 5 basic numerical types representing booleans (`bool`), integers (`int`), unsigned integers (`uint`) floating point (`float`) and `complex`. A basic numerical type name combined with a numeric bitsize defines a concrete type. The bitsize is the number of bits that are needed to represent a single value in memory. For example, `numpy.float64` is a 64 bit floating point data type. Some types, such as `numpy.int_` and `numpy.intp`, have differing bitsizes, dependent on the platforms (e.g. 32-bit vs. 64-bit CPU architectures). This should be taken into account when interfacing with low-level code (such as C or Fortran) where the raw memory is addressed.
### Data Types for Strings and Bytes
In addition to numerical types, NumPy also supports storing unicode strings, via the `numpy.str_` dtype (`U` character code), null-terminated byte sequences via `numpy.bytes_` (`S` character code), and arbitrary byte sequences, via `numpy.void` (`V` character code).
All of the above are fixed-width data types. They are parameterized by a width, in either bytes or unicode points, that a single data element in the array must fit inside. This means that storing an array of byte sequences or strings using this dtype requires knowing or calculating the sizes of the longest text or byte sequence in advance.
As an example, we can create an array storing the words `"hello"` and `"world!"`:
    
    >>> np.array(["hello", "world!"])
    array(['hello', 'world!'], dtype='<U6')
    
Here the data type is detected as a unicode string that is a maximum of 6 code points long, enough to store both entries without truncation. If we specify a shorter or longer data type, the string is either truncated or zero-padded to fit in the specified width:
    
    >>> np.array(["hello", "world!"], dtype="U5")
    array(['hello', 'world'], dtype='<U5')
    >>> np.array(["hello", "world!"], dtype="U7")
    array(['hello', 'world!'], dtype='<U7')
    
We can see the zero-padding a little more clearly if we use the bytes data type and ask NumPy to print out the bytes in the array buffer:
    
    >>> np.array(["hello", "world"], dtype="S7").tobytes()
    b'hello\x00\x00world\x00\x00'
    
Each entry is padded with two extra null bytes. Note however that NumPy cannot tell the difference between intentionally stored trailing nulls and padding nulls:
    
    >>> x = [b"hello\0\0", b"world"]
    >>> a = np.array(x, dtype="S7")
    >>> print(a[0])
    b"hello"
    >>> a[0] == x[0]
    False
    
If you need to store and round-trip any trailing null bytes, you will need to use an unstructured void data type:
    
    >>> a = np.array(x, dtype="V7")
    >>> a
    array([b'\x68\x65\x6C\x6C\x6F\x00\x00', b'\x77\x6F\x72\x6C\x64\x00\x00'],
          dtype='|V7')
    >>> a[0] == np.void(x[0])
    True
    
Advanced types, not listed above, are explored in section Structured arrays.
## Relationship Between NumPy Data Types and C Data Types
NumPy provides both bit sized type names and names based on the names of C types. Since the definition of C types are platform dependent, this means the explicitly bit sized should be preferred to avoid platform-dependent behavior in programs using NumPy.
To ease integration with C code, where it is more natural to refer to platform-dependent C types, NumPy also provides type aliases that correspond to the C types for the platform. Some dtypes have trailing underscore to avoid confusion with builtin python type names, such as `numpy.bool_`.
Canonical Python API name
Python API “C-like” name
Actual C type
Description  
`numpy.bool` or `numpy.bool_`
N/A
`bool` (defined in `stdbool.h`)
Boolean (True or False) stored as a byte.  
`numpy.int8`
`numpy.byte`
`signed char`
Platform-defined integer type with 8 bits.  
`numpy.uint8`
`numpy.ubyte`
`unsigned char`
Platform-defined integer type with 8 bits without sign.  
`numpy.int16`
`numpy.short`
`short`
Platform-defined integer type with 16 bits.  
`numpy.uint16`
`numpy.ushort`
`unsigned short`
Platform-defined integer type with 16 bits without sign.  
`numpy.int32`
`numpy.intc`
`int`
Platform-defined integer type with 32 bits.  
`numpy.uint32`
`numpy.uintc`
`unsigned int`
Platform-defined integer type with 32 bits without sign.  
`numpy.intp`
N/A
`ssize_t`/`Py_ssize_t`
Platform-defined integer of size `size_t`; used e.g. for sizes.  
`numpy.uintp`
N/A
`size_t`
Platform-defined integer type capable of storing the maximum allocation size.  
N/A
`'p'`
`intptr_t`
Guaranteed to hold pointers. Character code only (Python and C).  
N/A
`'P'`
`uintptr_t`
Guaranteed to hold pointers. Character code only (Python and C).  
`numpy.int32` or `numpy.int64`
`numpy.long`
`long`
Platform-defined integer type with at least 32 bits.  
`numpy.uint32` or `numpy.uint64`
`numpy.ulong`
`unsigned long`
Platform-defined integer type with at least 32 bits without sign.  
N/A
`numpy.longlong`
`long long`
Platform-defined integer type with at least 64 bits.  
N/A
`numpy.ulonglong`
`unsigned long long`
Platform-defined integer type with at least 64 bits without sign.  
`numpy.float16`
`numpy.half`
N/A
Half precision float: sign bit, 5 bits exponent, 10 bits mantissa.  
`numpy.float32`
`numpy.single`
`float`
Platform-defined single precision float: typically sign bit, 8 bits exponent, 23 bits mantissa.  
`numpy.float64`
`numpy.double`
`double`
Platform-defined double precision float: typically sign bit, 11 bits exponent, 52 bits mantissa.  
`numpy.float96` or `numpy.float128`
`numpy.longdouble`
`long double`
Platform-defined extended-precision float.  
`numpy.complex64`
`numpy.csingle`
`float complex`
Complex number, represented by two single-precision floats (real and imaginary components).  
`numpy.complex128`
`numpy.cdouble`
`double complex`
Complex number, represented by two double-precision floats (real and imaginary components).  
`numpy.complex192` or `numpy.complex256`
`numpy.clongdouble`
`long double complex`
Complex number, represented by two extended-precision floats (real and imaginary components).  
Since many of these have platform-dependent definitions, a set of fixed-size aliases are provided (See Sized aliases).
## Array scalars
NumPy generally returns elements of arrays as array scalars (a scalar with an associated dtype). Array scalars differ from Python scalars, but for the most part they can be used interchangeably (the primary exception is for versions of Python older than v2.x, where integer array scalars cannot act as indices for lists and tuples). There are some exceptions, such as when code requires very specific attributes of a scalar or when it checks specifically whether a value is a Python scalar. Generally, problems are easily fixed by explicitly converting array scalars to Python scalars, using the corresponding Python type function (e.g., `int`, `float`, `complex`, `str`).
The primary advantage of using array scalars is that they preserve the array type (Python may not have a matching scalar type available, e.g. `int16`). Therefore, the use of array scalars ensures identical behaviour between arrays and scalars, irrespective of whether the value is inside an array or not. NumPy scalars also have many of the same methods arrays do.
## Overflow errors
The fixed size of NumPy numeric types may cause overflow errors when a value requires more memory than available in the data type. For example, `numpy.power` evaluates `100 ** 9` correctly for 64-bit integers, but gives -1486618624 (incorrect) for a 32-bit integer.
    
    >>> np.power(100, 9, dtype=np.int64)
    1000000000000000000
    >>> np.power(100, 9, dtype=np.int32)
    np.int32(-1486618624)
    
The behaviour of NumPy and Python integer types differs significantly for integer overflows and may confuse users expecting NumPy integers to behave similar to Python’s `int`. Unlike NumPy, the size of Python’s `int` is flexible. This means Python integers may expand to accommodate any integer and will not overflow.
NumPy provides `numpy.iinfo` and `numpy.finfo` to verify the minimum or maximum values of NumPy integer and floating point values respectively
    
    >>> np.iinfo(int) # Bounds of the default integer on this system.
    iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
    >>> np.iinfo(np.int32) # Bounds of a 32-bit integer
    iinfo(min=-2147483648, max=2147483647, dtype=int32)
    >>> np.iinfo(np.int64) # Bounds of a 64-bit integer
    iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
    
If 64-bit integers are still too small the result may be cast to a floating point number. Floating point numbers offer a larger, but inexact, range of possible values.
    
    >>> np.power(100, 100, dtype=np.int64) # Incorrect even with 64-bit int
    0
    >>> np.power(100, 100, dtype=np.float64)
    1e+200
    
## Floating point precision
Many functions in NumPy, especially those in `numpy.linalg`, involve floating-point arithmetic, which can introduce small inaccuracies due to the way computers represent decimal numbers. For instance, when performing basic arithmetic operations involving floating-point numbers:
    
    >>> 0.3 - 0.2 - 0.1  # This does not equal 0 due to floating-point precision
    -2.7755575615628914e-17
    
To handle such cases, it’s advisable to use functions like `np.isclose` to compare values, rather than checking for exact equality:
    
    >>> np.isclose(0.3 - 0.2 - 0.1, 0, rtol=1e-05)  # Check for closeness to 0
    True
    
In this example, `np.isclose` accounts for the minor inaccuracies that occur in floating-point calculations by applying a relative tolerance, ensuring that results within a small threshold are considered close.
For information about precision in calculations, see Floating-Point Arithmetic.
## Extended precision
Python’s floating-point numbers are usually 64-bit floating-point numbers, nearly equivalent to `numpy.float64`. In some unusual situations it may be useful to use floating-point numbers with more precision. Whether this is possible in numpy depends on the hardware and on the development environment: specifically, x86 machines provide hardware floating-point with 80-bit precision, and while most C compilers provide this as their `long double` type, MSVC (standard for Windows builds) makes `long double` identical to `double` (64 bits). NumPy makes the compiler’s `long double` available as `numpy.longdouble` (and `np.clongdouble` for the complex numbers). You can find out what your numpy provides with `np.finfo(np.longdouble)`.
NumPy does not provide a dtype with more precision than C’s `long double`; in particular, the 128-bit IEEE quad precision data type (FORTRAN’s `REAL*16`) is not available.
For efficient memory alignment, `numpy.longdouble` is usually stored padded with zero bits, either to 96 or 128 bits. Which is more efficient depends on hardware and development environment; typically on 32-bit systems they are padded to 96 bits, while on 64-bit systems they are typically padded to 128 bits. `np.longdouble` is padded to the system default; `np.float96` and `np.float128` are provided for users who want specific padding. In spite of the names, `np.float96` and `np.float128` provide only as much precision as `np.longdouble`, that is, 80 bits on most x86 machines and 64 bits in standard Windows builds.
Be warned that even if `numpy.longdouble` offers more precision than python `float`, it is easy to lose that extra precision, since python often forces values to pass through `float`. For example, the `%` formatting operator requires its arguments to be converted to standard python types, and it is therefore impossible to preserve extended precision even if many decimal places are requested. It can be useful to test your code with the value `1 + np.finfo(np.longdouble).eps`.
# Universal functions (ufunc) basics
See also
Universal functions (ufunc)
A universal function (or ufunc for short) is a function that operates on `ndarrays` in an element-by-element fashion, supporting array broadcasting, type casting, and several other standard features. That is, a ufunc is a “vectorized” wrapper for a function that takes a fixed number of specific inputs and produces a fixed number of specific outputs.
In NumPy, universal functions are instances of the `numpy.ufunc` class. Many of the built-in functions are implemented in compiled C code. The basic ufuncs operate on scalars, but there is also a generalized kind for which the basic elements are sub-arrays (vectors, matrices, etc.), and broadcasting is done over other dimensions. The simplest example is the addition operator:
    
    >>> np.array([0,2,3,4]) + np.array([1,1,-1,2])
    array([1, 3, 2, 6])
    
One can also produce custom `numpy.ufunc` instances using the `numpy.frompyfunc` factory function.
## Ufunc methods
All ufuncs have four methods. They can be found at Methods. However, these methods only make sense on scalar ufuncs that take two input arguments and return one output argument. Attempting to call these methods on other ufuncs will cause a `ValueError`.
The reduce-like methods all take an axis keyword, a dtype keyword, and an out keyword, and the arrays must all have dimension >= 1. The axis keyword specifies the axis of the array over which the reduction will take place (with negative values counting backwards). Generally, it is an integer, though for `numpy.ufunc.reduce`, it can also be a tuple of `int` to reduce over several axes at once, or `None`, to reduce over all axes. For example:
    
    >>> x = np.arange(9).reshape(3,3)
    >>> x
    array([[0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]])
    >>> np.add.reduce(x, 1)
    array([ 3, 12, 21])
    >>> np.add.reduce(x, (0, 1))
    36
    
The dtype keyword allows you to manage a very common problem that arises when naively using `ufunc.reduce`. Sometimes you may have an array of a certain data type and wish to add up all of its elements, but the result does not fit into the data type of the array. This commonly happens if you have an array of single-byte integers. The dtype keyword allows you to alter the data type over which the reduction takes place (and therefore the type of the output). Thus, you can ensure that the output is a data type with precision large enough to handle your output. The responsibility of altering the reduce type is mostly up to you. There is one exception: if no dtype is given for a reduction on the “add” or “multiply” operations, then if the input type is an integer (or Boolean) data-type and smaller than the size of the `numpy.int_` data type, it will be internally upcast to the `int_` (or `numpy.uint`) data-type. In the previous example:
    
    >>> x.dtype
    dtype('int64')
    >>> np.multiply.reduce(x, dtype=float)
    array([ 0., 28., 80.])
    
Finally, the out keyword allows you to provide an output array (or a tuple of output arrays for multi-output ufuncs). If out is given, the dtype argument is only used for the internal computations. Considering `x` from the previous example:
    
    >>> y = np.zeros(3, dtype=int)
    >>> y
    array([0, 0, 0])
    >>> np.multiply.reduce(x, dtype=float, out=y)
    array([ 0, 28, 80])
    
Ufuncs also have a fifth method, `numpy.ufunc.at`, that allows in place operations to be performed using advanced indexing. No buffering is used on the dimensions where advanced indexing is used, so the advanced index can list an item more than once and the operation will be performed on the result of the previous operation for that item.
## Output type determination
The output of the ufunc (and its methods) is not necessarily an `ndarray`, if all input arguments are not `ndarrays`. Indeed, if any input defines an `__array_ufunc__` method, control will be passed completely to that function, i.e., the ufunc is overridden.
If none of the inputs overrides the ufunc, then all output arrays will be passed to the `__array_wrap__` method of the input (besides `ndarrays`, and scalars) that defines it and has the highest `__array_priority__` of any other input to the universal function. The default `__array_priority__` of the ndarray is 0.0, and the default `__array_priority__` of a subtype is 0.0. Matrices have `__array_priority__` equal to 10.0.
All ufuncs can also take output arguments which must be arrays or subclasses. If necessary, the result will be cast to the data-type(s) of the provided output array(s). If the output has an `__array_wrap__` method it is called instead of the one found on the inputs.
## Broadcasting
See also
Broadcasting basics
Each universal function takes array inputs and produces array outputs by performing the core function element-wise on the inputs (where an element is generally a scalar, but can be a vector or higher-order sub-array for generalized ufuncs). Standard broadcasting rules are applied so that inputs not sharing exactly the same shapes can still be usefully operated on.
By these rules, if an input has a dimension size of 1 in its shape, the first data entry in that dimension will be used for all calculations along that dimension. In other words, the stepping machinery of the ufunc will simply not step along that dimension (the stride will be 0 for that dimension).
## Type casting rules
Note
In NumPy 1.6.0, a type promotion API was created to encapsulate the mechanism for determining output types. See the functions `numpy.result_type`, `numpy.promote_types`, and `numpy.min_scalar_type` for more details.
At the core of every ufunc is a one-dimensional strided loop that implements the actual function for a specific type combination. When a ufunc is created, it is given a static list of inner loops and a corresponding list of type signatures over which the ufunc operates. The ufunc machinery uses this list to determine which inner loop to use for a particular case. You can inspect the `.types` attribute for a particular ufunc to see which type combinations have a defined inner loop and which output type they produce (character codes are used in said output for brevity).
Casting must be done on one or more of the inputs whenever the ufunc does not have a core loop implementation for the input types provided. If an implementation for the input types cannot be found, then the algorithm searches for an implementation with a type signature to which all of the inputs can be cast “safely.” The first one it finds in its internal list of loops is selected and performed, after all necessary type casting. Recall that internal copies during ufuncs (even for casting) are limited to the size of an internal buffer (which is user settable).
Note
Universal functions in NumPy are flexible enough to have mixed type signatures. Thus, for example, a universal function could be defined that works with floating-point and integer values. See `numpy.ldexp` for an example.
By the above description, the casting rules are essentially implemented by the question of when a data type can be cast “safely” to another data type. The answer to this question can be determined in Python with a function call: `can_cast(fromtype, totype)`. The example below shows the results of this call for the 24 internally supported types on the author’s 64-bit system. You can generate this table for your system with the code given in the example.
#### Example
Code segment showing the “can cast safely” table for a 64-bit system. Generally the output depends on the system; your system might result in a different table.
    
    >>> mark = {False: ' -', True: ' Y'}
    >>> def print_table(ntypes):
    ...     print('X ' + ' '.join(ntypes))
    ...     for row in ntypes:
    ...         print(row, end='')
    ...         for col in ntypes:
    ...             print(mark[np.can_cast(row, col)], end='')
    ...         print()
    ...
    >>> print_table(np.typecodes['All'])
    X ? b h i l q n p B H I L Q N P e f d g F D G S U V O M m
    ? Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - Y
    b - Y Y Y Y Y Y Y - - - - - - - Y Y Y Y Y Y Y Y Y Y Y - Y
    h - - Y Y Y Y Y Y - - - - - - - - Y Y Y Y Y Y Y Y Y Y - Y
    i - - - Y Y Y Y Y - - - - - - - - - Y Y - Y Y Y Y Y Y - Y
    l - - - - Y Y Y Y - - - - - - - - - Y Y - Y Y Y Y Y Y - Y
    q - - - - Y Y Y Y - - - - - - - - - Y Y - Y Y Y Y Y Y - Y
    n - - - - Y Y Y Y - - - - - - - - - Y Y - Y Y Y Y Y Y - Y
    p - - - - Y Y Y Y - - - - - - - - - Y Y - Y Y Y Y Y Y - Y
    B - - Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - Y
    H - - - Y Y Y Y Y - Y Y Y Y Y Y - Y Y Y Y Y Y Y Y Y Y - Y
    I - - - - Y Y Y Y - - Y Y Y Y Y - - Y Y - Y Y Y Y Y Y - Y
    L - - - - - - - - - - - Y Y Y Y - - Y Y - Y Y Y Y Y Y - -
    Q - - - - - - - - - - - Y Y Y Y - - Y Y - Y Y Y Y Y Y - -
    N - - - - - - - - - - - Y Y Y Y - - Y Y - Y Y Y Y Y Y - -
    P - - - - - - - - - - - Y Y Y Y - - Y Y - Y Y Y Y Y Y - -
    e - - - - - - - - - - - - - - - Y Y Y Y Y Y Y Y Y Y Y - -
    f - - - - - - - - - - - - - - - - Y Y Y Y Y Y Y Y Y Y - -
    d - - - - - - - - - - - - - - - - - Y Y - Y Y Y Y Y Y - -
    g - - - - - - - - - - - - - - - - - - Y - - Y Y Y Y Y - -
    F - - - - - - - - - - - - - - - - - - - Y Y Y Y Y Y Y - -
    D - - - - - - - - - - - - - - - - - - - - Y Y Y Y Y Y - -
    G - - - - - - - - - - - - - - - - - - - - - Y Y Y Y Y - -
    S - - - - - - - - - - - - - - - - - - - - - - Y Y Y Y - -
    U - - - - - - - - - - - - - - - - - - - - - - - Y Y Y - -
    V - - - - - - - - - - - - - - - - - - - - - - - - Y Y - -
    O - - - - - - - - - - - - - - - - - - - - - - - - - Y - -
    M - - - - - - - - - - - - - - - - - - - - - - - - Y Y Y -
    m - - - - - - - - - - - - - - - - - - - - - - - - Y Y - Y
    
You should note that, while included in the table for completeness, the ‘S’, ‘U’, and ‘V’ types cannot be operated on by ufuncs. Also, note that on a 32-bit system the integer types may have different sizes, resulting in a slightly altered table.
Mixed scalar-array operations use a different set of casting rules that ensure that a scalar cannot “upcast” an array unless the scalar is of a fundamentally different kind of data (i.e., under a different hierarchy in the data-type hierarchy) than the array. This rule enables you to use scalar constants in your code (which, as Python types, are interpreted accordingly in ufuncs) without worrying about whether the precision of the scalar constant will cause upcasting on your large (small precision) array.
## Use of internal buffers
Internally, buffers are used for misaligned data, swapped data, and data that has to be converted from one data type to another. The size of internal buffers is settable on a per-thread basis. There can be up to \\(2 (n_{\mathrm{inputs}} + n_{\mathrm{outputs}})\\) buffers of the specified size created to handle the data from all the inputs and outputs of a ufunc. The default size of a buffer is 10,000 elements. Whenever buffer-based calculation would be needed, but all input arrays are smaller than the buffer size, those misbehaved or incorrectly-typed arrays will be copied before the calculation proceeds. Adjusting the size of the buffer may therefore alter the speed at which ufunc calculations of various sorts are completed. A simple interface for setting this variable is accessible using the function `numpy.setbufsize`.
## Error handling
Universal functions can trip special floating-point status registers in your hardware (such as divide-by-zero). If available on your platform, these registers will be regularly checked during calculation. Error handling is controlled on a per-thread basis, and can be configured using the functions `numpy.seterr` and `numpy.seterrcall`.
## Overriding ufunc behavior
Classes (including ndarray subclasses) can override how ufuncs act on them by defining certain special methods. For details, see Standard array subclasses.
# Byte-swapping
## Introduction to byte ordering and ndarrays
The `ndarray` is an object that provides a python array interface to data in memory.
It often happens that the memory that you want to view with an array is not of the same byte ordering as the computer on which you are running Python.
For example, I might be working on a computer with a little-endian CPU - such as an Intel Pentium, but I have loaded some data from a file written by a computer that is big-endian. Let’s say I have loaded 4 bytes from a file written by a Sun (big-endian) computer. I know that these 4 bytes represent two 16-bit integers. On a big-endian machine, a two-byte integer is stored with the Most Significant Byte (MSB) first, and then the Least Significant Byte (LSB). Thus the bytes are, in memory order:
  1. MSB integer 1
  2. LSB integer 1
  3. MSB integer 2
  4. LSB integer 2


Let’s say the two integers were in fact 1 and 770. Because 770 = 256 * 3 + 2, the 4 bytes in memory would contain respectively: 0, 1, 3, 2. The bytes I have loaded from the file would have these contents:
    
    >>> big_end_buffer = bytearray([0,1,3,2])
    >>> big_end_buffer
    bytearray(b'\x00\x01\x03\x02')
    
We might want to use an `ndarray` to access these integers. In that case, we can create an array around this memory, and tell numpy that there are two integers, and that they are 16 bit and big-endian:
    
    >>> import numpy as np
    >>> big_end_arr = np.ndarray(shape=(2,),dtype='>i2', buffer=big_end_buffer)
    >>> big_end_arr[0]
    np.int16(1)
    >>> big_end_arr[1]
    np.int16(770)
    
Note the array `dtype` above of `>i2`. The `>` means ‘big-endian’ (`<` is little-endian) and `i2` means ‘signed 2-byte integer’. For example, if our data represented a single unsigned 4-byte little-endian integer, the dtype string would be `<u4`.
In fact, why don’t we try that?
    
    >>> little_end_u4 = np.ndarray(shape=(1,),dtype='<u4', buffer=big_end_buffer)
    >>> little_end_u4[0] == 1 * 256**1 + 3 * 256**2 + 2 * 256**3
    True
    
Returning to our `big_end_arr` \- in this case our underlying data is big-endian (data endianness) and we’ve set the dtype to match (the dtype is also big-endian). However, sometimes you need to flip these around.
Warning
Scalars do not include byte order information, so extracting a scalar from an array will return an integer in native byte order. Hence:
    
    >>> big_end_arr[0].dtype.byteorder == little_end_u4[0].dtype.byteorder
    True
    
NumPy intentionally does not attempt to always preserve byte-order and for example converts to native byte-order in `numpy.concatenate`.
## Changing byte ordering
As you can imagine from the introduction, there are two ways you can affect the relationship between the byte ordering of the array and the underlying memory it is looking at:
  * Change the byte-ordering information in the array dtype so that it interprets the underlying data as being in a different byte order. This is the role of `arr.view(arr.dtype.newbyteorder())`
  * Change the byte-ordering of the underlying data, leaving the dtype interpretation as it was. This is what `arr.byteswap()` does.


The common situations in which you need to change byte ordering are:
  1. Your data and dtype endianness don’t match, and you want to change the dtype so that it matches the data.
  2. Your data and dtype endianness don’t match, and you want to swap the data so that they match the dtype
  3. Your data and dtype endianness match, but you want the data swapped and the dtype to reflect this


### Data and dtype endianness don’t match, change dtype to match data
We make something where they don’t match:
    
    >>> wrong_end_dtype_arr = np.ndarray(shape=(2,),dtype='<i2', buffer=big_end_buffer)
    >>> wrong_end_dtype_arr[0]
    np.int16(256)
    
The obvious fix for this situation is to change the dtype so it gives the correct endianness:
    
    >>> fixed_end_dtype_arr = wrong_end_dtype_arr.view(np.dtype('<i2').newbyteorder())
    >>> fixed_end_dtype_arr[0]
    np.int16(1)
    
Note the array has not changed in memory:
    
    >>> fixed_end_dtype_arr.tobytes() == big_end_buffer
    True
    
### Data and type endianness don’t match, change data to match dtype
You might want to do this if you need the data in memory to be a certain ordering. For example you might be writing the memory out to a file that needs a certain byte ordering.
    
    >>> fixed_end_mem_arr = wrong_end_dtype_arr.byteswap()
    >>> fixed_end_mem_arr[0]
    np.int16(1)
    
Now the array has changed in memory:
    
    >>> fixed_end_mem_arr.tobytes() == big_end_buffer
    False
    
### Data and dtype endianness match, swap data and dtype
You may have a correctly specified array dtype, but you need the array to have the opposite byte order in memory, and you want the dtype to match so the array values make sense. In this case you just do both of the previous operations:
    
    >>> swapped_end_arr = big_end_arr.byteswap()
    >>> swapped_end_arr = swapped_end_arr.view(swapped_end_arr.dtype.newbyteorder())
    >>> swapped_end_arr[0]
    np.int16(1)
    >>> swapped_end_arr.tobytes() == big_end_buffer
    False
    
An easier way of casting the data to a specific dtype and byte ordering can be achieved with the ndarray astype method:
    
    >>> swapped_end_arr = big_end_arr.astype('<i2')
    >>> swapped_end_arr[0]
    np.int16(1)
    >>> swapped_end_arr.tobytes() == big_end_buffer
    False
    
# Beyond the basics
## Iterating over elements in the array
### Basic iteration
One common algorithmic requirement is to be able to walk over all elements in a multidimensional array. The array iterator object makes this easy to do in a generic way that works for arrays of any dimension. Naturally, if you know the number of dimensions you will be using, then you can always write nested for loops to accomplish the iteration. If, however, you want to write code that works with any number of dimensions, then you can make use of the array iterator. An array iterator object is returned when accessing the .flat attribute of an array.
Basic usage is to call `PyArray_IterNew` ( `array` ) where array is an ndarray object (or one of its sub-classes). The returned object is an array-iterator object (the same object returned by the .flat attribute of the ndarray). This object is usually cast to PyArrayIterObject* so that its members can be accessed. The only members that are needed are `iter->size` which contains the total size of the array, `iter->index`, which contains the current 1-d index into the array, and `iter->dataptr` which is a pointer to the data for the current element of the array. Sometimes it is also useful to access `iter->ao` which is a pointer to the underlying ndarray object.
After processing data at the current element of the array, the next element of the array can be obtained using the macro `PyArray_ITER_NEXT` ( `iter` ). The iteration always proceeds in a C-style contiguous fashion (last index varying the fastest). The `PyArray_ITER_GOTO` ( `iter`, `destination` ) can be used to jump to a particular point in the array, where `destination` is an array of npy_intp data-type with space to handle at least the number of dimensions in the underlying array. Occasionally it is useful to use `PyArray_ITER_GOTO1D` ( `iter`, `index` ) which will jump to the 1-d index given by the value of `index`. The most common usage, however, is given in the following example.
    
    PyObject *obj; /* assumed to be some ndarray object */
    PyArrayIterObject *iter;
    ...
    iter = (PyArrayIterObject *)PyArray_IterNew(obj);
    if (iter == NULL) goto fail;   /* Assume fail has clean-up code */
    while (iter->index < iter->size) {
        /* do something with the data at it->dataptr */
        PyArray_ITER_NEXT(it);
    }
    ...
    
You can also use `PyArrayIter_Check` ( `obj` ) to ensure you have an iterator object and `PyArray_ITER_RESET` ( `iter` ) to reset an iterator object back to the beginning of the array.
It should be emphasized at this point that you may not need the array iterator if your array is already contiguous (using an array iterator will work but will be slower than the fastest code you could write). The major purpose of array iterators is to encapsulate iteration over N-dimensional arrays with arbitrary strides. They are used in many, many places in the NumPy source code itself. If you already know your array is contiguous (Fortran or C), then simply adding the element- size to a running pointer variable will step you through the array very efficiently. In other words, code like this will probably be faster for you in the contiguous case (assuming doubles).
    
    npy_intp size;
    double *dptr;  /* could make this any variable type */
    size = PyArray_SIZE(obj);
    dptr = PyArray_DATA(obj);
    while(size--) {
       /* do something with the data at dptr */
       dptr++;
    }
    
### Iterating over all but one axis
A common algorithm is to loop over all elements of an array and perform some function with each element by issuing a function call. As function calls can be time consuming, one way to speed up this kind of algorithm is to write the function so it takes a vector of data and then write the iteration so the function call is performed for an entire dimension of data at a time. This increases the amount of work done per function call, thereby reducing the function-call over-head to a small(er) fraction of the total time. Even if the interior of the loop is performed without a function call it can be advantageous to perform the inner loop over the dimension with the highest number of elements to take advantage of speed enhancements available on micro- processors that use pipelining to enhance fundamental operations.
The `PyArray_IterAllButAxis` ( `array`, `&dim` ) constructs an iterator object that is modified so that it will not iterate over the dimension indicated by dim. The only restriction on this iterator object, is that the `PyArray_ITER_GOTO1D` ( `it`, `ind` ) macro cannot be used (thus flat indexing won’t work either if you pass this object back to Python — so you shouldn’t do this). Note that the returned object from this routine is still usually cast to PyArrayIterObject *. All that’s been done is to modify the strides and dimensions of the returned iterator to simulate iterating over array[…,0,…] where 0 is placed on the \\(\textrm{dim}^{\textrm{th}}\\) dimension. If dim is negative, then the dimension with the largest axis is found and used.
### Iterating over multiple arrays
Very often, it is desirable to iterate over several arrays at the same time. The universal functions are an example of this kind of behavior. If all you want to do is iterate over arrays with the same shape, then simply creating several iterator objects is the standard procedure. For example, the following code iterates over two arrays assumed to be the same shape and size (actually obj1 just has to have at least as many total elements as does obj2):
    
    /* It is already assumed that obj1 and obj2
       are ndarrays of the same shape and size.
    */
    iter1 = (PyArrayIterObject *)PyArray_IterNew(obj1);
    if (iter1 == NULL) goto fail;
    iter2 = (PyArrayIterObject *)PyArray_IterNew(obj2);
    if (iter2 == NULL) goto fail;  /* assume iter1 is DECREF'd at fail */
    while (iter2->index < iter2->size)  {
        /* process with iter1->dataptr and iter2->dataptr */
        PyArray_ITER_NEXT(iter1);
        PyArray_ITER_NEXT(iter2);
    }
    
### Broadcasting over multiple arrays
When multiple arrays are involved in an operation, you may want to use the same broadcasting rules that the math operations (i.e. the ufuncs) use. This can be done easily using the `PyArrayMultiIterObject`. This is the object returned from the Python command numpy.broadcast and it is almost as easy to use from C. The function `PyArray_MultiIterNew` ( `n`, `...` ) is used (with `n` input objects in place of `...` ). The input objects can be arrays or anything that can be converted into an array. A pointer to a PyArrayMultiIterObject is returned. Broadcasting has already been accomplished which adjusts the iterators so that all that needs to be done to advance to the next element in each array is for PyArray_ITER_NEXT to be called for each of the inputs. This incrementing is automatically performed by `PyArray_MultiIter_NEXT` ( `obj` ) macro (which can handle a multiterator `obj` as either a PyArrayMultiIterObject* or a PyObject*). The data from input number `i` is available using `PyArray_MultiIter_DATA` ( `obj`, `i` ). An example of using this feature follows.
    
    mobj = PyArray_MultiIterNew(2, obj1, obj2);
    size = mobj->size;
    while(size--) {
        ptr1 = PyArray_MultiIter_DATA(mobj, 0);
        ptr2 = PyArray_MultiIter_DATA(mobj, 1);
        /* code using contents of ptr1 and ptr2 */
        PyArray_MultiIter_NEXT(mobj);
    }
    
The function `PyArray_RemoveSmallest` ( `multi` ) can be used to take a multi-iterator object and adjust all the iterators so that iteration does not take place over the largest dimension (it makes that dimension of size 1). The code being looped over that makes use of the pointers will very-likely also need the strides data for each of the iterators. This information is stored in multi->iters[i]->strides.
There are several examples of using the multi-iterator in the NumPy source code as it makes N-dimensional broadcasting-code very simple to write. Browse the source for more examples.
## User-defined data-types
NumPy comes with 24 builtin data-types. While this covers a large majority of possible use cases, it is conceivable that a user may have a need for an additional data-type. There is some support for adding an additional data-type into the NumPy system. This additional data- type will behave much like a regular data-type except ufuncs must have 1-d loops registered to handle it separately. Also checking for whether or not other data-types can be cast “safely” to and from this new type or not will always return “can cast” unless you also register which types your new data-type can be cast to and from.
The NumPy source code includes an example of a custom data-type as part of its test suite. The file `_rational_tests.c.src` in the source code directory `numpy/_core/src/umath/` contains an implementation of a data-type that represents a rational number as the ratio of two 32 bit integers.
### Adding the new data-type
To begin to make use of the new data-type, you need to first define a new Python type to hold the scalars of your new data-type. It should be acceptable to inherit from one of the array scalars if your new type has a binary compatible layout. This will allow your new data type to have the methods and attributes of array scalars. New data- types must have a fixed memory size (if you want to define a data-type that needs a flexible representation, like a variable-precision number, then use a pointer to the object as the data-type). The memory layout of the object structure for the new Python type must be PyObject_HEAD followed by the fixed-size memory needed for the data- type. For example, a suitable structure for the new Python type is:
    
    typedef struct {
       PyObject_HEAD;
       some_data_type obval;
       /* the name can be whatever you want */
    } PySomeDataTypeObject;
    
After you have defined a new Python type object, you must then define a new `PyArray_Descr` structure whose typeobject member will contain a pointer to the data-type you’ve just defined. In addition, the required functions in the “.f” member must be defined: nonzero, copyswap, copyswapn, setitem, getitem, and cast. The more functions in the “.f” member you define, however, the more useful the new data-type will be. It is very important to initialize unused functions to NULL. This can be achieved using `PyArray_InitArrFuncs` (f).
Once a new `PyArray_Descr` structure is created and filled with the needed information and useful functions you call `PyArray_RegisterDataType` (new_descr). The return value from this call is an integer providing you with a unique type_number that specifies your data-type. This type number should be stored and made available by your module so that other modules can use it to recognize your data-type.
Note that this API is inherently thread-unsafe. See `thread_safety` for more details about thread safety in NumPy.
### Registering a casting function
You may want to allow builtin (and other user-defined) data-types to be cast automatically to your data-type. In order to make this possible, you must register a casting function with the data-type you want to be able to cast from. This requires writing low-level casting functions for each conversion you want to support and then registering these functions with the data-type descriptor. A low-level casting function has the signature.
voidcastfunc(void*from, void*to, npy_intpn, void*fromarr, void*toarr)  

    
Cast `n` elements `from` one type `to` another. The data to cast from is in a contiguous, correctly-swapped and aligned chunk of memory pointed to by from. The buffer to cast to is also contiguous, correctly-swapped and aligned. The fromarr and toarr arguments should only be used for flexible-element-sized arrays (string, unicode, void).
An example castfunc is:
    
    static void
    double_to_float(double *from, float* to, npy_intp n,
                    void* ignore1, void* ignore2) {
        while (n--) {
              (*to++) = (double) *(from++);
        }
    }
    
This could then be registered to convert doubles to floats using the code:
    
    doub = PyArray_DescrFromType(NPY_DOUBLE);
    PyArray_RegisterCastFunc(doub, NPY_FLOAT,
         (PyArray_VectorUnaryFunc *)double_to_float);
    Py_DECREF(doub);
    
### Registering coercion rules
By default, all user-defined data-types are not presumed to be safely castable to any builtin data-types. In addition builtin data-types are not presumed to be safely castable to user-defined data-types. This situation limits the ability of user-defined data-types to participate in the coercion system used by ufuncs and other times when automatic coercion takes place in NumPy. This can be changed by registering data-types as safely castable from a particular data-type object. The function `PyArray_RegisterCanCast` (from_descr, totype_number, scalarkind) should be used to specify that the data-type object from_descr can be cast to the data-type with type number totype_number. If you are not trying to alter scalar coercion rules, then use `NPY_NOSCALAR` for the scalarkind argument.
If you want to allow your new data-type to also be able to share in the scalar coercion rules, then you need to specify the scalarkind function in the data-type object’s “.f” member to return the kind of scalar the new data-type should be seen as (the value of the scalar is available to that function). Then, you can register data-types that can be cast to separately for each scalar kind that may be returned from your user-defined data-type. If you don’t register scalar coercion handling, then all of your user-defined data-types will be seen as `NPY_NOSCALAR`.
### Registering a ufunc loop
You may also want to register low-level ufunc loops for your data-type so that an ndarray of your data-type can have math applied to it seamlessly. Registering a new loop with exactly the same arg_types signature, silently replaces any previously registered loops for that data-type.
Before you can register a 1-d loop for a ufunc, the ufunc must be previously created. Then you call `PyUFunc_RegisterLoopForType` (…) with the information needed for the loop. The return value of this function is `0` if the process was successful and `-1` with an error condition set if it was not successful.
## Subtyping the ndarray in C
One of the lesser-used features that has been lurking in Python since 2.2 is the ability to sub-class types in C. This facility is one of the important reasons for basing NumPy off of the Numeric code-base which was already in C. A sub-type in C allows much more flexibility with regards to memory management. Sub-typing in C is not difficult even if you have only a rudimentary understanding of how to create new types for Python. While it is easiest to sub-type from a single parent type, sub-typing from multiple parent types is also possible. Multiple inheritance in C is generally less useful than it is in Python because a restriction on Python sub-types is that they have a binary compatible memory layout. Perhaps for this reason, it is somewhat easier to sub-type from a single parent type.
All C-structures corresponding to Python objects must begin with `PyObject_HEAD` (or `PyObject_VAR_HEAD`). In the same way, any sub-type must have a C-structure that begins with exactly the same memory layout as the parent type (or all of the parent types in the case of multiple-inheritance). The reason for this is that Python may attempt to access a member of the sub-type structure as if it had the parent structure ( i.e. it will cast a given pointer to a pointer to the parent structure and then dereference one of it’s members). If the memory layouts are not compatible, then this attempt will cause unpredictable behavior (eventually leading to a memory violation and program crash).
One of the elements in `PyObject_HEAD` is a pointer to a type-object structure. A new Python type is created by creating a new type-object structure and populating it with functions and pointers to describe the desired behavior of the type. Typically, a new C-structure is also created to contain the instance-specific information needed for each object of the type as well. For example, `&PyArray_Type` is a pointer to the type-object table for the ndarray while a PyArrayObject* variable is a pointer to a particular instance of an ndarray (one of the members of the ndarray structure is, in turn, a pointer to the type- object table `&PyArray_Type`). Finally `PyType_Ready` (<pointer_to_type_object>) must be called for every new Python type.
### Creating sub-types
To create a sub-type, a similar procedure must be followed except only behaviors that are different require new entries in the type- object structure. All other entries can be NULL and will be filled in by `PyType_Ready` with appropriate functions from the parent type(s). In particular, to create a sub-type in C follow these steps:
  1. If needed create a new C-structure to handle each instance of your type. A typical C-structure would be:
         typedef _new_struct {
             PyArrayObject base;
             /* new things here */
         } NewArrayObject;
         
Notice that the full PyArrayObject is used as the first entry in order to ensure that the binary layout of instances of the new type is identical to the PyArrayObject.
  2. Fill in a new Python type-object structure with pointers to new functions that will over-ride the default behavior while leaving any function that should remain the same unfilled (or NULL). The tp_name element should be different.
  3. Fill in the tp_base member of the new type-object structure with a pointer to the (main) parent type object. For multiple-inheritance, also fill in the tp_bases member with a tuple containing all of the parent objects in the order they should be used to define inheritance. Remember, all parent-types must have the same C-structure for multiple inheritance to work properly.
  4. Call `PyType_Ready` (<pointer_to_new_type>). If this function returns a negative number, a failure occurred and the type is not initialized. Otherwise, the type is ready to be used. It is generally important to place a reference to the new type into the module dictionary so it can be accessed from Python.


More information on creating sub-types in C can be learned by reading PEP 253 (available at https://www.python.org/dev/peps/pep-0253).
### Specific features of ndarray sub-typing
Some special methods and attributes are used by arrays in order to facilitate the interoperation of sub-types with the base ndarray type.
#### The __array_finalize__ method
ndarray.__array_finalize__
    
Several array-creation functions of the ndarray allow specification of a particular sub-type to be created. This allows sub-types to be handled seamlessly in many routines. When a sub-type is created in such a fashion, however, neither the __new__ method nor the __init__ method gets called. Instead, the sub-type is allocated and the appropriate instance-structure members are filled in. Finally, the `__array_finalize__` attribute is looked-up in the object dictionary. If it is present and not None, then it can be either a `PyCapsule` containing a pointer to a `PyArray_FinalizeFunc` or it can be a method taking a single argument (which could be None)
If the `__array_finalize__` attribute is a `PyCapsule`, then the pointer must be a pointer to a function with the signature:
    
    (int) (PyArrayObject *, PyObject *)
    
The first argument is the newly created sub-type. The second argument (if not NULL) is the “parent” array (if the array was created using slicing or some other operation where a clearly-distinguishable parent is present). This routine can do anything it wants to. It should return a -1 on error and 0 otherwise.
If the `__array_finalize__` attribute is not None nor a `PyCapsule`, then it must be a Python method that takes the parent array as an argument (which could be None if there is no parent), and returns nothing. Errors in this method will be caught and handled.
#### The __array_priority__ attribute
ndarray.__array_priority__
    
This attribute allows simple but flexible determination of which sub- type should be considered “primary” when an operation involving two or more sub-types arises. In operations where different sub-types are being used, the sub-type with the largest `__array_priority__` attribute will determine the sub-type of the output(s). If two sub- types have the same `__array_priority__` then the sub-type of the first argument determines the output. The default `__array_priority__` attribute returns a value of 0.0 for the base ndarray type and 1.0 for a sub-type. This attribute can also be defined by objects that are not sub-types of the ndarray and can be used to determine which `__array_wrap__` method should be called for the return output.
#### The __array_wrap__ method
ndarray.__array_wrap__
    
Any class or type can define this method which should take an ndarray argument and return an instance of the type. It can be seen as the opposite of the `__array__` method. This method is used by the ufuncs (and other NumPy functions) to allow other objects to pass through. For Python >2.4, it can also be used to write a decorator that converts a function that works only with ndarrays to one that works with any type with `__array__` and `__array_wrap__` methods.
# How to extend NumPy
## Writing an extension module
While the ndarray object is designed to allow rapid computation in Python, it is also designed to be general-purpose and satisfy a wide- variety of computational needs. As a result, if absolute speed is essential, there is no replacement for a well-crafted, compiled loop specific to your application and hardware. This is one of the reasons that numpy includes f2py so that an easy-to-use mechanisms for linking (simple) C/C++ and (arbitrary) Fortran code directly into Python are available. You are encouraged to use and improve this mechanism. The purpose of this section is not to document this tool but to document the more basic steps to writing an extension module that this tool depends on.
When an extension module is written, compiled, and installed to somewhere in the Python path (sys.path), the code can then be imported into Python as if it were a standard python file. It will contain objects and methods that have been defined and compiled in C code. The basic steps for doing this in Python are well-documented and you can find more information in the documentation for Python itself available online at www.python.org .
In addition to the Python C-API, there is a full and rich C-API for NumPy allowing sophisticated manipulations on a C-level. However, for most applications, only a few API calls will typically be used. For example, if you need to just extract a pointer to memory along with some shape information to pass to another calculation routine, then you will use very different calls than if you are trying to create a new array-like type or add a new data type for ndarrays. This chapter documents the API calls and macros that are most commonly used.
## Required subroutine
There is exactly one function that must be defined in your C-code in order for Python to use it as an extension module. The function must be called init{name} where {name} is the name of the module from Python. This function must be declared so that it is visible to code outside of the routine. Besides adding the methods and constants you desire, this subroutine must also contain calls like `import_array()` and/or `import_ufunc()` depending on which C-API is needed. Forgetting to place these commands will show itself as an ugly segmentation fault (crash) as soon as any C-API subroutine is actually called. It is actually possible to have multiple init{name} functions in a single file in which case multiple modules will be defined by that file. However, there are some tricks to get that to work correctly and it is not covered here.
A minimal `init{name}` method looks like:
    
    PyMODINIT_FUNC
    init{name}(void)
    {
       (void)Py_InitModule({name}, mymethods);
       import_array();
    }
    
The mymethods must be an array (usually statically declared) of PyMethodDef structures which contain method names, actual C-functions, a variable indicating whether the method uses keyword arguments or not, and docstrings. These are explained in the next section. If you want to add constants to the module, then you store the returned value from Py_InitModule which is a module object. The most general way to add items to the module is to get the module dictionary using PyModule_GetDict(module). With the module dictionary, you can add whatever you like to the module manually. An easier way to add objects to the module is to use one of three additional Python C-API calls that do not require a separate extraction of the module dictionary. These are documented in the Python documentation, but repeated here for convenience:
intPyModule_AddObject(PyObject*module, char*name, PyObject*value)  

intPyModule_AddIntConstant(PyObject*module, char*name, longvalue)  

intPyModule_AddStringConstant(PyObject*module, char*name, char*value)  

    
All three of these functions require the module object (the return value of Py_InitModule). The name is a string that labels the value in the module. Depending on which function is called, the value argument is either a general object (`PyModule_AddObject` steals a reference to it), an integer constant, or a string constant.
## Defining functions
The second argument passed in to the Py_InitModule function is a structure that makes it easy to define functions in the module. In the example given above, the mymethods structure would have been defined earlier in the file (usually right before the init{name} subroutine) to:
    
    static PyMethodDef mymethods[] = {
        { nokeywordfunc,nokeyword_cfunc,
          METH_VARARGS,
          Doc string},
        { keywordfunc, keyword_cfunc,
          METH_VARARGS|METH_KEYWORDS,
          Doc string},
        {NULL, NULL, 0, NULL} /* Sentinel */
    }
    
Each entry in the mymethods array is a `PyMethodDef` structure containing 1) the Python name, 2) the C-function that implements the function, 3) flags indicating whether or not keywords are accepted for this function, and 4) The docstring for the function. Any number of functions may be defined for a single module by adding more entries to this table. The last entry must be all NULL as shown to act as a sentinel. Python looks for this entry to know that all of the functions for the module have been defined.
The last thing that must be done to finish the extension module is to actually write the code that performs the desired functions. There are two kinds of functions: those that don’t accept keyword arguments, and those that do.
### Functions without keyword arguments
Functions that don’t accept keyword arguments should be written as:
    
    static PyObject*
    nokeyword_cfunc (PyObject *dummy, PyObject *args)
    {
        /* convert Python arguments */
        /* do function */
        /* return something */
    }
    
The dummy argument is not used in this context and can be safely ignored. The args argument contains all of the arguments passed in to the function as a tuple. You can do anything you want at this point, but usually the easiest way to manage the input arguments is to call `PyArg_ParseTuple` (args, format_string, addresses_to_C_variables…) or `PyArg_UnpackTuple` (tuple, “name”, min, max, …). A good description of how to use the first function is contained in the Python C-API reference manual under section 5.5 (Parsing arguments and building values). You should pay particular attention to the “O&” format which uses converter functions to go between the Python object and the C object. All of the other format functions can be (mostly) thought of as special cases of this general rule. There are several converter functions defined in the NumPy C-API that may be of use. In particular, the `PyArray_DescrConverter` function is very useful to support arbitrary data-type specification. This function transforms any valid data-type Python object into a PyArray_Descr* object. Remember to pass in the address of the C-variables that should be filled in.
There are lots of examples of how to use `PyArg_ParseTuple` throughout the NumPy source code. The standard usage is like this:
    
    PyObject *input;
    PyArray_Descr *dtype;
    if (!PyArg_ParseTuple(args, "OO&", &input,
                          PyArray_DescrConverter,
                          &dtype)) return NULL;
    
It is important to keep in mind that you get a borrowed reference to the object when using the “O” format string. However, the converter functions usually require some form of memory handling. In this example, if the conversion is successful, dtype will hold a new reference to a PyArray_Descr* object, while input will hold a borrowed reference. Therefore, if this conversion were mixed with another conversion (say to an integer) and the data-type conversion was successful but the integer conversion failed, then you would need to release the reference count to the data-type object before returning. A typical way to do this is to set dtype to `NULL` before calling `PyArg_ParseTuple` and then use `Py_XDECREF` on dtype before returning.
After the input arguments are processed, the code that actually does the work is written (likely calling other functions as needed). The final step of the C-function is to return something. If an error is encountered then `NULL` should be returned (making sure an error has actually been set). If nothing should be returned then increment `Py_None` and return it. If a single object should be returned then it is returned (ensuring that you own a reference to it first). If multiple objects should be returned then you need to return a tuple. The `Py_BuildValue` (format_string, c_variables…) function makes it easy to build tuples of Python objects from C variables. Pay special attention to the difference between ‘N’ and ‘O’ in the format string or you can easily create memory leaks. The ‘O’ format string increments the reference count of the PyObject* C-variable it corresponds to, while the ‘N’ format string steals a reference to the corresponding PyObject* C-variable. You should use ‘N’ if you have already created a reference for the object and just want to give that reference to the tuple. You should use ‘O’ if you only have a borrowed reference to an object and need to create one to provide for the tuple.
### Functions with keyword arguments
These functions are very similar to functions without keyword arguments. The only difference is that the function signature is:
    
    static PyObject*
    keyword_cfunc (PyObject *dummy, PyObject *args, PyObject *kwds)
    {
    ...
    }
    
The kwds argument holds a Python dictionary whose keys are the names of the keyword arguments and whose values are the corresponding keyword-argument values. This dictionary can be processed however you see fit. The easiest way to handle it, however, is to replace the `PyArg_ParseTuple` (args, format_string, addresses…) function with a call to `PyArg_ParseTupleAndKeywords` (args, kwds, format_string, char *kwlist[], addresses…). The kwlist parameter to this function is a `NULL` -terminated array of strings providing the expected keyword arguments. There should be one string for each entry in the format_string. Using this function will raise a TypeError if invalid keyword arguments are passed in.
For more help on this function please see section 1.8 (Keyword Parameters for Extension Functions) of the Extending and Embedding tutorial in the Python documentation.
### Reference counting
The biggest difficulty when writing extension modules is reference counting. It is an important reason for the popularity of f2py, weave, Cython, ctypes, etc…. If you mis-handle reference counts you can get problems from memory-leaks to segmentation faults. The only strategy I know of to handle reference counts correctly is blood, sweat, and tears. First, you force it into your head that every Python variable has a reference count. Then, you understand exactly what each function does to the reference count of your objects, so that you can properly use DECREF and INCREF when you need them. Reference counting can really test the amount of patience and diligence you have towards your programming craft. Despite the grim depiction, most cases of reference counting are quite straightforward with the most common difficulty being not using DECREF on objects before exiting early from a routine due to some error. In second place, is the common error of not owning the reference on an object that is passed to a function or macro that is going to steal the reference ( e.g. `PyTuple_SET_ITEM`, and most functions that take `PyArray_Descr` objects).
Typically you get a new reference to a variable when it is created or is the return value of some function (there are some prominent exceptions, however — such as getting an item out of a tuple or a dictionary). When you own the reference, you are responsible to make sure that `Py_DECREF` (var) is called when the variable is no longer necessary (and no other function has “stolen” its reference). Also, if you are passing a Python object to a function that will “steal” the reference, then you need to make sure you own it (or use `Py_INCREF` to get your own reference). You will also encounter the notion of borrowing a reference. A function that borrows a reference does not alter the reference count of the object and does not expect to “hold on “to the reference. It’s just going to use the object temporarily. When you use `PyArg_ParseTuple` or `PyArg_UnpackTuple` you receive a borrowed reference to the objects in the tuple and should not alter their reference count inside your function. With practice, you can learn to get reference counting right, but it can be frustrating at first.
One common source of reference-count errors is the `Py_BuildValue` function. Pay careful attention to the difference between the ‘N’ format character and the ‘O’ format character. If you create a new object in your subroutine (such as an output array), and you are passing it back in a tuple of return values, then you should most- likely use the ‘N’ format character in `Py_BuildValue`. The ‘O’ character will increase the reference count by one. This will leave the caller with two reference counts for a brand-new array. When the variable is deleted and the reference count decremented by one, there will still be that extra reference count, and the array will never be deallocated. You will have a reference-counting induced memory leak. Using the ‘N’ character will avoid this situation as it will return to the caller an object (inside the tuple) with a single reference count.
## Dealing with array objects
Most extension modules for NumPy will need to access the memory for an ndarray object (or one of it’s sub-classes). The easiest way to do this doesn’t require you to know much about the internals of NumPy. The method is to
  1. Ensure you are dealing with a well-behaved array (aligned, in machine byte-order and single-segment) of the correct type and number of dimensions.
     1. By converting it from some Python object using `PyArray_FromAny` or a macro built on it.
     2. By constructing a new ndarray of your desired shape and type using `PyArray_NewFromDescr` or a simpler macro or function based on it.
  2. Get the shape of the array and a pointer to its actual data.
  3. Pass the data and shape information on to a subroutine or other section of code that actually performs the computation.
  4. If you are writing the algorithm, then I recommend that you use the stride information contained in the array to access the elements of the array (the `PyArray_GetPtr` macros make this painless). Then, you can relax your requirements so as not to force a single-segment array and the data-copying that might result.


Each of these sub-topics is covered in the following sub-sections.
### Converting an arbitrary sequence object
The main routine for obtaining an array from any Python object that can be converted to an array is `PyArray_FromAny`. This function is very flexible with many input arguments. Several macros make it easier to use the basic function. `PyArray_FROM_OTF` is arguably the most useful of these macros for the most common uses. It allows you to convert an arbitrary Python object to an array of a specific builtin data-type ( e.g. float), while specifying a particular set of requirements ( e.g. contiguous, aligned, and writeable). The syntax is
`PyArray_FROM_OTF`
    
Return an ndarray from any Python object, obj, that can be converted to an array. The number of dimensions in the returned array is determined by the object. The desired data-type of the returned array is provided in typenum which should be one of the enumerated types. The requirements for the returned array can be any combination of standard array flags. Each of these arguments is explained in more detail below. You receive a new reference to the array on success. On failure, `NULL` is returned and an exception is set.
obj
    
The object can be any Python object convertible to an ndarray. If the object is already (a subclass of) the ndarray that satisfies the requirements then a new reference is returned. Otherwise, a new array is constructed. The contents of obj are copied to the new array unless the array interface is used so that data does not have to be copied. Objects that can be converted to an array include: 1) any nested sequence object, 2) any object exposing the array interface, 3) any object with an `__array__` method (which should return an ndarray), and 4) any scalar object (becomes a zero-dimensional array). Sub-classes of the ndarray that otherwise fit the requirements will be passed through. If you want to ensure a base-class ndarray, then use `NPY_ARRAY_ENSUREARRAY` in the requirements flag. A copy is made only if necessary. If you want to guarantee a copy, then pass in `NPY_ARRAY_ENSURECOPY` to the requirements flag.
typenum
    
One of the enumerated types or `NPY_NOTYPE` if the data-type should be determined from the object itself. The C-based names can be used:
`NPY_BOOL`, `NPY_BYTE`, `NPY_UBYTE`, `NPY_SHORT`, `NPY_USHORT`, `NPY_INT`, `NPY_UINT`, `NPY_LONG`, `NPY_ULONG`, `NPY_LONGLONG`, `NPY_ULONGLONG`, `NPY_DOUBLE`, `NPY_LONGDOUBLE`, `NPY_CFLOAT`, `NPY_CDOUBLE`, `NPY_CLONGDOUBLE`, `NPY_OBJECT`.
Alternatively, the bit-width names can be used as supported on the platform. For example:
`NPY_INT8`, `NPY_INT16`, `NPY_INT32`, `NPY_INT64`, `NPY_UINT8`, `NPY_UINT16`, `NPY_UINT32`, `NPY_UINT64`, `NPY_FLOAT32`, `NPY_FLOAT64`, `NPY_COMPLEX64`, `NPY_COMPLEX128`.
The object will be converted to the desired type only if it can be done without losing precision. Otherwise `NULL` will be returned and an error raised. Use `NPY_ARRAY_FORCECAST` in the requirements flag to override this behavior.
requirements
    
The memory model for an ndarray admits arbitrary strides in each dimension to advance to the next element of the array. Often, however, you need to interface with code that expects a C-contiguous or a Fortran-contiguous memory layout. In addition, an ndarray can be misaligned (the address of an element is not at an integral multiple of the size of the element) which can cause your program to crash (or at least work more slowly) if you try and dereference a pointer into the array data. Both of these problems can be solved by converting the Python object into an array that is more “well-behaved” for your specific usage.
The requirements flag allows specification of what kind of array is acceptable. If the object passed in does not satisfy this requirements then a copy is made so that the returned object will satisfy the requirements. these ndarray can use a very generic pointer to memory. This flag allows specification of the desired properties of the returned array object. All of the flags are explained in the detailed API chapter. The flags most commonly needed are `NPY_ARRAY_IN_ARRAY`, `NPY_ARRAY_OUT_ARRAY`, and `NPY_ARRAY_INOUT_ARRAY`:
`NPY_ARRAY_IN_ARRAY`
    
This flag is useful for arrays that must be in C-contiguous order and aligned. These kinds of arrays are usually input arrays for some algorithm.
`NPY_ARRAY_OUT_ARRAY`
    
This flag is useful to specify an array that is in C-contiguous order, is aligned, and can be written to as well. Such an array is usually returned as output (although normally such output arrays are created from scratch).
`NPY_ARRAY_INOUT_ARRAY`
    
This flag is useful to specify an array that will be used for both input and output. `PyArray_ResolveWritebackIfCopy` must be called before `Py_DECREF` at the end of the interface routine to write back the temporary data into the original array passed in. Use of the `NPY_ARRAY_WRITEBACKIFCOPY` flag requires that the input object is already an array (because other objects cannot be automatically updated in this fashion). If an error occurs use `PyArray_DiscardWritebackIfCopy` (obj) on an array with these flags set. This will set the underlying base array writable without causing the contents to be copied back into the original array.
Other useful flags that can be OR’d as additional requirements are:
`NPY_ARRAY_FORCECAST`
    
Cast to the desired type, even if it can’t be done without losing information.
`NPY_ARRAY_ENSURECOPY`
    
Make sure the resulting array is a copy of the original.
`NPY_ARRAY_ENSUREARRAY`
    
Make sure the resulting object is an actual ndarray and not a sub- class.
Note
Whether or not an array is byte-swapped is determined by the data-type of the array. Native byte-order arrays are always requested by `PyArray_FROM_OTF` and so there is no need for a `NPY_ARRAY_NOTSWAPPED` flag in the requirements argument. There is also no way to get a byte-swapped array from this routine.
### Creating a brand-new ndarray
Quite often, new arrays must be created from within extension-module code. Perhaps an output array is needed and you don’t want the caller to have to supply it. Perhaps only a temporary array is needed to hold an intermediate calculation. Whatever the need there are simple ways to get an ndarray object of whatever data-type is needed. The most general function for doing this is `PyArray_NewFromDescr`. All array creation functions go through this heavily re-used code. Because of its flexibility, it can be somewhat confusing to use. As a result, simpler forms exist that are easier to use. These forms are part of the `PyArray_SimpleNew` family of functions, which simplify the interface by providing default values for common use cases.
### Getting at ndarray memory and accessing elements of the ndarray
If obj is an ndarray (PyArrayObject*), then the data-area of the ndarray is pointed to by the void* pointer `PyArray_DATA` (obj) or the char* pointer `PyArray_BYTES` (obj). Remember that (in general) this data-area may not be aligned according to the data-type, it may represent byte-swapped data, and/or it may not be writeable. If the data area is aligned and in native byte-order, then how to get at a specific element of the array is determined only by the array of npy_intp variables, `PyArray_STRIDES` (obj). In particular, this c-array of integers shows how many bytes must be added to the current element pointer to get to the next element in each dimension. For arrays less than 4-dimensions there are `PyArray_GETPTR{k}` (obj, …) macros where {k} is the integer 1, 2, 3, or 4 that make using the array strides easier. The arguments …. represent {k} non- negative integer indices into the array. For example, suppose `E` is a 3-dimensional ndarray. A (void*) pointer to the element `E[i,j,k]` is obtained as `PyArray_GETPTR3` (E, i, j, k).
As explained previously, C-style contiguous arrays and Fortran-style contiguous arrays have particular striding patterns. Two array flags (`NPY_ARRAY_C_CONTIGUOUS` and `NPY_ARRAY_F_CONTIGUOUS`) indicate whether or not the striding pattern of a particular array matches the C-style contiguous or Fortran-style contiguous or neither. Whether or not the striding pattern matches a standard C or Fortran one can be tested Using `PyArray_IS_C_CONTIGUOUS` (obj) and `PyArray_ISFORTRAN` (obj) respectively. Most third-party libraries expect contiguous arrays. But, often it is not difficult to support general-purpose striding. I encourage you to use the striding information in your own code whenever possible, and reserve single-segment requirements for wrapping third-party code. Using the striding information provided with the ndarray rather than requiring a contiguous striding reduces copying that otherwise must be made.
## Example
The following example shows how you might write a wrapper that accepts two input arguments (that will be converted to an array) and an output argument (that must be an array). The function returns None and updates the output array. Note the updated use of WRITEBACKIFCOPY semantics for NumPy v1.14 and above
    
    static PyObject *
    example_wrapper(PyObject *dummy, PyObject *args)
    {
        PyObject *arg1=NULL, *arg2=NULL, *out=NULL;
        PyObject *arr1=NULL, *arr2=NULL, *oarr=NULL;
    
        if (!PyArg_ParseTuple(args, "OOO!", &arg1, &arg2,
            &PyArray_Type, &out)) return NULL;
    
        arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);
        if (arr1 == NULL) return NULL;
        arr2 = PyArray_FROM_OTF(arg2, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);
        if (arr2 == NULL) goto fail;
    #if NPY_API_VERSION >= 0x0000000c
        oarr = PyArray_FROM_OTF(out, NPY_DOUBLE, NPY_ARRAY_INOUT_ARRAY2);
    #else
        oarr = PyArray_FROM_OTF(out, NPY_DOUBLE, NPY_ARRAY_INOUT_ARRAY);
    #endif
        if (oarr == NULL) goto fail;
    
        /* code that makes use of arguments */
        /* You will probably need at least
           nd = PyArray_NDIM(<..>)    -- number of dimensions
           dims = PyArray_DIMS(<..>)  -- npy_intp array of length nd
                                         showing length in each dim.
           dptr = (double *)PyArray_DATA(<..>) -- pointer to data.
    
           If an error occurs goto fail.
         */
    
        Py_DECREF(arr1);
        Py_DECREF(arr2);
    #if NPY_API_VERSION >= 0x0000000c
        PyArray_ResolveWritebackIfCopy(oarr);
    #endif
        Py_DECREF(oarr);
        Py_INCREF(Py_None);
        return Py_None;
    
     fail:
        Py_XDECREF(arr1);
        Py_XDECREF(arr2);
    #if NPY_API_VERSION >= 0x0000000c
        PyArray_DiscardWritebackIfCopy(oarr);
    #endif
        Py_XDECREF(oarr);
        return NULL;
    }
    
# Using NumPy C-API
  * How to extend NumPy
    * Writing an extension module
    * Required subroutine
    * Defining functions
      * Functions without keyword arguments
      * Functions with keyword arguments
      * Reference counting
    * Dealing with array objects
      * Converting an arbitrary sequence object
      * Creating a brand-new ndarray
      * Getting at ndarray memory and accessing elements of the ndarray
    * Example
  * Using Python as glue
    * Calling other compiled libraries from Python
    * Hand-generated wrappers
    * F2PY
    * Cython
      * Complex addition in Cython
      * Image filter in Cython
      * Conclusion
    * ctypes
      * Having a shared library
      * Loading the shared library
      * Converting arguments
      * Calling the function
        * `ndpointer`
      * Complete example
      * Conclusion
    * Additional tools you may find useful
      * SWIG
      * SIP
      * Boost Python
      * Pyfort
  * Writing your own ufunc
    * Creating a new universal function
    * Example non-ufunc extension
    * Example NumPy ufunc for one dtype
    * Example NumPy ufunc with multiple dtypes
    * Example NumPy ufunc with multiple arguments/return values
    * Example NumPy ufunc with structured array dtype arguments
  * Beyond the basics
    * Iterating over elements in the array
      * Basic iteration
      * Iterating over all but one axis
      * Iterating over multiple arrays
      * Broadcasting over multiple arrays
    * User-defined data-types
      * Adding the new data-type
      * Registering a casting function
      * Registering coercion rules
      * Registering a ufunc loop
    * Subtyping the ndarray in C
      * Creating sub-types
      * Specific features of ndarray sub-typing
        * The __array_finalize__ method
          * `ndarray.__array_finalize__`
        * The __array_priority__ attribute
          * `ndarray.__array_priority__`
        * The __array_wrap__ method
          * `ndarray.__array_wrap__`


# Using Python as glue
Warning
This was written in 2008 as part of the original Guide to NumPy book by Travis E. Oliphant and is out of date.
Many people like to say that Python is a fantastic glue language. Hopefully, this Chapter will convince you that this is true. The first adopters of Python for science were typically people who used it to glue together large application codes running on super-computers. Not only was it much nicer to code in Python than in a shell script or Perl, in addition, the ability to easily extend Python made it relatively easy to create new classes and types specifically adapted to the problems being solved. From the interactions of these early contributors, Numeric emerged as an array-like object that could be used to pass data between these applications.
As Numeric has matured and developed into NumPy, people have been able to write more code directly in NumPy. Often this code is fast-enough for production use, but there are still times that there is a need to access compiled code. Either to get that last bit of efficiency out of the algorithm or to make it easier to access widely-available codes written in C/C++ or Fortran.
This chapter will review many of the tools that are available for the purpose of accessing code written in other compiled languages. There are many resources available for learning to call other compiled libraries from Python and the purpose of this Chapter is not to make you an expert. The main goal is to make you aware of some of the possibilities so that you will know what to “Google” in order to learn more.
## Calling other compiled libraries from Python
While Python is a great language and a pleasure to code in, its dynamic nature results in overhead that can cause some code ( i.e. raw computations inside of for loops) to be up 10-100 times slower than equivalent code written in a static compiled language. In addition, it can cause memory usage to be larger than necessary as temporary arrays are created and destroyed during computation. For many types of computing needs, the extra slow-down and memory consumption can often not be spared (at least for time- or memory- critical portions of your code). Therefore one of the most common needs is to call out from Python code to a fast, machine-code routine (e.g. compiled using C/C++ or Fortran). The fact that this is relatively easy to do is a big reason why Python is such an excellent high-level language for scientific and engineering programming.
There are two basic approaches to calling compiled code: writing an extension module that is then imported to Python using the import command, or calling a shared-library subroutine directly from Python using the ctypes module. Writing an extension module is the most common method.
Warning
Calling C-code from Python can result in Python crashes if you are not careful. None of the approaches in this chapter are immune. You have to know something about the way data is handled by both NumPy and by the third-party library being used.
## Hand-generated wrappers
Extension modules were discussed in Writing an extension module. The most basic way to interface with compiled code is to write an extension module and construct a module method that calls the compiled code. For improved readability, your method should take advantage of the `PyArg_ParseTuple` call to convert between Python objects and C data-types. For standard C data-types there is probably already a built-in converter. For others you may need to write your own converter and use the `"O&"` format string which allows you to specify a function that will be used to perform the conversion from the Python object to whatever C-structures are needed.
Once the conversions to the appropriate C-structures and C data-types have been performed, the next step in the wrapper is to call the underlying function. This is straightforward if the underlying function is in C or C++. However, in order to call Fortran code you must be familiar with how Fortran subroutines are called from C/C++ using your compiler and platform. This can vary somewhat platforms and compilers (which is another reason f2py makes life much simpler for interfacing Fortran code) but generally involves underscore mangling of the name and the fact that all variables are passed by reference (i.e. all arguments are pointers).
The advantage of the hand-generated wrapper is that you have complete control over how the C-library gets used and called which can lead to a lean and tight interface with minimal over-head. The disadvantage is that you have to write, debug, and maintain C-code, although most of it can be adapted using the time-honored technique of “cutting-pasting-and-modifying” from other extension modules. Because the procedure of calling out to additional C-code is fairly regimented, code-generation procedures have been developed to make this process easier. One of these code-generation techniques is distributed with NumPy and allows easy integration with Fortran and (simple) C code. This package, f2py, will be covered briefly in the next section.
## F2PY
F2PY allows you to automatically construct an extension module that interfaces to routines in Fortran 77/90/95 code. It has the ability to parse Fortran 77/90/95 code and automatically generate Python signatures for the subroutines it encounters, or you can guide how the subroutine interfaces with Python by constructing an interface-definition-file (or modifying the f2py-produced one).
See the F2PY documentation for more information and examples.
The f2py method of linking compiled code is currently the most sophisticated and integrated approach. It allows clean separation of Python with compiled code while still allowing for separate distribution of the extension module. The only draw-back is that it requires the existence of a Fortran compiler in order for a user to install the code. However, with the existence of the free-compilers g77, gfortran, and g95, as well as high-quality commercial compilers, this restriction is not particularly onerous. In our opinion, Fortran is still the easiest way to write fast and clear code for scientific computing. It handles complex numbers, and multi-dimensional indexing in the most straightforward way. Be aware, however, that some Fortran compilers will not be able to optimize code as well as good hand- written C-code.
## Cython
Cython is a compiler for a Python dialect that adds (optional) static typing for speed, and allows mixing C or C++ code into your modules. It produces C or C++ extensions that can be compiled and imported in Python code.
If you are writing an extension module that will include quite a bit of your own algorithmic code as well, then Cython is a good match. Among its features is the ability to easily and quickly work with multidimensional arrays.
Notice that Cython is an extension-module generator only. Unlike f2py, it includes no automatic facility for compiling and linking the extension module (which must be done in the usual fashion). It does provide a modified distutils class called `build_ext` which lets you build an extension module from a `.pyx` source. Thus, you could write in a `setup.py` file:
    
    from Cython.Distutils import build_ext
    from distutils.extension import Extension
    from distutils.core import setup
    import numpy
    
    setup(name='mine', description='Nothing',
          ext_modules=[Extension('filter', ['filter.pyx'],
                                 include_dirs=[numpy.get_include()])],
          cmdclass = {'build_ext':build_ext})
    
Adding the NumPy include directory is, of course, only necessary if you are using NumPy arrays in the extension module (which is what we assume you are using Cython for). The distutils extensions in NumPy also include support for automatically producing the extension-module and linking it from a `.pyx` file. It works so that if the user does not have Cython installed, then it looks for a file with the same file-name but a `.c` extension which it then uses instead of trying to produce the `.c` file again.
If you just use Cython to compile a standard Python module, then you will get a C extension module that typically runs a bit faster than the equivalent Python module. Further speed increases can be gained by using the `cdef` keyword to statically define C variables.
Let’s look at two examples we’ve seen before to see how they might be implemented using Cython. These examples were compiled into extension modules using Cython 0.21.1.
### Complex addition in Cython
Here is part of a Cython module named `add.pyx` which implements the complex addition functions we previously implemented using f2py:
    
    cimport cython
    cimport numpy as np
    import numpy as np
    
    # We need to initialize NumPy.
    np.import_array()
    
    #@cython.boundscheck(False)
    def zadd(in1, in2):
        cdef double complex[:] a = in1.ravel()
        cdef double complex[:] b = in2.ravel()
    
        out = np.empty(a.shape[0], np.complex64)
        cdef double complex[:] c = out.ravel()
    
        for i in range(c.shape[0]):
            c[i].real = a[i].real + b[i].real
            c[i].imag = a[i].imag + b[i].imag
    
        return out
    
This module shows use of the `cimport` statement to load the definitions from the `numpy.pxd` header that ships with Cython. It looks like NumPy is imported twice; `cimport` only makes the NumPy C-API available, while the regular `import` causes a Python-style import at runtime and makes it possible to call into the familiar NumPy Python API.
The example also demonstrates Cython’s “typed memoryviews”, which are like NumPy arrays at the C level, in the sense that they are shaped and strided arrays that know their own extent (unlike a C array addressed through a bare pointer). The syntax `double complex[:]` denotes a one-dimensional array (vector) of doubles, with arbitrary strides. A contiguous array of ints would be `int[::1]`, while a matrix of floats would be `float[:, :]`.
Shown commented is the `cython.boundscheck` decorator, which turns bounds-checking for memory view accesses on or off on a per-function basis. We can use this to further speed up our code, at the expense of safety (or a manual check prior to entering the loop).
Other than the view syntax, the function is immediately readable to a Python programmer. Static typing of the variable `i` is implicit. Instead of the view syntax, we could also have used Cython’s special NumPy array syntax, but the view syntax is preferred.
### Image filter in Cython
The two-dimensional example we created using Fortran is just as easy to write in Cython:
    
    cimport numpy as np
    import numpy as np
    
    np.import_array()
    
    def filter(img):
        cdef double[:, :] a = np.asarray(img, dtype=np.double)
        out = np.zeros(img.shape, dtype=np.double)
        cdef double[:, ::1] b = out
    
        cdef np.npy_intp i, j
    
        for i in range(1, a.shape[0] - 1):
            for j in range(1, a.shape[1] - 1):
                b[i, j] = (a[i, j]
                           + .5 * (  a[i-1, j] + a[i+1, j]
                                   + a[i, j-1] + a[i, j+1])
                           + .25 * (  a[i-1, j-1] + a[i-1, j+1]
                                    + a[i+1, j-1] + a[i+1, j+1]))
    
        return out
    
This 2-d averaging filter runs quickly because the loop is in C and the pointer computations are done only as needed. If the code above is compiled as a module `image`, then a 2-d image, `img`, can be filtered using this code very quickly using:
    
    import image
    out = image.filter(img)
    
Regarding the code, two things are of note: firstly, it is impossible to return a memory view to Python. Instead, a NumPy array `out` is first created, and then a view `b` onto this array is used for the computation. Secondly, the view `b` is typed `double[:, ::1]`. This means 2-d array with contiguous rows, i.e., C matrix order. Specifying the order explicitly can speed up some algorithms since they can skip stride computations.
### Conclusion
Cython is the extension mechanism of choice for several scientific Python libraries, including Scipy, Pandas, SAGE, scikit-image and scikit-learn, as well as the XML processing library LXML. The language and compiler are well-maintained.
There are several disadvantages of using Cython:
  1. When coding custom algorithms, and sometimes when wrapping existing C libraries, some familiarity with C is required. In particular, when using C memory management (`malloc` and friends), it’s easy to introduce memory leaks. However, just compiling a Python module renamed to `.pyx` can already speed it up, and adding a few type declarations can give dramatic speedups in some code.
  2. It is easy to lose a clean separation between Python and C which makes re-using your C-code for other non-Python-related projects more difficult.
  3. The C-code generated by Cython is hard to read and modify (and typically compiles with annoying but harmless warnings).


One big advantage of Cython-generated extension modules is that they are easy to distribute. In summary, Cython is a very capable tool for either gluing C code or generating an extension module quickly and should not be over-looked. It is especially useful for people that can’t or won’t write C or Fortran code.
## ctypes
ctypes is a Python extension module, included in the stdlib, that allows you to call an arbitrary function in a shared library directly from Python. This approach allows you to interface with C-code directly from Python. This opens up an enormous number of libraries for use from Python. The drawback, however, is that coding mistakes can lead to ugly program crashes very easily (just as can happen in C) because there is little type or bounds checking done on the parameters. This is especially true when array data is passed in as a pointer to a raw memory location. The responsibility is then on you that the subroutine will not access memory outside the actual array area. But, if you don’t mind living a little dangerously ctypes can be an effective tool for quickly taking advantage of a large shared library (or writing extended functionality in your own shared library).
Because the ctypes approach exposes a raw interface to the compiled code it is not always tolerant of user mistakes. Robust use of the ctypes module typically involves an additional layer of Python code in order to check the data types and array bounds of objects passed to the underlying subroutine. This additional layer of checking (not to mention the conversion from ctypes objects to C-data-types that ctypes itself performs), will make the interface slower than a hand-written extension-module interface. However, this overhead should be negligible if the C-routine being called is doing any significant amount of work. If you are a great Python programmer with weak C skills, ctypes is an easy way to write a useful interface to a (shared) library of compiled code.
To use ctypes you must
  1. Have a shared library.
  2. Load the shared library.
  3. Convert the Python objects to ctypes-understood arguments.
  4. Call the function from the library with the ctypes arguments.


### Having a shared library
There are several requirements for a shared library that can be used with ctypes that are platform specific. This guide assumes you have some familiarity with making a shared library on your system (or simply have a shared library available to you). Items to remember are:
  * A shared library must be compiled in a special way ( e.g. using the `-shared` flag with gcc).
  * On some platforms (e.g. Windows), a shared library requires a .def file that specifies the functions to be exported. For example a mylib.def file might contain:
        LIBRARY mylib.dll
        EXPORTS
        cool_function1
        cool_function2
        
Alternatively, you may be able to use the storage-class specifier `__declspec(dllexport)` in the C-definition of the function to avoid the need for this `.def` file.


There is no standard way in Python distutils to create a standard shared library (an extension module is a “special” shared library Python understands) in a cross-platform manner. Thus, a big disadvantage of ctypes at the time of writing this book is that it is difficult to distribute in a cross-platform manner a Python extension that uses ctypes and includes your own code which should be compiled as a shared library on the users system.
### Loading the shared library
A simple, but robust way to load the shared library is to get the absolute path name and load it using the cdll object of ctypes:
    
    lib = ctypes.cdll[<full_path_name>]
    
However, on Windows accessing an attribute of the `cdll` method will load the first DLL by that name found in the current directory or on the PATH. Loading the absolute path name requires a little finesse for cross-platform work since the extension of shared libraries varies. There is a `ctypes.util.find_library` utility available that can simplify the process of finding the library to load but it is not foolproof. Complicating matters, different platforms have different default extensions used by shared libraries (e.g. .dll – Windows, .so – Linux, .dylib – Mac OS X). This must also be taken into account if you are using ctypes to wrap code that needs to work on several platforms.
NumPy provides a convenience function called `ctypeslib.load_library` (name, path). This function takes the name of the shared library (including any prefix like ‘lib’ but excluding the extension) and a path where the shared library can be located. It returns a ctypes library object or raises an `OSError` if the library cannot be found or raises an `ImportError` if the ctypes module is not available. (Windows users: the ctypes library object loaded using `load_library` is always loaded assuming cdecl calling convention. See the ctypes documentation under `ctypes.windll` and/or `ctypes.oledll` for ways to load libraries under other calling conventions).
The functions in the shared library are available as attributes of the ctypes library object (returned from `ctypeslib.load_library`) or as items using `lib['func_name']` syntax. The latter method for retrieving a function name is particularly useful if the function name contains characters that are not allowable in Python variable names.
### Converting arguments
Python ints/longs, strings, and unicode objects are automatically converted as needed to equivalent ctypes arguments The None object is also converted automatically to a NULL pointer. All other Python objects must be converted to ctypes-specific types. There are two ways around this restriction that allow ctypes to integrate with other objects.
  1. Don’t set the argtypes attribute of the function object and define an `_as_parameter_` method for the object you want to pass in. The `_as_parameter_` method must return a Python int which will be passed directly to the function.
  2. Set the argtypes attribute to a list whose entries contain objects with a classmethod named from_param that knows how to convert your object to an object that ctypes can understand (an int/long, string, unicode, or object with the `_as_parameter_` attribute).


NumPy uses both methods with a preference for the second method because it can be safer. The ctypes attribute of the ndarray returns an object that has an `_as_parameter_` attribute which returns an integer representing the address of the ndarray to which it is associated. As a result, one can pass this ctypes attribute object directly to a function expecting a pointer to the data in your ndarray. The caller must be sure that the ndarray object is of the correct type, shape, and has the correct flags set or risk nasty crashes if the data-pointer to inappropriate arrays are passed in.
To implement the second method, NumPy provides the class-factory function `ndpointer` in the `numpy.ctypeslib` module. This class-factory function produces an appropriate class that can be placed in an argtypes attribute entry of a ctypes function. The class will contain a from_param method which ctypes will use to convert any ndarray passed in to the function to a ctypes-recognized object. In the process, the conversion will perform checking on any properties of the ndarray that were specified by the user in the call to `ndpointer`. Aspects of the ndarray that can be checked include the data-type, the number-of-dimensions, the shape, and/or the state of the flags on any array passed. The return value of the from_param method is the ctypes attribute of the array which (because it contains the `_as_parameter_` attribute pointing to the array data area) can be used by ctypes directly.
The ctypes attribute of an ndarray is also endowed with additional attributes that may be convenient when passing additional information about the array into a ctypes function. The attributes data, shape, and strides can provide ctypes compatible types corresponding to the data-area, the shape, and the strides of the array. The data attribute returns a `c_void_p` representing a pointer to the data area. The shape and strides attributes each return an array of ctypes integers (or None representing a NULL pointer, if a 0-d array). The base ctype of the array is a ctype integer of the same size as a pointer on the platform. There are also methods `data_as({ctype})`, `shape_as(<base ctype>)`, and `strides_as(<base ctype>)`. These return the data as a ctype object of your choice and the shape/strides arrays using an underlying base type of your choice. For convenience, the `ctypeslib` module also contains `c_intp` as a ctypes integer data-type whose size is the same as the size of `c_void_p` on the platform (its value is None if ctypes is not installed).
### Calling the function
The function is accessed as an attribute of or an item from the loaded shared-library. Thus, if `./mylib.so` has a function named `cool_function1`, it may be accessed either as:
    
    lib = numpy.ctypeslib.load_library('mylib','.')
    func1 = lib.cool_function1  # or equivalently
    func1 = lib['cool_function1']
    
In ctypes, the return-value of a function is set to be ‘int’ by default. This behavior can be changed by setting the restype attribute of the function. Use None for the restype if the function has no return value (‘void’):
    
    func1.restype = None
    
As previously discussed, you can also set the argtypes attribute of the function in order to have ctypes check the types of the input arguments when the function is called. Use the `ndpointer` factory function to generate a ready-made class for data-type, shape, and flags checking on your new function. The `ndpointer` function has the signature
ndpointer(dtype=None, ndim=None, shape=None, flags=None)
    
Keyword arguments with the value `None` are not checked. Specifying a keyword enforces checking of that aspect of the ndarray on conversion to a ctypes-compatible object. The dtype keyword can be any object understood as a data-type object. The ndim keyword should be an integer, and the shape keyword should be an integer or a sequence of integers. The flags keyword specifies the minimal flags that are required on any array passed in. This can be specified as a string of comma separated requirements, an integer indicating the requirement bits OR’d together, or a flags object returned from the flags attribute of an array with the necessary requirements.
Using an ndpointer class in the argtypes method can make it significantly safer to call a C function using ctypes and the data- area of an ndarray. You may still want to wrap the function in an additional Python wrapper to make it user-friendly (hiding some obvious arguments and making some arguments output arguments). In this process, the `requires` function in NumPy may be useful to return the right kind of array from a given input.
### Complete example
In this example, we will demonstrate how the addition function and the filter function implemented previously using the other approaches can be implemented using ctypes. First, the C code which implements the algorithms contains the functions `zadd`, `dadd`, `sadd`, `cadd`, and `dfilter2d`. The `zadd` function is:
    
    /* Add arrays of contiguous data */
    typedef struct {double real; double imag;} cdouble;
    typedef struct {float real; float imag;} cfloat;
    void zadd(cdouble *a, cdouble *b, cdouble *c, long n)
    {
        while (n--) {
            c->real = a->real + b->real;
            c->imag = a->imag + b->imag;
            a++; b++; c++;
        }
    }
    
with similar code for `cadd`, `dadd`, and `sadd` that handles complex float, double, and float data-types, respectively:
    
    void cadd(cfloat *a, cfloat *b, cfloat *c, long n)
    {
            while (n--) {
                    c->real = a->real + b->real;
                    c->imag = a->imag + b->imag;
                    a++; b++; c++;
            }
    }
    void dadd(double *a, double *b, double *c, long n)
    {
            while (n--) {
                    *c++ = *a++ + *b++;
            }
    }
    void sadd(float *a, float *b, float *c, long n)
    {
            while (n--) {
                    *c++ = *a++ + *b++;
            }
    }
    
The `code.c` file also contains the function `dfilter2d`:
    
    /*
     * Assumes b is contiguous and has strides that are multiples of
     * sizeof(double)
     */
    void
    dfilter2d(double *a, double *b, ssize_t *astrides, ssize_t *dims)
    {
        ssize_t i, j, M, N, S0, S1;
        ssize_t r, c, rm1, rp1, cp1, cm1;
    
        M = dims[0]; N = dims[1];
        S0 = astrides[0]/sizeof(double);
        S1 = astrides[1]/sizeof(double);
        for (i = 1; i < M - 1; i++) {
            r = i*S0;
            rp1 = r + S0;
            rm1 = r - S0;
            for (j = 1; j < N - 1; j++) {
                c = j*S1;
                cp1 = j + S1;
                cm1 = j - S1;
                b[i*N + j] = a[r + c] +
                    (a[rp1 + c] + a[rm1 + c] +
                     a[r + cp1] + a[r + cm1])*0.5 +
                    (a[rp1 + cp1] + a[rp1 + cm1] +
                     a[rm1 + cp1] + a[rm1 + cp1])*0.25;
            }
        }
    }
    
A possible advantage this code has over the Fortran-equivalent code is that it takes arbitrarily strided (i.e. non-contiguous arrays) and may also run faster depending on the optimization capability of your compiler. But, it is an obviously more complicated than the simple code in `filter.f`. This code must be compiled into a shared library. On my Linux system this is accomplished using:
    
    gcc -o code.so -shared code.c
    
Which creates a shared_library named code.so in the current directory. On Windows don’t forget to either add `__declspec(dllexport)` in front of void on the line preceding each function definition, or write a `code.def` file that lists the names of the functions to be exported.
A suitable Python interface to this shared library should be constructed. To do this create a file named interface.py with the following lines at the top:
    
    __all__ = ['add', 'filter2d']
    
    import numpy as np
    import os
    
    _path = os.path.dirname('__file__')
    lib = np.ctypeslib.load_library('code', _path)
    _typedict = {'zadd' : complex, 'sadd' : np.single,
                 'cadd' : np.csingle, 'dadd' : float}
    for name in _typedict.keys():
        val = getattr(lib, name)
        val.restype = None
        _type = _typedict[name]
        val.argtypes = [np.ctypeslib.ndpointer(_type,
                          flags='aligned, contiguous'),
                        np.ctypeslib.ndpointer(_type,
                          flags='aligned, contiguous'),
                        np.ctypeslib.ndpointer(_type,
                          flags='aligned, contiguous,'\
                                'writeable'),
                        np.ctypeslib.c_intp]
    
This code loads the shared library named `code.{ext}` located in the same path as this file. It then adds a return type of void to the functions contained in the library. It also adds argument checking to the functions in the library so that ndarrays can be passed as the first three arguments along with an integer (large enough to hold a pointer on the platform) as the fourth argument.
Setting up the filtering function is similar and allows the filtering function to be called with ndarray arguments as the first two arguments and with pointers to integers (large enough to handle the strides and shape of an ndarray) as the last two arguments.:
    
    lib.dfilter2d.restype=None
    lib.dfilter2d.argtypes = [np.ctypeslib.ndpointer(float, ndim=2,
                                           flags='aligned'),
                              np.ctypeslib.ndpointer(float, ndim=2,
                                     flags='aligned, contiguous,'\
                                           'writeable'),
                              ctypes.POINTER(np.ctypeslib.c_intp),
                              ctypes.POINTER(np.ctypeslib.c_intp)]
    
Next, define a simple selection function that chooses which addition function to call in the shared library based on the data-type:
    
    def select(dtype):
        if dtype.char in ['?bBhHf']:
            return lib.sadd, single
        elif dtype.char in ['F']:
            return lib.cadd, csingle
        elif dtype.char in ['DG']:
            return lib.zadd, complex
        else:
            return lib.dadd, float
        return func, ntype
    
Finally, the two functions to be exported by the interface can be written simply as:
    
    def add(a, b):
        requires = ['CONTIGUOUS', 'ALIGNED']
        a = np.asanyarray(a)
        func, dtype = select(a.dtype)
        a = np.require(a, dtype, requires)
        b = np.require(b, dtype, requires)
        c = np.empty_like(a)
        func(a,b,c,a.size)
        return c
    
and:
    
    def filter2d(a):
        a = np.require(a, float, ['ALIGNED'])
        b = np.zeros_like(a)
        lib.dfilter2d(a, b, a.ctypes.strides, a.ctypes.shape)
        return b
    
### Conclusion
Using ctypes is a powerful way to connect Python with arbitrary C-code. Its advantages for extending Python include
  * clean separation of C code from Python code
    * no need to learn a new syntax except Python and C
    * allows reuse of C code
    * functionality in shared libraries written for other purposes can be obtained with a simple Python wrapper and search for the library.
  * easy integration with NumPy through the ctypes attribute
  * full argument checking with the ndpointer class factory


Its disadvantages include
  * It is difficult to distribute an extension module made using ctypes because of a lack of support for building shared libraries in distutils.
  * You must have shared-libraries of your code (no static libraries).
  * Very little support for C++ code and its different library-calling conventions. You will probably need a C wrapper around C++ code to use with ctypes (or just use Boost.Python instead).


Because of the difficulty in distributing an extension module made using ctypes, f2py and Cython are still the easiest ways to extend Python for package creation. However, ctypes is in some cases a useful alternative. This should bring more features to ctypes that should eliminate the difficulty in extending Python and distributing the extension using ctypes.
## Additional tools you may find useful
These tools have been found useful by others using Python and so are included here. They are discussed separately because they are either older ways to do things now handled by f2py, Cython, or ctypes (SWIG, PyFort) or because of a lack of reasonable documentation (SIP, Boost). Links to these methods are not included since the most relevant can be found using Google or some other search engine, and any links provided here would be quickly dated. Do not assume that inclusion in this list means that the package deserves attention. Information about these packages are collected here because many people have found them useful and we’d like to give you as many options as possible for tackling the problem of easily integrating your code.
### SWIG
Simplified Wrapper and Interface Generator (SWIG) is an old and fairly stable method for wrapping C/C++-libraries to a large variety of other languages. It does not specifically understand NumPy arrays but can be made usable with NumPy through the use of typemaps. There are some sample typemaps in the numpy/tools/swig directory under numpy.i together with an example module that makes use of them. SWIG excels at wrapping large C/C++ libraries because it can (almost) parse their headers and auto-produce an interface. Technically, you need to generate a `.i` file that defines the interface. Often, however, this `.i` file can be parts of the header itself. The interface usually needs a bit of tweaking to be very useful. This ability to parse C/C++ headers and auto-generate the interface still makes SWIG a useful approach to adding functionality from C/C++ into Python, despite the other methods that have emerged that are more targeted to Python. SWIG can actually target extensions for several languages, but the typemaps usually have to be language-specific. Nonetheless, with modifications to the Python-specific typemaps, SWIG can be used to interface a library with other languages such as Perl, Tcl, and Ruby.
My experience with SWIG has been generally positive in that it is relatively easy to use and quite powerful. It has been used often before becoming more proficient at writing C-extensions. However, writing custom interfaces with SWIG is often troublesome because it must be done using the concept of typemaps which are not Python specific and are written in a C-like syntax. Therefore, other gluing strategies are preferred and SWIG would be probably considered only to wrap a very-large C/C++ library. Nonetheless, there are others who use SWIG quite happily.
### SIP
SIP is another tool for wrapping C/C++ libraries that is Python specific and appears to have very good support for C++. Riverbank Computing developed SIP in order to create Python bindings to the QT library. An interface file must be written to generate the binding, but the interface file looks a lot like a C/C++ header file. While SIP is not a full C++ parser, it understands quite a bit of C++ syntax as well as its own special directives that allow modification of how the Python binding is accomplished. It also allows the user to define mappings between Python types and C/C++ structures and classes.
### Boost Python
Boost is a repository of C++ libraries and Boost.Python is one of those libraries which provides a concise interface for binding C++ classes and functions to Python. The amazing part of the Boost.Python approach is that it works entirely in pure C++ without introducing a new syntax. Many users of C++ report that Boost.Python makes it possible to combine the best of both worlds in a seamless fashion. Using Boost to wrap simple C-subroutines is usually over-kill. Its primary purpose is to make C++ classes available in Python. So, if you have a set of C++ classes that need to be integrated cleanly into Python, consider learning about and using Boost.Python.
### Pyfort
Pyfort is a nice tool for wrapping Fortran and Fortran-like C-code into Python with support for Numeric arrays. It was written by Paul Dubois, a distinguished computer scientist and the very first maintainer of Numeric (now retired). It is worth mentioning in the hopes that somebody will update PyFort to work with NumPy arrays as well which now support either Fortran or C-style contiguous arrays.
# Writing your own ufunc
## Creating a new universal function
Before reading this, it may help to familiarize yourself with the basics of C extensions for Python by reading/skimming the tutorials in Section 1 of Extending and Embedding the Python Interpreter and in How to extend NumPy
The umath module is a computer-generated C-module that creates many ufuncs. It provides a great many examples of how to create a universal function. Creating your own ufunc that will make use of the ufunc machinery is not difficult either. Suppose you have a function that you want to operate element-by-element over its inputs. By creating a new ufunc you will obtain a function that handles
  * broadcasting
  * N-dimensional looping
  * automatic type-conversions with minimal memory usage
  * optional output arrays


It is not difficult to create your own ufunc. All that is required is a 1-d loop for each data-type you want to support. Each 1-d loop must have a specific signature, and only ufuncs for fixed-size data-types can be used. The function call used to create a new ufunc to work on built-in data-types is given below. A different mechanism is used to register ufuncs for user-defined data-types.
In the next several sections we give example code that can be easily modified to create your own ufuncs. The examples are successively more complete or complicated versions of the logit function, a common function in statistical modeling. Logit is also interesting because, due to the magic of IEEE standards (specifically IEEE 754), all of the logit functions created below automatically have the following behavior.
    
    >>> logit(0)
    -inf
    >>> logit(1)
    inf
    >>> logit(2)
    nan
    >>> logit(-2)
    nan
    
This is wonderful because the function writer doesn’t have to manually propagate infs or nans.
## Example non-ufunc extension
For comparison and general edification of the reader we provide a simple implementation of a C extension of `logit` that uses no numpy.
To do this we need two files. The first is the C file which contains the actual code, and the second is the `setup.py` file used to create the module.
    
    #define PY_SSIZE_T_CLEAN
    #include <Python.h>
    #include <math.h>
    
    /*
     * spammodule.c
     * This is the C code for a non-numpy Python extension to
     * define the logit function, where logit(p) = log(p/(1-p)).
     * This function will not work on numpy arrays automatically.
     * numpy.vectorize must be called in python to generate
     * a numpy-friendly function.
     *
     * Details explaining the Python-C API can be found under
     * 'Extending and Embedding' and 'Python/C API' at
     * docs.python.org .
     */
    
    
    /* This declares the logit function */
    static PyObject *spam_logit(PyObject *self, PyObject *args);
    
    /*
     * This tells Python what methods this module has.
     * See the Python-C API for more information.
     */
    static PyMethodDef SpamMethods[] = {
        {"logit",
            spam_logit,
            METH_VARARGS, "compute logit"},
        {NULL, NULL, 0, NULL}
    };
    
    /*
     * This actually defines the logit function for
     * input args from Python.
     */
    
    static PyObject *spam_logit(PyObject *self, PyObject *args)
    {
        double p;
    
        /* This parses the Python argument into a double */
        if(!PyArg_ParseTuple(args, "d", &p)) {
            return NULL;
        }
    
        /* THE ACTUAL LOGIT FUNCTION */
        p = p/(1-p);
        p = log(p);
    
        /*This builds the answer back into a python object */
        return Py_BuildValue("d", p);
    }
    
    /* This initiates the module using the above definitions. */
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "spam",
        NULL,
        -1,
        SpamMethods,
        NULL,
        NULL,
        NULL,
        NULL
    };
    
    PyMODINIT_FUNC PyInit_spam(void)
    {
        PyObject *m;
        m = PyModule_Create(&moduledef);
        if (!m) {
            return NULL;
        }
        return m;
    }
    
To use the `setup.py file`, place `setup.py` and `spammodule.c` in the same folder. Then `python setup.py build` will build the module to import, or `python setup.py install` will install the module to your site-packages directory.
    
    '''
        setup.py file for spammodule.c
    
        Calling
        $python setup.py build_ext --inplace
        will build the extension library in the current file.
    
        Calling
        $python setup.py build
        will build a file that looks like ./build/lib*, where
        lib* is a file that begins with lib. The library will
        be in this file and end with a C library extension,
        such as .so
    
        Calling
        $python setup.py install
        will install the module in your site-packages file.
    
        See the setuptools section 'Building Extension Modules'
        at setuptools.pypa.io for more information.
    '''
    
    from setuptools import setup, Extension
    import numpy as np
    
    module1 = Extension('spam', sources=['spammodule.c'])
    
    setup(name='spam', version='1.0', ext_modules=[module1])
    
Once the spam module is imported into python, you can call logit via `spam.logit`. Note that the function used above cannot be applied as-is to numpy arrays. To do so we must call `numpy.vectorize` on it. For example, if a python interpreter is opened in the file containing the spam library or spam has been installed, one can perform the following commands:
    
    >>> import numpy as np
    >>> import spam
    >>> spam.logit(0)
    -inf
    >>> spam.logit(1)
    inf
    >>> spam.logit(0.5)
    0.0
    >>> x = np.linspace(0,1,10)
    >>> spam.logit(x)
    TypeError: only length-1 arrays can be converted to Python scalars
    >>> f = np.vectorize(spam.logit)
    >>> f(x)
    array([       -inf, -2.07944154, -1.25276297, -0.69314718, -0.22314355,
        0.22314355,  0.69314718,  1.25276297,  2.07944154,         inf])
    
THE RESULTING LOGIT FUNCTION IS NOT FAST! `numpy.vectorize` simply loops over `spam.logit`. The loop is done at the C level, but the numpy array is constantly being parsed and build back up. This is expensive. When the author compared `numpy.vectorize(spam.logit)` against the logit ufuncs constructed below, the logit ufuncs were almost exactly 4 times faster. Larger or smaller speedups are, of course, possible depending on the nature of the function.
## Example NumPy ufunc for one dtype
For simplicity we give a ufunc for a single dtype, the `'f8'` `double`. As in the previous section, we first give the `.c` file and then the `setup.py` file used to create the module containing the ufunc.
The place in the code corresponding to the actual computations for the ufunc are marked with `/\* BEGIN main ufunc computation \*/` and `/\* END main ufunc computation \*/`. The code in between those lines is the primary thing that must be changed to create your own ufunc.
    
    #define PY_SSIZE_T_CLEAN
    #include <Python.h>
    #include "numpy/ndarraytypes.h"
    #include "numpy/ufuncobject.h"
    #include "numpy/npy_3kcompat.h"
    #include <math.h>
    
    /*
     * single_type_logit.c
     * This is the C code for creating your own
     * NumPy ufunc for a logit function.
     *
     * In this code we only define the ufunc for
     * a single dtype. The computations that must
     * be replaced to create a ufunc for
     * a different function are marked with BEGIN
     * and END.
     *
     * Details explaining the Python-C API can be found under
     * 'Extending and Embedding' and 'Python/C API' at
     * docs.python.org .
     */
    
    static PyMethodDef LogitMethods[] = {
        {NULL, NULL, 0, NULL}
    };
    
    /* The loop definition must precede the PyMODINIT_FUNC. */
    
    static void double_logit(char **args, const npy_intp *dimensions,
                             const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp n = dimensions[0];
        char *in = args[0], *out = args[1];
        npy_intp in_step = steps[0], out_step = steps[1];
    
        double tmp;
    
        for (i = 0; i < n; i++) {
            /* BEGIN main ufunc computation */
            tmp = *(double *)in;
            tmp /= 1 - tmp;
            *((double *)out) = log(tmp);
            /* END main ufunc computation */
    
            in += in_step;
            out += out_step;
        }
    }
    
    /* This a pointer to the above function */
    PyUFuncGenericFunction funcs[1] = {&double_logit};
    
    /* These are the input and return dtypes of logit.*/
    static const char types[2] = {NPY_DOUBLE, NPY_DOUBLE};
    
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "npufunc",
        NULL,
        -1,
        LogitMethods,
        NULL,
        NULL,
        NULL,
        NULL
    };
    
    PyMODINIT_FUNC PyInit_npufunc(void)
    {
        PyObject *m, *logit, *d;
    
        import_array();
        import_umath();
    
        m = PyModule_Create(&moduledef);
        if (!m) {
            return NULL;
        }
    
        logit = PyUFunc_FromFuncAndData(funcs, NULL, types, 1, 1, 1,
                                        PyUFunc_None, "logit",
                                        "logit_docstring", 0);
    
        d = PyModule_GetDict(m);
    
        PyDict_SetItemString(d, "logit", logit);
        Py_DECREF(logit);
    
        return m;
    }
    
This is a `setup.py file` for the above code. As before, the module can be build via calling `python setup.py build` at the command prompt, or installed to site-packages via `python setup.py install`. The module can also be placed into a local folder e.g. `npufunc_directory` below using `python setup.py build_ext --inplace`.
    
    '''
        setup.py file for single_type_logit.c
        Note that since this is a numpy extension
        we add an include_dirs=[get_include()] so that the
        extension is built with numpy's C/C++ header files.
    
        Calling
        $python setup.py build_ext --inplace
        will build the extension library in the npufunc_directory.
    
        Calling
        $python setup.py build
        will build a file that looks like ./build/lib*, where
        lib* is a file that begins with lib. The library will
        be in this file and end with a C library extension,
        such as .so
    
        Calling
        $python setup.py install
        will install the module in your site-packages file.
    
        See the setuptools section 'Building Extension Modules'
        at setuptools.pypa.io for more information.
    '''
    
    from setuptools import setup, Extension
    from numpy import get_include
    
    npufunc = Extension('npufunc',
                        sources=['single_type_logit.c'],
                        include_dirs=[get_include()])
    
    setup(name='npufunc', version='1.0', ext_modules=[npufunc])
    
After the above has been installed, it can be imported and used as follows.
    
    >>> import numpy as np
    >>> import npufunc
    >>> npufunc.logit(0.5)
    np.float64(0.0)
    >>> a = np.linspace(0,1,5)
    >>> npufunc.logit(a)
    array([       -inf, -1.09861229,  0.        ,  1.09861229,         inf])
    
## Example NumPy ufunc with multiple dtypes
We finally give an example of a full ufunc, with inner loops for half-floats, floats, doubles, and long doubles. As in the previous sections we first give the `.c` file and then the corresponding `setup.py` file.
The places in the code corresponding to the actual computations for the ufunc are marked with `/\* BEGIN main ufunc computation \*/` and `/\* END main ufunc computation \*/`. The code in between those lines is the primary thing that must be changed to create your own ufunc.
    
    #define PY_SSIZE_T_CLEAN
    #include <Python.h>
    #include "numpy/ndarraytypes.h"
    #include "numpy/ufuncobject.h"
    #include "numpy/halffloat.h"
    #include <math.h>
    
    /*
     * multi_type_logit.c
     * This is the C code for creating your own
     * NumPy ufunc for a logit function.
     *
     * Each function of the form type_logit defines the
     * logit function for a different numpy dtype. Each
     * of these functions must be modified when you
     * create your own ufunc. The computations that must
     * be replaced to create a ufunc for
     * a different function are marked with BEGIN
     * and END.
     *
     * Details explaining the Python-C API can be found under
     * 'Extending and Embedding' and 'Python/C API' at
     * docs.python.org .
     *
     */
    
    static PyMethodDef LogitMethods[] = {
        {NULL, NULL, 0, NULL}
    };
    
    /* The loop definitions must precede the PyMODINIT_FUNC. */
    
    static void long_double_logit(char **args, const npy_intp *dimensions,
                                  const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp n = dimensions[0];
        char *in = args[0], *out = args[1];
        npy_intp in_step = steps[0], out_step = steps[1];
    
        long double tmp;
    
        for (i = 0; i < n; i++) {
            /* BEGIN main ufunc computation */
            tmp = *(long double *)in;
            tmp /= 1 - tmp;
            *((long double *)out) = logl(tmp);
            /* END main ufunc computation */
    
            in += in_step;
            out += out_step;
        }
    }
    
    static void double_logit(char **args, const npy_intp *dimensions,
                             const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp n = dimensions[0];
        char *in = args[0], *out = args[1];
        npy_intp in_step = steps[0], out_step = steps[1];
    
        double tmp;
    
        for (i = 0; i < n; i++) {
            /* BEGIN main ufunc computation */
            tmp = *(double *)in;
            tmp /= 1 - tmp;
            *((double *)out) = log(tmp);
            /* END main ufunc computation */
    
            in += in_step;
            out += out_step;
        }
    }
    
    static void float_logit(char **args, const npy_intp *dimensions,
                           const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp n = dimensions[0];
        char *in = args[0], *out = args[1];
        npy_intp in_step = steps[0], out_step = steps[1];
    
        float tmp;
    
        for (i = 0; i < n; i++) {
            /* BEGIN main ufunc computation */
            tmp = *(float *)in;
            tmp /= 1 - tmp;
            *((float *)out) = logf(tmp);
            /* END main ufunc computation */
    
            in += in_step;
            out += out_step;
        }
    }
    
    
    static void half_float_logit(char **args, const npy_intp *dimensions,
                                const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp n = dimensions[0];
        char *in = args[0], *out = args[1];
        npy_intp in_step = steps[0], out_step = steps[1];
    
        float tmp;
    
        for (i = 0; i < n; i++) {
    
            /* BEGIN main ufunc computation */
            tmp = npy_half_to_float(*(npy_half *)in);
            tmp /= 1 - tmp;
            tmp = logf(tmp);
            *((npy_half *)out) = npy_float_to_half(tmp);
            /* END main ufunc computation */
    
            in += in_step;
            out += out_step;
        }
    }
    
    
    /*This gives pointers to the above functions*/
    PyUFuncGenericFunction funcs[4] = {&half_float_logit,
                                       &float_logit,
                                       &double_logit,
                                       &long_double_logit};
    
    static const char types[8] = {NPY_HALF, NPY_HALF,
                                  NPY_FLOAT, NPY_FLOAT,
                                  NPY_DOUBLE, NPY_DOUBLE,
                                  NPY_LONGDOUBLE, NPY_LONGDOUBLE};
    
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "npufunc",
        NULL,
        -1,
        LogitMethods,
        NULL,
        NULL,
        NULL,
        NULL
    };
    
    PyMODINIT_FUNC PyInit_npufunc(void)
    {
        PyObject *m, *logit, *d;
    
        import_array();
        import_umath();
    
        m = PyModule_Create(&moduledef);
        if (!m) {
            return NULL;
        }
    
        logit = PyUFunc_FromFuncAndData(funcs, NULL, types, 4, 1, 1,
                                        PyUFunc_None, "logit",
                                        "logit_docstring", 0);
    
        d = PyModule_GetDict(m);
    
        PyDict_SetItemString(d, "logit", logit);
        Py_DECREF(logit);
    
        return m;
    }
    
This is a `setup.py` file for the above code. As before, the module can be build via calling `python setup.py build` at the command prompt, or installed to site-packages via `python setup.py install`.
    
    '''
        setup.py file for multi_type_logit.c
        Note that since this is a numpy extension
        we add an include_dirs=[get_include()] so that the
        extension is built with numpy's C/C++ header files.
        Furthermore, we also have to include the npymath
        lib for half-float d-type.
    
        Calling
        $python setup.py build_ext --inplace
        will build the extension library in the current file.
    
        Calling
        $python setup.py build
        will build a file that looks like ./build/lib*, where
        lib* is a file that begins with lib. The library will
        be in this file and end with a C library extension,
        such as .so
    
        Calling
        $python setup.py install
        will install the module in your site-packages file.
    
        See the setuptools section 'Building Extension Modules'
        at setuptools.pypa.io for more information.
    '''
    
    from setuptools import setup, Extension
    from numpy import get_include
    from os import path
    
    path_to_npymath = path.join(get_include(), '..', 'lib')
    npufunc = Extension('npufunc',
                        sources=['multi_type_logit.c'],
                        include_dirs=[get_include()],
                        # Necessary for the half-float d-type.
                        library_dirs=[path_to_npymath],
                        libraries=["npymath"])
    
    setup(name='npufunc', version='1.0', ext_modules=[npufunc])
    
After the above has been installed, it can be imported and used as follows.
    
    >>> import numpy as np
    >>> import npufunc
    >>> npufunc.logit(0.5)
    np.float64(0.0)
    >>> a = np.linspace(0,1,5)
    >>> npufunc.logit(a)
    array([       -inf, -1.09861229,  0.        ,  1.09861229,         inf])
    
## Example NumPy ufunc with multiple arguments/return values
Our final example is a ufunc with multiple arguments. It is a modification of the code for a logit ufunc for data with a single dtype. We compute `(A * B, logit(A * B))`.
We only give the C code as the setup.py file is exactly the same as the `setup.py` file in Example NumPy ufunc for one dtype, except that the line
    
    npufunc = Extension('npufunc',
                        sources=['single_type_logit.c'],
                        include_dirs=[get_include()])
    
is replaced with
    
    npufunc = Extension('npufunc',
                        sources=['multi_arg_logit.c'],
                        include_dirs=[get_include()])
    
The C file is given below. The ufunc generated takes two arguments `A` and `B`. It returns a tuple whose first element is `A * B` and whose second element is `logit(A * B)`. Note that it automatically supports broadcasting, as well as all other properties of a ufunc.
    
    #define PY_SSIZE_T_CLEAN
    #include <Python.h>
    #include "numpy/ndarraytypes.h"
    #include "numpy/ufuncobject.h"
    #include "numpy/halffloat.h"
    #include <math.h>
    
    /*
     * multi_arg_logit.c
     * This is the C code for creating your own
     * NumPy ufunc for a multiple argument, multiple
     * return value ufunc. The places where the
     * ufunc computation is carried out are marked
     * with comments.
     *
     * Details explaining the Python-C API can be found under
     * 'Extending and Embedding' and 'Python/C API' at
     * docs.python.org.
     */
    
    static PyMethodDef LogitMethods[] = {
        {NULL, NULL, 0, NULL}
    };
    
    /* The loop definition must precede the PyMODINIT_FUNC. */
    
    static void double_logitprod(char **args, const npy_intp *dimensions,
                                 const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp n = dimensions[0];
        char *in1 = args[0], *in2 = args[1];
        char *out1 = args[2], *out2 = args[3];
        npy_intp in1_step = steps[0], in2_step = steps[1];
        npy_intp out1_step = steps[2], out2_step = steps[3];
    
        double tmp;
    
        for (i = 0; i < n; i++) {
            /* BEGIN main ufunc computation */
            tmp = *(double *)in1;
            tmp *= *(double *)in2;
            *((double *)out1) = tmp;
            *((double *)out2) = log(tmp / (1 - tmp));
            /* END main ufunc computation */
    
            in1 += in1_step;
            in2 += in2_step;
            out1 += out1_step;
            out2 += out2_step;
        }
    }
    
    /*This a pointer to the above function*/
    PyUFuncGenericFunction funcs[1] = {&double_logitprod};
    
    /* These are the input and return dtypes of logit.*/
    
    static const char types[4] = {NPY_DOUBLE, NPY_DOUBLE,
                                  NPY_DOUBLE, NPY_DOUBLE};
    
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "npufunc",
        NULL,
        -1,
        LogitMethods,
        NULL,
        NULL,
        NULL,
        NULL
    };
    
    PyMODINIT_FUNC PyInit_npufunc(void)
    {
        PyObject *m, *logit, *d;
    
        import_array();
        import_umath();
    
        m = PyModule_Create(&moduledef);
        if (!m) {
            return NULL;
        }
    
        logit = PyUFunc_FromFuncAndData(funcs, NULL, types, 1, 2, 2,
                                        PyUFunc_None, "logit",
                                        "logit_docstring", 0);
    
        d = PyModule_GetDict(m);
    
        PyDict_SetItemString(d, "logit", logit);
        Py_DECREF(logit);
    
        return m;
    }
    
## Example NumPy ufunc with structured array dtype arguments
This example shows how to create a ufunc for a structured array dtype. For the example we show a trivial ufunc for adding two arrays with dtype `'u8,u8,u8'`. The process is a bit different from the other examples since a call to `PyUFunc_FromFuncAndData` doesn’t fully register ufuncs for custom dtypes and structured array dtypes. We need to also call `PyUFunc_RegisterLoopForDescr` to finish setting up the ufunc.
We only give the C code as the `setup.py` file is exactly the same as the `setup.py` file in Example NumPy ufunc for one dtype, except that the line
    
    npufunc = Extension('npufunc',
                        sources=['single_type_logit.c'],
                        include_dirs=[get_include()])
    
is replaced with
    
    npufunc = Extension('npufunc',
                        sources=['add_triplet.c'],
                        include_dirs=[get_include()])
    
The C file is given below.
    
    #define PY_SSIZE_T_CLEAN
    #include <Python.h>
    #include "numpy/ndarraytypes.h"
    #include "numpy/ufuncobject.h"
    #include "numpy/npy_3kcompat.h"
    #include <math.h>
    
    /*
     * add_triplet.c
     * This is the C code for creating your own
     * NumPy ufunc for a structured array dtype.
     *
     * Details explaining the Python-C API can be found under
     * 'Extending and Embedding' and 'Python/C API' at
     * docs.python.org.
     */
    
    static PyMethodDef StructUfuncTestMethods[] = {
        {NULL, NULL, 0, NULL}
    };
    
    /* The loop definition must precede the PyMODINIT_FUNC. */
    
    static void add_uint64_triplet(char **args, const npy_intp *dimensions,
                                   const npy_intp *steps, void *data)
    {
        npy_intp i;
        npy_intp is1 = steps[0];
        npy_intp is2 = steps[1];
        npy_intp os = steps[2];
        npy_intp n = dimensions[0];
        uint64_t *x, *y, *z;
    
        char *i1 = args[0];
        char *i2 = args[1];
        char *op = args[2];
    
        for (i = 0; i < n; i++) {
    
            x = (uint64_t *)i1;
            y = (uint64_t *)i2;
            z = (uint64_t *)op;
    
            z[0] = x[0] + y[0];
            z[1] = x[1] + y[1];
            z[2] = x[2] + y[2];
    
            i1 += is1;
            i2 += is2;
            op += os;
        }
    }
    
    /* This a pointer to the above function */
    PyUFuncGenericFunction funcs[1] = {&add_uint64_triplet};
    
    /* These are the input and return dtypes of add_uint64_triplet. */
    static const char types[3] = {NPY_UINT64, NPY_UINT64, NPY_UINT64};
    
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "struct_ufunc_test",
        NULL,
        -1,
        StructUfuncTestMethods,
        NULL,
        NULL,
        NULL,
        NULL
    };
    
    PyMODINIT_FUNC PyInit_npufunc(void)
    {
        PyObject *m, *add_triplet, *d;
        PyObject *dtype_dict;
        PyArray_Descr *dtype;
        PyArray_Descr *dtypes[3];
    
        import_array();
        import_umath();
    
        m = PyModule_Create(&moduledef);
        if (m == NULL) {
            return NULL;
        }
    
        /* Create a new ufunc object */
        add_triplet = PyUFunc_FromFuncAndData(NULL, NULL, NULL, 0, 2, 1,
                                              PyUFunc_None, "add_triplet",
                                              "add_triplet_docstring", 0);
    
        dtype_dict = Py_BuildValue("[(s, s), (s, s), (s, s)]",
                                   "f0", "u8", "f1", "u8", "f2", "u8");
        PyArray_DescrConverter(dtype_dict, &dtype);
        Py_DECREF(dtype_dict);
    
        dtypes[0] = dtype;
        dtypes[1] = dtype;
        dtypes[2] = dtype;
    
        /* Register ufunc for structured dtype */
        PyUFunc_RegisterLoopForDescr(add_triplet,
                                     dtype,
                                     &add_uint64_triplet,
                                     dtypes,
                                     NULL);
    
        d = PyModule_GetDict(m);
    
        PyDict_SetItemString(d, "add_triplet", add_triplet);
        Py_DECREF(add_triplet);
        return m;
    }
    
The returned ufunc object is a callable Python object. It should be placed in a (module) dictionary under the same name as was used in the name argument to the ufunc-creation routine. The following example is adapted from the umath module
    
    static PyUFuncGenericFunction atan2_functions[] = {
                          PyUFunc_ff_f, PyUFunc_dd_d,
                          PyUFunc_gg_g, PyUFunc_OO_O_method};
    static void *atan2_data[] = {
                          (void *)atan2f, (void *)atan2,
                          (void *)atan2l, (void *)"arctan2"};
    static const char atan2_signatures[] = {
                  NPY_FLOAT, NPY_FLOAT, NPY_FLOAT,
                  NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE,
                  NPY_LONGDOUBLE, NPY_LONGDOUBLE, NPY_LONGDOUBLE
                  NPY_OBJECT, NPY_OBJECT, NPY_OBJECT};
    ...
    /* in the module initialization code */
    PyObject *f, *dict, *module;
    ...
    dict = PyModule_GetDict(module);
    ...
    f = PyUFunc_FromFuncAndData(atan2_functions,
        atan2_data, atan2_signatures, 4, 2, 1,
        PyUFunc_None, "arctan2",
        "a safe and correct arctan(x1/x2)", 0);
    PyDict_SetItemString(dict, "arctan2", f);
    Py_DECREF(f);
    ...
    
# How to write a NumPy how-to
How-tos get straight to the point – they
  * answer a focused question, or
  * narrow a broad question into focused questions that the user can choose among.


## A stranger has asked for directions…
“I need to refuel my car.”
## Give a brief but explicit answer
  * “Three kilometers/miles, take a right at Hayseed Road, it’s on your left.”


Add helpful details for newcomers (“Hayseed Road”, even though it’s the only turnoff at three km/mi). But not irrelevant ones:
  * Don’t also give directions from Route 7.
  * Don’t explain why the town has only one filling station.


If there’s related background (tutorial, explanation, reference, alternative approach), bring it to the user’s attention with a link (“Directions from Route 7,” “Why so few filling stations?”).
## Delegate
  * “Three km/mi, take a right at Hayseed Road, follow the signs.”


If the information is already documented and succinct enough for a how-to, just link to it, possibly after an introduction (“Three km/mi, take a right”).
## If the question is broad, narrow and redirect it
“I want to see the sights.”
The See the sights how-to should link to a set of narrower how-tos:
  * Find historic buildings
  * Find scenic lookouts
  * Find the town center


and these might in turn link to still narrower how-tos – so the town center page might link to
  * Find the court house
  * Find city hall


By organizing how-tos this way, you not only display the options for people who need to narrow their question, you also have provided answers for users who start with narrower questions (“I want to see historic buildings,” “Which way to city hall?”).
## If there are many steps, break them up
If a how-to has many steps:
  * Consider breaking a step out into an individual how-to and linking to it.
  * Include subheadings. They help readers grasp what’s coming and return where they left off.


## Why write how-tos when there’s Stack Overflow, Reddit, Gitter…?
  * We have authoritative answers.
  * How-tos make the site less forbidding to non-experts.
  * How-tos bring people into the site and help them discover other information that’s here .
  * Creating how-tos helps us see NumPy usability through new eyes.


## Aren’t how-tos and tutorials the same thing?
People use the terms “how-to” and “tutorial” interchangeably, but we draw a distinction, following Daniele Procida’s taxonomy of documentation.
Documentation needs to meet users where they are. How-tos offer get-it-done information; the user wants steps to copy and doesn’t necessarily want to understand NumPy. Tutorials are warm-fuzzy information; the user wants a feel for some aspect of NumPy (and again, may or may not care about deeper knowledge).
We distinguish both tutorials and how-tos from Explanations, which are deep dives intended to give understanding rather than immediate assistance, and References, which give complete, authoritative data on some concrete part of NumPy (like its API) but aren’t obligated to paint a broader picture.
For more on tutorials, see Learn to write a NumPy tutorial
## Is this page an example of a how-to?
Yes – until the sections with question-mark headings; they explain rather than giving directions. In a how-to, those would be links.
# How to index ndarrays
See also
Indexing on ndarrays
This page tackles common examples. For an in-depth look into indexing, refer to Indexing on ndarrays.
## Access specific/arbitrary rows and columns
Use Basic indexing features like Slicing and striding, and Dimensional indexing tools.
    
    >>> a = np.arange(30).reshape(2, 3, 5)
    >>> a
    array([[[ 0,  1,  2,  3,  4],
            [ 5,  6,  7,  8,  9],
            [10, 11, 12, 13, 14]],
    
            [[15, 16, 17, 18, 19],
            [20, 21, 22, 23, 24],
            [25, 26, 27, 28, 29]]])
    >>> a[0, 2, :]
    array([10, 11, 12, 13, 14])
    >>> a[0, :, 3]
    array([ 3,  8, 13])
    
Note that the output from indexing operations can have different shape from the original object. To preserve the original dimensions after indexing, you can use `newaxis`. To use other such tools, refer to Dimensional indexing tools.
    
    >>> a[0, :, 3].shape
    (3,)
    >>> a[0, :, 3, np.newaxis].shape
    (3, 1)
    >>> a[0, :, 3, np.newaxis, np.newaxis].shape
    (3, 1, 1)
    
Variables can also be used to index:
    
    >>> y = 0
    >>> a[y, :, y+3]
    array([ 3,  8, 13])
    
Refer to Dealing with variable numbers of indices within programs to see how to use slice and `Ellipsis` in your index variables.
### Index columns
To index columns, you have to index the last axis. Use Dimensional indexing tools to get the desired number of dimensions:
    
    >>> a = np.arange(24).reshape(2, 3, 4)
    >>> a
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
    
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>> a[..., 3]
    array([[ 3,  7, 11],
           [15, 19, 23]])
    
To index specific elements in each column, make use of Advanced indexing as below:
    
    >>> arr = np.arange(3*4).reshape(3, 4)
    >>> arr
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> column_indices = [[1, 3], [0, 2], [2, 2]]
    >>> np.arange(arr.shape[0])
    array([0, 1, 2])
    >>> row_indices = np.arange(arr.shape[0])[:, np.newaxis]
    >>> row_indices
    array([[0],
           [1],
           [2]])
    
Use the `row_indices` and `column_indices` for advanced indexing:
    
    >>> arr[row_indices, column_indices]
    array([[ 1,  3],
           [ 4,  6],
           [10, 10]])
    
### Index along a specific axis
Use `take`. See also `take_along_axis` and `put_along_axis`.
    
    >>> a = np.arange(30).reshape(2, 3, 5)
    >>> a
    array([[[ 0,  1,  2,  3,  4],
            [ 5,  6,  7,  8,  9],
            [10, 11, 12, 13, 14]],
    
            [[15, 16, 17, 18, 19],
            [20, 21, 22, 23, 24],
            [25, 26, 27, 28, 29]]])
    >>> np.take(a, [2, 3], axis=2)
    array([[[ 2,  3],
            [ 7,  8],
            [12, 13]],
    
            [[17, 18],
            [22, 23],
            [27, 28]]])
    >>> np.take(a, [2], axis=1)
    array([[[10, 11, 12, 13, 14]],
    
            [[25, 26, 27, 28, 29]]])
    
## Create subsets of larger matrices
Use Slicing and striding to access chunks of a large array:
    
    >>> a = np.arange(100).reshape(10, 10)
    >>> a
    array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
            [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
            [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
            [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
            [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
            [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
            [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
            [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
            [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
            [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
    >>> a[2:5, 2:5]
    array([[22, 23, 24],
           [32, 33, 34],
           [42, 43, 44]])
    >>> a[2:5, 1:3]
    array([[21, 22],
           [31, 32],
           [41, 42]])
    >>> a[:5, :5]
    array([[ 0,  1,  2,  3,  4],
           [10, 11, 12, 13, 14],
           [20, 21, 22, 23, 24],
           [30, 31, 32, 33, 34],
           [40, 41, 42, 43, 44]])
    
The same thing can be done with advanced indexing in a slightly more complex way. Remember that advanced indexing creates a copy:
    
    >>> a[np.arange(5)[:, None], np.arange(5)[None, :]]
    array([[ 0,  1,  2,  3,  4],
           [10, 11, 12, 13, 14],
           [20, 21, 22, 23, 24],
           [30, 31, 32, 33, 34],
           [40, 41, 42, 43, 44]])
    
You can also use `mgrid` to generate indices:
    
    >>> indices = np.mgrid[0:6:2]
    >>> indices
    array([0, 2, 4])
    >>> a[:, indices]
    array([[ 0,  2,  4],
           [10, 12, 14],
           [20, 22, 24],
           [30, 32, 34],
           [40, 42, 44],
           [50, 52, 54],
           [60, 62, 64],
           [70, 72, 74],
           [80, 82, 84],
           [90, 92, 94]])
    
## Filter values
### Non-zero elements
Use `nonzero` to get a tuple of array indices of non-zero elements corresponding to every dimension:
    
    >>> z = np.array([[1, 2, 3, 0], [0, 0, 5, 3], [4, 6, 0, 0]])
    >>> z
    array([[1, 2, 3, 0],
           [0, 0, 5, 3],
           [4, 6, 0, 0]])
    >>> np.nonzero(z)
    (array([0, 0, 0, 1, 1, 2, 2]), array([0, 1, 2, 2, 3, 0, 1]))
    
Use `flatnonzero` to fetch indices of elements that are non-zero in the flattened version of the ndarray:
    
    >>> np.flatnonzero(z)
    array([0, 1, 2, 6, 7, 8, 9])
    
### Arbitrary conditions
Use `where` to generate indices based on conditions and then use Advanced indexing.
    
    >>> a = np.arange(30).reshape(2, 3, 5)
    >>> indices = np.where(a % 2 == 0)
    >>> indices
    (array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]),
    array([0, 0, 0, 1, 1, 2, 2, 2, 0, 0, 1, 1, 1, 2, 2]),
    array([0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3]))
    >>> a[indices]
    array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
    
Or, use Boolean array indexing:
    
    >>> a > 14
    array([[[False, False, False, False, False],
            [False, False, False, False, False],
            [False, False, False, False, False]],
    
           [[ True,  True,  True,  True,  True],
            [ True,  True,  True,  True,  True],
            [ True,  True,  True,  True,  True]]])
    >>> a[a > 14]
    array([15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])
    
### Replace values after filtering
Use assignment with filtering to replace desired values:
    
    >>> p = np.arange(-10, 10).reshape(2, 2, 5)
    >>> p
    array([[[-10,  -9,  -8,  -7,  -6],
            [ -5,  -4,  -3,  -2,  -1]],
    
           [[  0,   1,   2,   3,   4],
            [  5,   6,   7,   8,   9]]])
    >>> q = p < 0
    >>> q
    array([[[ True,  True,  True,  True,  True],
            [ True,  True,  True,  True,  True]],
    
           [[False, False, False, False, False],
            [False, False, False, False, False]]])
    >>> p[q] = 0
    >>> p
    array([[[0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]],
    
           [[0, 1, 2, 3, 4],
            [5, 6, 7, 8, 9]]])
    
## Fetch indices of max/min values
Use `argmax` and `argmin`:
    
    >>> a = np.arange(30).reshape(2, 3, 5)
    >>> np.argmax(a)
    29
    >>> np.argmin(a)
    0
    
Use the `axis` keyword to get the indices of maximum and minimum values along a specific axis:
    
    >>> np.argmax(a, axis=0)
    array([[1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1]])
    >>> np.argmax(a, axis=1)
    array([[2, 2, 2, 2, 2],
           [2, 2, 2, 2, 2]])
    >>> np.argmax(a, axis=2)
    array([[4, 4, 4],
           [4, 4, 4]])
    
    >>> np.argmin(a, axis=1)
    array([[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0]])
    >>> np.argmin(a, axis=2)
    array([[0, 0, 0],
           [0, 0, 0]])
    
Set `keepdims` to `True` to keep the axes which are reduced in the result as dimensions with size one:
    
    >>> np.argmin(a, axis=2, keepdims=True)
    array([[[0],
            [0],
            [0]],
    
           [[0],
            [0],
            [0]]])
    >>> np.argmax(a, axis=1, keepdims=True)
    array([[[2, 2, 2, 2, 2]],
    
           [[2, 2, 2, 2, 2]]])
    
To get the indices of each maximum or minimum value for each (N-1)-dimensional array in an N-dimensional array, use `reshape` to reshape the array to a 2D array, apply `argmax` or `argmin` along `axis=1` and use `unravel_index` to recover the index of the values per slice:
    
    >>> x = np.arange(2*2*3).reshape(2, 2, 3) % 7  # 3D example array
    >>> x
    array([[[0, 1, 2],
            [3, 4, 5]],
    
           [[6, 0, 1],
            [2, 3, 4]]])
    >>> x_2d = np.reshape(x, (x.shape[0], -1))
    >>> indices_2d = np.argmax(x_2d, axis=1)
    >>> indices_2d
    array([5, 0])
    >>> np.unravel_index(indices_2d, x.shape[1:])
    (array([1, 0]), array([2, 0]))
    
The first array returned contains the indices along axis 1 in the original array, the second array contains the indices along axis 2. The highest value in `x[0]` is therefore `x[0, 1, 2]`.
## Index the same ndarray multiple times efficiently
It must be kept in mind that basic indexing produces views and advanced indexing produces copies, which are computationally less efficient. Hence, you should take care to use basic indexing wherever possible instead of advanced indexing.
## Further reading
Nicolas Rougier’s 100 NumPy exercises provide a good insight into how indexing is combined with other operations. Exercises 6, 8, 10, 15, 16, 19, 20, 45, 59, 64, 65, 70, 71, 72, 76, 80, 81, 84, 87, 90, 93, 94 are specially focused on indexing.
# Reading and writing files
This page tackles common applications; for the full collection of I/O routines, see Input and output.
## Reading text and CSV files
### With no missing values
Use `numpy.loadtxt`.
### With missing values
Use `numpy.genfromtxt`.
`numpy.genfromtxt` will either
  * return a masked array masking out missing values (if `usemask=True`), or
  * fill in the missing value with the value specified in `filling_values` (default is `np.nan` for float, -1 for int).


#### With non-whitespace delimiters
    
    >>> with open("csv.txt", "r") as f:
    ...     print(f.read())
    1, 2, 3
    4,, 6
    7, 8, 9
    
##### Masked-array output
    
    >>> np.genfromtxt("csv.txt", delimiter=",", usemask=True)
    masked_array(
      data=[[1.0, 2.0, 3.0],
            [4.0, --, 6.0],
            [7.0, 8.0, 9.0]],
      mask=[[False, False, False],
            [False,  True, False],
            [False, False, False]],
      fill_value=1e+20)
    
##### Array output
    
    >>> np.genfromtxt("csv.txt", delimiter=",")
    array([[ 1.,  2.,  3.],
           [ 4., nan,  6.],
           [ 7.,  8.,  9.]])
    
##### Array output, specified fill-in value
    
    >>> np.genfromtxt("csv.txt", delimiter=",", dtype=np.int8, filling_values=99)
    array([[ 1,  2,  3],
           [ 4, 99,  6],
           [ 7,  8,  9]], dtype=int8)
    
#### Whitespace-delimited
`numpy.genfromtxt` can also parse whitespace-delimited data files that have missing values if
  * Each field has a fixed width: Use the width as the `delimiter` argument.:
        # File with width=4. The data does not have to be justified (for example,
        # the 2 in row 1), the last column can be less than width (for example, the 6
        # in row 2), and no delimiting character is required (for instance 8888 and 9
        # in row 3)
        
        >>> with open("fixedwidth.txt", "r") as f:
        ...    data = (f.read())
        >>> print(data)
        1   2      3
        44      6
        7   88889
        
        # Showing spaces as ^
        >>> print(data.replace(" ","^"))
        1^^^2^^^^^^3
        44^^^^^^6
        7^^^88889
        
        >>> np.genfromtxt("fixedwidth.txt", delimiter=4)
        array([[1.000e+00, 2.000e+00, 3.000e+00],
               [4.400e+01,       nan, 6.000e+00],
               [7.000e+00, 8.888e+03, 9.000e+00]])
        
  * A special value (e.g. “x”) indicates a missing field: Use it as the `missing_values` argument.
        >>> with open("nan.txt", "r") as f:
        ...     print(f.read())
        1 2 3
        44 x 6
        7  8888 9
        
        >>> np.genfromtxt("nan.txt", missing_values="x")
        array([[1.000e+00, 2.000e+00, 3.000e+00],
               [4.400e+01,       nan, 6.000e+00],
               [7.000e+00, 8.888e+03, 9.000e+00]])
        
  * You want to skip the rows with missing values: Set `invalid_raise=False`.
        >>> with open("skip.txt", "r") as f:
        ...     print(f.read())
        1 2   3
        44    6
        7 888 9
        
        >>> np.genfromtxt("skip.txt", invalid_raise=False)  
        __main__:1: ConversionWarning: Some errors were detected !
            Line #2 (got 2 columns instead of 3)
        array([[  1.,   2.,   3.],
               [  7., 888.,   9.]])
        
  * The delimiter whitespace character is different from the whitespace that indicates missing data. For instance, if columns are delimited by `\t`, then missing data will be recognized if it consists of one or more spaces.:
        >>> with open("tabs.txt", "r") as f:
        ...    data = (f.read())
        >>> print(data)
        1       2       3
        44              6
        7       888     9
        
        # Tabs vs. spaces
        >>> print(data.replace("\t","^"))
        1^2^3
        44^ ^6
        7^888^9
        
        >>> np.genfromtxt("tabs.txt", delimiter="\t", missing_values=" +")
        array([[  1.,   2.,   3.],
               [ 44.,  nan,   6.],
               [  7., 888.,   9.]])
        


## Read a file in .npy or .npz format
Choices:
  * Use `numpy.load`. It can read files generated by any of `numpy.save`, `numpy.savez`, or `numpy.savez_compressed`.
  * Use memory mapping. See `numpy.lib.format.open_memmap`.


## Write to a file to be read back by NumPy
### Binary
Use `numpy.save`, or to store multiple arrays `numpy.savez` or `numpy.savez_compressed`.
For security and portability, set `allow_pickle=False` unless the dtype contains Python objects, which requires pickling.
Masked arrays `can't currently be saved`, nor can other arbitrary array subclasses.
### Human-readable
`numpy.save` and `numpy.savez` create binary files. To write a human-readable file, use `numpy.savetxt`. The array can only be 1- or 2-dimensional, and there’s no ` savetxtz` for multiple files.
### Large arrays
See Write or read large arrays.
## Read an arbitrarily formatted binary file (“binary blob”)
Use a structured array.
Example:
The `.wav` file header is a 44-byte block preceding `data_size` bytes of the actual sound data:
    
    chunk_id         "RIFF"
    chunk_size       4-byte unsigned little-endian integer
    format           "WAVE"
    fmt_id           "fmt "
    fmt_size         4-byte unsigned little-endian integer
    audio_fmt        2-byte unsigned little-endian integer
    num_channels     2-byte unsigned little-endian integer
    sample_rate      4-byte unsigned little-endian integer
    byte_rate        4-byte unsigned little-endian integer
    block_align      2-byte unsigned little-endian integer
    bits_per_sample  2-byte unsigned little-endian integer
    data_id          "data"
    data_size        4-byte unsigned little-endian integer
    
The `.wav` file header as a NumPy structured dtype:
    
    wav_header_dtype = np.dtype([
        ("chunk_id", (bytes, 4)), # flexible-sized scalar type, item size 4
        ("chunk_size", "<u4"),    # little-endian unsigned 32-bit integer
        ("format", "S4"),         # 4-byte string, alternate spelling of (bytes, 4)
        ("fmt_id", "S4"),
        ("fmt_size", "<u4"),
        ("audio_fmt", "<u2"),     #
        ("num_channels", "<u2"),  # .. more of the same ...
        ("sample_rate", "<u4"),   #
        ("byte_rate", "<u4"),
        ("block_align", "<u2"),
        ("bits_per_sample", "<u2"),
        ("data_id", "S4"),
        ("data_size", "<u4"),
        #
        # the sound data itself cannot be represented here:
        # it does not have a fixed size
    ])
    
    header = np.fromfile(f, dtype=wave_header_dtype, count=1)[0]
    
This `.wav` example is for illustration; to read a `.wav` file in real life, use Python’s built-in module `wave`.
(Adapted from Pauli Virtanen, Advanced NumPy, licensed under CC BY 4.0.)
## Write or read large arrays
Arrays too large to fit in memory can be treated like ordinary in-memory arrays using memory mapping.
  * Raw array data written with `numpy.ndarray.tofile` or `numpy.ndarray.tobytes` can be read with `numpy.memmap`:
        array = numpy.memmap("mydata/myarray.arr", mode="r", dtype=np.int16, shape=(1024, 1024))
        
  * Files output by `numpy.save` (that is, using the numpy format) can be read using `numpy.load` with the `mmap_mode` keyword argument:
        large_array[some_slice] = np.load("path/to/small_array", mmap_mode="r")
        


Memory mapping lacks features like data chunking and compression; more full-featured formats and libraries usable with NumPy include:
  * HDF5: h5py or PyTables.
  * Zarr: here.
  * NetCDF: `scipy.io.netcdf_file`.


For tradeoffs among memmap, Zarr, and HDF5, see pythonspeed.com.
## Write files for reading by other (non-NumPy) tools
Formats for exchanging data with other tools include HDF5, Zarr, and NetCDF (see Write or read large arrays).
## Write or read a JSON file
NumPy arrays and most NumPy scalars are not directly JSON serializable. Instead, use a custom `json.JSONEncoder` for NumPy types, which can be found using your favorite search engine.
## Save/restore using a pickle file
Avoid when possible; pickles are not secure against erroneous or maliciously constructed data.
Use `numpy.save` and `numpy.load`. Set `allow_pickle=False`, unless the array dtype includes Python objects, in which case pickling is required.
`numpy.load` and `pickle` submodule also support unpickling files created with NumPy 1.26.
## Convert from a pandas DataFrame to a NumPy array
See `pandas.Series.to_numpy`.
## Save/restore using tofile and fromfile
In general, prefer `numpy.save` and `numpy.load`.
`numpy.ndarray.tofile` and `numpy.fromfile` lose information on endianness and precision and so are unsuitable for anything but scratch storage.
# How to create arrays with regularly-spaced values
There are a few NumPy functions that are similar in application, but which provide slightly different results, which may cause confusion if one is not sure when and how to use them. The following guide aims to list these functions and describe their recommended usage.
The functions mentioned here are
  * `numpy.linspace`
  * `numpy.arange`
  * `numpy.geomspace`
  * `numpy.logspace`
  * `numpy.meshgrid`
  * `numpy.mgrid`
  * `numpy.ogrid`


## 1D domains (intervals)
###  `linspace` vs. `arange`
Both `numpy.linspace` and `numpy.arange` provide ways to partition an interval (a 1D domain) into equal-length subintervals. These partitions will vary depending on the chosen starting and ending points, and the step (the length of the subintervals).
  * Use `numpy.arange` if you want integer steps.
`numpy.arange` relies on step size to determine how many elements are in the returned array, which excludes the endpoint. This is determined through the `step` argument to `arange`.
Example:
        >>> np.arange(0, 10, 2)  # np.arange(start, stop, step)
        array([0, 2, 4, 6, 8])
        
The arguments `start` and `stop` should be integer or real, but not complex numbers. `numpy.arange` is similar to the Python built-in `range`.
Floating-point inaccuracies can make `arange` results with floating-point numbers confusing. In this case, you should use `numpy.linspace` instead.
  * Use `numpy.linspace` if you want the endpoint to be included in the result, or if you are using a non-integer step size.
`numpy.linspace` can include the endpoint and determines step size from the `num` argument, which specifies the number of elements in the returned array.
The inclusion of the endpoint is determined by an optional boolean argument `endpoint`, which defaults to `True`. Note that selecting `endpoint=False` will change the step size computation, and the subsequent output for the function.
Example:
        >>> np.linspace(0.1, 0.2, num=5)  # np.linspace(start, stop, num)
        array([0.1  , 0.125, 0.15 , 0.175, 0.2  ])
        >>> np.linspace(0.1, 0.2, num=5, endpoint=False)
        array([0.1, 0.12, 0.14, 0.16, 0.18])
        
`numpy.linspace` can also be used with complex arguments:
        >>> np.linspace(1+1.j, 4, 5, dtype=np.complex64)
        array([1.  +1.j  , 1.75+0.75j, 2.5 +0.5j , 3.25+0.25j, 4.  +0.j  ],
              dtype=complex64)
        


### Other examples
  1. Unexpected results may happen if floating point values are used as `step` in `numpy.arange`. To avoid this, make sure all floating point conversion happens after the computation of results. For example, replace
         >>> list(np.arange(0.1,0.4,0.1).round(1))
         [0.1, 0.2, 0.3, 0.4]  # endpoint should not be included!
         
with
         >>> list(np.arange(1, 4, 1) / 10.0)
         [0.1, 0.2, 0.3]  # expected result
         
  2. Note that
         >>> np.arange(0, 1.12, 0.04)
         array([0.  , 0.04, 0.08, 0.12, 0.16, 0.2 , 0.24, 0.28, 0.32, 0.36, 0.4 ,
                0.44, 0.48, 0.52, 0.56, 0.6 , 0.64, 0.68, 0.72, 0.76, 0.8 , 0.84,
                0.88, 0.92, 0.96, 1.  , 1.04, 1.08, 1.12])
         
and
         >>> np.arange(0, 1.08, 0.04)
         array([0.  , 0.04, 0.08, 0.12, 0.16, 0.2 , 0.24, 0.28, 0.32, 0.36, 0.4 ,
                0.44, 0.48, 0.52, 0.56, 0.6 , 0.64, 0.68, 0.72, 0.76, 0.8 , 0.84,
                0.88, 0.92, 0.96, 1.  , 1.04])
         
These differ because of numeric noise. When using floating point values, it is possible that `0 + 0.04 * 28 < 1.12`, and so `1.12` is in the interval. In fact, this is exactly the case:
         >>> 1.12/0.04
         28.000000000000004
         
But `0 + 0.04 * 27 >= 1.08` so that 1.08 is excluded:
         >>> 1.08/0.04
         27.0
         
Alternatively, you could use `np.arange(0, 28)*0.04` which would always give you precise control of the end point since it is integral:
         >>> np.arange(0, 28)*0.04
         array([0.  , 0.04, 0.08, 0.12, 0.16, 0.2 , 0.24, 0.28, 0.32, 0.36, 0.4 ,
                0.44, 0.48, 0.52, 0.56, 0.6 , 0.64, 0.68, 0.72, 0.76, 0.8 , 0.84,
                0.88, 0.92, 0.96, 1.  , 1.04, 1.08])
         


###  `geomspace` and `logspace`
`numpy.geomspace` is similar to `numpy.linspace`, but with numbers spaced evenly on a log scale (a geometric progression). The endpoint is included in the result.
Example:
    
    >>> np.geomspace(2, 3, num=5)
    array([2.        , 2.21336384, 2.44948974, 2.71080601, 3.        ])
    
`numpy.logspace` is similar to `numpy.geomspace`, but with the start and end points specified as logarithms (with base 10 as default):
    
    >>> np.logspace(2, 3, num=5)
    array([ 100.        ,  177.827941  ,  316.22776602,  562.34132519, 1000.        ])
    
In linear space, the sequence starts at `base ** start` (`base` to the power of `start`) and ends with `base ** stop`:
    
    >>> np.logspace(2, 3, num=5, base=2)
    array([4.        , 4.75682846, 5.65685425, 6.72717132, 8.        ])
    
## N-D domains
N-D domains can be partitioned into grids. This can be done using one of the following functions.
### `meshgrid`
The purpose of `numpy.meshgrid` is to create a rectangular grid out of a set of one-dimensional coordinate arrays.
Given arrays:
    
    >>> x = np.array([0, 1, 2, 3])
    >>> y = np.array([0, 1, 2, 3, 4, 5])
    
`meshgrid` will create two coordinate arrays, which can be used to generate the coordinate pairs determining this grid.:
    
    >>> xx, yy = np.meshgrid(x, y)
    >>> xx
    array([[0, 1, 2, 3],
           [0, 1, 2, 3],
           [0, 1, 2, 3],
           [0, 1, 2, 3],
           [0, 1, 2, 3],
           [0, 1, 2, 3]])
    >>> yy
    array([[0, 0, 0, 0],
           [1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [4, 4, 4, 4],
           [5, 5, 5, 5]])
    
    >>> import matplotlib.pyplot as plt
    >>> plt.plot(xx, yy, marker='.', color='k', linestyle='none')
    
### `mgrid`
`numpy.mgrid` can be used as a shortcut for creating meshgrids. It is not a function, but when indexed, returns a multidimensional meshgrid.
    
    >>> xx, yy = np.meshgrid(np.array([0, 1, 2, 3]), np.array([0, 1, 2, 3, 4, 5]))
    >>> xx.T, yy.T
    (array([[0, 0, 0, 0, 0, 0],
            [1, 1, 1, 1, 1, 1],
            [2, 2, 2, 2, 2, 2],
            [3, 3, 3, 3, 3, 3]]),
     array([[0, 1, 2, 3, 4, 5],
            [0, 1, 2, 3, 4, 5],
            [0, 1, 2, 3, 4, 5],
            [0, 1, 2, 3, 4, 5]]))
    
    >>> np.mgrid[0:4, 0:6]
    array([[[0, 0, 0, 0, 0, 0],
            [1, 1, 1, 1, 1, 1],
            [2, 2, 2, 2, 2, 2],
            [3, 3, 3, 3, 3, 3]],
    
           [[0, 1, 2, 3, 4, 5],
            [0, 1, 2, 3, 4, 5],
            [0, 1, 2, 3, 4, 5],
            [0, 1, 2, 3, 4, 5]]])
    
### `ogrid`
Similar to `numpy.mgrid`, `numpy.ogrid` returns an open multidimensional meshgrid. This means that when it is indexed, only one dimension of each returned array is greater than 1. This avoids repeating the data and thus saves memory, which is often desirable.
These sparse coordinate grids are intended to be use with Broadcasting. When all coordinates are used in an expression, broadcasting still leads to a fully-dimensional result array.
    
    >>> np.ogrid[0:4, 0:6]
    (array([[0],
            [1],
            [2],
            [3]]), array([[0, 1, 2, 3, 4, 5]]))
    
All three methods described here can be used to evaluate function values on a grid.
    
    >>> g = np.ogrid[0:4, 0:6]
    >>> zg = np.sqrt(g[0]**2 + g[1]**2)
    >>> g[0].shape, g[1].shape, zg.shape
    ((4, 1), (1, 6), (4, 6))
    >>> m = np.mgrid[0:4, 0:6]
    >>> zm = np.sqrt(m[0]**2 + m[1]**2)
    >>> np.array_equal(zm, zg)
    True
    
# Verifying bugs and bug fixes in NumPy
In this how-to you will learn how to:
  * Verify the existence of a bug in NumPy
  * Verify the fix, if any, made for the bug


While you walk through the verification process, you will learn how to:
  * Set up a Python virtual environment (using `virtualenv`)
  * Install appropriate versions of NumPy, first to see the bug in action, then to verify its fix


Issue 16354 is used as an example.
This issue was:
Title: np.polymul return type is np.float64 or np.complex128 when given an all-zero argument
np.polymul returns an object with type np.float64 when one argument is all zero, and both arguments have type np.int64 or np.float32. Something similar happens with all zero np.complex64 giving result type np.complex128.
This doesn’t happen with non-zero arguments; there the result is as expected.
This bug isn’t present in np.convolve.
Reproducing code example:
    
    >>> import numpy as np
    >>> np.__version__
    '1.18.4'
    >>> a = np.array([1,2,3])
    >>> z = np.array([0,0,0])
    >>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
    dtype('int64')
    >>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
    dtype('float64')
    >>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
    dtype('float64')
    >>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
    dtype('complex128')
    Numpy/Python version information:
    >>> import sys, numpy; print(numpy.__version__, sys.version)
    1.18.4 3.7.5 (default, Nov  7 2019, 10:50:52) [GCC 8.3.0]
    
## 1\. Set up a virtual environment
Create a new directory, enter into it, and set up a virtual environment using your preferred method. For example, this is how to do it using `virtualenv` on linux or macOS:
    
    virtualenv venv_np_bug
    source venv_np_bug/bin/activate
    
This ensures the system/global/default Python/NumPy installation will not be altered.
## 2\. Install the NumPy version in which the bug was reported
The report references NumPy version 1.18.4, so that is the version you need to install in this case.
Since this bug is tied to a release and not a specific commit, a pre-built wheel installed in your virtual environment via `pip` will suffice:
    
    pip install numpy==1.18.4
    
Some bugs may require you to build the NumPy version referenced in the issue report. To learn how to do that, visit Building from source.
## 3\. Reproduce the bug
The issue reported in #16354 is that the wrong `dtype` is returned if one of the inputs of the method `numpy.polymul` is a zero array.
To reproduce the bug, start a Python terminal, enter the code snippet shown in the bug report, and ensure that the results match those in the issue:
    
    >>> import numpy as np
    >>> np.__version__
    '...' # 1.18.4
    >>> a = np.array([1,2,3])
    >>> z = np.array([0,0,0])
    >>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
    dtype('int64')
    >>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
    dtype('...') # float64
    >>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
    dtype('...') # float64
    >>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
    dtype('...') # complex128
    
As reported, whenever the zero array, `z` in the example above, is one of the arguments to `numpy.polymul`, an incorrect `dtype` is returned.
## 4\. Check for fixes in the latest version of NumPy
If the issue report for your bug has not yet been resolved, further action or patches need to be submitted.
In this case, however, the issue was resolved by PR 17577 and is now closed. So you can try to verify the fix.
To verify the fix:
  1. Uninstall the version of NumPy in which the bug still exists:
         pip uninstall numpy
         
  2. Install the latest version of NumPy:
         pip install numpy
         
  3. In your Python terminal, run the reported code snippet you used to verify the existence of the bug and confirm that the issue has been resolved:
         >>> import numpy as np
         >>> np.__version__
         '...' # 1.18.4
         >>> a = np.array([1,2,3])
         >>> z = np.array([0,0,0])
         >>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
         dtype('int64')
         >>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
         dtype('int64')
         >>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
         dtype('float32')
         >>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
         dtype('complex64')
         


Note that the correct `dtype` is now returned even when a zero array is one of the arguments to `numpy.polymul`.
## 5\. Support NumPy development by verifying and fixing bugs
Go to the NumPy GitHub issues page and see if you can confirm the existence of any other bugs which have not been confirmed yet. In particular, it is useful for the developers to know if a bug can be reproduced on a newer version of NumPy.
Comments verifying the existence of bugs alert the NumPy developers that more than one user can reproduce the issue.
# NumPy how-tos
These documents are intended as recipes to common tasks using NumPy. For detailed reference documentation of the functions and classes contained in the package, see the API reference.
  * How to write a NumPy how-to
  * Reading and writing files
  * How to index `ndarrays`
  * Verifying bugs and bug fixes in NumPy
  * How to create arrays with regularly-spaced values


# NumPy user guide
This guide is an overview and explains the important features; details are found in NumPy reference.
Getting started
  * What is NumPy?
  * Installation
  * NumPy quickstart
  * NumPy: the absolute basics for beginners


Fundamentals and usage
  * NumPy fundamentals
    * Array creation
    * Indexing on `ndarrays`
    * I/O with NumPy
    * Data types
    * Broadcasting
    * Copies and views
    * Working with Arrays of Strings And Bytes
    * Structured arrays
    * Universal functions (`ufunc`) basics


  * NumPy for MATLAB users
  * NumPy tutorials
  * NumPy how-tos


Advanced usage and interoperability
  * Using NumPy C-API
  * F2PY user guide and reference manual
  * Under-the-hood documentation for developers
  * Interoperability with NumPy


# NumPy for MATLAB users
## Introduction
MATLAB® and NumPy have a lot in common, but NumPy was created to work with Python, not to be a MATLAB clone. This guide will help MATLAB users get started with NumPy.
## Some key differences
In MATLAB, the basic type, even for scalars, is a multidimensional array. Array assignments in MATLAB are stored as 2D arrays of double precision floating point numbers, unless you specify the number of dimensions and type. Operations on the 2D instances of these arrays are modeled on matrix operations in linear algebra.
In NumPy, the basic type is a multidimensional `array`. Array assignments in NumPy are usually stored as n-dimensional arrays with the minimum type required to hold the objects in sequence, unless you specify the number of dimensions and type. NumPy performs operations element-by-element, so multiplying 2D arrays with `*` is not a matrix multiplication – it’s an element-by-element multiplication. (The `@` operator, available since Python 3.5, can be used for conventional matrix multiplication.)  
MATLAB numbers indices from 1; `a(1)` is the first element. See note INDEXING
NumPy, like Python, numbers indices from 0; `a[0]` is the first element.  
MATLAB’s scripting language was created for linear algebra so the syntax for some array manipulations is more compact than NumPy’s. On the other hand, the API for adding GUIs and creating full-fledged applications is more or less an afterthought.
NumPy is based on Python, a general-purpose language. The advantage to NumPy is access to Python libraries including: SciPy, Matplotlib, Pandas, OpenCV, and more. In addition, Python is often embedded as a scripting language in other software, allowing NumPy to be used there too.  
MATLAB array slicing uses pass-by-value semantics, with a lazy copy-on-write scheme to prevent creating copies until they are needed. Slicing operations copy parts of the array.
NumPy array slicing uses pass-by-reference, that does not copy the arguments. Slicing operations are views into an array.  
## Rough equivalents
The table below gives rough equivalents for some common MATLAB expressions. These are similar expressions, not equivalents. For details, see the documentation.
In the table below, it is assumed that you have executed the following commands in Python:
    
    import numpy as np
    from scipy import io, integrate, linalg, signal
    from scipy.sparse.linalg import cg, eigs
    
Also assume below that if the Notes talk about “matrix” that the arguments are two-dimensional entities.
### General purpose equivalents
MATLAB
NumPy
Notes  
`help func`
`info(func)` or `help(func)` or `func?` (in IPython)
get help on the function func  
`which func`
see note HELP
find out where func is defined  
`type func`
`np.source(func)` or `func??` (in IPython)
print source for func (if not a native function)  
`% comment`
`# comment`
comment a line of code with the text `comment`  
    
    for i=1:3
        fprintf('%i\n',i)
    end
    
    
    for i in range(1, 4):
       print(i)
    
use a for-loop to print the numbers 1, 2, and 3 using `range`  
`a && b`
`a and b`
short-circuiting logical AND operator (Python native operator); scalar arguments only  
`a || b`
`a or b`
short-circuiting logical OR operator (Python native operator); scalar arguments only  
    
    >> 4 == 4
    ans = 1
    >> 4 == 5
    ans = 0
    
    
    >>> 4 == 4
    True
    >>> 4 == 5
    False
    
The boolean objects in Python are `True` and `False`, as opposed to MATLAB logical types of `1` and `0`.  
    
    a=4
    if a==4
        fprintf('a = 4\n')
    elseif a==5
        fprintf('a = 5\n')
    end
    
    
    a = 4
    if a == 4:
        print('a = 4')
    elif a == 5:
        print('a = 5')
    
create an if-else statement to check if `a` is 4 or 5 and print result  
`1*i`, `1*j`, `1i`, `1j`
`1j`
complex numbers  
`eps`
`np.finfo(float).eps` or `np.spacing(1)`
distance from 1 to the next larger representable real number in double precision  
`load data.mat`
`io.loadmat('data.mat')`
Load MATLAB variables saved to the file `data.mat`. (Note: When saving arrays to `data.mat` in MATLAB/Octave, use a recent binary format. `scipy.io.loadmat` will create a dictionary with the saved arrays and further information.)  
`ode45`
`integrate.solve_ivp(f)`
integrate an ODE with Runge-Kutta 4,5  
`ode15s`
`integrate.solve_ivp(f, method='BDF')`
integrate an ODE with BDF method  
### Linear algebra equivalents
MATLAB
NumPy
Notes  
`ndims(a)`
`np.ndim(a)` or `a.ndim`
number of dimensions of array `a`  
`numel(a)`
`np.size(a)` or `a.size`
number of elements of array `a`  
`size(a)`
`np.shape(a)` or `a.shape`
“size” of array `a`  
`size(a,n)`
`a.shape[n-1]`
get the number of elements of the n-th dimension of array `a`. (Note that MATLAB uses 1 based indexing while Python uses 0 based indexing, See note INDEXING)  
`[ 1 2 3; 4 5 6 ]`
`np.array([[1., 2., 3.], [4., 5., 6.]])`
define a 2x3 2D array  
`[ a b; c d ]`
`np.block([[a, b], [c, d]])`
construct a matrix from blocks `a`, `b`, `c`, and `d`  
`a(end)`
`a[-1]`
access last element in MATLAB vector (1xn or nx1) or 1D NumPy array `a` (length n)  
`a(2,5)`
`a[1, 4]`
access element in second row, fifth column in 2D array `a`  
`a(2,:)`
`a[1]` or `a[1, :]`
entire second row of 2D array `a`  
`a(1:5,:)`
`a[0:5]` or `a[:5]` or `a[0:5, :]`
first 5 rows of 2D array `a`  
`a(end-4:end,:)`
`a[-5:]`
last 5 rows of 2D array `a`  
`a(1:3,5:9)`
`a[0:3, 4:9]`
The first through third rows and fifth through ninth columns of a 2D array, `a`.  
`a([2,4,5],[1,3])`
`a[np.ix_([1, 3, 4], [0, 2])]`
rows 2,4 and 5 and columns 1 and 3. This allows the matrix to be modified, and doesn’t require a regular slice.  
`a(3:2:21,:)`
`a[2:21:2,:]`
every other row of `a`, starting with the third and going to the twenty-first  
`a(1:2:end,:)`
`a[::2, :]`
every other row of `a`, starting with the first  
`a(end:-1:1,:)` or `flipud(a)`
`a[::-1,:]`
`a` with rows in reverse order  
`a([1:end 1],:)`
`a[np.r_[:len(a),0]]`
`a` with copy of the first row appended to the end  
`a.'`
`a.transpose()` or `a.T`
transpose of `a`  
`a'`
`a.conj().transpose()` or `a.conj().T`
conjugate transpose of `a`  
`a * b`
`a @ b`
matrix multiply  
`a .* b`
`a * b`
element-wise multiply  
`a./b`
`a/b`
element-wise divide  
`a.^3`
`a**3`
element-wise exponentiation  
`(a > 0.5)`
`(a > 0.5)`
matrix whose i,jth element is (a_ij > 0.5). The MATLAB result is an array of logical values 0 and 1. The NumPy result is an array of the boolean values `False` and `True`.  
`find(a > 0.5)`
`np.nonzero(a > 0.5)`
find the indices where (`a` > 0.5)  
`a(:,find(v > 0.5))`
`a[:,np.nonzero(v > 0.5)[0]]`
extract the columns of `a` where vector v > 0.5  
`a(:,find(v>0.5))`
`a[:, v.T > 0.5]`
extract the columns of `a` where column vector v > 0.5  
`a(a<0.5)=0`
`a[a < 0.5]=0`
`a` with elements less than 0.5 zeroed out  
`a .* (a>0.5)`
`a * (a > 0.5)`
`a` with elements less than 0.5 zeroed out  
`a(:) = 3`
`a[:] = 3`
set all values to the same scalar value  
`y=x`
`y = x.copy()`
NumPy assigns by reference  
`y=x(2,:)`
`y = x[1, :].copy()`
NumPy slices are by reference  
`y=x(:)`
`y = x.flatten()`
turn array into vector (note that this forces a copy). To obtain the same data ordering as in MATLAB, use `x.flatten('F')`.  
`1:10`
`np.arange(1., 11.)` or `np.r_[1.:11.]` or `np.r_[1:10:10j]`
create an increasing vector (see note RANGES)  
`0:9`
`np.arange(10.)` or `np.r_[:10.]` or `np.r_[:9:10j]`
create an increasing vector (see note RANGES)  
`[1:10]'`
`np.arange(1.,11.)[:, np.newaxis]`
create a column vector  
`zeros(3,4)`
`np.zeros((3, 4))`
3x4 two-dimensional array full of 64-bit floating point zeros  
`zeros(3,4,5)`
`np.zeros((3, 4, 5))`
3x4x5 three-dimensional array full of 64-bit floating point zeros  
`ones(3,4)`
`np.ones((3, 4))`
3x4 two-dimensional array full of 64-bit floating point ones  
`eye(3)`
`np.eye(3)`
3x3 identity matrix  
`diag(a)`
`np.diag(a)`
returns a vector of the diagonal elements of 2D array, `a`  
`diag(v,0)`
`np.diag(v, 0)`
returns a square diagonal matrix whose nonzero values are the elements of vector, `v`  
    
    rng(42,'twister')
    rand(3,4)
    
    
    from numpy.random import default_rng
    rng = default_rng(42)
    rng.random((3, 4))
    
or older version: `random.rand((3, 4))`
generate a random 3x4 array with default random number generator and seed = 42  
`linspace(1,3,4)`
`np.linspace(1,3,4)`
4 equally spaced samples between 1 and 3, inclusive  
`[x,y]=meshgrid(0:8,0:5)`
`np.mgrid[0:9.,0:6.]` or `np.meshgrid(r_[0:9.],r_[0:6.])`
two 2D arrays: one of x values, the other of y values  
`ogrid[0:9.,0:6.]` or `np.ix_(np.r_[0:9.],np.r_[0:6.]`
the best way to eval functions on a grid  
`[x,y]=meshgrid([1,2,4],[2,4,5])`
`np.meshgrid([1,2,4],[2,4,5])`  
`np.ix_([1,2,4],[2,4,5])`
the best way to eval functions on a grid  
`repmat(a, m, n)`
`np.tile(a, (m, n))`
create m by n copies of `a`  
`[a b]`
`np.concatenate((a,b),1)` or `np.hstack((a,b))` or `np.column_stack((a,b))` or `np.c_[a,b]`
concatenate columns of `a` and `b`  
`[a; b]`
`np.concatenate((a,b))` or `np.vstack((a,b))` or `np.r_[a,b]`
concatenate rows of `a` and `b`  
`max(max(a))`
`a.max()` or `np.nanmax(a)`
maximum element of `a` (with ndims(a)<=2 for MATLAB, if there are NaN’s, `nanmax` will ignore these and return largest value)  
`max(a)`
`a.max(0)`
maximum element of each column of array `a`  
`max(a,[],2)`
`a.max(1)`
maximum element of each row of array `a`  
`max(a,b)`
`np.maximum(a, b)`
compares `a` and `b` element-wise, and returns the maximum value from each pair  
`norm(v)`
`np.sqrt(v @ v)` or `np.linalg.norm(v)`
L2 norm of vector `v`  
`a & b`
`logical_and(a,b)`
element-by-element AND operator (NumPy ufunc) See note LOGICOPS  
`a | b`
`np.logical_or(a,b)`
element-by-element OR operator (NumPy ufunc) See note LOGICOPS  
`bitand(a,b)`
`a & b`
bitwise AND operator (Python native and NumPy ufunc)  
`bitor(a,b)`
`a | b`
bitwise OR operator (Python native and NumPy ufunc)  
`inv(a)`
`linalg.inv(a)`
inverse of square 2D array `a`  
`pinv(a)`
`linalg.pinv(a)`
pseudo-inverse of 2D array `a`  
`rank(a)`
`np.linalg.matrix_rank(a)`
matrix rank of a 2D array `a`  
`a\b`
`linalg.solve(a, b)` if `a` is square; `linalg.lstsq(a, b)` otherwise
solution of a x = b for x  
`b/a`
Solve `a.T x.T = b.T` instead
solution of x a = b for x  
`[U,S,V]=svd(a)`
`U, S, Vh = linalg.svd(a); V = Vh.T`
singular value decomposition of `a`  
`chol(a)`
`linalg.cholesky(a)`
Cholesky factorization of a 2D array  
`[V,D]=eig(a)`
`D,V = linalg.eig(a)`
eigenvalues \\(\lambda\\) and eigenvectors \\(v\\) of `a`, where \\(\mathbf{a} v = \lambda v\\)  
`[V,D]=eig(a,b)`
`D,V = linalg.eig(a, b)`
eigenvalues \\(\lambda\\) and eigenvectors \\(v\\) of `a`, `b` where \\(\mathbf{a} v = \lambda \mathbf{b} v\\)  
`[V,D]=eigs(a,3)`
`D,V = eigs(a, k=3)`
find the `k=3` largest eigenvalues and eigenvectors of 2D array, `a`  
`[Q,R]=qr(a,0)`
`Q,R = linalg.qr(a)`
QR decomposition  
`[L,U,P]=lu(a)` where `a==P'*L*U`
`P,L,U = linalg.lu(a)` where `a == P@L@U`
LU decomposition with partial pivoting (note: P(MATLAB) == transpose(P(NumPy)))  
`conjgrad`
`cg`
conjugate gradients solver  
`fft(a)`
`np.fft.fft(a)`
Fourier transform of `a`  
`ifft(a)`
`np.fft.ifft(a)`
inverse Fourier transform of `a`  
`sort(a)`
`np.sort(a)` or `a.sort(axis=0)`
sort each column of a 2D array, `a`  
`sort(a, 2)`
`np.sort(a, axis=1)` or `a.sort(axis=1)`
sort the each row of 2D array, `a`  
`[b,I]=sortrows(a,1)`
`I = np.argsort(a[:, 0]); b = a[I,:]`
save the array `a` as array `b` with rows sorted by the first column  
`x = Z\y`
`x = linalg.lstsq(Z, y)`
perform a linear regression of the form \\(\mathbf{Zx}=\mathbf{y}\\)  
`decimate(x, q)`
`signal.resample(x, np.ceil(len(x)/q))`
downsample with low-pass filtering  
`unique(a)`
`np.unique(a)`
a vector of unique values in array `a`  
`squeeze(a)`
`a.squeeze()`
remove singleton dimensions of array `a`. Note that MATLAB will always return arrays of 2D or higher while NumPy will return arrays of 0D or higher  
## Notes
Submatrix: Assignment to a submatrix can be done with lists of indices using the `ix_` command. E.g., for 2D array `a`, one might do: `ind=[1, 3]; a[np.ix_(ind, ind)] += 100`.
HELP: There is no direct equivalent of MATLAB’s `which` command, but the commands `help` will usually list the filename where the function is located. Python also has an `inspect` module (do `import inspect`) which provides a `getfile` that often works.
INDEXING: MATLAB uses one based indexing, so the initial element of a sequence has index 1. Python uses zero based indexing, so the initial element of a sequence has index 0. Confusion and flamewars arise because each has advantages and disadvantages. One based indexing is consistent with common human language usage, where the “first” element of a sequence has index 1. Zero based indexing simplifies indexing. See also a text by prof.dr. Edsger W. Dijkstra.
RANGES: In MATLAB, `0:5` can be used as both a range literal and a ‘slice’ index (inside parentheses); however, in Python, constructs like `0:5` can only be used as a slice index (inside square brackets). Thus the somewhat quirky `r_` object was created to allow NumPy to have a similarly terse range construction mechanism. Note that `r_` is not called like a function or a constructor, but rather indexed using square brackets, which allows the use of Python’s slice syntax in the arguments.
LOGICOPS: `&` or `|` in NumPy is bitwise AND/OR, while in MATLAB & and `|` are logical AND/OR. The two can appear to work the same, but there are important differences. If you would have used MATLAB’s `&` or `|` operators, you should use the NumPy ufuncs `logical_and`/`logical_or`. The notable differences between MATLAB’s and NumPy’s `&` and `|` operators are:
  * Non-logical {0,1} inputs: NumPy’s output is the bitwise AND of the inputs. MATLAB treats any non-zero value as 1 and returns the logical AND. For example `(3 & 4)` in NumPy is `0`, while in MATLAB both `3` and `4` are considered logical true and `(3 & 4)` returns `1`.
  * Precedence: NumPy’s & operator is higher precedence than logical operators like `<` and `>`; MATLAB’s is the reverse.


If you know you have boolean arguments, you can get away with using NumPy’s bitwise operators, but be careful with parentheses, like this: `z = (x > 1) & (x < 2)`. The absence of NumPy operator forms of `logical_and` and `logical_or` is an unfortunate consequence of Python’s design.
RESHAPE and LINEAR INDEXING: MATLAB always allows multi-dimensional arrays to be accessed using scalar or linear indices, NumPy does not. Linear indices are common in MATLAB programs, e.g. `find()` on a matrix returns them, whereas NumPy’s find behaves differently. When converting MATLAB code it might be necessary to first reshape a matrix to a linear sequence, perform some indexing operations and then reshape back. As reshape (usually) produces views onto the same storage, it should be possible to do this fairly efficiently. Note that the scan order used by reshape in NumPy defaults to the ‘C’ order, whereas MATLAB uses the Fortran order. If you are simply converting to a linear sequence and back this doesn’t matter. But if you are converting reshapes from MATLAB code which relies on the scan order, then this MATLAB code: `z = reshape(x,3,4);` should become `z = x.reshape(3,4,order='F').copy()` in NumPy.
## ‘array’ or ‘matrix’? Which should I use?
Historically, NumPy has provided a special matrix type, `np.matrix`, which is a subclass of ndarray which makes binary operations linear algebra operations. You may see it used in some existing code instead of `np.array`. So, which one to use?
### Short answer
Use arrays.
  * They support multidimensional array algebra that is supported in MATLAB
  * They are the standard vector/matrix/tensor type of NumPy. Many NumPy functions return arrays, not matrices.
  * There is a clear distinction between element-wise operations and linear algebra operations.
  * You can have standard vectors or row/column vectors if you like.


Until Python 3.5 the only disadvantage of using the array type was that you had to use `dot` instead of `*` to multiply (reduce) two tensors (scalar product, matrix vector multiplication etc.). Since Python 3.5 you can use the matrix multiplication `@` operator.
Given the above, we intend to deprecate `matrix` eventually.
### Long answer
NumPy contains both an `array` class and a `matrix` class. The `array` class is intended to be a general-purpose n-dimensional array for many kinds of numerical computing, while `matrix` is intended to facilitate linear algebra computations specifically. In practice there are only a handful of key differences between the two.
  * Operators `*` and `@`, functions `dot()`, and `multiply()`:
    * For `array`, ``*`` means element-wise multiplication, while ``@`` means matrix multiplication; they have associated functions `multiply()` and `dot()`. (Before Python 3.5, `@` did not exist and one had to use `dot()` for matrix multiplication).
    * For `matrix`, ``*`` means matrix multiplication, and for element-wise multiplication one has to use the `multiply()` function.
  * Handling of vectors (one-dimensional arrays)
    * For `array`, the vector shapes 1xN, Nx1, and N are all different things. Operations like `A[:,1]` return a one-dimensional array of shape N, not a two-dimensional array of shape Nx1. Transpose on a one-dimensional `array` does nothing.
    * For `matrix`, one-dimensional arrays are always upconverted to 1xN or Nx1 matrices (row or column vectors). `A[:,1]` returns a two-dimensional matrix of shape Nx1.
  * Handling of higher-dimensional arrays (ndim > 2)
    * `array` objects can have number of dimensions > 2;
    * `matrix` objects always have exactly two dimensions.
  * Convenience attributes
    * `array` has a .T attribute, which returns the transpose of the data.
    * `matrix` also has .H, .I, and .A attributes, which return the conjugate transpose, inverse, and `asarray()` of the matrix, respectively.
  * Convenience constructor
    * The `array` constructor takes (nested) Python sequences as initializers. As in, `array([[1,2,3],[4,5,6]])`.
    * The `matrix` constructor additionally takes a convenient string initializer. As in `matrix("[1 2 3; 4 5 6]")`.


There are pros and cons to using both:
  * `array`
    * `:)` Element-wise multiplication is easy: `A*B`.
    * `:(` You have to remember that matrix multiplication has its own operator, `@`.
    * `:)` You can treat one-dimensional arrays as either row or column vectors. `A @ v` treats `v` as a column vector, while `v @ A` treats `v` as a row vector. This can save you having to type a lot of transposes.
    * `:)` `array` is the “default” NumPy type, so it gets the most testing, and is the type most likely to be returned by 3rd party code that uses NumPy.
    * `:)` Is quite at home handling data of any number of dimensions.
    * `:)` Closer in semantics to tensor algebra, if you are familiar with that.
    * `:)` All operations (`*`, `/`, `+`, `-` etc.) are element-wise.
    * `:(` Sparse matrices from `scipy.sparse` do not interact as well with arrays.
  * `matrix`
    * `:\\` Behavior is more like that of MATLAB matrices.
    * `<:(` Maximum of two-dimensional. To hold three-dimensional data you need `array` or perhaps a Python list of `matrix`.
    * `<:(` Minimum of two-dimensional. You cannot have vectors. They must be cast as single-column or single-row matrices.
    * `<:(` Since `array` is the default in NumPy, some functions may return an `array` even if you give them a `matrix` as an argument. This shouldn’t happen with NumPy functions (if it does it’s a bug), but 3rd party code based on NumPy may not honor type preservation like NumPy does.
    * `:)` `A*B` is matrix multiplication, so it looks just like you write it in linear algebra (For Python >= 3.5 plain arrays have the same convenience with the `@` operator).
    * `<:(` Element-wise multiplication requires calling a function, `multiply(A,B)`.
    * `<:(` The use of operator overloading is a bit illogical: `*` does not work element-wise but `/` does.
    * Interaction with `scipy.sparse` is a bit cleaner.


The `array` is thus much more advisable to use. Indeed, we intend to deprecate `matrix` eventually.
## Customizing your environment
In MATLAB the main tool available to you for customizing the environment is to modify the search path with the locations of your favorite functions. You can put such customizations into a startup script that MATLAB will run on startup.
NumPy, or rather Python, has similar facilities.
  * To modify your Python search path to include the locations of your own modules, define the `PYTHONPATH` environment variable.
  * To have a particular script file executed when the interactive Python interpreter is started, define the `PYTHONSTARTUP` environment variable to contain the name of your startup script.


Unlike MATLAB, where anything on your path can be called immediately, with Python you need to first do an ‘import’ statement to make functions in a particular file accessible.
For example you might make a startup script that looks like this (Note: this is just an example, not a statement of “best practices”):
    
    # Make all numpy available via shorter 'np' prefix
    import numpy as np
    #
    # Make the SciPy linear algebra functions available as linalg.func()
    # e.g. linalg.lu, linalg.eig (for general l*B@u==A@u solution)
    from scipy import linalg
    #
    # Define a Hermitian function
    def hermitian(A, **kwargs):
        return np.conj(A,**kwargs).T
    # Make a shortcut for hermitian:
    #    hermitian(A) --> H(A)
    H = hermitian
    
To use the deprecated `matrix` and other `matlib` functions:
    
    # Make all matlib functions accessible at the top level via M.func()
    import numpy.matlib as M
    # Make some matlib functions accessible directly at the top level via, e.g. rand(3,3)
    from numpy.matlib import matrix,rand,zeros,ones,empty,eye
    
## Links
Another somewhat outdated MATLAB/NumPy cross-reference can be found at http://mathesaurus.sf.net/
An extensive list of tools for scientific work with Python can be found in the topical software page.
See List of Python software: scripting for a list of software that use Python as a scripting language
MATLAB® and SimuLink® are registered trademarks of The MathWorks, Inc.
# NumPy quickstart
## Prerequisites
You’ll need to know a bit of Python. For a refresher, see the Python tutorial.
To work the examples, you’ll need `matplotlib` installed in addition to NumPy.
Learner profile
This is a quick overview of arrays in NumPy. It demonstrates how n-dimensional (\\(n>=2\\)) arrays are represented and can be manipulated. In particular, if you don’t know how to apply common functions to n-dimensional arrays (without using for-loops), or if you want to understand axis and shape properties for n-dimensional arrays, this article might be of help.
Learning Objectives
After reading, you should be able to:
  * Understand the difference between one-, two- and n-dimensional arrays in NumPy;
  * Understand how to apply some linear algebra operations to n-dimensional arrays without using for-loops;
  * Understand axis and shape properties for n-dimensional arrays.


## The basics
NumPy’s main object is the homogeneous multidimensional array. It is a table of elements (usually numbers), all of the same type, indexed by a tuple of non-negative integers. In NumPy dimensions are called axes.
For example, the array for the coordinates of a point in 3D space, `[1, 2, 1]`, has one axis. That axis has 3 elements in it, so we say it has a length of 3. In the example pictured below, the array has 2 axes. The first axis has a length of 2, the second axis has a length of 3.
    
    [[1., 0., 0.],
     [0., 1., 2.]]
    
NumPy’s array class is called `ndarray`. It is also known by the alias `array`. Note that `numpy.array` is not the same as the Standard Python Library class `array.array`, which only handles one-dimensional arrays and offers less functionality. The more important attributes of an `ndarray` object are:
ndarray.ndim
    
the number of axes (dimensions) of the array.
ndarray.shape
    
the dimensions of the array. This is a tuple of integers indicating the size of the array in each dimension. For a matrix with n rows and m columns, `shape` will be `(n,m)`. The length of the `shape` tuple is therefore the number of axes, `ndim`.
ndarray.size
    
the total number of elements of the array. This is equal to the product of the elements of `shape`.
ndarray.dtype
    
an object describing the type of the elements in the array. One can create or specify dtype’s using standard Python types. Additionally NumPy provides types of its own. numpy.int32, numpy.int16, and numpy.float64 are some examples.
ndarray.itemsize
    
the size in bytes of each element of the array. For example, an array of elements of type `float64` has `itemsize` 8 (=64/8), while one of type `complex32` has `itemsize` 4 (=32/8). It is equivalent to `ndarray.dtype.itemsize`.
ndarray.data
    
the buffer containing the actual elements of the array. Normally, we won’t need to use this attribute because we will access the elements in an array using indexing facilities.
### An example
    
    >>> import numpy as np
    >>> a = np.arange(15).reshape(3, 5)
    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    >>> a.shape
    (3, 5)
    >>> a.ndim
    2
    >>> a.dtype.name
    'int64'
    >>> a.itemsize
    8
    >>> a.size
    15
    >>> type(a)
    <class 'numpy.ndarray'>
    >>> b = np.array([6, 7, 8])
    >>> b
    array([6, 7, 8])
    >>> type(b)
    <class 'numpy.ndarray'>
    
### Array creation
There are several ways to create arrays.
For example, you can create an array from a regular Python list or tuple using the `array` function. The type of the resulting array is deduced from the type of the elements in the sequences.
    
    >>> import numpy as np
    >>> a = np.array([2, 3, 4])
    >>> a
    array([2, 3, 4])
    >>> a.dtype
    dtype('int64')
    >>> b = np.array([1.2, 3.5, 5.1])
    >>> b.dtype
    dtype('float64')
    
A frequent error consists in calling `array` with multiple arguments, rather than providing a single sequence as an argument.
    
    >>> a = np.array(1, 2, 3, 4)    # WRONG
    Traceback (most recent call last):
      ...
    TypeError: array() takes from 1 to 2 positional arguments but 4 were given
    >>> a = np.array([1, 2, 3, 4])  # RIGHT
    
`array` transforms sequences of sequences into two-dimensional arrays, sequences of sequences of sequences into three-dimensional arrays, and so on.
    
    >>> b = np.array([(1.5, 2, 3), (4, 5, 6)])
    >>> b
    array([[1.5, 2. , 3. ],
           [4. , 5. , 6. ]])
    
The type of the array can also be explicitly specified at creation time:
    
    >>> c = np.array([[1, 2], [3, 4]], dtype=complex)
    >>> c
    array([[1.+0.j, 2.+0.j],
           [3.+0.j, 4.+0.j]])
    
Often, the elements of an array are originally unknown, but its size is known. Hence, NumPy offers several functions to create arrays with initial placeholder content. These minimize the necessity of growing arrays, an expensive operation.
The function `zeros` creates an array full of zeros, the function `ones` creates an array full of ones, and the function `empty` creates an array whose initial content is random and depends on the state of the memory. By default, the dtype of the created array is `float64`, but it can be specified via the key word argument `dtype`.
    
    >>> np.zeros((3, 4))
    array([[0., 0., 0., 0.],
           [0., 0., 0., 0.],
           [0., 0., 0., 0.]])
    >>> np.ones((2, 3, 4), dtype=np.int16)
    array([[[1, 1, 1, 1],
            [1, 1, 1, 1],
            [1, 1, 1, 1]],
    
           [[1, 1, 1, 1],
            [1, 1, 1, 1],
            [1, 1, 1, 1]]], dtype=int16)
    >>> np.empty((2, 3)) 
    array([[3.73603959e-262, 6.02658058e-154, 6.55490914e-260],  # may vary
           [5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
    
To create sequences of numbers, NumPy provides the `arange` function which is analogous to the Python built-in `range`, but returns an array.
    
    >>> np.arange(10, 30, 5)
    array([10, 15, 20, 25])
    >>> np.arange(0, 2, 0.3)  # it accepts float arguments
    array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
    
When `arange` is used with floating point arguments, it is generally not possible to predict the number of elements obtained, due to the finite floating point precision. For this reason, it is usually better to use the function `linspace` that receives as an argument the number of elements that we want, instead of the step:
    
    >>> from numpy import pi
    >>> np.linspace(0, 2, 9)                   # 9 numbers from 0 to 2
    array([0.  , 0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  ])
    >>> x = np.linspace(0, 2 * pi, 100)        # useful to evaluate function at lots of points
    >>> f = np.sin(x)
    
See also
`array`, `zeros`, `zeros_like`, `ones`, `ones_like`, `empty`, `empty_like`, `arange`, `linspace`, `random.Generator.random`, `random.Generator.normal`, `fromfunction`, `fromfile`
### Printing arrays
When you print an array, NumPy displays it in a similar way to nested lists, but with the following layout:
  * the last axis is printed from left to right,
  * the second-to-last is printed from top to bottom,
  * the rest are also printed from top to bottom, with each slice separated from the next by an empty line.


One-dimensional arrays are then printed as rows, bidimensionals as matrices and tridimensionals as lists of matrices.
    
    >>> a = np.arange(6)                    # 1d array
    >>> print(a)
    [0 1 2 3 4 5]
    >>>
    >>> b = np.arange(12).reshape(4, 3)     # 2d array
    >>> print(b)
    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10 11]]
    >>>
    >>> c = np.arange(24).reshape(2, 3, 4)  # 3d array
    >>> print(c)
    [[[ 0  1  2  3]
      [ 4  5  6  7]
      [ 8  9 10 11]]
    
     [[12 13 14 15]
      [16 17 18 19]
      [20 21 22 23]]]
    
See below to get more details on `reshape`.
If an array is too large to be printed, NumPy automatically skips the central part of the array and only prints the corners:
    
    >>> print(np.arange(10000))
    [   0    1    2 ... 9997 9998 9999]
    >>>
    >>> print(np.arange(10000).reshape(100, 100))
    [[   0    1    2 ...   97   98   99]
     [ 100  101  102 ...  197  198  199]
     [ 200  201  202 ...  297  298  299]
     ...
     [9700 9701 9702 ... 9797 9798 9799]
     [9800 9801 9802 ... 9897 9898 9899]
     [9900 9901 9902 ... 9997 9998 9999]]
    
To disable this behaviour and force NumPy to print the entire array, you can change the printing options using `set_printoptions`.
    
    >>> np.set_printoptions(threshold=sys.maxsize)  # sys module should be imported
    
### Basic operations
Arithmetic operators on arrays apply elementwise. A new array is created and filled with the result.
    
    >>> a = np.array([20, 30, 40, 50])
    >>> b = np.arange(4)
    >>> b
    array([0, 1, 2, 3])
    >>> c = a - b
    >>> c
    array([20, 29, 38, 47])
    >>> b**2
    array([0, 1, 4, 9])
    >>> 10 * np.sin(a)
    array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
    >>> a < 35
    array([ True,  True, False, False])
    
Unlike in many matrix languages, the product operator `*` operates elementwise in NumPy arrays. The matrix product can be performed using the `@` operator (in python >=3.5) or the `dot` function or method:
    
    >>> A = np.array([[1, 1],
    ...               [0, 1]])
    >>> B = np.array([[2, 0],
    ...               [3, 4]])
    >>> A * B     # elementwise product
    array([[2, 0],
           [0, 4]])
    >>> A @ B     # matrix product
    array([[5, 4],
           [3, 4]])
    >>> A.dot(B)  # another matrix product
    array([[5, 4],
           [3, 4]])
    
Some operations, such as `+=` and `*=`, act in place to modify an existing array rather than create a new one.
    
    >>> rg = np.random.default_rng(1)  # create instance of default random number generator
    >>> a = np.ones((2, 3), dtype=int)
    >>> b = rg.random((2, 3))
    >>> a *= 3
    >>> a
    array([[3, 3, 3],
           [3, 3, 3]])
    >>> b += a
    >>> b
    array([[3.51182162, 3.9504637 , 3.14415961],
           [3.94864945, 3.31183145, 3.42332645]])
    >>> a += b  # b is not automatically converted to integer type
    Traceback (most recent call last):
        ...
    numpy._core._exceptions._UFuncOutputCastingError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
    
When operating with arrays of different types, the type of the resulting array corresponds to the more general or precise one (a behavior known as upcasting).
    
    >>> a = np.ones(3, dtype=np.int32)
    >>> b = np.linspace(0, pi, 3)
    >>> b.dtype.name
    'float64'
    >>> c = a + b
    >>> c
    array([1.        , 2.57079633, 4.14159265])
    >>> c.dtype.name
    'float64'
    >>> d = np.exp(c * 1j)
    >>> d
    array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
           -0.54030231-0.84147098j])
    >>> d.dtype.name
    'complex128'
    
Many unary operations, such as computing the sum of all the elements in the array, are implemented as methods of the `ndarray` class.
    
    >>> a = rg.random((2, 3))
    >>> a
    array([[0.82770259, 0.40919914, 0.54959369],
           [0.02755911, 0.75351311, 0.53814331]])
    >>> a.sum()
    3.1057109529998157
    >>> a.min()
    0.027559113243068367
    >>> a.max()
    0.8277025938204418
    
By default, these operations apply to the array as though it were a list of numbers, regardless of its shape. However, by specifying the `axis` parameter you can apply an operation along the specified axis of an array:
    
    >>> b = np.arange(12).reshape(3, 4)
    >>> b
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>
    >>> b.sum(axis=0)     # sum of each column
    array([12, 15, 18, 21])
    >>>
    >>> b.min(axis=1)     # min of each row
    array([0, 4, 8])
    >>>
    >>> b.cumsum(axis=1)  # cumulative sum along each row
    array([[ 0,  1,  3,  6],
           [ 4,  9, 15, 22],
           [ 8, 17, 27, 38]])
    
### Universal functions
NumPy provides familiar mathematical functions such as sin, cos, and exp. In NumPy, these are called “universal functions” (`ufunc`). Within NumPy, these functions operate elementwise on an array, producing an array as output.
    
    >>> B = np.arange(3)
    >>> B
    array([0, 1, 2])
    >>> np.exp(B)
    array([1.        , 2.71828183, 7.3890561 ])
    >>> np.sqrt(B)
    array([0.        , 1.        , 1.41421356])
    >>> C = np.array([2., -1., 4.])
    >>> np.add(B, C)
    array([2., 0., 6.])
    
See also
`all`, `any`, `apply_along_axis`, `argmax`, `argmin`, `argsort`, `average`, `bincount`, `ceil`, `clip`, `conj`, `corrcoef`, `cov`, `cross`, `cumprod`, `cumsum`, `diff`, `dot`, `floor`, `inner`, `invert`, `lexsort`, `max`, `maximum`, `mean`, `median`, `min`, `minimum`, `nonzero`, `outer`, `prod`, `re`, `round`, `sort`, `std`, `sum`, `trace`, `transpose`, `var`, `vdot`, `vectorize`, `where`
### Indexing, slicing and iterating
One-dimensional arrays can be indexed, sliced and iterated over, much like lists and other Python sequences.
    
    >>> a = np.arange(10)**3
    >>> a
    array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
    >>> a[2]
    8
    >>> a[2:5]
    array([ 8, 27, 64])
    >>> # equivalent to a[0:6:2] = 1000;
    >>> # from start to position 6, exclusive, set every 2nd element to 1000
    >>> a[:6:2] = 1000
    >>> a
    array([1000,    1, 1000,   27, 1000,  125,  216,  343,  512,  729])
    >>> a[::-1]  # reversed a
    array([ 729,  512,  343,  216,  125, 1000,   27, 1000,    1, 1000])
    >>> for i in a:
    ...     print(i**(1 / 3.))
    ...
    9.999999999999998  # may vary
    1.0
    9.999999999999998
    3.0
    9.999999999999998
    4.999999999999999
    5.999999999999999
    6.999999999999999
    7.999999999999999
    8.999999999999998
    
Multidimensional arrays can have one index per axis. These indices are given in a tuple separated by commas:
    
    >>> def f(x, y):
    ...     return 10 * x + y
    ...
    >>> b = np.fromfunction(f, (5, 4), dtype=int)
    >>> b
    array([[ 0,  1,  2,  3],
           [10, 11, 12, 13],
           [20, 21, 22, 23],
           [30, 31, 32, 33],
           [40, 41, 42, 43]])
    >>> b[2, 3]
    23
    >>> b[0:5, 1]  # each row in the second column of b
    array([ 1, 11, 21, 31, 41])
    >>> b[:, 1]    # equivalent to the previous example
    array([ 1, 11, 21, 31, 41])
    >>> b[1:3, :]  # each column in the second and third row of b
    array([[10, 11, 12, 13],
           [20, 21, 22, 23]])
    
When fewer indices are provided than the number of axes, the missing indices are considered complete slices`:`
    
    >>> b[-1]   # the last row. Equivalent to b[-1, :]
    array([40, 41, 42, 43])
    
The expression within brackets in `b[i]` is treated as an `i` followed by as many instances of `:` as needed to represent the remaining axes. NumPy also allows you to write this using dots as `b[i, ...]`.
The dots (`...`) represent as many colons as needed to produce a complete indexing tuple. For example, if `x` is an array with 5 axes, then
  * `x[1, 2, ...]` is equivalent to `x[1, 2, :, :, :]`,
  * `x[..., 3]` to `x[:, :, :, :, 3]` and
  * `x[4, ..., 5, :]` to `x[4, :, :, 5, :]`.


    
    >>> c = np.array([[[  0,  1,  2],  # a 3D array (two stacked 2D arrays)
    ...                [ 10, 12, 13]],
    ...               [[100, 101, 102],
    ...                [110, 112, 113]]])
    >>> c.shape
    (2, 2, 3)
    >>> c[1, ...]  # same as c[1, :, :] or c[1]
    array([[100, 101, 102],
           [110, 112, 113]])
    >>> c[..., 2]  # same as c[:, :, 2]
    array([[  2,  13],
           [102, 113]])
    
Iterating over multidimensional arrays is done with respect to the first axis:
    
    >>> for row in b:
    ...     print(row)
    ...
    [0 1 2 3]
    [10 11 12 13]
    [20 21 22 23]
    [30 31 32 33]
    [40 41 42 43]
    
However, if one wants to perform an operation on each element in the array, one can use the `flat` attribute which is an iterator over all the elements of the array:
    
    >>> for element in b.flat:
    ...     print(element)
    ...
    0
    1
    2
    3
    10
    11
    12
    13
    20
    21
    22
    23
    30
    31
    32
    33
    40
    41
    42
    43
    
See also
Indexing on ndarrays, Indexing routines (reference), `newaxis`, `ndenumerate`, `indices`
## Shape manipulation
### Changing the shape of an array
An array has a shape given by the number of elements along each axis:
    
    >>> a = np.floor(10 * rg.random((3, 4)))
    >>> a
    array([[3., 7., 3., 4.],
           [1., 4., 2., 2.],
           [7., 2., 4., 9.]])
    >>> a.shape
    (3, 4)
    
The shape of an array can be changed with various commands. Note that the following three commands all return a modified array, but do not change the original array:
    
    >>> a.ravel()  # returns the array, flattened
    array([3., 7., 3., 4., 1., 4., 2., 2., 7., 2., 4., 9.])
    >>> a.reshape(6, 2)  # returns the array with a modified shape
    array([[3., 7.],
           [3., 4.],
           [1., 4.],
           [2., 2.],
           [7., 2.],
           [4., 9.]])
    >>> a.T  # returns the array, transposed
    array([[3., 1., 7.],
           [7., 4., 2.],
           [3., 2., 4.],
           [4., 2., 9.]])
    >>> a.T.shape
    (4, 3)
    >>> a.shape
    (3, 4)
    
The order of the elements in the array resulting from `ravel` is normally “C-style”, that is, the rightmost index “changes the fastest”, so the element after `a[0, 0]` is `a[0, 1]`. If the array is reshaped to some other shape, again the array is treated as “C-style”. NumPy normally creates arrays stored in this order, so `ravel` will usually not need to copy its argument, but if the array was made by taking slices of another array or created with unusual options, it may need to be copied. The functions `ravel` and `reshape` can also be instructed, using an optional argument, to use FORTRAN-style arrays, in which the leftmost index changes the fastest.
The `reshape` function returns its argument with a modified shape, whereas the `ndarray.resize` method modifies the array itself:
    
    >>> a
    array([[3., 7., 3., 4.],
           [1., 4., 2., 2.],
           [7., 2., 4., 9.]])
    >>> a.resize((2, 6))
    >>> a
    array([[3., 7., 3., 4., 1., 4.],
           [2., 2., 7., 2., 4., 9.]])
    
If a dimension is given as `-1` in a reshaping operation, the other dimensions are automatically calculated:
    
    >>> a.reshape(3, -1)
    array([[3., 7., 3., 4.],
           [1., 4., 2., 2.],
           [7., 2., 4., 9.]])
    
See also
`ndarray.shape`, `reshape`, `resize`, `ravel`
### Stacking together different arrays
Several arrays can be stacked together along different axes:
    
    >>> a = np.floor(10 * rg.random((2, 2)))
    >>> a
    array([[9., 7.],
           [5., 2.]])
    >>> b = np.floor(10 * rg.random((2, 2)))
    >>> b
    array([[1., 9.],
           [5., 1.]])
    >>> np.vstack((a, b))
    array([[9., 7.],
           [5., 2.],
           [1., 9.],
           [5., 1.]])
    >>> np.hstack((a, b))
    array([[9., 7., 1., 9.],
           [5., 2., 5., 1.]])
    
The function `column_stack` stacks 1D arrays as columns into a 2D array. It is equivalent to `hstack` only for 2D arrays:
    
    >>> from numpy import newaxis
    >>> np.column_stack((a, b))  # with 2D arrays
    array([[9., 7., 1., 9.],
           [5., 2., 5., 1.]])
    >>> a = np.array([4., 2.])
    >>> b = np.array([3., 8.])
    >>> np.column_stack((a, b))  # returns a 2D array
    array([[4., 3.],
           [2., 8.]])
    >>> np.hstack((a, b))        # the result is different
    array([4., 2., 3., 8.])
    >>> a[:, newaxis]  # view `a` as a 2D column vector
    array([[4.],
           [2.]])
    >>> np.column_stack((a[:, newaxis], b[:, newaxis]))
    array([[4., 3.],
           [2., 8.]])
    >>> np.hstack((a[:, newaxis], b[:, newaxis]))  # the result is the same
    array([[4., 3.],
           [2., 8.]])
    
In general, for arrays with more than two dimensions, `hstack` stacks along their second axes, `vstack` stacks along their first axes, and `concatenate` allows for an optional arguments giving the number of the axis along which the concatenation should happen.
Note
In complex cases, `r_` and `c_` are useful for creating arrays by stacking numbers along one axis. They allow the use of range literals `:`.
    
    >>> np.r_[1:4, 0, 4]
    array([1, 2, 3, 0, 4])
    
When used with arrays as arguments, `r_` and `c_` are similar to `vstack` and `hstack` in their default behavior, but allow for an optional argument giving the number of the axis along which to concatenate.
See also
`hstack`, `vstack`, `column_stack`, `concatenate`, `c_`, `r_`
### Splitting one array into several smaller ones
Using `hsplit`, you can split an array along its horizontal axis, either by specifying the number of equally shaped arrays to return, or by specifying the columns after which the division should occur:
    
    >>> a = np.floor(10 * rg.random((2, 12)))
    >>> a
    array([[6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.],
           [8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.]])
    >>> # Split `a` into 3
    >>> np.hsplit(a, 3)
    [array([[6., 7., 6., 9.],
           [8., 5., 5., 7.]]), array([[0., 5., 4., 0.],
           [1., 8., 6., 7.]]), array([[6., 8., 5., 2.],
           [1., 8., 1., 0.]])]
    >>> # Split `a` after the third and the fourth column
    >>> np.hsplit(a, (3, 4))
    [array([[6., 7., 6.],
           [8., 5., 5.]]), array([[9.],
           [7.]]), array([[0., 5., 4., 0., 6., 8., 5., 2.],
           [1., 8., 6., 7., 1., 8., 1., 0.]])]
    
`vsplit` splits along the vertical axis, and `array_split` allows one to specify along which axis to split.
## Copies and views
When operating and manipulating arrays, their data is sometimes copied into a new array and sometimes not. This is often a source of confusion for beginners. There are three cases:
### No copy at all
Simple assignments make no copy of objects or their data.
    
    >>> a = np.array([[ 0,  1,  2,  3],
    ...               [ 4,  5,  6,  7],
    ...               [ 8,  9, 10, 11]])
    >>> b = a            # no new object is created
    >>> b is a           # a and b are two names for the same ndarray object
    True
    
Python passes mutable objects as references, so function calls make no copy.
    
    >>> def f(x):
    ...     print(id(x))
    ...
    >>> id(a)  # id is a unique identifier of an object 
    148293216  # may vary
    >>> f(a)   
    148293216  # may vary
    
### View or shallow copy
Different array objects can share the same data. The `view` method creates a new array object that looks at the same data.
    
    >>> c = a.view()
    >>> c is a
    False
    >>> c.base is a            # c is a view of the data owned by a
    True
    >>> c.flags.owndata
    False
    >>>
    >>> c = c.reshape((2, 6))  # a's shape doesn't change, reassigned c is still a view of a
    >>> a.shape
    (3, 4)
    >>> c[0, 4] = 1234         # a's data changes
    >>> a
    array([[   0,    1,    2,    3],
           [1234,    5,    6,    7],
           [   8,    9,   10,   11]])
    
Slicing an array returns a view of it:
    
    >>> s = a[:, 1:3]
    >>> s[:] = 10  # s[:] is a view of s. Note the difference between s = 10 and s[:] = 10
    >>> a
    array([[   0,   10,   10,    3],
           [1234,   10,   10,    7],
           [   8,   10,   10,   11]])
    
### Deep copy
The `copy` method makes a complete copy of the array and its data.
    
    >>> d = a.copy()  # a new array object with new data is created
    >>> d is a
    False
    >>> d.base is a  # d doesn't share anything with a
    False
    >>> d[0, 0] = 9999
    >>> a
    array([[   0,   10,   10,    3],
           [1234,   10,   10,    7],
           [   8,   10,   10,   11]])
    
Sometimes `copy` should be called after slicing if the original array is not required anymore. For example, suppose `a` is a huge intermediate result and the final result `b` only contains a small fraction of `a`, a deep copy should be made when constructing `b` with slicing:
    
    >>> a = np.arange(int(1e8))
    >>> b = a[:100].copy()
    >>> del a  # the memory of ``a`` can be released.
    
If `b = a[:100]` is used instead, `a` is referenced by `b` and will persist in memory even if `del a` is executed.
See also Copies and views.
### Functions and methods overview
Here is a list of some useful NumPy functions and methods names ordered in categories. See Routines and objects by topic for the full list.
Array Creation
    
`arange`, `array`, `copy`, `empty`, `empty_like`, `eye`, `fromfile`, `fromfunction`, `identity`, `linspace`, `logspace`, `mgrid`, `ogrid`, `ones`, `ones_like`, `r_`, `zeros`, `zeros_like`
Conversions
    
`ndarray.astype`, `atleast_1d`, `atleast_2d`, `atleast_3d`, `mat`
Manipulations
    
`array_split`, `column_stack`, `concatenate`, `diagonal`, `dsplit`, `dstack`, `hsplit`, `hstack`, `ndarray.item`, `newaxis`, `ravel`, `repeat`, `reshape`, `resize`, `squeeze`, `swapaxes`, `take`, `transpose`, `vsplit`, `vstack`
Questions
    
`all`, `any`, `nonzero`, `where`
Ordering
    
`argmax`, `argmin`, `argsort`, `max`, `min`, `ptp`, `searchsorted`, `sort`
Operations
    
`choose`, `compress`, `cumprod`, `cumsum`, `inner`, `ndarray.fill`, `imag`, `prod`, `put`, `putmask`, `real`, `sum`
Basic Statistics
    
`cov`, `mean`, `std`, `var`
Basic Linear Algebra
    
`cross`, `dot`, `outer`, `linalg.svd`, `vdot`
## Less basic
### Broadcasting rules
Broadcasting allows universal functions to deal in a meaningful way with inputs that do not have exactly the same shape.
The first rule of broadcasting is that if all input arrays do not have the same number of dimensions, a “1” will be repeatedly prepended to the shapes of the smaller arrays until all the arrays have the same number of dimensions.
The second rule of broadcasting ensures that arrays with a size of 1 along a particular dimension act as if they had the size of the array with the largest shape along that dimension. The value of the array element is assumed to be the same along that dimension for the “broadcast” array.
After application of the broadcasting rules, the sizes of all arrays must match. More details can be found in Broadcasting.
## Advanced indexing and index tricks
NumPy offers more indexing facilities than regular Python sequences. In addition to indexing by integers and slices, as we saw before, arrays can be indexed by arrays of integers and arrays of booleans.
### Indexing with arrays of indices
    
    >>> a = np.arange(12)**2  # the first 12 square numbers
    >>> i = np.array([1, 1, 3, 8, 5])  # an array of indices
    >>> a[i]  # the elements of `a` at the positions `i`
    array([ 1,  1,  9, 64, 25])
    >>>
    >>> j = np.array([[3, 4], [9, 7]])  # a bidimensional array of indices
    >>> a[j]  # the same shape as `j`
    array([[ 9, 16],
           [81, 49]])
    
When the indexed array `a` is multidimensional, a single array of indices refers to the first dimension of `a`. The following example shows this behavior by converting an image of labels into a color image using a palette.
    
    >>> palette = np.array([[0, 0, 0],         # black
    ...                     [255, 0, 0],       # red
    ...                     [0, 255, 0],       # green
    ...                     [0, 0, 255],       # blue
    ...                     [255, 255, 255]])  # white
    >>> image = np.array([[0, 1, 2, 0],  # each value corresponds to a color in the palette
    ...                   [0, 3, 4, 0]])
    >>> palette[image]  # the (2, 4, 3) color image
    array([[[  0,   0,   0],
            [255,   0,   0],
            [  0, 255,   0],
            [  0,   0,   0]],
    
           [[  0,   0,   0],
            [  0,   0, 255],
            [255, 255, 255],
            [  0,   0,   0]]])
    
We can also give indexes for more than one dimension. The arrays of indices for each dimension must have the same shape.
    
    >>> a = np.arange(12).reshape(3, 4)
    >>> a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> i = np.array([[0, 1],  # indices for the first dim of `a`
    ...               [1, 2]])
    >>> j = np.array([[2, 1],  # indices for the second dim
    ...               [3, 3]])
    >>>
    >>> a[i, j]  # i and j must have equal shape
    array([[ 2,  5],
           [ 7, 11]])
    >>>
    >>> a[i, 2]
    array([[ 2,  6],
           [ 6, 10]])
    >>>
    >>> a[:, j]
    array([[[ 2,  1],
            [ 3,  3]],
    
           [[ 6,  5],
            [ 7,  7]],
    
           [[10,  9],
            [11, 11]]])
    
In Python, `arr[i, j]` is exactly the same as `arr[(i, j)]`—so we can put `i` and `j` in a `tuple` and then do the indexing with that.
    
    >>> l = (i, j)
    >>> # equivalent to a[i, j]
    >>> a[l]
    array([[ 2,  5],
           [ 7, 11]])
    
However, we can not do this by putting `i` and `j` into an array, because this array will be interpreted as indexing the first dimension of `a`.
    
    >>> s = np.array([i, j])
    >>> # not what we want
    >>> a[s]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: index 3 is out of bounds for axis 0 with size 3
    >>> # same as `a[i, j]`
    >>> a[tuple(s)]
    array([[ 2,  5],
           [ 7, 11]])
    
Another common use of indexing with arrays is the search of the maximum value of time-dependent series:
    
    >>> time = np.linspace(20, 145, 5)  # time scale
    >>> data = np.sin(np.arange(20)).reshape(5, 4)  # 4 time-dependent series
    >>> time
    array([ 20.  ,  51.25,  82.5 , 113.75, 145.  ])
    >>> data
    array([[ 0.        ,  0.84147098,  0.90929743,  0.14112001],
           [-0.7568025 , -0.95892427, -0.2794155 ,  0.6569866 ],
           [ 0.98935825,  0.41211849, -0.54402111, -0.99999021],
           [-0.53657292,  0.42016704,  0.99060736,  0.65028784],
           [-0.28790332, -0.96139749, -0.75098725,  0.14987721]])
    >>> # index of the maxima for each series
    >>> ind = data.argmax(axis=0)
    >>> ind
    array([2, 0, 3, 1])
    >>> # times corresponding to the maxima
    >>> time_max = time[ind]
    >>>
    >>> data_max = data[ind, range(data.shape[1])]  # => data[ind[0], 0], data[ind[1], 1]...
    >>> time_max
    array([ 82.5 ,  20.  , 113.75,  51.25])
    >>> data_max
    array([0.98935825, 0.84147098, 0.99060736, 0.6569866 ])
    >>> np.all(data_max == data.max(axis=0))
    True
    
You can also use indexing with arrays as a target to assign to:
    
    >>> a = np.arange(5)
    >>> a
    array([0, 1, 2, 3, 4])
    >>> a[[1, 3, 4]] = 0
    >>> a
    array([0, 0, 2, 0, 0])
    
However, when the list of indices contains repetitions, the assignment is done several times, leaving behind the last value:
    
    >>> a = np.arange(5)
    >>> a[[0, 0, 2]] = [1, 2, 3]
    >>> a
    array([2, 1, 3, 3, 4])
    
This is reasonable enough, but watch out if you want to use Python’s `+=` construct, as it may not do what you expect:
    
    >>> a = np.arange(5)
    >>> a[[0, 0, 2]] += 1
    >>> a
    array([1, 1, 3, 3, 4])
    
Even though 0 occurs twice in the list of indices, the 0th element is only incremented once. This is because Python requires `a += 1` to be equivalent to `a = a + 1`.
### Indexing with boolean arrays
When we index arrays with arrays of (integer) indices we are providing the list of indices to pick. With boolean indices the approach is different; we explicitly choose which items in the array we want and which ones we don’t.
The most natural way one can think of for boolean indexing is to use boolean arrays that have the same shape as the original array:
    
    >>> a = np.arange(12).reshape(3, 4)
    >>> b = a > 4
    >>> b  # `b` is a boolean with `a`'s shape
    array([[False, False, False, False],
           [False,  True,  True,  True],
           [ True,  True,  True,  True]])
    >>> a[b]  # 1d array with the selected elements
    array([ 5,  6,  7,  8,  9, 10, 11])
    
This property can be very useful in assignments:
    
    >>> a[b] = 0  # All elements of `a` higher than 4 become 0
    >>> a
    array([[0, 1, 2, 3],
           [4, 0, 0, 0],
           [0, 0, 0, 0]])
    
You can look at the following example to see how to use boolean indexing to generate an image of the Mandelbrot set:
    
    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> def mandelbrot(h, w, maxit=20, r=2):
    ...     """Returns an image of the Mandelbrot fractal of size (h,w)."""
    ...     x = np.linspace(-2.5, 1.5, 4*h+1)
    ...     y = np.linspace(-1.5, 1.5, 3*w+1)
    ...     A, B = np.meshgrid(x, y)
    ...     C = A + B*1j
    ...     z = np.zeros_like(C)
    ...     divtime = maxit + np.zeros(z.shape, dtype=int)
    ...
    ...     for i in range(maxit):
    ...         z = z**2 + C
    ...         diverge = abs(z) > r                    # who is diverging
    ...         div_now = diverge & (divtime == maxit)  # who is diverging now
    ...         divtime[div_now] = i                    # note when
    ...         z[diverge] = r                          # avoid diverging too much
    ...
    ...     return divtime
    >>> plt.clf()
    >>> plt.imshow(mandelbrot(400, 400))
    
The second way of indexing with booleans is more similar to integer indexing; for each dimension of the array we give a 1D boolean array selecting the slices we want:
    
    >>> a = np.arange(12).reshape(3, 4)
    >>> b1 = np.array([False, True, True])         # first dim selection
    >>> b2 = np.array([True, False, True, False])  # second dim selection
    >>>
    >>> a[b1, :]                                   # selecting rows
    array([[ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>
    >>> a[b1]                                      # same thing
    array([[ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>
    >>> a[:, b2]                                   # selecting columns
    array([[ 0,  2],
           [ 4,  6],
           [ 8, 10]])
    >>>
    >>> a[b1, b2]                                  # a weird thing to do
    array([ 4, 10])
    
Note that the length of the 1D boolean array must coincide with the length of the dimension (or axis) you want to slice. In the previous example, `b1` has length 3 (the number of rows in `a`), and `b2` (of length 4) is suitable to index the 2nd axis (columns) of `a`.
### The ix_() function
The `ix_` function can be used to combine different vectors so as to obtain the result for each n-uplet. For example, if you want to compute all the a+b*c for all the triplets taken from each of the vectors a, b and c:
    
    >>> a = np.array([2, 3, 4, 5])
    >>> b = np.array([8, 5, 4])
    >>> c = np.array([5, 4, 6, 8, 3])
    >>> ax, bx, cx = np.ix_(a, b, c)
    >>> ax
    array([[[2]],
    
           [[3]],
    
           [[4]],
    
           [[5]]])
    >>> bx
    array([[[8],
            [5],
            [4]]])
    >>> cx
    array([[[5, 4, 6, 8, 3]]])
    >>> ax.shape, bx.shape, cx.shape
    ((4, 1, 1), (1, 3, 1), (1, 1, 5))
    >>> result = ax + bx * cx
    >>> result
    array([[[42, 34, 50, 66, 26],
            [27, 22, 32, 42, 17],
            [22, 18, 26, 34, 14]],
    
           [[43, 35, 51, 67, 27],
            [28, 23, 33, 43, 18],
            [23, 19, 27, 35, 15]],
    
           [[44, 36, 52, 68, 28],
            [29, 24, 34, 44, 19],
            [24, 20, 28, 36, 16]],
    
           [[45, 37, 53, 69, 29],
            [30, 25, 35, 45, 20],
            [25, 21, 29, 37, 17]]])
    >>> result[3, 2, 4]
    17
    >>> a[3] + b[2] * c[4]
    17
    
You could also implement the reduce as follows:
    
    >>> def ufunc_reduce(ufct, *vectors):
    ...    vs = np.ix_(*vectors)
    ...    r = ufct.identity
    ...    for v in vs:
    ...        r = ufct(r, v)
    ...    return r
    
and then use it as:
    
    >>> ufunc_reduce(np.add, a, b, c)
    array([[[15, 14, 16, 18, 13],
            [12, 11, 13, 15, 10],
            [11, 10, 12, 14,  9]],
    
           [[16, 15, 17, 19, 14],
            [13, 12, 14, 16, 11],
            [12, 11, 13, 15, 10]],
    
           [[17, 16, 18, 20, 15],
            [14, 13, 15, 17, 12],
            [13, 12, 14, 16, 11]],
    
           [[18, 17, 19, 21, 16],
            [15, 14, 16, 18, 13],
            [14, 13, 15, 17, 12]]])
    
The advantage of this version of reduce compared to the normal ufunc.reduce is that it makes use of the broadcasting rules in order to avoid creating an argument array the size of the output times the number of vectors.
### Indexing with strings
See Structured arrays.
## Tricks and tips
Here we give a list of short and useful tips.
### “Automatic” reshaping
To change the dimensions of an array, you can omit one of the sizes which will then be deduced automatically:
    
    >>> a = np.arange(30)
    >>> b = a.reshape((2, -1, 3))  # -1 means "whatever is needed"
    >>> b.shape
    (2, 5, 3)
    >>> b
    array([[[ 0,  1,  2],
            [ 3,  4,  5],
            [ 6,  7,  8],
            [ 9, 10, 11],
            [12, 13, 14]],
    
           [[15, 16, 17],
            [18, 19, 20],
            [21, 22, 23],
            [24, 25, 26],
            [27, 28, 29]]])
    
### Vector stacking
How do we construct a 2D array from a list of equally-sized row vectors? In MATLAB this is quite easy: if `x` and `y` are two vectors of the same length you only need do `m=[x;y]`. In NumPy this works via the functions `column_stack`, `dstack`, `hstack` and `vstack`, depending on the dimension in which the stacking is to be done. For example:
    
    >>> x = np.arange(0, 10, 2)
    >>> y = np.arange(5)
    >>> m = np.vstack([x, y])
    >>> m
    array([[0, 2, 4, 6, 8],
           [0, 1, 2, 3, 4]])
    >>> xy = np.hstack([x, y])
    >>> xy
    array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])
    
The logic behind those functions in more than two dimensions can be strange.
See also
NumPy for MATLAB users
### Histograms
The NumPy `histogram` function applied to an array returns a pair of vectors: the histogram of the array and a vector of the bin edges. Beware: `matplotlib` also has a function to build histograms (called `hist`, as in Matlab) that differs from the one in NumPy. The main difference is that `pylab.hist` plots the histogram automatically, while `numpy.histogram` only generates the data.
    
    >>> import numpy as np
    >>> rg = np.random.default_rng(1)
    >>> import matplotlib.pyplot as plt
    >>> # Build a vector of 10000 normal deviates with variance 0.5^2 and mean 2
    >>> mu, sigma = 2, 0.5
    >>> v = rg.normal(mu, sigma, 10000)
    >>> # Plot a normalized histogram with 50 bins
    >>> plt.hist(v, bins=50, density=True)       # matplotlib version (plot)
    (array...)
    >>> # Compute the histogram with numpy and then plot it
    >>> (n, bins) = np.histogram(v, bins=50, density=True)  # NumPy version (no plot)
    >>> plt.plot(.5 * (bins[1:] + bins[:-1]), n) 
    
With Matplotlib >=3.4 you can also use `plt.stairs(n, bins)`.
## Further reading
  * The Python tutorial
  * NumPy reference
  * SciPy Tutorial
  * SciPy Lecture Notes
  * A matlab, R, IDL, NumPy/SciPy dictionary
  * tutorial-svd


# What is NumPy?
NumPy is the fundamental package for scientific computing in Python. It is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more.
At the core of the NumPy package, is the `ndarray` object. This encapsulates n-dimensional arrays of homogeneous data types, with many operations being performed in compiled code for performance. There are several important differences between NumPy arrays and the standard Python sequences:
  * NumPy arrays have a fixed size at creation, unlike Python lists (which can grow dynamically). Changing the size of an `ndarray` will create a new array and delete the original.
  * The elements in a NumPy array are all required to be of the same data type, and thus will be the same size in memory. The exception: one can have arrays of (Python, including NumPy) objects, thereby allowing for arrays of different sized elements.
  * NumPy arrays facilitate advanced mathematical and other types of operations on large numbers of data. Typically, such operations are executed more efficiently and with less code than is possible using Python’s built-in sequences.
  * A growing plethora of scientific and mathematical Python-based packages are using NumPy arrays; though these typically support Python-sequence input, they convert such input to NumPy arrays prior to processing, and they often output NumPy arrays. In other words, in order to efficiently use much (perhaps even most) of today’s scientific/mathematical Python-based software, just knowing how to use Python’s built-in sequence types is insufficient - one also needs to know how to use NumPy arrays.


The points about sequence size and speed are particularly important in scientific computing. As a simple example, consider the case of multiplying each element in a 1-D sequence with the corresponding element in another sequence of the same length. If the data are stored in two Python lists, `a` and `b`, we could iterate over each element:
    
    c = []
    for i in range(len(a)):
        c.append(a[i]*b[i])
    
This produces the correct answer, but if `a` and `b` each contain millions of numbers, we will pay the price for the inefficiencies of looping in Python. We could accomplish the same task much more quickly in C by writing (for clarity we neglect variable declarations and initializations, memory allocation, etc.)
    
    for (i = 0; i < rows; i++) {
      c[i] = a[i]*b[i];
    }
    
This saves all the overhead involved in interpreting the Python code and manipulating Python objects, but at the expense of the benefits gained from coding in Python. Furthermore, the coding work required increases with the dimensionality of our data. In the case of a 2-D array, for example, the C code (abridged as before) expands to
    
    for (i = 0; i < rows; i++) {
      for (j = 0; j < columns; j++) {
        c[i][j] = a[i][j]*b[i][j];
      }
    }
    
NumPy gives us the best of both worlds: element-by-element operations are the “default mode” when an `ndarray` is involved, but the element-by-element operation is speedily executed by pre-compiled C code. In NumPy
    
    c = a * b
    
does what the earlier examples do, at near-C speeds, but with the code simplicity we expect from something based on Python. Indeed, the NumPy idiom is even simpler! This last example illustrates two of NumPy’s features which are the basis of much of its power: vectorization and broadcasting.
## Why is NumPy fast?
Vectorization describes the absence of any explicit looping, indexing, etc., in the code - these things are taking place, of course, just “behind the scenes” in optimized, pre-compiled C code. Vectorized code has many advantages, among which are:
  * vectorized code is more concise and easier to read
  * fewer lines of code generally means fewer bugs
  * the code more closely resembles standard mathematical notation (making it easier, typically, to correctly code mathematical constructs)
  * vectorization results in more “Pythonic” code. Without vectorization, our code would be littered with inefficient and difficult to read `for` loops.


Broadcasting is the term used to describe the implicit element-by-element behavior of operations; generally speaking, in NumPy all operations, not just arithmetic operations, but logical, bit-wise, functional, etc., behave in this implicit element-by-element fashion, i.e., they broadcast. Moreover, in the example above, `a` and `b` could be multidimensional arrays of the same shape, or a scalar and an array, or even two arrays with different shapes, provided that the smaller array is “expandable” to the shape of the larger in such a way that the resulting broadcast is unambiguous. For detailed “rules” of broadcasting see Broadcasting.
## Who else uses NumPy?
NumPy fully supports an object-oriented approach, starting, once again, with `ndarray`. For example, `ndarray` is a class, possessing numerous methods and attributes. Many of its methods are mirrored by functions in the outer-most NumPy namespace, allowing the programmer to code in whichever paradigm they prefer. This flexibility has allowed the NumPy array dialect and NumPy `ndarray` class to become the de-facto language of multi-dimensional data interchange used in Python.
