123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813 |
- """Module containing non-deprecated functions borrowed from Numeric.
- """
- import functools
- import types
- import warnings
- import numpy as np
- from . import multiarray as mu
- from . import overrides
- from . import umath as um
- from . import numerictypes as nt
- from .multiarray import asarray, array, asanyarray, concatenate
- from . import _methods
- _dt_ = nt.sctype2char
- # functions that are methods
- __all__ = [
- 'all', 'alltrue', 'amax', 'amin', 'any', 'argmax',
- 'argmin', 'argpartition', 'argsort', 'around', 'choose', 'clip',
- 'compress', 'cumprod', 'cumproduct', 'cumsum', 'diagonal', 'mean',
- 'ndim', 'nonzero', 'partition', 'prod', 'product', 'ptp', 'put',
- 'ravel', 'repeat', 'reshape', 'resize', 'round_',
- 'searchsorted', 'shape', 'size', 'sometrue', 'sort', 'squeeze',
- 'std', 'sum', 'swapaxes', 'take', 'trace', 'transpose', 'var',
- ]
- _gentype = types.GeneratorType
- # save away Python sum
- _sum_ = sum
- array_function_dispatch = functools.partial(
- overrides.array_function_dispatch, module='numpy')
- # functions that are now methods
- def _wrapit(obj, method, *args, **kwds):
- try:
- wrap = obj.__array_wrap__
- except AttributeError:
- wrap = None
- result = getattr(asarray(obj), method)(*args, **kwds)
- if wrap:
- if not isinstance(result, mu.ndarray):
- result = asarray(result)
- result = wrap(result)
- return result
- def _wrapfunc(obj, method, *args, **kwds):
- bound = getattr(obj, method, None)
- if bound is None:
- return _wrapit(obj, method, *args, **kwds)
- try:
- return bound(*args, **kwds)
- except TypeError:
- # A TypeError occurs if the object does have such a method in its
- # class, but its signature is not identical to that of NumPy's. This
- # situation has occurred in the case of a downstream library like
- # 'pandas'.
- #
- # Call _wrapit from within the except clause to ensure a potential
- # exception has a traceback chain.
- return _wrapit(obj, method, *args, **kwds)
- def _wrapreduction(obj, ufunc, method, axis, dtype, out, **kwargs):
- passkwargs = {k: v for k, v in kwargs.items()
- if v is not np._NoValue}
- if type(obj) is not mu.ndarray:
- try:
- reduction = getattr(obj, method)
- except AttributeError:
- pass
- else:
- # This branch is needed for reductions like any which don't
- # support a dtype.
- if dtype is not None:
- return reduction(axis=axis, dtype=dtype, out=out, **passkwargs)
- else:
- return reduction(axis=axis, out=out, **passkwargs)
- return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
- def _take_dispatcher(a, indices, axis=None, out=None, mode=None):
- return (a, out)
- @array_function_dispatch(_take_dispatcher)
- def take(a, indices, axis=None, out=None, mode='raise'):
- """
- 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
- ----------
- a : array_like (Ni..., M, Nk...)
- The source array.
- indices : array_like (Nj...)
- The indices of the values to extract.
- .. versionadded:: 1.8.0
- Also allow scalars for indices.
- axis : int, optional
- The axis over which to select values. By default, the flattened
- input array is used.
- out : ndarray, 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
- -------
- out : ndarray (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
- --------
- >>> 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]])
- """
- return _wrapfunc(a, 'take', indices, axis=axis, out=out, mode=mode)
- def _reshape_dispatcher(a, newshape, order=None):
- return (a,)
- # not deprecated --- copy if necessary, view otherwise
- @array_function_dispatch(_reshape_dispatcher)
- def reshape(a, newshape, order='C'):
- """
- Gives a new shape to an array without changing its data.
- Parameters
- ----------
- a : array_like
- Array to be reshaped.
- newshape : int 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.
- Returns
- -------
- reshaped_array : ndarray
- 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. If you want an error to be raised when the data is copied,
- you should assign the new shape to the shape attribute of the array::
- >>> a = np.zeros((10, 2))
- # A transpose makes the array non-contiguous
- >>> b = a.T
- # Taking a view makes it possible to modify the shape without modifying
- # the initial object.
- >>> c = b.view()
- >>> c.shape = (20)
- Traceback (most recent call last):
- ...
- AttributeError: Incompatible shape for in-place modification. Use
- `.reshape()` to make a copy with the desired shape.
- 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
- --------
- >>> 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]])
- """
- return _wrapfunc(a, 'reshape', newshape, order=order)
- def _choose_dispatcher(a, choices, out=None, mode=None):
- yield a
- yield from choices
- yield out
- @array_function_dispatch(_choose_dispatcher)
- def choose(a, choices, out=None, mode='raise'):
- """
- 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 (below ndi =
- `numpy.lib.index_tricks`):
- ``np.choose(a,c) == np.array([c[a[I]][I] for I in ndi.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
- ----------
- a : int 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.
- choices : sequence 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".
- out : array, 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_array : array
- 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
- --------
- >>> 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]]])
- """
- return _wrapfunc(a, 'choose', choices, out=out, mode=mode)
- def _repeat_dispatcher(a, repeats, axis=None):
- return (a,)
- @array_function_dispatch(_repeat_dispatcher)
- def repeat(a, repeats, axis=None):
- """
- Repeat elements of an array.
- Parameters
- ----------
- a : array_like
- Input array.
- repeats : int or array of ints
- The number of repetitions for each element. `repeats` is broadcasted
- to fit the shape of the given axis.
- axis : int, optional
- The axis along which to repeat values. By default, use the
- flattened input array, and return a flat output array.
- Returns
- -------
- repeated_array : ndarray
- 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
- --------
- >>> 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]])
- """
- return _wrapfunc(a, 'repeat', repeats, axis=axis)
- def _put_dispatcher(a, ind, v, mode=None):
- return (a, ind, v)
- @array_function_dispatch(_put_dispatcher)
- def put(a, ind, v, mode='raise'):
- """
- 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
- ----------
- a : ndarray
- Target array.
- ind : array_like
- Target indices, interpreted as integers.
- v : array_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
- --------
- >>> 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])
- """
- try:
- put = a.put
- except AttributeError as e:
- raise TypeError("argument 1 must be numpy.ndarray, "
- "not {name}".format(name=type(a).__name__)) from e
- return put(ind, v, mode=mode)
- def _swapaxes_dispatcher(a, axis1, axis2):
- return (a,)
- @array_function_dispatch(_swapaxes_dispatcher)
- def swapaxes(a, axis1, axis2):
- """
- Interchange two axes of an array.
- Parameters
- ----------
- a : array_like
- Input array.
- axis1 : int
- First axis.
- axis2 : int
- Second axis.
- Returns
- -------
- a_swapped : ndarray
- 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
- --------
- >>> 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]]])
- """
- return _wrapfunc(a, 'swapaxes', axis1, axis2)
- def _transpose_dispatcher(a, axes=None):
- return (a,)
- @array_function_dispatch(_transpose_dispatcher)
- def transpose(a, axes=None):
- """
- 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.atleast2d(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
- ----------
- a : array_like
- Input array.
- axes : tuple 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`. 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
- -------
- p : ndarray
- `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
- --------
- >>> 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)
- """
- return _wrapfunc(a, 'transpose', axes)
- def _partition_dispatcher(a, kth, axis=None, kind=None, order=None):
- return (a,)
- @array_function_dispatch(_partition_dispatcher)
- def partition(a, kth, axis=-1, kind='introselect', order=None):
- """
- Return a partitioned copy of an array.
- Creates a copy of the array with its elements rearranged in such a
- way that the value of the element in k-th position is in the position
- the value would be in a sorted array. In the partitioned array, all
- elements before the k-th element are less than or equal to that
- element, and all the elements after the k-th element are greater than
- or equal to that element. The ordering of the elements in the two
- partitions is undefined.
- .. versionadded:: 1.8.0
- Parameters
- ----------
- a : array_like
- Array to be sorted.
- kth : int 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:: 1.22.0
- Passing booleans as index is deprecated.
- axis : int 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'.
- order : str 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_array : ndarray
- 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.
- Examples
- --------
- >>> 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])
- ``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]
- """
- if axis is None:
- # flatten returns (1, N) for np.matrix, so always use the last axis
- a = asanyarray(a).flatten()
- axis = -1
- else:
- a = asanyarray(a).copy(order="K")
- a.partition(kth, axis=axis, kind=kind, order=order)
- return a
- def _argpartition_dispatcher(a, kth, axis=None, kind=None, order=None):
- return (a,)
- @array_function_dispatch(_argpartition_dispatcher)
- def argpartition(a, kth, axis=-1, kind='introselect', order=None):
- """
- 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.
- .. versionadded:: 1.8.0
- Parameters
- ----------
- a : array_like
- Array to sort.
- kth : int 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:: 1.22.0
- Passing booleans as index is deprecated.
- axis : int 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'
- order : str 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_array : ndarray, 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
- -----
- See `partition` for notes on the different selection algorithms.
- Examples
- --------
- One dimensional array:
- >>> x = np.array([3, 4, 2, 1])
- >>> x[np.argpartition(x, 3)]
- array([2, 1, 3, 4])
- >>> x[np.argpartition(x, (1, 3))]
- array([1, 2, 3, 4])
- >>> x = [3, 4, 2, 1]
- >>> np.array(x)[np.argpartition(x, 3)]
- array([2, 1, 3, 4])
- Multi-dimensional array:
- >>> x = np.array([[3, 4, 2], [1, 3, 1]])
- >>> index_array = np.argpartition(x, kth=1, axis=-1)
- >>> np.take_along_axis(x, index_array, axis=-1) # same as np.partition(x, kth=1)
- array([[2, 3, 4],
- [1, 1, 3]])
- """
- return _wrapfunc(a, 'argpartition', kth, axis=axis, kind=kind, order=order)
- def _sort_dispatcher(a, axis=None, kind=None, order=None):
- return (a,)
- @array_function_dispatch(_sort_dispatcher)
- def sort(a, axis=-1, kind=None, order=None):
- """
- Return a sorted copy of an array.
- Parameters
- ----------
- a : array_like
- Array to be sorted.
- axis : int 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.
- .. versionchanged:: 1.15.0.
- The 'stable' option was added.
- order : str 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
- -------
- sorted_array : ndarray
- 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.
- All the sort algorithms make temporary copies of the data when
- sorting along any but the last axis. Consequently, sorting along
- the last axis is faster and uses less space than sorting 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.
- 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.
- .. versionadded:: 1.12.0
- quicksort has been changed to `introsort <https://en.wikipedia.org/wiki/Introsort>`_.
- When sorting does not make enough progress it switches to
- `heapsort <https://en.wikipedia.org/wiki/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 <https://en.wikipedia.org/wiki/Timsort>`_
- or `radix sort <https://en.wikipedia.org/wiki/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.
- .. versionadded:: 1.17.0
- 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 <https://github.com/python/cpython/blob/3.7/Objects/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).
- .. versionchanged:: 1.18.0
- NaT now sorts to the end of arrays for consistency with NaN.
- Examples
- --------
- >>> 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') # doctest: +SKIP
- 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']) # doctest: +SKIP
- array([('Galahad', 1.7, 38), ('Lancelot', 1.8999999999999999, 38),
- ('Arthur', 1.8, 41)],
- dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])
- """
- if axis is None:
- # flatten returns (1, N) for np.matrix, so always use the last axis
- a = asanyarray(a).flatten()
- axis = -1
- else:
- a = asanyarray(a).copy(order="K")
- a.sort(axis=axis, kind=kind, order=order)
- return a
- def _argsort_dispatcher(a, axis=None, kind=None, order=None):
- return (a,)
- @array_function_dispatch(_argsort_dispatcher)
- def argsort(a, axis=-1, kind=None, order=None):
- """
- 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
- ----------
- a : array_like
- Array to sort.
- axis : int 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.
- .. versionchanged:: 1.15.0.
- The 'stable' option was added.
- order : str 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_array : ndarray, 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:
- >>> 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])
- """
- return _wrapfunc(a, 'argsort', axis=axis, kind=kind, order=order)
- def _argmax_dispatcher(a, axis=None, out=None, *, keepdims=np._NoValue):
- return (a, out)
- @array_function_dispatch(_argmax_dispatcher)
- def argmax(a, axis=None, out=None, *, keepdims=np._NoValue):
- """
- Returns the indices of the maximum values along an axis.
- Parameters
- ----------
- a : array_like
- Input array.
- axis : int, optional
- By default, the index is into the flattened array, otherwise
- along the specified axis.
- out : array, optional
- If provided, the result will be inserted into this array. It should
- be of the appropriate shape and dtype.
- keepdims : bool, 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.
- .. versionadded:: 1.22.0
- Returns
- -------
- index_array : ndarray 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
- --------
- >>> 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)
- """
- kwds = {'keepdims': keepdims} if keepdims is not np._NoValue else {}
- return _wrapfunc(a, 'argmax', axis=axis, out=out, **kwds)
- def _argmin_dispatcher(a, axis=None, out=None, *, keepdims=np._NoValue):
- return (a, out)
- @array_function_dispatch(_argmin_dispatcher)
- def argmin(a, axis=None, out=None, *, keepdims=np._NoValue):
- """
- Returns the indices of the minimum values along an axis.
- Parameters
- ----------
- a : array_like
- Input array.
- axis : int, optional
- By default, the index is into the flattened array, otherwise
- along the specified axis.
- out : array, optional
- If provided, the result will be inserted into this array. It should
- be of the appropriate shape and dtype.
- keepdims : bool, 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.
- .. versionadded:: 1.22.0
- Returns
- -------
- index_array : ndarray 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
- --------
- >>> 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)
- """
- kwds = {'keepdims': keepdims} if keepdims is not np._NoValue else {}
- return _wrapfunc(a, 'argmin', axis=axis, out=out, **kwds)
- def _searchsorted_dispatcher(a, v, side=None, sorter=None):
- return (a, v, sorter)
- @array_function_dispatch(_searchsorted_dispatcher)
- def searchsorted(a, v, side='left', sorter=None):
- """
- 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
- ----------
- a : 1-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.
- v : array_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`).
- sorter : 1-D array_like, optional
- Optional array of integer indices that sort array a into ascending
- order. They are typically the result of argsort.
- .. versionadded:: 1.7.0
- Returns
- -------
- indices : int 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
- --------
- >>> np.searchsorted([1,2,3,4,5], 3)
- 2
- >>> np.searchsorted([1,2,3,4,5], 3, side='right')
- 3
- >>> np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3])
- array([0, 5, 1, 2])
- """
- return _wrapfunc(a, 'searchsorted', v, side=side, sorter=sorter)
- def _resize_dispatcher(a, new_shape):
- return (a,)
- @array_function_dispatch(_resize_dispatcher)
- def resize(a, new_shape):
- """
- 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
- ----------
- a : array_like
- Array to be resized.
- new_shape : int or tuple of int
- Shape of resized array.
- Returns
- -------
- reshaped_array : ndarray
- 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 `~numpy.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
- --------
- >>> 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]])
- """
- if isinstance(new_shape, (int, nt.integer)):
- new_shape = (new_shape,)
- a = ravel(a)
- new_size = 1
- for dim_length in new_shape:
- new_size *= dim_length
- if dim_length < 0:
- raise ValueError('all elements of `new_shape` must be non-negative')
- if a.size == 0 or new_size == 0:
- # First case must zero fill. The second would have repeats == 0.
- return np.zeros_like(a, shape=new_shape)
- repeats = -(-new_size // a.size) # ceil division
- a = concatenate((a,) * repeats)[:new_size]
- return reshape(a, new_shape)
- def _squeeze_dispatcher(a, axis=None):
- return (a,)
- @array_function_dispatch(_squeeze_dispatcher)
- def squeeze(a, axis=None):
- """
- Remove axes of length one from `a`.
- Parameters
- ----------
- a : array_like
- Input data.
- axis : None or int or tuple of ints, optional
- .. versionadded:: 1.7.0
- 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
- -------
- squeezed : ndarray
- 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
- --------
- >>> 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
- """
- try:
- squeeze = a.squeeze
- except AttributeError:
- return _wrapit(a, 'squeeze', axis=axis)
- if axis is None:
- return squeeze()
- else:
- return squeeze(axis=axis)
- def _diagonal_dispatcher(a, offset=None, axis1=None, axis2=None):
- return (a,)
- @array_function_dispatch(_diagonal_dispatcher)
- def diagonal(a, offset=0, axis1=0, axis2=1):
- """
- 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
- ----------
- a : array_like
- Array from which the diagonals are taken.
- offset : int, optional
- Offset of the diagonal from the main diagonal. Can be positive or
- negative. Defaults to main diagonal (0).
- axis1 : int, 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).
- axis2 : int, 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_diagonals : ndarray
- 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
- --------
- >>> 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.
- """
- if isinstance(a, np.matrix):
- # Make diagonal of matrix 1-D to preserve backward compatibility.
- return asarray(a).diagonal(offset=offset, axis1=axis1, axis2=axis2)
- else:
- return asanyarray(a).diagonal(offset=offset, axis1=axis1, axis2=axis2)
- def _trace_dispatcher(
- a, offset=None, axis1=None, axis2=None, dtype=None, out=None):
- return (a, out)
- @array_function_dispatch(_trace_dispatcher)
- def trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None):
- """
- 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
- ----------
- a : array_like
- Input array, from which the diagonals are taken.
- offset : int, optional
- Offset of the diagonal from the main diagonal. Can be both positive
- and negative. Defaults to 0.
- axis1, axis2 : int, 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`.
- dtype : dtype, 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`.
- out : ndarray, 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_diagonals : ndarray
- 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
- --------
- >>> 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)
- """
- if isinstance(a, np.matrix):
- # Get trace of matrix via an array to preserve backward compatibility.
- return asarray(a).trace(offset=offset, axis1=axis1, axis2=axis2, dtype=dtype, out=out)
- else:
- return asanyarray(a).trace(offset=offset, axis1=axis1, axis2=axis2, dtype=dtype, out=out)
- def _ravel_dispatcher(a, order=None):
- return (a,)
- @array_function_dispatch(_ravel_dispatcher)
- def ravel(a, order='C'):
- """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
- ----------
- a : array_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
- -------
- y : array_like
- y is an 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.
- Examples
- --------
- It is equivalent to ``reshape(-1, order=order)``.
- >>> 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])
- """
- if isinstance(a, np.matrix):
- return asarray(a).ravel(order=order)
- else:
- return asanyarray(a).ravel(order=order)
- def _nonzero_dispatcher(a):
- return (a,)
- @array_function_dispatch(_nonzero_dispatcher)
- def nonzero(a):
- """
- 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:: 1.17.0
- Use `atleast_1d` explicitly if this behavior is deliberate.
- Parameters
- ----------
- a : array_like
- Input array.
- Returns
- -------
- tuple_of_arrays : tuple
- 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
- --------
- >>> 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]))
- """
- return _wrapfunc(a, 'nonzero')
- def _shape_dispatcher(a):
- return (a,)
- @array_function_dispatch(_shape_dispatcher)
- def shape(a):
- """
- Return the shape of an array.
- Parameters
- ----------
- a : array_like
- Input array.
- Returns
- -------
- shape : tuple 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
- --------
- >>> 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,)
- """
- try:
- result = a.shape
- except AttributeError:
- result = asarray(a).shape
- return result
- def _compress_dispatcher(condition, a, axis=None, out=None):
- return (condition, a, out)
- @array_function_dispatch(_compress_dispatcher)
- def compress(condition, a, axis=None, out=None):
- """
- 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
- ----------
- condition : 1-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.
- a : array_like
- Array from which to extract a part.
- axis : int, optional
- Axis along which to take slices. If None (default), work on the
- flattened array.
- out : ndarray, optional
- Output array. Its type is preserved and it must be of the right
- shape to hold the output.
- Returns
- -------
- compressed_array : ndarray
- 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
- :ref:`ufuncs-output-type`
- Examples
- --------
- >>> 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])
- """
- return _wrapfunc(a, 'compress', condition, axis=axis, out=out)
- def _clip_dispatcher(a, a_min, a_max, out=None, **kwargs):
- return (a, a_min, a_max)
- @array_function_dispatch(_clip_dispatcher)
- def clip(a, a_min, a_max, out=None, **kwargs):
- """
- 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
- ----------
- a : array_like
- Array containing elements to clip.
- a_min, a_max : array_like or None
- Minimum and maximum value. If ``None``, clipping is not performed on
- the corresponding edge. Only one of `a_min` and `a_max` may be
- ``None``. Both are broadcast against `a`.
- out : ndarray, 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.
- **kwargs
- For other keyword-only arguments, see the
- :ref:`ufunc docs <ufuncs.kwargs>`.
- .. versionadded:: 1.17.0
- Returns
- -------
- clipped_array : ndarray
- 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
- --------
- :ref:`ufuncs-output-type`
- 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
- --------
- >>> 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])
- """
- return _wrapfunc(a, 'clip', a_min, a_max, out=out, **kwargs)
- def _sum_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None,
- initial=None, where=None):
- return (a, out)
- @array_function_dispatch(_sum_dispatcher)
- def sum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue,
- initial=np._NoValue, where=np._NoValue):
- """
- Sum of array elements over a given axis.
- Parameters
- ----------
- a : array_like
- Elements to sum.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- dtype : dtype, 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.
- out : ndarray, 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.
- keepdims : bool, 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.
- initial : scalar, optional
- Starting value for the sum. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.15.0
- where : array_like of bool, optional
- Elements to include in the sum. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.17.0
- Returns
- -------
- sum_along_axis : ndarray
- 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.reduce : Equivalent functionality of `add`.
- cumsum : Cumulative sum of array elements.
- trapz : Integration of array values using the 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
- --------
- >>> np.sum([0.5, 1.5])
- 2.0
- >>> np.sum([0.5, 0.7, 0.2, 1.5], dtype=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)
- -128
- You can also start the sum with a value other than zero:
- >>> np.sum([10], initial=5)
- 15
- """
- if isinstance(a, _gentype):
- # 2018-02-25, 1.15.0
- warnings.warn(
- "Calling np.sum(generator) is deprecated, and in the future will give a different result. "
- "Use np.sum(np.fromiter(generator)) or the python sum builtin instead.",
- DeprecationWarning, stacklevel=3)
- res = _sum_(a)
- if out is not None:
- out[...] = res
- return out
- return res
- return _wrapreduction(a, np.add, 'sum', axis, dtype, out, keepdims=keepdims,
- initial=initial, where=where)
- def _any_dispatcher(a, axis=None, out=None, keepdims=None, *,
- where=np._NoValue):
- return (a, where, out)
- @array_function_dispatch(_any_dispatcher)
- def any(a, axis=None, out=None, keepdims=np._NoValue, *, where=np._NoValue):
- """
- Test whether any array element along a given axis evaluates to True.
- Returns single boolean if `axis` is ``None``
- Parameters
- ----------
- a : array_like
- Input array or object that can be converted to an array.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- out : ndarray, 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 :ref:`ufuncs-output-type` for more details.
- keepdims : bool, 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.
- where : array_like of bool, optional
- Elements to include in checking for any `True` values.
- See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.20.0
- Returns
- -------
- any : bool 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.
- Examples
- --------
- >>> np.any([[True, False], [True, True]])
- True
- >>> np.any([[True, False], [False, False]], axis=0)
- array([ True, False])
- >>> np.any([-1, 0, 5])
- True
- >>> np.any(np.nan)
- True
- >>> np.any([[True, False], [False, False]], where=[[False], [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 # doctest: +SKIP
- (191614240, 191614240)
- """
- return _wrapreduction(a, np.logical_or, 'any', axis, None, out,
- keepdims=keepdims, where=where)
- def _all_dispatcher(a, axis=None, out=None, keepdims=None, *,
- where=None):
- return (a, where, out)
- @array_function_dispatch(_all_dispatcher)
- def all(a, axis=None, out=None, keepdims=np._NoValue, *, where=np._NoValue):
- """
- Test whether all array elements along a given axis evaluate to True.
- Parameters
- ----------
- a : array_like
- Input array or object that can be converted to an array.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- out : ndarray, 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 :ref:`ufuncs-output-type` for more
- details.
- keepdims : bool, 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.
- where : array_like of bool, optional
- Elements to include in checking for all `True` values.
- See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.20.0
- Returns
- -------
- all : ndarray, 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.
- Examples
- --------
- >>> 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
- """
- return _wrapreduction(a, np.logical_and, 'all', axis, None, out,
- keepdims=keepdims, where=where)
- def _cumsum_dispatcher(a, axis=None, dtype=None, out=None):
- return (a, out)
- @array_function_dispatch(_cumsum_dispatcher)
- def cumsum(a, axis=None, dtype=None, out=None):
- """
- Return the cumulative sum of the elements along a given axis.
- Parameters
- ----------
- a : array_like
- Input array.
- axis : int, optional
- Axis along which the cumulative sum is computed. The default
- (None) is to compute the cumsum over the flattened array.
- dtype : dtype, 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.
- out : ndarray, 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 :ref:`ufuncs-output-type` for
- more details.
- Returns
- -------
- cumsum_along_axis : ndarray.
- 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
- --------
- sum : Sum array elements.
- trapz : Integration of array values using the 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
- --------
- >>> 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
- """
- return _wrapfunc(a, 'cumsum', axis=axis, dtype=dtype, out=out)
- def _ptp_dispatcher(a, axis=None, out=None, keepdims=None):
- return (a, out)
- @array_function_dispatch(_ptp_dispatcher)
- def ptp(a, axis=None, out=None, keepdims=np._NoValue):
- """
- 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. `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
- ----------
- a : array_like
- Input values.
- axis : None 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.
- .. versionadded:: 1.15.0
- 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.
- out : array_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.
- keepdims : bool, 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
- -------
- ptp : ndarray 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
- --------
- >>> 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)
- """
- kwargs = {}
- if keepdims is not np._NoValue:
- kwargs['keepdims'] = keepdims
- if type(a) is not mu.ndarray:
- try:
- ptp = a.ptp
- except AttributeError:
- pass
- else:
- return ptp(axis=axis, out=out, **kwargs)
- return _methods._ptp(a, axis=axis, out=out, **kwargs)
- def _amax_dispatcher(a, axis=None, out=None, keepdims=None, initial=None,
- where=None):
- return (a, out)
- @array_function_dispatch(_amax_dispatcher)
- def amax(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
- where=np._NoValue):
- """
- Return the maximum of an array or maximum along an axis.
- Parameters
- ----------
- a : array_like
- Input data.
- axis : None or int or tuple of ints, optional
- Axis or axes along which to operate. By default, flattened input is
- used.
- .. versionadded:: 1.7.0
- 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.
- out : ndarray, optional
- Alternative output array in which to place the result. Must
- be of the same shape and buffer length as the expected output.
- See :ref:`ufuncs-output-type` for more details.
- keepdims : bool, 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 `amax` 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.
- initial : scalar, optional
- The minimum value of an output element. Must be present to allow
- computation on empty slice. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.15.0
- where : array_like of bool, optional
- Elements to compare for the maximum. See `~numpy.ufunc.reduce`
- for details.
- .. versionadded:: 1.17.0
- Returns
- -------
- amax : ndarray 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 `amax` for element-wise comparison of 2 arrays; when
- ``a.shape[0]`` is 2, ``maximum(a[0], a[1])`` is faster than
- ``amax(a, axis=0)``.
- Examples
- --------
- >>> a = np.arange(4).reshape((2,2))
- >>> a
- array([[0, 1],
- [2, 3]])
- >>> np.amax(a) # Maximum of the flattened array
- 3
- >>> np.amax(a, axis=0) # Maxima along the first axis
- array([2, 3])
- >>> np.amax(a, axis=1) # Maxima along the second axis
- array([1, 3])
- >>> np.amax(a, where=[False, True], initial=-1, axis=0)
- array([-1, 3])
- >>> b = np.arange(5, dtype=float)
- >>> b[2] = np.NaN
- >>> np.amax(b)
- nan
- >>> np.amax(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.amax([[-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.amax([5], initial=6)
- 6
- >>> max([5], default=6)
- 5
- """
- return _wrapreduction(a, np.maximum, 'max', axis, None, out,
- keepdims=keepdims, initial=initial, where=where)
- def _amin_dispatcher(a, axis=None, out=None, keepdims=None, initial=None,
- where=None):
- return (a, out)
- @array_function_dispatch(_amin_dispatcher)
- def amin(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
- where=np._NoValue):
- """
- Return the minimum of an array or minimum along an axis.
- Parameters
- ----------
- a : array_like
- Input data.
- axis : None or int or tuple of ints, optional
- Axis or axes along which to operate. By default, flattened input is
- used.
- .. versionadded:: 1.7.0
- 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.
- out : ndarray, optional
- Alternative output array in which to place the result. Must
- be of the same shape and buffer length as the expected output.
- See :ref:`ufuncs-output-type` for more details.
- keepdims : bool, 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 `amin` 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.
- initial : scalar, optional
- The maximum value of an output element. Must be present to allow
- computation on empty slice. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.15.0
- where : array_like of bool, optional
- Elements to compare for the minimum. See `~numpy.ufunc.reduce`
- for details.
- .. versionadded:: 1.17.0
- Returns
- -------
- amin : ndarray 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 `amin` for element-wise comparison of 2 arrays; when
- ``a.shape[0]`` is 2, ``minimum(a[0], a[1])`` is faster than
- ``amin(a, axis=0)``.
- Examples
- --------
- >>> a = np.arange(4).reshape((2,2))
- >>> a
- array([[0, 1],
- [2, 3]])
- >>> np.amin(a) # Minimum of the flattened array
- 0
- >>> np.amin(a, axis=0) # Minima along the first axis
- array([0, 1])
- >>> np.amin(a, axis=1) # Minima along the second axis
- array([0, 2])
- >>> np.amin(a, where=[False, True], initial=10, axis=0)
- array([10, 1])
- >>> b = np.arange(5, dtype=float)
- >>> b[2] = np.NaN
- >>> np.amin(b)
- nan
- >>> np.amin(b, where=~np.isnan(b), initial=10)
- 0.0
- >>> np.nanmin(b)
- 0.0
- >>> np.amin([[-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.amin([6], initial=5)
- 5
- >>> min([6], default=5)
- 6
- """
- return _wrapreduction(a, np.minimum, 'min', axis, None, out,
- keepdims=keepdims, initial=initial, where=where)
- def _prod_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None,
- initial=None, where=None):
- return (a, out)
- @array_function_dispatch(_prod_dispatcher)
- def prod(a, axis=None, dtype=None, out=None, keepdims=np._NoValue,
- initial=np._NoValue, where=np._NoValue):
- """
- Return the product of array elements over a given axis.
- Parameters
- ----------
- a : array_like
- Input data.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- dtype : dtype, 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.
- out : ndarray, 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.
- keepdims : bool, 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.
- initial : scalar, optional
- The starting value for this product. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.15.0
- where : array_like of bool, optional
- Elements to include in the product. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.17.0
- Returns
- -------
- product_along_axis : ndarray, 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
- :ref:`ufuncs-output-type`
- 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:
- >>> 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
- """
- return _wrapreduction(a, np.multiply, 'prod', axis, dtype, out,
- keepdims=keepdims, initial=initial, where=where)
- def _cumprod_dispatcher(a, axis=None, dtype=None, out=None):
- return (a, out)
- @array_function_dispatch(_cumprod_dispatcher)
- def cumprod(a, axis=None, dtype=None, out=None):
- """
- Return the cumulative product of elements along a given axis.
- Parameters
- ----------
- a : array_like
- Input array.
- axis : int, optional
- Axis along which the cumulative product is computed. By default
- the input is flattened.
- dtype : dtype, 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.
- out : ndarray, 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
- -------
- cumprod : ndarray
- A new array holding the result is returned unless `out` is
- specified, in which case a reference to out is returned.
- See Also
- --------
- :ref:`ufuncs-output-type`
- Notes
- -----
- Arithmetic is modular when using integer types, and no error is
- raised on overflow.
- Examples
- --------
- >>> 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]])
- """
- return _wrapfunc(a, 'cumprod', axis=axis, dtype=dtype, out=out)
- def _ndim_dispatcher(a):
- return (a,)
- @array_function_dispatch(_ndim_dispatcher)
- def ndim(a):
- """
- Return the number of dimensions of an array.
- Parameters
- ----------
- a : array_like
- Input array. If it is not already an ndarray, a conversion is
- attempted.
- Returns
- -------
- number_of_dimensions : int
- 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
- --------
- >>> np.ndim([[1,2,3],[4,5,6]])
- 2
- >>> np.ndim(np.array([[1,2,3],[4,5,6]]))
- 2
- >>> np.ndim(1)
- 0
- """
- try:
- return a.ndim
- except AttributeError:
- return asarray(a).ndim
- def _size_dispatcher(a, axis=None):
- return (a,)
- @array_function_dispatch(_size_dispatcher)
- def size(a, axis=None):
- """
- Return the number of elements along a given axis.
- Parameters
- ----------
- a : array_like
- Input data.
- axis : int, optional
- Axis along which the elements are counted. By default, give
- the total number of elements.
- Returns
- -------
- element_count : int
- 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
- --------
- >>> a = np.array([[1,2,3],[4,5,6]])
- >>> np.size(a)
- 6
- >>> np.size(a,1)
- 3
- >>> np.size(a,0)
- 2
- """
- if axis is None:
- try:
- return a.size
- except AttributeError:
- return asarray(a).size
- else:
- try:
- return a.shape[axis]
- except AttributeError:
- return asarray(a).shape[axis]
- def _around_dispatcher(a, decimals=None, out=None):
- return (a, out)
- @array_function_dispatch(_around_dispatcher)
- def around(a, decimals=0, out=None):
- """
- Evenly round to the given number of decimals.
- Parameters
- ----------
- a : array_like
- Input data.
- decimals : int, 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.
- out : ndarray, 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 :ref:`ufuncs-output-type` for more
- details.
- Returns
- -------
- rounded_array : ndarray
- 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
- ceil, fix, floor, rint, trunc
- Notes
- -----
- `~numpy.round` is often used as an alias for `~numpy.around`.
-
- 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.around`` 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
- --------
- >>> np.around([0.37, 1.64])
- array([0., 2.])
- >>> np.around([0.37, 1.64], decimals=1)
- array([0.4, 1.6])
- >>> np.around([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even value
- array([0., 2., 2., 4., 4.])
- >>> np.around([1,2,3,11], decimals=1) # ndarray of ints is returned
- array([ 1, 2, 3, 11])
- >>> np.around([1,2,3,11], decimals=-1)
- array([ 0, 0, 0, 10])
- """
- return _wrapfunc(a, 'round', decimals=decimals, out=out)
- def _mean_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None, *,
- where=None):
- return (a, where, out)
- @array_function_dispatch(_mean_dispatcher)
- def mean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue, *,
- where=np._NoValue):
- """
- 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
- ----------
- a : array_like
- Array containing numbers whose mean is desired. If `a` is not an
- array, a conversion is attempted.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- dtype : data-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.
- out : ndarray, 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 :ref:`ufuncs-output-type` for more details.
- keepdims : bool, 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.
- where : array_like of bool, optional
- Elements to include in the mean. See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.20.0
- Returns
- -------
- m : ndarray, 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
- --------
- >>> 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)
- 0.54999924
- Computing the mean in float64 is more accurate:
- >>> np.mean(a, dtype=np.float64)
- 0.55000000074505806 # may vary
- 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
- """
- kwargs = {}
- if keepdims is not np._NoValue:
- kwargs['keepdims'] = keepdims
- if where is not np._NoValue:
- kwargs['where'] = where
- if type(a) is not mu.ndarray:
- try:
- mean = a.mean
- except AttributeError:
- pass
- else:
- return mean(axis=axis, dtype=dtype, out=out, **kwargs)
- return _methods._mean(a, axis=axis, dtype=dtype,
- out=out, **kwargs)
- def _std_dispatcher(a, axis=None, dtype=None, out=None, ddof=None,
- keepdims=None, *, where=None):
- return (a, where, out)
- @array_function_dispatch(_std_dispatcher)
- def std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue, *,
- where=np._NoValue):
- """
- 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
- ----------
- a : array_like
- Calculate the standard deviation of these values.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- dtype : dtype, 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.
- out : ndarray, 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, 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.
- keepdims : bool, 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.
- where : array_like of bool, optional
- Elements to include in the standard deviation.
- See `~numpy.ufunc.reduce` for details.
- .. versionadded:: 1.20.0
- Returns
- -------
- standard_deviation : ndarray, 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
- :ref:`ufuncs-output-type`
- Notes
- -----
- The standard deviation is the square root of the average of the squared
- deviations from the mean, i.e., ``std = sqrt(mean(x))``, where
- ``x = abs(a - a.mean())**2``.
- The average squared deviation is typically 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
- --------
- >>> 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)
- 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
- """
- kwargs = {}
- if keepdims is not np._NoValue:
- kwargs['keepdims'] = keepdims
- if where is not np._NoValue:
- kwargs['where'] = where
- if type(a) is not mu.ndarray:
- try:
- std = a.std
- except AttributeError:
- pass
- else:
- return std(axis=axis, dtype=dtype, out=out, ddof=ddof, **kwargs)
- return _methods._std(a, axis=axis, dtype=dtype, out=out, ddof=ddof,
- **kwargs)
- def _var_dispatcher(a, axis=None, dtype=None, out=None, ddof=None,
- keepdims=None, *, where=None):
- return (a, where, out)
- @array_function_dispatch(_var_dispatcher)
- def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue, *,
- where=np._NoValue):
- """
- 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
- ----------
- a : array_like
- Array containing numbers whose variance is desired. If `a` is not an
- array, a conversion is attempted.
- axis : None 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.
- .. versionadded:: 1.7.0
- 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.
- dtype : data-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.
- out : ndarray, 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, 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.
- keepdims : bool, 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.
- where : array_like of bool, optional
- Elements to include in the variance. See `~numpy.ufunc.reduce` for
- details.
- .. versionadded:: 1.20.0
- Returns
- -------
- variance : ndarray, 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
- :ref:`ufuncs-output-type`
- Notes
- -----
- The variance is the average of the squared deviations from the mean,
- i.e., ``var = mean(x)``, where ``x = abs(a - a.mean())**2``.
- The mean is typically 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.
- Examples
- --------
- >>> 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)
- 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
- """
- kwargs = {}
- if keepdims is not np._NoValue:
- kwargs['keepdims'] = keepdims
- if where is not np._NoValue:
- kwargs['where'] = where
- if type(a) is not mu.ndarray:
- try:
- var = a.var
- except AttributeError:
- pass
- else:
- return var(axis=axis, dtype=dtype, out=out, ddof=ddof, **kwargs)
- return _methods._var(a, axis=axis, dtype=dtype, out=out, ddof=ddof,
- **kwargs)
- # Aliases of other functions. These have their own definitions only so that
- # they can have unique docstrings.
- @array_function_dispatch(_around_dispatcher)
- def round_(a, decimals=0, out=None):
- """
- Round an array to the given number of decimals.
- See Also
- --------
- around : equivalent function; see for details.
- """
- return around(a, decimals=decimals, out=out)
- @array_function_dispatch(_prod_dispatcher, verify=False)
- def product(*args, **kwargs):
- """
- Return the product of array elements over a given axis.
- See Also
- --------
- prod : equivalent function; see for details.
- """
- return prod(*args, **kwargs)
- @array_function_dispatch(_cumprod_dispatcher, verify=False)
- def cumproduct(*args, **kwargs):
- """
- Return the cumulative product over the given axis.
- See Also
- --------
- cumprod : equivalent function; see for details.
- """
- return cumprod(*args, **kwargs)
- @array_function_dispatch(_any_dispatcher, verify=False)
- def sometrue(*args, **kwargs):
- """
- Check whether some values are true.
- Refer to `any` for full documentation.
- See Also
- --------
- any : equivalent function; see for details.
- """
- return any(*args, **kwargs)
- @array_function_dispatch(_all_dispatcher, verify=False)
- def alltrue(*args, **kwargs):
- """
- Check if all elements of input array are true.
- See Also
- --------
- numpy.all : Equivalent function; see for details.
- """
- return all(*args, **kwargs)
|