tmp
/
pip-install-ghxuqwgs
/numpy_78e94bf2b6094bf9a1f3d92042f9bf46
/doc
/source
/reference
/arrays.classes.rst
.. _arrays.classes: | |
######################### | |
Standard array subclasses | |
######################### | |
.. currentmodule:: numpy | |
The :class:`ndarray` in NumPy is a "new-style" Python | |
built-in-type. Therefore, it 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 :func:`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 :func:`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, :func:`asanyarray` would rarely be | |
useful. However, most subclasses of the arrayobject 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 | |
============================== | |
.. seealso:: :ref:`Subclassing ndarray <basics.subclassing>` | |
Numpy provides several hooks that classes can customize: | |
.. function:: class.__array_finalize__(self) | |
This method is called whenever the system internally allocates a | |
new array from *obj*, where *obj* is a subclass (subtype) of the | |
:class:`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. | |
.. function:: class.__array_prepare__(array, context=None) | |
At the beginning of every :ref:`ufunc <ufuncs.output-type>`, this | |
method is called on the input object with the highest array | |
priority, or the output object if one was specified. The output | |
array is passed in and whatever is returned is passed to the ufunc. | |
Subclasses inherit a default implementation of this method which | |
simply returns the output array unmodified. 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 | |
ufunc for computation. | |
.. function:: class.__array_wrap__(array, context=None) | |
At the end of every :ref:`ufunc <ufuncs.output-type>`, 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. | |
.. data:: 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 1.0 for this attribute. | |
.. function:: class.__array__([dtype]) | |
If a class (ndarray subclass or not) having the :func:`__array__` | |
method is used as the output object of an :ref:`ufunc | |
<ufuncs.output-type>`, results will be written to the object | |
returned by :func:`__array__`. Similar conversion is done on | |
input arrays. | |
Matrix objects | |
============== | |
.. index:: | |
single: matrix | |
:class:`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 | |
.. autosummary:: | |
:toctree: generated/ | |
matrix.T | |
matrix.H | |
matrix.I | |
matrix.A | |
.. 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. | |
.. autosummary:: | |
:toctree: generated/ | |
matrix | |
asmatrix | |
bmat | |
Example 1: Matrix creation from a string | |
>>> a=mat('1 2 3; 4 5 3') | |
>>> print (a*a.T).I | |
[[ 0.2924 -0.1345] | |
[-0.1345 0.0819]] | |
Example 2: Matrix creation from nested sequence | |
>>> mat([[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 | |
>>> mat(random.rand(3,3)).T | |
matrix([[ 0.7699, 0.7922, 0.3294], | |
[ 0.2792, 0.0101, 0.9219], | |
[ 0.3398, 0.7571, 0.8197]]) | |
Memory-mapped file arrays | |
========================= | |
.. index:: | |
single: memory maps | |
.. currentmodule:: numpy | |
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): :meth:`.flush() <memmap.flush>` which | |
must be called manually by the user to ensure that any changes to the | |
array actually get written to disk. | |
.. note:: | |
Memory-mapped arrays use the the Python memory-map object which | |
(prior to Python 2.5) does not allow files to be larger than a | |
certain size depending on the platform. This size is always | |
< 2GB even on 64-bit systems. | |
.. autosummary:: | |
:toctree: generated/ | |
memmap | |
memmap.flush | |
Example: | |
>>> a = memmap('newfile.dat', dtype=float, mode='w+', shape=1000) | |
>>> a[10] = 10.0 | |
>>> a[30] = 30.0 | |
>>> del a | |
>>> b = fromfile('newfile.dat', dtype=float) | |
>>> print b[10], b[30] | |
10.0 30.0 | |
>>> a = memmap('newfile.dat', dtype=float) | |
>>> print a[10], a[30] | |
10.0 30.0 | |
Character arrays (:mod:`numpy.char`) | |
==================================== | |
.. seealso:: :ref:`routines.array-creation.char` | |
.. index:: | |
single: character arrays | |
.. 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_`, `string_` or `unicode_`, and use the free functions | |
in the `numpy.char` module for fast vectorized string operations. | |
These are enhanced arrays of either :class:`string_` type or | |
:class:`unicode_` type. These arrays inherit from the | |
:class:`ndarray`, but specially-define the operations ``+``, ``*``, | |
and ``%`` on a (broadcasting) element-by-element basis. These | |
operations are not available on the standard :class:`ndarray` of | |
character type. In addition, the :class:`chararray` has all of the | |
standard :class:`string <str>` (and :class:`unicode`) methods, | |
executing them on an element-by-element basis. Perhaps the easiest | |
way to create a chararray is to use :meth:`self.view(chararray) | |
<ndarray.view>` where *self* is an ndarray of str or unicode | |
data-type. However, a chararray can also be created using the | |
:meth:`numpy.chararray` constructor, or via the | |
:func:`numpy.char.array <core.defchararray.array>` function: | |
.. autosummary:: | |
:toctree: generated/ | |
chararray | |
core.defchararray.array | |
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. | |
.. _arrays.classes.rec: | |
Record arrays (:mod:`numpy.rec`) | |
================================ | |
.. seealso:: :ref:`routines.array-creation.rec`, :ref:`routines.dtype`, | |
:ref:`arrays.dtypes`. | |
Numpy provides the :class:`recarray` class which allows accessing the | |
fields of a record/structured array as attributes, and a corresponding | |
scalar data type object :class:`record`. | |
.. currentmodule:: numpy | |
.. autosummary:: | |
:toctree: generated/ | |
recarray | |
record | |
Masked arrays (:mod:`numpy.ma`) | |
=============================== | |
.. seealso:: :ref:`maskedarray` | |
Standard container class | |
======================== | |
.. currentmodule:: numpy | |
For backward compatibility and as a standard "container "class, the | |
UserArray from Numeric has been brought over to NumPy and named | |
:class:`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. | |
.. autosummary:: | |
:toctree: generated/ | |
numpy.lib.user_array.container | |
.. index:: | |
single: user_array | |
single: container class | |
Array Iterators | |
=============== | |
.. currentmodule:: numpy | |
.. index:: | |
single: array iterator | |
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 = myiter.next()`` repeatedly until :exc:`StopIteration` is | |
raised by the iterator. There are several ways to iterate over an | |
array that may be useful: default iteration, flat iteration, and | |
:math:`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 :math:`N-1` | |
from the array. This can be a useful construct for defining recursive | |
algorithms. To loop over the entire array requires :math:`N` for-loops. | |
>>> a = 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 | |
-------------- | |
.. autosummary:: | |
:toctree: generated/ | |
ndarray.flat | |
As mentioned previously, the flat attribute of ndarray objects returns | |
an iterator that will cycle over the entire array in C-style | |
contiguous order. | |
>>> 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 | |
------------------------- | |
.. autosummary:: | |
:toctree: generated/ | |
ndenumerate | |
Sometimes it may be useful to get the N-dimensional index while | |
iterating. The ndenumerate iterator can achieve this. | |
>>> for i, val in 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 | |
------------------------- | |
.. autosummary:: | |
:toctree: generated/ | |
broadcast | |
The general concept of broadcasting is also available from Python | |
using the :class:`broadcast` iterator. This object takes :math:`N` | |
objects as inputs and returns an iterator that returns tuples | |
providing each of the input sequence elements in the broadcasted | |
result. | |
>>> for val in broadcast([[1,0],[2,3]],[0,1]): | |
... print val | |
(1, 0) | |
(0, 1) | |
(2, 0) | |
(3, 1) | |