12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411 |
- from __future__ import division, absolute_import, print_function
- import functools
- import itertools
- import operator
- import sys
- import warnings
- import numbers
- import contextlib
- import numpy as np
- from numpy.compat import pickle, basestring
- from . import multiarray
- from .multiarray import (
- _fastCopyAndTranspose as fastCopyAndTranspose, ALLOW_THREADS,
- BUFSIZE, CLIP, MAXDIMS, MAY_SHARE_BOUNDS, MAY_SHARE_EXACT, RAISE,
- WRAP, arange, array, broadcast, can_cast, compare_chararrays,
- concatenate, copyto, dot, dtype, empty,
- empty_like, flatiter, frombuffer, fromfile, fromiter, fromstring,
- inner, int_asbuffer, lexsort, matmul, may_share_memory,
- min_scalar_type, ndarray, nditer, nested_iters, promote_types,
- putmask, result_type, set_numeric_ops, shares_memory, vdot, where,
- zeros, normalize_axis_index)
- if sys.version_info[0] < 3:
- from .multiarray import newbuffer, getbuffer
- from . import overrides
- from . import umath
- from . import shape_base
- from .overrides import set_module
- from .umath import (multiply, invert, sin, PINF, NAN)
- from . import numerictypes
- from .numerictypes import longlong, intc, int_, float_, complex_, bool_
- from ._exceptions import TooHardError, AxisError
- from ._asarray import asarray, asanyarray
- from ._ufunc_config import errstate
- bitwise_not = invert
- ufunc = type(sin)
- newaxis = None
- if sys.version_info[0] >= 3:
- import builtins
- else:
- import __builtin__ as builtins
- array_function_dispatch = functools.partial(
- overrides.array_function_dispatch, module='numpy')
- __all__ = [
- 'newaxis', 'ndarray', 'flatiter', 'nditer', 'nested_iters', 'ufunc',
- 'arange', 'array', 'zeros', 'count_nonzero', 'empty', 'broadcast', 'dtype',
- 'fromstring', 'fromfile', 'frombuffer', 'int_asbuffer', 'where',
- 'argwhere', 'copyto', 'concatenate', 'fastCopyAndTranspose', 'lexsort',
- 'set_numeric_ops', 'can_cast', 'promote_types', 'min_scalar_type',
- 'result_type', 'isfortran', 'empty_like', 'zeros_like', 'ones_like',
- 'correlate', 'convolve', 'inner', 'dot', 'outer', 'vdot', 'roll',
- 'rollaxis', 'moveaxis', 'cross', 'tensordot', 'little_endian',
- 'fromiter', 'array_equal', 'array_equiv', 'indices', 'fromfunction',
- 'isclose', 'isscalar', 'binary_repr', 'base_repr', 'ones',
- 'identity', 'allclose', 'compare_chararrays', 'putmask',
- 'flatnonzero', 'Inf', 'inf', 'infty', 'Infinity', 'nan', 'NaN',
- 'False_', 'True_', 'bitwise_not', 'CLIP', 'RAISE', 'WRAP', 'MAXDIMS',
- 'BUFSIZE', 'ALLOW_THREADS', 'ComplexWarning', 'full', 'full_like',
- 'matmul', 'shares_memory', 'may_share_memory', 'MAY_SHARE_BOUNDS',
- 'MAY_SHARE_EXACT', 'TooHardError', 'AxisError']
- if sys.version_info[0] < 3:
- __all__.extend(['getbuffer', 'newbuffer'])
- @set_module('numpy')
- class ComplexWarning(RuntimeWarning):
- """
- 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.
- """
- pass
- def _zeros_like_dispatcher(a, dtype=None, order=None, subok=None, shape=None):
- return (a,)
- @array_function_dispatch(_zeros_like_dispatcher)
- def zeros_like(a, dtype=None, order='K', subok=True, shape=None):
- """
- Return an array of zeros with the same shape and type as a given array.
- Parameters
- ----------
- a : array_like
- The shape and data-type of `a` define these same attributes of
- the returned array.
- dtype : data-type, optional
- Overrides the data type of the result.
- .. versionadded:: 1.6.0
- 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.
- .. versionadded:: 1.6.0
- subok : bool, 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.
- shape : int 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.
- .. versionadded:: 1.17.0
- Returns
- -------
- out : ndarray
- 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
- --------
- >>> 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.])
- """
- res = empty_like(a, dtype=dtype, order=order, subok=subok, shape=shape)
- # needed instead of a 0 to get same result as zeros for for string dtypes
- z = zeros(1, dtype=res.dtype)
- multiarray.copyto(res, z, casting='unsafe')
- return res
- @set_module('numpy')
- def ones(shape, dtype=None, order='C'):
- """
- Return a new array of given shape and type, filled with ones.
- Parameters
- ----------
- shape : int or sequence of ints
- Shape of the new array, e.g., ``(2, 3)`` or ``2``.
- dtype : data-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.
- Returns
- -------
- out : ndarray
- 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
- --------
- >>> 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.]])
- """
- a = empty(shape, dtype, order)
- multiarray.copyto(a, 1, casting='unsafe')
- return a
- def _ones_like_dispatcher(a, dtype=None, order=None, subok=None, shape=None):
- return (a,)
- @array_function_dispatch(_ones_like_dispatcher)
- def ones_like(a, dtype=None, order='K', subok=True, shape=None):
- """
- Return an array of ones with the same shape and type as a given array.
- Parameters
- ----------
- a : array_like
- The shape and data-type of `a` define these same attributes of
- the returned array.
- dtype : data-type, optional
- Overrides the data type of the result.
- .. versionadded:: 1.6.0
- 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.
- .. versionadded:: 1.6.0
- subok : bool, 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.
- shape : int 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.
- .. versionadded:: 1.17.0
- Returns
- -------
- out : ndarray
- 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
- --------
- >>> 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.])
- """
- res = empty_like(a, dtype=dtype, order=order, subok=subok, shape=shape)
- multiarray.copyto(res, 1, casting='unsafe')
- return res
- @set_module('numpy')
- def full(shape, fill_value, dtype=None, order='C'):
- """
- Return a new array of given shape and type, filled with `fill_value`.
- Parameters
- ----------
- shape : int or sequence of ints
- Shape of the new array, e.g., ``(2, 3)`` or ``2``.
- fill_value : scalar
- Fill value.
- dtype : data-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.
- Returns
- -------
- out : ndarray
- 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
- --------
- >>> np.full((2, 2), np.inf)
- array([[inf, inf],
- [inf, inf]])
- >>> np.full((2, 2), 10)
- array([[10, 10],
- [10, 10]])
- """
- if dtype is None:
- dtype = array(fill_value).dtype
- a = empty(shape, dtype, order)
- multiarray.copyto(a, fill_value, casting='unsafe')
- return a
- def _full_like_dispatcher(a, fill_value, dtype=None, order=None, subok=None, shape=None):
- return (a,)
- @array_function_dispatch(_full_like_dispatcher)
- def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):
- """
- Return a full array with the same shape and type as a given array.
- Parameters
- ----------
- a : array_like
- The shape and data-type of `a` define these same attributes of
- the returned array.
- fill_value : scalar
- Fill value.
- dtype : data-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.
- subok : bool, 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.
- shape : int 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.
- .. versionadded:: 1.17.0
- Returns
- -------
- out : ndarray
- 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
- --------
- >>> 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])
- """
- res = empty_like(a, dtype=dtype, order=order, subok=subok, shape=shape)
- multiarray.copyto(res, fill_value, casting='unsafe')
- return res
- def _count_nonzero_dispatcher(a, axis=None):
- return (a,)
- @array_function_dispatch(_count_nonzero_dispatcher)
- def count_nonzero(a, axis=None):
- """
- 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
- ----------
- a : array_like
- The array for which to count non-zeros.
- axis : int 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``.
- .. versionadded:: 1.12.0
- Returns
- -------
- count : int 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
- --------
- >>> np.count_nonzero(np.eye(4))
- 4
- >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]])
- 5
- >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]], axis=0)
- array([1, 1, 1, 1, 1])
- >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]], axis=1)
- array([2, 3])
- """
- if axis is None:
- return multiarray.count_nonzero(a)
- a = asanyarray(a)
- # TODO: this works around .astype(bool) not working properly (gh-9847)
- if np.issubdtype(a.dtype, np.character):
- a_bool = a != a.dtype.type()
- else:
- a_bool = a.astype(np.bool_, copy=False)
- return a_bool.sum(axis=axis, dtype=np.intp)
- @set_module('numpy')
- def isfortran(a):
- """
- Check if the array is Fortran contiguous but *not* C contiguous.
- This function is obsolete and, because of changes due to relaxed stride
- checking, its return value for the same array may differ for versions
- of NumPy >= 1.10.0 and previous versions. If you only want to check if an
- array is Fortran contiguous use ``a.flags.f_contiguous`` instead.
- Parameters
- ----------
- a : ndarray
- Input array.
- Returns
- -------
- isfortran : bool
- 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).
- >>> 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
- """
- return a.flags.fnc
- def _argwhere_dispatcher(a):
- return (a,)
- @array_function_dispatch(_argwhere_dispatcher)
- def argwhere(a):
- """
- Find the indices of array elements that are non-zero, grouped by element.
- Parameters
- ----------
- a : array_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
- --------
- >>> 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]])
- """
- # nonzero does not behave well on 0d, so promote to 1d
- if np.ndim(a) == 0:
- a = shape_base.atleast_1d(a)
- # then remove the added dimension
- return argwhere(a)[:,:0]
- return transpose(nonzero(a))
- def _flatnonzero_dispatcher(a):
- return (a,)
- @array_function_dispatch(_flatnonzero_dispatcher)
- def flatnonzero(a):
- """
- Return indices that are non-zero in the flattened version of a.
- This is equivalent to np.nonzero(np.ravel(a))[0].
- Parameters
- ----------
- a : array_like
- Input data.
- Returns
- -------
- res : ndarray
- 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
- --------
- >>> 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])
- """
- return np.nonzero(np.ravel(a))[0]
- _mode_from_name_dict = {'v': 0,
- 's': 1,
- 'f': 2}
- def _mode_from_name(mode):
- if isinstance(mode, basestring):
- return _mode_from_name_dict[mode.lower()[0]]
- return mode
- def _correlate_dispatcher(a, v, mode=None):
- return (a, v)
- @array_function_dispatch(_correlate_dispatcher)
- def correlate(a, v, mode='valid'):
- """
- Cross-correlation of two 1-dimensional sequences.
- This function computes the correlation as generally defined in signal
- processing texts::
- c_{av}[k] = sum_n a[n+k] * conj(v[n])
- with a and v sequences being zero-padded where necessary and conj being
- the conjugate.
- Parameters
- ----------
- a, v : array_like
- Input sequences.
- mode : {'valid', 'same', 'full'}, optional
- Refer to the `convolve` docstring. Note that the default
- is 'valid', unlike `convolve`, which uses 'full'.
- old_behavior : bool
- `old_behavior` was removed in NumPy 1.10. If you need the old
- behavior, use `multiarray.correlate`.
- Returns
- -------
- out : ndarray
- Discrete cross-correlation of `a` and `v`.
- See Also
- --------
- convolve : Discrete, linear convolution of two one-dimensional sequences.
- multiarray.correlate : Old, no conjugate, version of correlate.
- Notes
- -----
- The definition of correlation above is not unique and sometimes correlation
- may be defined differently. Another common definition is::
- c'_{av}[k] = sum_n a[n] conj(v[n+k])
- which is related to ``c_{av}[k]`` by ``c'_{av}[k] = c_{av}[-k]``.
- Examples
- --------
- >>> 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
- when the two input sequences change places, i.e.,
- ``c_{va}[k] = c^{*}_{av}[-k]``:
- >>> 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])
- """
- mode = _mode_from_name(mode)
- return multiarray.correlate2(a, v, mode)
- def _convolve_dispatcher(a, v, mode=None):
- return (a, v)
- @array_function_dispatch(_convolve_dispatcher)
- def convolve(a, v, mode='full'):
- """
- 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
- -------
- out : ndarray
- 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
- .. math:: (a * v)[n] = \\sum_{m = -\\infty}^{\\infty} a[m] v[n - m]
- It can be shown that a convolution :math:`x(t) * y(t)` in time/space
- is equivalent to the multiplication :math:`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:
- >>> 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])
- """
- a, v = array(a, copy=False, ndmin=1), array(v, copy=False, ndmin=1)
- if (len(v) > len(a)):
- a, v = v, a
- if len(a) == 0:
- raise ValueError('a cannot be empty')
- if len(v) == 0:
- raise ValueError('v cannot be empty')
- mode = _mode_from_name(mode)
- return multiarray.correlate(a, v[::-1], mode)
- def _outer_dispatcher(a, b, out=None):
- return (a, b, out)
- @array_function_dispatch(_outer_dispatcher)
- def outer(a, b, out=None):
- """
- Compute the outer product of two vectors.
- Given two vectors, ``a = [a0, a1, ..., aM]`` and
- ``b = [b0, b1, ..., bN]``,
- the outer product [1]_ is::
- [[a0*b0 a0*b1 ... a0*bN ]
- [a1*b0 .
- [ ... .
- [aM*b0 aM*bN ]]
- 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
- .. versionadded:: 1.9.0
- 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 N dimensions and other operations.
- ``np.multiply.outer(a.ravel(), b.ravel())`` 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:
- >>> 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)
- """
- a = asarray(a)
- b = asarray(b)
- return multiply(a.ravel()[:, newaxis], b.ravel()[newaxis, :], out)
- def _tensordot_dispatcher(a, b, axes=None):
- return (a, b)
- @array_function_dispatch(_tensordot_dispatcher)
- def tensordot(a, b, axes=2):
- """
- 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, b : array_like
- Tensors to "dot".
- axes : int 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
- -------
- output : ndarray
- The tensor dot product of the input.
- See Also
- --------
- dot, einsum
- Notes
- -----
- Three common use cases are:
- * ``axes = 0`` : tensor product :math:`a\\otimes b`
- * ``axes = 1`` : tensor dot product :math:`a\\cdot b`
- * ``axes = 2`` : (default) tensor double contraction :math:`a:b`
- When `axes` is integer_like, the sequence for evaluation will be: first
- the -Nth axis in `a` and 0th axis in `b`, and the -1th axis in `a` and
- Nth axis in `b` last.
- 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 shape of the result consists of the non-contracted axes of the
- first tensor, followed by the non-contracted axes of the second.
- Examples
- --------
- A "traditional" example:
- >>> 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)
- """
- try:
- iter(axes)
- except Exception:
- axes_a = list(range(-axes, 0))
- axes_b = list(range(0, axes))
- else:
- axes_a, axes_b = axes
- try:
- na = len(axes_a)
- axes_a = list(axes_a)
- except TypeError:
- axes_a = [axes_a]
- na = 1
- try:
- nb = len(axes_b)
- axes_b = list(axes_b)
- except TypeError:
- axes_b = [axes_b]
- nb = 1
- a, b = asarray(a), asarray(b)
- as_ = a.shape
- nda = a.ndim
- bs = b.shape
- ndb = b.ndim
- equal = True
- if na != nb:
- equal = False
- else:
- for k in range(na):
- if as_[axes_a[k]] != bs[axes_b[k]]:
- equal = False
- break
- if axes_a[k] < 0:
- axes_a[k] += nda
- if axes_b[k] < 0:
- axes_b[k] += ndb
- if not equal:
- raise ValueError("shape-mismatch for sum")
- # Move the axes to sum over to the end of "a"
- # and to the front of "b"
- notin = [k for k in range(nda) if k not in axes_a]
- newaxes_a = notin + axes_a
- N2 = 1
- for axis in axes_a:
- N2 *= as_[axis]
- newshape_a = (int(multiply.reduce([as_[ax] for ax in notin])), N2)
- olda = [as_[axis] for axis in notin]
- notin = [k for k in range(ndb) if k not in axes_b]
- newaxes_b = axes_b + notin
- N2 = 1
- for axis in axes_b:
- N2 *= bs[axis]
- newshape_b = (N2, int(multiply.reduce([bs[ax] for ax in notin])))
- oldb = [bs[axis] for axis in notin]
- at = a.transpose(newaxes_a).reshape(newshape_a)
- bt = b.transpose(newaxes_b).reshape(newshape_b)
- res = dot(at, bt)
- return res.reshape(olda + oldb)
- def _roll_dispatcher(a, shift, axis=None):
- return (a,)
- @array_function_dispatch(_roll_dispatcher)
- def roll(a, shift, axis=None):
- """
- Roll array elements along a given axis.
- Elements that roll beyond the last position are re-introduced at
- the first.
- Parameters
- ----------
- a : array_like
- Input array.
- shift : int 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.
- axis : int 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
- -------
- res : ndarray
- Output array, with the same shape as `a`.
- See Also
- --------
- rollaxis : Roll the specified axis backwards, until it lies in a
- given position.
- Notes
- -----
- .. versionadded:: 1.12.0
- Supports rolling over multiple dimensions simultaneously.
- Examples
- --------
- >>> 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]])
- """
- a = asanyarray(a)
- if axis is None:
- return roll(a.ravel(), shift, 0).reshape(a.shape)
- else:
- axis = normalize_axis_tuple(axis, a.ndim, allow_duplicate=True)
- broadcasted = broadcast(shift, axis)
- if broadcasted.ndim > 1:
- raise ValueError(
- "'shift' and 'axis' should be scalars or 1D sequences")
- shifts = {ax: 0 for ax in range(a.ndim)}
- for sh, ax in broadcasted:
- shifts[ax] += sh
- rolls = [((slice(None), slice(None)),)] * a.ndim
- for ax, offset in shifts.items():
- offset %= a.shape[ax] or 1 # If `a` is empty, nothing matters.
- if offset:
- # (original, result), (original, result)
- rolls[ax] = ((slice(None, -offset), slice(offset, None)),
- (slice(-offset, None), slice(None, offset)))
- result = empty_like(a)
- for indices in itertools.product(*rolls):
- arr_index, res_index = zip(*indices)
- result[res_index] = a[arr_index]
- return result
- def _rollaxis_dispatcher(a, axis, start=None):
- return (a,)
- @array_function_dispatch(_rollaxis_dispatcher)
- def rollaxis(a, axis, start=0):
- """
- 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
- ----------
- a : ndarray
- Input array.
- axis : int
- The axis to roll backwards. The positions of the other axes do not
- change relative to one another.
- start : int, optional
- The axis is rolled until it lies before this position. The default,
- 0, results in a "complete" roll.
- Returns
- -------
- res : ndarray
- 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
- --------
- >>> 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)
- """
- n = a.ndim
- axis = normalize_axis_index(axis, n)
- if start < 0:
- start += n
- msg = "'%s' arg requires %d <= %s < %d, but %d was passed in"
- if not (0 <= start < n + 1):
- raise AxisError(msg % ('start', -n, 'start', n + 1, start))
- if axis < start:
- # it's been removed
- start -= 1
- if axis == start:
- return a[...]
- axes = list(range(0, n))
- axes.remove(axis)
- axes.insert(start, axis)
- return a.transpose(axes)
- def normalize_axis_tuple(axis, ndim, argname=None, allow_duplicate=False):
- """
- 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.
- .. versionadded:: 1.13.0
- Parameters
- ----------
- axis : int, iterable of int
- The un-normalized index or indices of the axis.
- ndim : int
- The number of dimensions of the array that `axis` should be normalized
- against.
- argname : str, optional
- A prefix to put before the error message, typically the name of the
- argument.
- allow_duplicate : bool, optional
- If False, the default, disallow an axis from being specified twice.
- Returns
- -------
- normalized_axes : tuple 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
- """
- # Optimization to speed-up the most common cases.
- if type(axis) not in (tuple, list):
- try:
- axis = [operator.index(axis)]
- except TypeError:
- pass
- # Going via an iterator directly is slower than via list comprehension.
- axis = tuple([normalize_axis_index(ax, ndim, argname) for ax in axis])
- if not allow_duplicate and len(set(axis)) != len(axis):
- if argname:
- raise ValueError('repeated axis in `{}` argument'.format(argname))
- else:
- raise ValueError('repeated axis')
- return axis
- def _moveaxis_dispatcher(a, source, destination):
- return (a,)
- @array_function_dispatch(_moveaxis_dispatcher)
- def moveaxis(a, source, destination):
- """
- Move axes of an array to new positions.
- Other axes remain in their original order.
- .. versionadded:: 1.11.0
- Parameters
- ----------
- a : np.ndarray
- The array whose axes should be reordered.
- source : int or sequence of int
- Original positions of the axes to move. These must be unique.
- destination : int or sequence of int
- Destination positions for each of the original axes. These must also be
- unique.
- Returns
- -------
- result : np.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
- --------
- >>> 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)
- """
- try:
- # allow duck-array types if they define transpose
- transpose = a.transpose
- except AttributeError:
- a = asarray(a)
- transpose = a.transpose
- source = normalize_axis_tuple(source, a.ndim, 'source')
- destination = normalize_axis_tuple(destination, a.ndim, 'destination')
- if len(source) != len(destination):
- raise ValueError('`source` and `destination` arguments must have '
- 'the same number of elements')
- order = [n for n in range(a.ndim) if n not in source]
- for dest, src in sorted(zip(destination, source)):
- order.insert(dest, src)
- result = transpose(order)
- return result
- # fix hack in scipy which imports this function
- def _move_axis_to_0(a, axis):
- return moveaxis(a, axis, 0)
- def _cross_dispatcher(a, b, axisa=None, axisb=None, axisc=None, axis=None):
- return (a, b)
- @array_function_dispatch(_cross_dispatcher)
- def cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None):
- """
- Return the cross product of two (arrays of) vectors.
- The cross product of `a` and `b` in :math:`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
- ----------
- a : array_like
- Components of the first vector(s).
- b : array_like
- Components of the second vector(s).
- axisa : int, optional
- Axis of `a` that defines the vector(s). By default, the last axis.
- axisb : int, optional
- Axis of `b` that defines the vector(s). By default, the last axis.
- axisc : int, 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.
- axis : int, 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
- -------
- c : ndarray
- 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.
- ix_ : Construct index arrays.
- Notes
- -----
- .. versionadded:: 1.9.0
- Supports full broadcasting of the inputs.
- Examples
- --------
- Vector cross-product.
- >>> 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]])
- """
- if axis is not None:
- axisa, axisb, axisc = (axis,) * 3
- a = asarray(a)
- b = asarray(b)
- # Check axisa and axisb are within bounds
- axisa = normalize_axis_index(axisa, a.ndim, msg_prefix='axisa')
- axisb = normalize_axis_index(axisb, b.ndim, msg_prefix='axisb')
- # Move working axis to the end of the shape
- a = moveaxis(a, axisa, -1)
- b = moveaxis(b, axisb, -1)
- msg = ("incompatible dimensions for cross product\n"
- "(dimension must be 2 or 3)")
- if a.shape[-1] not in (2, 3) or b.shape[-1] not in (2, 3):
- raise ValueError(msg)
- # Create the output array
- shape = broadcast(a[..., 0], b[..., 0]).shape
- if a.shape[-1] == 3 or b.shape[-1] == 3:
- shape += (3,)
- # Check axisc is within bounds
- axisc = normalize_axis_index(axisc, len(shape), msg_prefix='axisc')
- dtype = promote_types(a.dtype, b.dtype)
- cp = empty(shape, dtype)
- # create local aliases for readability
- a0 = a[..., 0]
- a1 = a[..., 1]
- if a.shape[-1] == 3:
- a2 = a[..., 2]
- b0 = b[..., 0]
- b1 = b[..., 1]
- if b.shape[-1] == 3:
- b2 = b[..., 2]
- if cp.ndim != 0 and cp.shape[-1] == 3:
- cp0 = cp[..., 0]
- cp1 = cp[..., 1]
- cp2 = cp[..., 2]
- if a.shape[-1] == 2:
- if b.shape[-1] == 2:
- # a0 * b1 - a1 * b0
- multiply(a0, b1, out=cp)
- cp -= a1 * b0
- return cp
- else:
- assert b.shape[-1] == 3
- # cp0 = a1 * b2 - 0 (a2 = 0)
- # cp1 = 0 - a0 * b2 (a2 = 0)
- # cp2 = a0 * b1 - a1 * b0
- multiply(a1, b2, out=cp0)
- multiply(a0, b2, out=cp1)
- negative(cp1, out=cp1)
- multiply(a0, b1, out=cp2)
- cp2 -= a1 * b0
- else:
- assert a.shape[-1] == 3
- if b.shape[-1] == 3:
- # cp0 = a1 * b2 - a2 * b1
- # cp1 = a2 * b0 - a0 * b2
- # cp2 = a0 * b1 - a1 * b0
- multiply(a1, b2, out=cp0)
- tmp = array(a2 * b1)
- cp0 -= tmp
- multiply(a2, b0, out=cp1)
- multiply(a0, b2, out=tmp)
- cp1 -= tmp
- multiply(a0, b1, out=cp2)
- multiply(a1, b0, out=tmp)
- cp2 -= tmp
- else:
- assert b.shape[-1] == 2
- # cp0 = 0 - a2 * b1 (b2 = 0)
- # cp1 = a2 * b0 - 0 (b2 = 0)
- # cp2 = a0 * b1 - a1 * b0
- multiply(a2, b1, out=cp0)
- negative(cp0, out=cp0)
- multiply(a2, b0, out=cp1)
- multiply(a0, b1, out=cp2)
- cp2 -= a1 * b0
- return moveaxis(cp, -1, axisc)
- little_endian = (sys.byteorder == 'little')
- @set_module('numpy')
- def indices(dimensions, dtype=int, sparse=False):
- """
- 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
- ----------
- dimensions : sequence of ints
- The shape of the grid.
- dtype : dtype, optional
- Data type of the result.
- sparse : boolean, optional
- Return a sparse representation of the grid instead of a dense
- representation. Default is False.
- .. versionadded:: 1.17
- Returns
- -------
- grid : one 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
- --------
- >>> 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]])
- """
- dimensions = tuple(dimensions)
- N = len(dimensions)
- shape = (1,)*N
- if sparse:
- res = tuple()
- else:
- res = empty((N,)+dimensions, dtype=dtype)
- for i, dim in enumerate(dimensions):
- idx = arange(dim, dtype=dtype).reshape(
- shape[:i] + (dim,) + shape[i+1:]
- )
- if sparse:
- res = res + (idx,)
- else:
- res[i] = idx
- return res
- @set_module('numpy')
- def fromfunction(function, shape, **kwargs):
- """
- 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
- ----------
- function : callable
- 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`.
- dtype : data-type, optional
- Data-type of the coordinate arrays passed to `function`.
- By default, `dtype` is float.
- Returns
- -------
- fromfunction : any
- 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` are passed to `function`.
- Examples
- --------
- >>> 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]])
- """
- dtype = kwargs.pop('dtype', float)
- args = indices(shape, dtype=dtype)
- return function(*args, **kwargs)
- def _frombuffer(buf, dtype, shape, order):
- return frombuffer(buf, dtype=dtype).reshape(shape, order=order)
- @set_module('numpy')
- def isscalar(element):
- """
- Returns True if the type of `element` is a scalar type.
- Parameters
- ----------
- element : any
- Input argument, can be of any type and shape.
- Returns
- -------
- val : bool
- 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 | ``True`` | ``True`` |
- | builtins) | | |
- +--------------------------------------+---------------+-------------------+
- | builtin string and buffer objects | ``True`` | ``True`` |
- +--------------------------------------+---------------+-------------------+
- | other builtin objects, like | ``False`` | ``True`` |
- | `pathlib.Path`, `Exception`, | | |
- | the result of `re.compile` | | |
- +--------------------------------------+---------------+-------------------+
- | third-party objects like | ``False`` | ``True`` |
- | `matplotlib.figure.Figure` | | |
- +--------------------------------------+---------------+-------------------+
- | zero-dimensional numpy arrays | ``False`` | ``True`` |
- +--------------------------------------+---------------+-------------------+
- | other numpy arrays | ``False`` | ``False`` |
- +--------------------------------------+---------------+-------------------+
- | `list`, `tuple`, and other sequence | ``False`` | ``False`` |
- | objects | | |
- +--------------------------------------+---------------+-------------------+
- Examples
- --------
- >>> 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
- """
- return (isinstance(element, generic)
- or type(element) in ScalarType
- or isinstance(element, numbers.Number))
- @set_module('numpy')
- def binary_repr(num, width=None):
- """
- 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
- :math:`-2^{N-1}` to :math:`+2^{N-1}-1`.
- Parameters
- ----------
- num : int
- Only an integer decimal number can be used.
- width : int, 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, it will be ignored, and `num` will
- be returned in binary (`num` > 0) or two's complement (`num` < 0) form
- with its width equal to the minimum number of bits needed to represent
- the number in the designated form. This behavior is deprecated and will
- later raise an error.
- .. deprecated:: 1.12.0
- Returns
- -------
- bin : str
- 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
- --------
- >>> 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'
- """
- def warn_if_insufficient(width, binwidth):
- if width is not None and width < binwidth:
- warnings.warn(
- "Insufficient bit width provided. This behavior "
- "will raise an error in the future.", DeprecationWarning,
- stacklevel=3)
- # Ensure that num is a Python integer to avoid overflow or unwanted
- # casts to floating point.
- num = operator.index(num)
- if num == 0:
- return '0' * (width or 1)
- elif num > 0:
- binary = bin(num)[2:]
- binwidth = len(binary)
- outwidth = (binwidth if width is None
- else max(binwidth, width))
- warn_if_insufficient(width, binwidth)
- return binary.zfill(outwidth)
- else:
- if width is None:
- return '-' + bin(-num)[2:]
- else:
- poswidth = len(bin(-num)[2:])
- # See gh-8679: remove extra digit
- # for numbers at boundaries.
- if 2**(poswidth - 1) == -num:
- poswidth -= 1
- twocomp = 2**(poswidth + 1) + num
- binary = bin(twocomp)[2:]
- binwidth = len(binary)
- outwidth = max(binwidth, width)
- warn_if_insufficient(width, binwidth)
- return '1' * (outwidth - binwidth) + binary
- @set_module('numpy')
- def base_repr(number, base=2, padding=0):
- """
- Return a string representation of a number in the given base system.
- Parameters
- ----------
- number : int
- The value to convert. Positive and negative values are handled.
- base : int, optional
- Convert `number` to the `base` number system. The valid range is 2-36,
- the default value is 2.
- padding : int, optional
- Number of zeros padded on the left. Default is 0 (no padding).
- Returns
- -------
- out : str
- String representation of `number` in `base` system.
- See Also
- --------
- binary_repr : Faster version of `base_repr` for base 2.
- Examples
- --------
- >>> 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'
- """
- digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- if base > len(digits):
- raise ValueError("Bases greater than 36 not handled in base_repr.")
- elif base < 2:
- raise ValueError("Bases less than 2 not handled in base_repr.")
- num = abs(number)
- res = []
- while num:
- res.append(digits[num % base])
- num //= base
- if padding:
- res.append('0' * padding)
- if number < 0:
- res.append('-')
- return ''.join(reversed(res or '0'))
- # These are all essentially abbreviations
- # These might wind up in a special abbreviations module
- def _maketup(descr, val):
- dt = dtype(descr)
- # Place val in all scalar tuples:
- fields = dt.fields
- if fields is None:
- return val
- else:
- res = [_maketup(fields[name][0], val) for name in dt.names]
- return tuple(res)
- @set_module('numpy')
- def identity(n, dtype=None):
- """
- Return the identity array.
- The identity array is a square array with ones on
- the main diagonal.
- Parameters
- ----------
- n : int
- Number of rows (and columns) in `n` x `n` output.
- dtype : data-type, optional
- Data-type of the output. Defaults to ``float``.
- Returns
- -------
- out : ndarray
- `n` x `n` array with its main diagonal set to one,
- and all other elements 0.
- Examples
- --------
- >>> np.identity(3)
- array([[1., 0., 0.],
- [0., 1., 0.],
- [0., 0., 1.]])
- """
- from numpy import eye
- return eye(n, dtype=dtype)
- def _allclose_dispatcher(a, b, rtol=None, atol=None, equal_nan=None):
- return (a, b)
- @array_function_dispatch(_allclose_dispatcher)
- def allclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
- """
- 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`.
- 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, b : array_like
- Input arrays to compare.
- rtol : float
- The relative tolerance parameter (see Notes).
- atol : float
- The absolute tolerance parameter (see Notes).
- equal_nan : bool
- 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.
- .. versionadded:: 1.10.0
- Returns
- -------
- allclose : bool
- 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 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`.
- Examples
- --------
- >>> 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
- """
- res = all(isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan))
- return bool(res)
- def _isclose_dispatcher(a, b, rtol=None, atol=None, equal_nan=None):
- return (a, b)
- @array_function_dispatch(_isclose_dispatcher)
- def isclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
- """
- 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
- that are much smaller than one (see Notes).
- Parameters
- ----------
- a, b : array_like
- Input arrays to compare.
- rtol : float
- The relative tolerance parameter (see Notes).
- atol : float
- The absolute tolerance parameter (see Notes).
- equal_nan : bool
- 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
- -------
- y : array_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
- Notes
- -----
- .. versionadded:: 1.7.0
- 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)`. Furthermore,
- the default value of atol is not zero, and is used to determine what
- small values should be considered close to zero. The default value is
- appropriate for expected values of order unity: if the expected values
- are significantly smaller than one, it can result in false positives.
- `atol` should be carefully selected for the use case at hand. A zero value
- for `atol` will result in `False` if either `a` or `b` is zero.
- Examples
- --------
- >>> 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])
- """
- def within_tol(x, y, atol, rtol):
- with errstate(invalid='ignore'):
- return less_equal(abs(x-y), atol + rtol * abs(y))
- x = asanyarray(a)
- y = asanyarray(b)
- # Make sure y is an inexact type to avoid bad behavior on abs(MIN_INT).
- # This will cause casting of x later. Also, make sure to allow subclasses
- # (e.g., for numpy.ma).
- dt = multiarray.result_type(y, 1.)
- y = array(y, dtype=dt, copy=False, subok=True)
- xfin = isfinite(x)
- yfin = isfinite(y)
- if all(xfin) and all(yfin):
- return within_tol(x, y, atol, rtol)
- else:
- finite = xfin & yfin
- cond = zeros_like(finite, subok=True)
- # Because we're using boolean indexing, x & y must be the same shape.
- # Ideally, we'd just do x, y = broadcast_arrays(x, y). It's in
- # lib.stride_tricks, though, so we can't import it here.
- x = x * ones_like(cond)
- y = y * ones_like(cond)
- # Avoid subtraction with infinite/nan values...
- cond[finite] = within_tol(x[finite], y[finite], atol, rtol)
- # Check for equality of infinite values...
- cond[~finite] = (x[~finite] == y[~finite])
- if equal_nan:
- # Make NaN == NaN
- both_nan = isnan(x) & isnan(y)
- # Needed to treat masked arrays correctly. = True would not work.
- cond[both_nan] = both_nan[both_nan]
- return cond[()] # Flatten 0d arrays to scalars
- def _array_equal_dispatcher(a1, a2):
- return (a1, a2)
- @array_function_dispatch(_array_equal_dispatcher)
- def array_equal(a1, a2):
- """
- True if two arrays have the same shape and elements, False otherwise.
- Parameters
- ----------
- a1, a2 : array_like
- Input arrays.
- Returns
- -------
- b : bool
- 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
- --------
- >>> 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
- """
- try:
- a1, a2 = asarray(a1), asarray(a2)
- except Exception:
- return False
- if a1.shape != a2.shape:
- return False
- return bool(asarray(a1 == a2).all())
- def _array_equiv_dispatcher(a1, a2):
- return (a1, a2)
- @array_function_dispatch(_array_equiv_dispatcher)
- def array_equiv(a1, a2):
- """
- 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, a2 : array_like
- Input arrays.
- Returns
- -------
- out : bool
- True if equivalent, False otherwise.
- Examples
- --------
- >>> 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
- """
- try:
- a1, a2 = asarray(a1), asarray(a2)
- except Exception:
- return False
- try:
- multiarray.broadcast(a1, a2)
- except Exception:
- return False
- return bool(asarray(a1 == a2).all())
- Inf = inf = infty = Infinity = PINF
- nan = NaN = NAN
- False_ = bool_(False)
- True_ = bool_(True)
- def extend_all(module):
- existing = set(__all__)
- mall = getattr(module, '__all__')
- for a in mall:
- if a not in existing:
- __all__.append(a)
- from .umath import *
- from .numerictypes import *
- from . import fromnumeric
- from .fromnumeric import *
- from . import arrayprint
- from .arrayprint import *
- from . import _asarray
- from ._asarray import *
- from . import _ufunc_config
- from ._ufunc_config import *
- extend_all(fromnumeric)
- extend_all(umath)
- extend_all(numerictypes)
- extend_all(arrayprint)
- extend_all(_asarray)
- extend_all(_ufunc_config)
|