You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

1-numpy_tutorial.ipynb 165 kB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# Numpy - 多维数据数组软件库"
  8. ]
  9. },
  10. {
  11. "cell_type": "markdown",
  12. "metadata": {},
  13. "source": [
  14. "NumPy是Python中科学计算的基本软件包。它是一个Python库,提供多维数组对象、各种派生类(如掩码数组和矩阵)和各种例程。\n",
  15. "* 用于对数组进行快速操作,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计操作、随机模拟等等。\n",
  16. "* Numpy作为Python数据计算的基础广泛应用到数据处理、信号处理、机器学习等领域。"
  17. ]
  18. },
  19. {
  20. "cell_type": "markdown",
  21. "metadata": {},
  22. "source": [
  23. "![cover image](images/numpy.png)"
  24. ]
  25. },
  26. {
  27. "cell_type": "markdown",
  28. "metadata": {},
  29. "source": [
  30. "## 1. 简介"
  31. ]
  32. },
  33. {
  34. "cell_type": "markdown",
  35. "metadata": {},
  36. "source": [
  37. "`numpy`包(模块)用在几乎所有使用Python的数值计算中,为Python提供高性能向量,矩阵和高维数据结构的模块。它是用C和Fortran语言实现的,因此当计算向量化数据(用向量和矩阵表示)时,性能非常的好。\n",
  38. "\n",
  39. "为了使用`numpy`模块,你先要像下面的例子一样导入这个模块:"
  40. ]
  41. },
  42. {
  43. "cell_type": "code",
  44. "execution_count": 1,
  45. "metadata": {
  46. "collapsed": true
  47. },
  48. "outputs": [],
  49. "source": [
  50. "# 这一行的作用会在Matplotlib中介绍\n",
  51. "%matplotlib inline\n",
  52. "import matplotlib.pyplot as plt"
  53. ]
  54. },
  55. {
  56. "cell_type": "code",
  57. "execution_count": 2,
  58. "metadata": {
  59. "collapsed": true
  60. },
  61. "outputs": [],
  62. "source": [
  63. "# 不建议用这种方式导入库\n",
  64. "from numpy import *"
  65. ]
  66. },
  67. {
  68. "cell_type": "code",
  69. "execution_count": 3,
  70. "metadata": {
  71. "collapsed": true
  72. },
  73. "outputs": [],
  74. "source": [
  75. "# 建议使用这种方式\n",
  76. "import numpy as np"
  77. ]
  78. },
  79. {
  80. "cell_type": "markdown",
  81. "metadata": {},
  82. "source": [
  83. "**建议大家使用第二种导入方法** `import numpy as np`\n"
  84. ]
  85. },
  86. {
  87. "cell_type": "markdown",
  88. "metadata": {},
  89. "source": [
  90. "## 2. 创建`numpy`数组"
  91. ]
  92. },
  93. {
  94. "cell_type": "markdown",
  95. "metadata": {},
  96. "source": [
  97. "有很多种方法去初始化新的numpy数组, 例如从\n",
  98. "\n",
  99. "* Python列表或元组\n",
  100. "* 使用专门用来创建numpy arrays的函数,例如 `arange`, `linspace`等\n",
  101. "* 从文件中读取数据"
  102. ]
  103. },
  104. {
  105. "cell_type": "markdown",
  106. "metadata": {},
  107. "source": [
  108. "### 2.1 从列表中"
  109. ]
  110. },
  111. {
  112. "cell_type": "markdown",
  113. "metadata": {},
  114. "source": [
  115. "例如,为了从Python列表创建新的向量和矩阵我们可以用`numpy.array`函数。\n"
  116. ]
  117. },
  118. {
  119. "cell_type": "code",
  120. "execution_count": 4,
  121. "metadata": {},
  122. "outputs": [
  123. {
  124. "name": "stdout",
  125. "output_type": "stream",
  126. "text": [
  127. "[1, 2, 3, 4]\n"
  128. ]
  129. },
  130. {
  131. "data": {
  132. "text/plain": [
  133. "array([1, 2, 3, 4])"
  134. ]
  135. },
  136. "execution_count": 4,
  137. "metadata": {},
  138. "output_type": "execute_result"
  139. }
  140. ],
  141. "source": [
  142. "import numpy as np\n",
  143. "\n",
  144. "a = [1, 2, 3, 4]\n",
  145. "print(a)\n",
  146. "\n",
  147. "# a vector: the argument to the array function is a Python list\n",
  148. "v = np.array(a)\n",
  149. "\n",
  150. "v"
  151. ]
  152. },
  153. {
  154. "cell_type": "code",
  155. "execution_count": 7,
  156. "metadata": {},
  157. "outputs": [
  158. {
  159. "name": "stdout",
  160. "output_type": "stream",
  161. "text": [
  162. "[[1, 2], [3, 4], [5, 6]]\n",
  163. "[[1 2]\n",
  164. " [3 4]\n",
  165. " [5 6]]\n",
  166. "\n",
  167. "(3, 2)\n"
  168. ]
  169. }
  170. ],
  171. "source": [
  172. "# 矩阵:数组函数的参数是一个嵌套的Python列表\n",
  173. "a = [[1, 2], [3, 4], [5, 6]]\n",
  174. "M = np.array(a)\n",
  175. "\n",
  176. "print(a)\n",
  177. "print(M)\n",
  178. "print()\n",
  179. "print(M.shape)"
  180. ]
  181. },
  182. {
  183. "cell_type": "code",
  184. "execution_count": 9,
  185. "metadata": {},
  186. "outputs": [
  187. {
  188. "name": "stdout",
  189. "output_type": "stream",
  190. "text": [
  191. "[[[ 1 2]\n",
  192. " [ 3 4]\n",
  193. " [ 5 6]]\n",
  194. "\n",
  195. " [[ 3 4]\n",
  196. " [ 5 6]\n",
  197. " [ 7 8]]\n",
  198. "\n",
  199. " [[ 5 6]\n",
  200. " [ 7 8]\n",
  201. " [ 9 10]]\n",
  202. "\n",
  203. " [[ 7 8]\n",
  204. " [ 9 10]\n",
  205. " [11 12]]]\n",
  206. "\n",
  207. "(4, 3, 2)\n"
  208. ]
  209. }
  210. ],
  211. "source": [
  212. "M = np.array([[[1,2], [3,4], [5,6]], \\\n",
  213. " [[3,4], [5,6], [7,8]], \\\n",
  214. " [[5,6], [7,8], [9,10]], \\\n",
  215. " [[7,8], [9,10], [11,12]]])\n",
  216. "print(M)\n",
  217. "print()\n",
  218. "print(M.shape)"
  219. ]
  220. },
  221. {
  222. "cell_type": "markdown",
  223. "metadata": {},
  224. "source": [
  225. "`v`和`M`两个都是属于`numpy`模块提供的`ndarray`类型。"
  226. ]
  227. },
  228. {
  229. "cell_type": "code",
  230. "execution_count": 10,
  231. "metadata": {},
  232. "outputs": [
  233. {
  234. "data": {
  235. "text/plain": [
  236. "(numpy.ndarray, numpy.ndarray)"
  237. ]
  238. },
  239. "execution_count": 10,
  240. "metadata": {},
  241. "output_type": "execute_result"
  242. }
  243. ],
  244. "source": [
  245. "type(v), type(M)"
  246. ]
  247. },
  248. {
  249. "cell_type": "markdown",
  250. "metadata": {},
  251. "source": [
  252. "`v`和`M`之间的区别仅在于他们的形状。我们可以用属性函数`ndarray.shape`得到数组形状的信息。"
  253. ]
  254. },
  255. {
  256. "cell_type": "code",
  257. "execution_count": 11,
  258. "metadata": {},
  259. "outputs": [
  260. {
  261. "data": {
  262. "text/plain": [
  263. "(4,)"
  264. ]
  265. },
  266. "execution_count": 11,
  267. "metadata": {},
  268. "output_type": "execute_result"
  269. }
  270. ],
  271. "source": [
  272. "v.shape"
  273. ]
  274. },
  275. {
  276. "cell_type": "code",
  277. "execution_count": 12,
  278. "metadata": {},
  279. "outputs": [
  280. {
  281. "data": {
  282. "text/plain": [
  283. "(4, 3, 2)"
  284. ]
  285. },
  286. "execution_count": 12,
  287. "metadata": {},
  288. "output_type": "execute_result"
  289. }
  290. ],
  291. "source": [
  292. "M.shape"
  293. ]
  294. },
  295. {
  296. "cell_type": "markdown",
  297. "metadata": {},
  298. "source": [
  299. "通过属性函数`ndarray.size`我们可以得到数组中元素的个数"
  300. ]
  301. },
  302. {
  303. "cell_type": "code",
  304. "execution_count": 13,
  305. "metadata": {},
  306. "outputs": [
  307. {
  308. "data": {
  309. "text/plain": [
  310. "24"
  311. ]
  312. },
  313. "execution_count": 13,
  314. "metadata": {},
  315. "output_type": "execute_result"
  316. }
  317. ],
  318. "source": [
  319. "M.size"
  320. ]
  321. },
  322. {
  323. "cell_type": "markdown",
  324. "metadata": {},
  325. "source": [
  326. "同样,我们可以用函数`numpy.shape`和`numpy.size`"
  327. ]
  328. },
  329. {
  330. "cell_type": "code",
  331. "execution_count": 15,
  332. "metadata": {},
  333. "outputs": [
  334. {
  335. "data": {
  336. "text/plain": [
  337. "(4, 3, 2)"
  338. ]
  339. },
  340. "execution_count": 15,
  341. "metadata": {},
  342. "output_type": "execute_result"
  343. }
  344. ],
  345. "source": [
  346. "np.shape(M)"
  347. ]
  348. },
  349. {
  350. "cell_type": "code",
  351. "execution_count": 16,
  352. "metadata": {},
  353. "outputs": [
  354. {
  355. "data": {
  356. "text/plain": [
  357. "24"
  358. ]
  359. },
  360. "execution_count": 16,
  361. "metadata": {},
  362. "output_type": "execute_result"
  363. }
  364. ],
  365. "source": [
  366. "np.size(M)"
  367. ]
  368. },
  369. {
  370. "cell_type": "markdown",
  371. "metadata": {},
  372. "source": [
  373. "到目前为止`numpy.ndarray`看起来非常像Python列表(或嵌套列表)。为什么不简单地使用Python列表来进行计算,而不是创建一个新的数组类型?\n",
  374. "\n",
  375. "下面有几个原因:\n",
  376. "\n",
  377. "* Python列表非常普遍。它们可以包含任何类型的对象。它们是动态类型的。它们不支持矩阵和点乘等数学函数。由于动态类型的关系,为Python列表实现这类函数的效率不是很高。\n",
  378. "* Numpy数组是**静态类型的**和**同构的**。元素的类型是在创建数组时确定的。\n",
  379. "* Numpy数组是内存高效的。\n",
  380. "* 由于是静态类型,数学函数的快速实现,比如“numpy”数组的乘法和加法可以用编译语言实现(使用C和Fortran).\n",
  381. "\n",
  382. "利用`ndarray`的属性函数`dtype`(数据类型),我们可以看出数组的数据是那种类型。\n"
  383. ]
  384. },
  385. {
  386. "cell_type": "code",
  387. "execution_count": 17,
  388. "metadata": {},
  389. "outputs": [
  390. {
  391. "data": {
  392. "text/plain": [
  393. "dtype('int64')"
  394. ]
  395. },
  396. "execution_count": 17,
  397. "metadata": {},
  398. "output_type": "execute_result"
  399. }
  400. ],
  401. "source": [
  402. "M.dtype"
  403. ]
  404. },
  405. {
  406. "cell_type": "markdown",
  407. "metadata": {},
  408. "source": [
  409. "如果我们试图给一个numpy数组中的元素赋一个错误类型的值,我们会得到一个错误:"
  410. ]
  411. },
  412. {
  413. "cell_type": "code",
  414. "execution_count": 23,
  415. "metadata": {},
  416. "outputs": [],
  417. "source": [
  418. "M[0,0,0] = \"Hello\"\n"
  419. ]
  420. },
  421. {
  422. "cell_type": "markdown",
  423. "metadata": {},
  424. "source": [
  425. "如果想显式设定类型的话,可以利用`dtype`关键字参数显式地创建给定数据类型的数组:"
  426. ]
  427. },
  428. {
  429. "cell_type": "code",
  430. "execution_count": 25,
  431. "metadata": {},
  432. "outputs": [
  433. {
  434. "data": {
  435. "text/plain": [
  436. "array([[1.+0.j, 2.+0.j],\n",
  437. " [3.+0.j, 4.+0.j]])"
  438. ]
  439. },
  440. "execution_count": 25,
  441. "metadata": {},
  442. "output_type": "execute_result"
  443. }
  444. ],
  445. "source": [
  446. "M = np.array([[1, 2], [3, 4]], dtype=complex)\n",
  447. "\n",
  448. "M"
  449. ]
  450. },
  451. {
  452. "cell_type": "markdown",
  453. "metadata": {},
  454. "source": [
  455. "常规可以伴随`dtype`使用的数据类型是:`int`, `float`, `complex`, `bool`, `object`等\n",
  456. "\n",
  457. "也可以显式地定义数据类型的大小,例如:`int64`, `int16`, `float128`, `complex128`。"
  458. ]
  459. },
  460. {
  461. "cell_type": "markdown",
  462. "metadata": {},
  463. "source": [
  464. "### 2.2 使用数组生成函数"
  465. ]
  466. },
  467. {
  468. "cell_type": "markdown",
  469. "metadata": {},
  470. "source": [
  471. "对于较大的数组,使用显式的Python列表人为地初始化数据是不切实际的。除此之外可以用`numpy`的很多函数得到不同类型的数组。有一些常用的分别是:"
  472. ]
  473. },
  474. {
  475. "cell_type": "markdown",
  476. "metadata": {},
  477. "source": [
  478. "#### arange"
  479. ]
  480. },
  481. {
  482. "cell_type": "code",
  483. "execution_count": 27,
  484. "metadata": {},
  485. "outputs": [
  486. {
  487. "name": "stdout",
  488. "output_type": "stream",
  489. "text": [
  490. "[0 1 2 3 4 5 6 7 8 9]\n",
  491. "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
  492. ]
  493. }
  494. ],
  495. "source": [
  496. "# 创建一个范围\n",
  497. "\n",
  498. "x = np.arange(0, 10, 1) # 参数:start, stop, step: \n",
  499. "y = range(0, 10, 1)\n",
  500. "print(x)\n",
  501. "print(list(y))"
  502. ]
  503. },
  504. {
  505. "cell_type": "code",
  506. "execution_count": 29,
  507. "metadata": {},
  508. "outputs": [
  509. {
  510. "data": {
  511. "text/plain": [
  512. "array([-1.50000000e+00, -1.40000000e+00, -1.30000000e+00, -1.20000000e+00,\n",
  513. " -1.10000000e+00, -1.00000000e+00, -9.00000000e-01, -8.00000000e-01,\n",
  514. " -7.00000000e-01, -6.00000000e-01, -5.00000000e-01, -4.00000000e-01,\n",
  515. " -3.00000000e-01, -2.00000000e-01, -1.00000000e-01, 1.33226763e-15,\n",
  516. " 1.00000000e-01, 2.00000000e-01, 3.00000000e-01, 4.00000000e-01,\n",
  517. " 5.00000000e-01, 6.00000000e-01, 7.00000000e-01, 8.00000000e-01,\n",
  518. " 9.00000000e-01, 1.00000000e+00, 1.10000000e+00, 1.20000000e+00,\n",
  519. " 1.30000000e+00, 1.40000000e+00])"
  520. ]
  521. },
  522. "execution_count": 29,
  523. "metadata": {},
  524. "output_type": "execute_result"
  525. }
  526. ],
  527. "source": [
  528. "x = np.arange(-1.5, 1.5, 0.1)\n",
  529. "\n",
  530. "x"
  531. ]
  532. },
  533. {
  534. "cell_type": "markdown",
  535. "metadata": {},
  536. "source": [
  537. "#### linspace and logspace"
  538. ]
  539. },
  540. {
  541. "cell_type": "code",
  542. "execution_count": 30,
  543. "metadata": {},
  544. "outputs": [
  545. {
  546. "data": {
  547. "text/plain": [
  548. "array([ 0. , 2.5, 5. , 7.5, 10. ])"
  549. ]
  550. },
  551. "execution_count": 30,
  552. "metadata": {},
  553. "output_type": "execute_result"
  554. }
  555. ],
  556. "source": [
  557. "# 使用linspace两边的端点也被包含进去\n",
  558. "np.linspace(0, 10, 5)"
  559. ]
  560. },
  561. {
  562. "cell_type": "code",
  563. "execution_count": 19,
  564. "metadata": {},
  565. "outputs": [
  566. {
  567. "data": {
  568. "text/plain": [
  569. "array([1.00000000e+00, 3.03773178e+00, 9.22781435e+00, 2.80316249e+01,\n",
  570. " 8.51525577e+01, 2.58670631e+02, 7.85771994e+02, 2.38696456e+03,\n",
  571. " 7.25095809e+03, 2.20264658e+04])"
  572. ]
  573. },
  574. "execution_count": 19,
  575. "metadata": {},
  576. "output_type": "execute_result"
  577. }
  578. ],
  579. "source": [
  580. "np.logspace(0, 10, 10, base=np.e)"
  581. ]
  582. },
  583. {
  584. "cell_type": "markdown",
  585. "metadata": {},
  586. "source": [
  587. "#### mgrid"
  588. ]
  589. },
  590. {
  591. "cell_type": "code",
  592. "execution_count": 31,
  593. "metadata": {
  594. "collapsed": true
  595. },
  596. "outputs": [],
  597. "source": [
  598. "y, x = np.mgrid[0:5, 0:5] # 和MATLAB中的meshgrid类似"
  599. ]
  600. },
  601. {
  602. "cell_type": "code",
  603. "execution_count": 32,
  604. "metadata": {},
  605. "outputs": [
  606. {
  607. "data": {
  608. "text/plain": [
  609. "array([[0, 1, 2, 3, 4],\n",
  610. " [0, 1, 2, 3, 4],\n",
  611. " [0, 1, 2, 3, 4],\n",
  612. " [0, 1, 2, 3, 4],\n",
  613. " [0, 1, 2, 3, 4]])"
  614. ]
  615. },
  616. "execution_count": 32,
  617. "metadata": {},
  618. "output_type": "execute_result"
  619. }
  620. ],
  621. "source": [
  622. "x"
  623. ]
  624. },
  625. {
  626. "cell_type": "code",
  627. "execution_count": 33,
  628. "metadata": {},
  629. "outputs": [
  630. {
  631. "data": {
  632. "text/plain": [
  633. "array([[0, 0, 0, 0, 0],\n",
  634. " [1, 1, 1, 1, 1],\n",
  635. " [2, 2, 2, 2, 2],\n",
  636. " [3, 3, 3, 3, 3],\n",
  637. " [4, 4, 4, 4, 4]])"
  638. ]
  639. },
  640. "execution_count": 33,
  641. "metadata": {},
  642. "output_type": "execute_result"
  643. }
  644. ],
  645. "source": [
  646. "y"
  647. ]
  648. },
  649. {
  650. "cell_type": "markdown",
  651. "metadata": {},
  652. "source": [
  653. "#### random 数据"
  654. ]
  655. },
  656. {
  657. "cell_type": "code",
  658. "execution_count": 34,
  659. "metadata": {
  660. "collapsed": true
  661. },
  662. "outputs": [],
  663. "source": [
  664. "from numpy import random"
  665. ]
  666. },
  667. {
  668. "cell_type": "code",
  669. "execution_count": 35,
  670. "metadata": {},
  671. "outputs": [
  672. {
  673. "data": {
  674. "text/plain": [
  675. "array([[[0.70579787, 0.45339106],\n",
  676. " [0.70077228, 0.42219419],\n",
  677. " [0.23131123, 0.03411284],\n",
  678. " [0.2532498 , 0.07772567]],\n",
  679. "\n",
  680. " [[0.75365153, 0.69937927],\n",
  681. " [0.21553641, 0.56617441],\n",
  682. " [0.61761472, 0.11883064],\n",
  683. " [0.7861052 , 0.25673121]],\n",
  684. "\n",
  685. " [[0.71446123, 0.85646903],\n",
  686. " [0.28415481, 0.62853095],\n",
  687. " [0.33432352, 0.16008364],\n",
  688. " [0.44492951, 0.37964323]],\n",
  689. "\n",
  690. " [[0.29149357, 0.6174702 ],\n",
  691. " [0.74610846, 0.29358931],\n",
  692. " [0.54484636, 0.6733187 ],\n",
  693. " [0.26218121, 0.49989907]],\n",
  694. "\n",
  695. " [[0.19261666, 0.73021809],\n",
  696. " [0.96694702, 0.91832708],\n",
  697. " [0.25561228, 0.26086337],\n",
  698. " [0.63901316, 0.18787211]]])"
  699. ]
  700. },
  701. "execution_count": 35,
  702. "metadata": {},
  703. "output_type": "execute_result"
  704. }
  705. ],
  706. "source": [
  707. "# 均匀随机数在[0,1)区间\n",
  708. "random.rand(5,4,2)"
  709. ]
  710. },
  711. {
  712. "cell_type": "code",
  713. "execution_count": 25,
  714. "metadata": {},
  715. "outputs": [
  716. {
  717. "data": {
  718. "text/plain": [
  719. "array([[-1.74300737, 1.94689131, 0.18922227, -0.20440928],\n",
  720. " [ 1.31664152, -0.01176745, -0.43956951, 0.53571291],\n",
  721. " [ 0.02140654, -0.09635041, -1.84205831, 0.64951045],\n",
  722. " [ 0.35682903, 0.96657395, -0.50099255, -0.80044681]])"
  723. ]
  724. },
  725. "execution_count": 25,
  726. "metadata": {},
  727. "output_type": "execute_result"
  728. }
  729. ],
  730. "source": [
  731. "# 标准正态分布随机数\n",
  732. "random.randn(4,4)"
  733. ]
  734. },
  735. {
  736. "cell_type": "markdown",
  737. "metadata": {},
  738. "source": [
  739. "#### diag"
  740. ]
  741. },
  742. {
  743. "cell_type": "code",
  744. "execution_count": 36,
  745. "metadata": {},
  746. "outputs": [
  747. {
  748. "data": {
  749. "text/plain": [
  750. "array([[1, 0, 0],\n",
  751. " [0, 2, 0],\n",
  752. " [0, 0, 3]])"
  753. ]
  754. },
  755. "execution_count": 36,
  756. "metadata": {},
  757. "output_type": "execute_result"
  758. }
  759. ],
  760. "source": [
  761. "# 一个对角矩阵\n",
  762. "np.diag([1,2,3])"
  763. ]
  764. },
  765. {
  766. "cell_type": "code",
  767. "execution_count": 38,
  768. "metadata": {},
  769. "outputs": [
  770. {
  771. "data": {
  772. "text/plain": [
  773. "array([[0, 1, 0, 0],\n",
  774. " [0, 0, 2, 0],\n",
  775. " [0, 0, 0, 3],\n",
  776. " [0, 0, 0, 0]])"
  777. ]
  778. },
  779. "execution_count": 38,
  780. "metadata": {},
  781. "output_type": "execute_result"
  782. }
  783. ],
  784. "source": [
  785. "# 从主对角线偏移的对角线\n",
  786. "np.diag([1,2,3], k=1) "
  787. ]
  788. },
  789. {
  790. "cell_type": "markdown",
  791. "metadata": {},
  792. "source": [
  793. "#### zeros and ones"
  794. ]
  795. },
  796. {
  797. "cell_type": "code",
  798. "execution_count": 39,
  799. "metadata": {},
  800. "outputs": [
  801. {
  802. "data": {
  803. "text/plain": [
  804. "array([[0., 0., 0.],\n",
  805. " [0., 0., 0.],\n",
  806. " [0., 0., 0.]])"
  807. ]
  808. },
  809. "execution_count": 39,
  810. "metadata": {},
  811. "output_type": "execute_result"
  812. }
  813. ],
  814. "source": [
  815. "np.zeros((3,3))"
  816. ]
  817. },
  818. {
  819. "cell_type": "code",
  820. "execution_count": 42,
  821. "metadata": {},
  822. "outputs": [
  823. {
  824. "data": {
  825. "text/plain": [
  826. "array([[1., 1., 1.],\n",
  827. " [1., 1., 1.],\n",
  828. " [1., 1., 1.]])"
  829. ]
  830. },
  831. "execution_count": 42,
  832. "metadata": {},
  833. "output_type": "execute_result"
  834. }
  835. ],
  836. "source": [
  837. "np.ones((3,3))"
  838. ]
  839. },
  840. {
  841. "cell_type": "markdown",
  842. "metadata": {},
  843. "source": [
  844. "## 3. 文件 I/O"
  845. ]
  846. },
  847. {
  848. "cell_type": "markdown",
  849. "metadata": {},
  850. "source": [
  851. "### 3.1 逗号分隔值 (CSV)"
  852. ]
  853. },
  854. {
  855. "cell_type": "markdown",
  856. "metadata": {},
  857. "source": [
  858. "对于数据文件来说一种非常常见的文件格式是逗号分割值(CSV),或者有关的格式例如TSV(制表符分隔的值)。为了从这些文件中读取数据到Numpy数组中,我们可以用`numpy.genfromtxt`函数。例如:"
  859. ]
  860. },
  861. {
  862. "cell_type": "code",
  863. "execution_count": 43,
  864. "metadata": {},
  865. "outputs": [
  866. {
  867. "name": "stdout",
  868. "output_type": "stream",
  869. "text": [
  870. "1800 1 1 -6.1 -6.1 -6.1 1\r\n",
  871. "1800 1 2 -15.4 -15.4 -15.4 1\r\n",
  872. "1800 1 3 -15.0 -15.0 -15.0 1\r\n",
  873. "1800 1 4 -19.3 -19.3 -19.3 1\r\n",
  874. "1800 1 5 -16.8 -16.8 -16.8 1\r\n",
  875. "1800 1 6 -11.4 -11.4 -11.4 1\r\n",
  876. "1800 1 7 -7.6 -7.6 -7.6 1\r\n",
  877. "1800 1 8 -7.1 -7.1 -7.1 1\r\n",
  878. "1800 1 9 -10.1 -10.1 -10.1 1\r\n",
  879. "1800 1 10 -9.5 -9.5 -9.5 1\r\n"
  880. ]
  881. }
  882. ],
  883. "source": [
  884. "!head stockholm_td_adj.dat"
  885. ]
  886. },
  887. {
  888. "cell_type": "code",
  889. "execution_count": 44,
  890. "metadata": {
  891. "collapsed": true
  892. },
  893. "outputs": [],
  894. "source": [
  895. "import numpy as np\n",
  896. "\n",
  897. "data = np.genfromtxt('stockholm_td_adj.dat')"
  898. ]
  899. },
  900. {
  901. "cell_type": "code",
  902. "execution_count": 45,
  903. "metadata": {},
  904. "outputs": [
  905. {
  906. "data": {
  907. "text/plain": [
  908. "(77431, 7)"
  909. ]
  910. },
  911. "execution_count": 45,
  912. "metadata": {},
  913. "output_type": "execute_result"
  914. }
  915. ],
  916. "source": [
  917. "data.shape"
  918. ]
  919. },
  920. {
  921. "cell_type": "code",
  922. "execution_count": 46,
  923. "metadata": {},
  924. "outputs": [
  925. {
  926. "data": {
  927. "image/png": "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\nAAAASUVORK5CYII=\n",
  928. "text/plain": [
  929. "<matplotlib.figure.Figure at 0x7ff5667f1f28>"
  930. ]
  931. },
  932. "metadata": {},
  933. "output_type": "display_data"
  934. }
  935. ],
  936. "source": [
  937. "%matplotlib inline\n",
  938. "import matplotlib.pyplot as plt\n",
  939. "import matplotlib as mpl\n",
  940. "\n",
  941. "mpl.rcParams['font.family'] = 'SimHei'\n",
  942. "plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)\n",
  943. "\n",
  944. "fig, ax = plt.subplots(figsize=(14,4))\n",
  945. "ax.plot(data[:,0]+data[:,1]/12.0+data[:,2]/365, data[:,5])\n",
  946. "ax.axis('tight')\n",
  947. "ax.set_title('斯德哥尔摩的温度')\n",
  948. "ax.set_xlabel('年份')\n",
  949. "ax.set_ylabel('温度(摄氏度)');\n",
  950. "fig.savefig('fig-res-tempture-stockholm.pdf')"
  951. ]
  952. },
  953. {
  954. "cell_type": "markdown",
  955. "metadata": {},
  956. "source": [
  957. "使用`numpy.savetxt`我们可以将一个Numpy数组以CSV格式存入:"
  958. ]
  959. },
  960. {
  961. "cell_type": "code",
  962. "execution_count": 47,
  963. "metadata": {},
  964. "outputs": [
  965. {
  966. "data": {
  967. "text/plain": [
  968. "array([[0.82845074, 0.51029894, 0.08941169],\n",
  969. " [0.61403488, 0.90697888, 0.54387303],\n",
  970. " [0.87268988, 0.78110361, 0.53332052]])"
  971. ]
  972. },
  973. "execution_count": 47,
  974. "metadata": {},
  975. "output_type": "execute_result"
  976. }
  977. ],
  978. "source": [
  979. "M = np.random.rand(3,3)\n",
  980. "\n",
  981. "M"
  982. ]
  983. },
  984. {
  985. "cell_type": "code",
  986. "execution_count": 35,
  987. "metadata": {
  988. "collapsed": true
  989. },
  990. "outputs": [],
  991. "source": [
  992. "np.savetxt(\"random-matrix.csv\", M)"
  993. ]
  994. },
  995. {
  996. "cell_type": "code",
  997. "execution_count": 36,
  998. "metadata": {},
  999. "outputs": [
  1000. {
  1001. "name": "stdout",
  1002. "output_type": "stream",
  1003. "text": [
  1004. "3.474310879390657414e-01 3.466609365910759966e-01 6.779623624489031775e-01\r\n",
  1005. "3.777553531256817587e-01 7.452935047749419395e-01 4.463927097637667707e-01\r\n",
  1006. "7.097023968559375007e-01 5.472163711854115542e-01 9.640087120207403437e-01\r\n"
  1007. ]
  1008. }
  1009. ],
  1010. "source": [
  1011. "!cat random-matrix.csv"
  1012. ]
  1013. },
  1014. {
  1015. "cell_type": "code",
  1016. "execution_count": 37,
  1017. "metadata": {},
  1018. "outputs": [
  1019. {
  1020. "name": "stdout",
  1021. "output_type": "stream",
  1022. "text": [
  1023. "0.34743 0.34666 0.67796\r\n",
  1024. "0.37776 0.74529 0.44639\r\n",
  1025. "0.70970 0.54722 0.96401\r\n"
  1026. ]
  1027. }
  1028. ],
  1029. "source": [
  1030. "np.savetxt(\"random-matrix.csv\", M, fmt='%.5f') # fmt 确定格式\n",
  1031. "\n",
  1032. "!cat random-matrix.csv"
  1033. ]
  1034. },
  1035. {
  1036. "cell_type": "markdown",
  1037. "metadata": {},
  1038. "source": [
  1039. "### 3.2 numpy 的本地文件格式"
  1040. ]
  1041. },
  1042. {
  1043. "cell_type": "markdown",
  1044. "metadata": {},
  1045. "source": [
  1046. "当存储和读取numpy数组时非常有用。利用函数`numpy.save`和`numpy.load`:"
  1047. ]
  1048. },
  1049. {
  1050. "cell_type": "code",
  1051. "execution_count": 48,
  1052. "metadata": {},
  1053. "outputs": [
  1054. {
  1055. "name": "stdout",
  1056. "output_type": "stream",
  1057. "text": [
  1058. "random-matrix.npy: NumPy array, version 1.0, header length 118\r\n"
  1059. ]
  1060. }
  1061. ],
  1062. "source": [
  1063. "np.save(\"random-matrix.npy\", M)\n",
  1064. "\n",
  1065. "!file random-matrix.npy"
  1066. ]
  1067. },
  1068. {
  1069. "cell_type": "code",
  1070. "execution_count": 49,
  1071. "metadata": {},
  1072. "outputs": [
  1073. {
  1074. "data": {
  1075. "text/plain": [
  1076. "array([[0.82845074, 0.51029894, 0.08941169],\n",
  1077. " [0.61403488, 0.90697888, 0.54387303],\n",
  1078. " [0.87268988, 0.78110361, 0.53332052]])"
  1079. ]
  1080. },
  1081. "execution_count": 49,
  1082. "metadata": {},
  1083. "output_type": "execute_result"
  1084. }
  1085. ],
  1086. "source": [
  1087. "np.load(\"random-matrix.npy\")"
  1088. ]
  1089. },
  1090. {
  1091. "cell_type": "markdown",
  1092. "metadata": {},
  1093. "source": [
  1094. "## 4. 更多Numpy数组的性质"
  1095. ]
  1096. },
  1097. {
  1098. "cell_type": "code",
  1099. "execution_count": 50,
  1100. "metadata": {},
  1101. "outputs": [
  1102. {
  1103. "name": "stdout",
  1104. "output_type": "stream",
  1105. "text": [
  1106. "int64\n",
  1107. "8\n"
  1108. ]
  1109. }
  1110. ],
  1111. "source": [
  1112. "M = np.array([[1, 2], [3, 4], [5, 6]])\n",
  1113. "\n",
  1114. "print(M.dtype)\n",
  1115. "print(M.itemsize) # 每个元素的字节数\n"
  1116. ]
  1117. },
  1118. {
  1119. "cell_type": "code",
  1120. "execution_count": 51,
  1121. "metadata": {},
  1122. "outputs": [
  1123. {
  1124. "data": {
  1125. "text/plain": [
  1126. "48"
  1127. ]
  1128. },
  1129. "execution_count": 51,
  1130. "metadata": {},
  1131. "output_type": "execute_result"
  1132. }
  1133. ],
  1134. "source": [
  1135. "M.nbytes # 字节数"
  1136. ]
  1137. },
  1138. {
  1139. "cell_type": "code",
  1140. "execution_count": 52,
  1141. "metadata": {},
  1142. "outputs": [
  1143. {
  1144. "data": {
  1145. "text/plain": [
  1146. "2"
  1147. ]
  1148. },
  1149. "execution_count": 52,
  1150. "metadata": {},
  1151. "output_type": "execute_result"
  1152. }
  1153. ],
  1154. "source": [
  1155. "M.ndim # 维度"
  1156. ]
  1157. },
  1158. {
  1159. "cell_type": "markdown",
  1160. "metadata": {},
  1161. "source": [
  1162. "## 5. 操作数组"
  1163. ]
  1164. },
  1165. {
  1166. "cell_type": "markdown",
  1167. "metadata": {},
  1168. "source": [
  1169. "### 5.1 索引"
  1170. ]
  1171. },
  1172. {
  1173. "cell_type": "markdown",
  1174. "metadata": {},
  1175. "source": [
  1176. "我们可以用方括号和下标索引元素:"
  1177. ]
  1178. },
  1179. {
  1180. "cell_type": "code",
  1181. "execution_count": 53,
  1182. "metadata": {},
  1183. "outputs": [
  1184. {
  1185. "data": {
  1186. "text/plain": [
  1187. "1"
  1188. ]
  1189. },
  1190. "execution_count": 53,
  1191. "metadata": {},
  1192. "output_type": "execute_result"
  1193. }
  1194. ],
  1195. "source": [
  1196. "v = np.array([1, 2, 3, 4, 5])\n",
  1197. "\n",
  1198. "# v 是一个向量,仅仅只有一维,取一个索引\n",
  1199. "v[0]"
  1200. ]
  1201. },
  1202. {
  1203. "cell_type": "code",
  1204. "execution_count": 54,
  1205. "metadata": {},
  1206. "outputs": [
  1207. {
  1208. "name": "stdout",
  1209. "output_type": "stream",
  1210. "text": [
  1211. "4\n",
  1212. "4\n",
  1213. "[3 4]\n"
  1214. ]
  1215. }
  1216. ],
  1217. "source": [
  1218. "# M 是一个矩阵或者是一个二维的数组,取两个索引 \n",
  1219. "print(M[1,1])\n",
  1220. "print(M[1][1])\n",
  1221. "print(M[1])"
  1222. ]
  1223. },
  1224. {
  1225. "cell_type": "markdown",
  1226. "metadata": {},
  1227. "source": [
  1228. "如果我们省略了一个多维数组的索引,它将会返回整行(或者,总的来说,一个 N-1 维的数组)"
  1229. ]
  1230. },
  1231. {
  1232. "cell_type": "code",
  1233. "execution_count": 45,
  1234. "metadata": {},
  1235. "outputs": [
  1236. {
  1237. "data": {
  1238. "text/plain": [
  1239. "array([[1, 2],\n",
  1240. " [3, 4],\n",
  1241. " [5, 6]])"
  1242. ]
  1243. },
  1244. "execution_count": 45,
  1245. "metadata": {},
  1246. "output_type": "execute_result"
  1247. }
  1248. ],
  1249. "source": [
  1250. "M"
  1251. ]
  1252. },
  1253. {
  1254. "cell_type": "code",
  1255. "execution_count": 55,
  1256. "metadata": {},
  1257. "outputs": [
  1258. {
  1259. "data": {
  1260. "text/plain": [
  1261. "array([3, 4])"
  1262. ]
  1263. },
  1264. "execution_count": 55,
  1265. "metadata": {},
  1266. "output_type": "execute_result"
  1267. }
  1268. ],
  1269. "source": [
  1270. "M[1]"
  1271. ]
  1272. },
  1273. {
  1274. "cell_type": "markdown",
  1275. "metadata": {},
  1276. "source": [
  1277. "相同的事情可以利用 `:` 而不是索引来实现:"
  1278. ]
  1279. },
  1280. {
  1281. "cell_type": "code",
  1282. "execution_count": 56,
  1283. "metadata": {},
  1284. "outputs": [
  1285. {
  1286. "data": {
  1287. "text/plain": [
  1288. "array([3, 4])"
  1289. ]
  1290. },
  1291. "execution_count": 56,
  1292. "metadata": {},
  1293. "output_type": "execute_result"
  1294. }
  1295. ],
  1296. "source": [
  1297. "M[1,:] # 行 1"
  1298. ]
  1299. },
  1300. {
  1301. "cell_type": "code",
  1302. "execution_count": 57,
  1303. "metadata": {},
  1304. "outputs": [
  1305. {
  1306. "data": {
  1307. "text/plain": [
  1308. "array([2, 4, 6])"
  1309. ]
  1310. },
  1311. "execution_count": 57,
  1312. "metadata": {},
  1313. "output_type": "execute_result"
  1314. }
  1315. ],
  1316. "source": [
  1317. "M[:,1] # 列 1"
  1318. ]
  1319. },
  1320. {
  1321. "cell_type": "markdown",
  1322. "metadata": {},
  1323. "source": [
  1324. "我们可以用索引赋新的值给数组中的元素:"
  1325. ]
  1326. },
  1327. {
  1328. "cell_type": "code",
  1329. "execution_count": 58,
  1330. "metadata": {
  1331. "collapsed": true
  1332. },
  1333. "outputs": [],
  1334. "source": [
  1335. "M[0,0] = 1"
  1336. ]
  1337. },
  1338. {
  1339. "cell_type": "code",
  1340. "execution_count": 59,
  1341. "metadata": {},
  1342. "outputs": [
  1343. {
  1344. "data": {
  1345. "text/plain": [
  1346. "array([[1, 2],\n",
  1347. " [3, 4],\n",
  1348. " [5, 6]])"
  1349. ]
  1350. },
  1351. "execution_count": 59,
  1352. "metadata": {},
  1353. "output_type": "execute_result"
  1354. }
  1355. ],
  1356. "source": [
  1357. "M"
  1358. ]
  1359. },
  1360. {
  1361. "cell_type": "code",
  1362. "execution_count": 60,
  1363. "metadata": {
  1364. "collapsed": true
  1365. },
  1366. "outputs": [],
  1367. "source": [
  1368. "# 对行和列也同样有用\n",
  1369. "M[1,:] = 0\n",
  1370. "M[:,1] = -1"
  1371. ]
  1372. },
  1373. {
  1374. "cell_type": "code",
  1375. "execution_count": 52,
  1376. "metadata": {},
  1377. "outputs": [
  1378. {
  1379. "data": {
  1380. "text/plain": [
  1381. "array([[ 1, -1],\n",
  1382. " [ 0, -1],\n",
  1383. " [ 5, -1]])"
  1384. ]
  1385. },
  1386. "execution_count": 52,
  1387. "metadata": {},
  1388. "output_type": "execute_result"
  1389. }
  1390. ],
  1391. "source": [
  1392. "M"
  1393. ]
  1394. },
  1395. {
  1396. "cell_type": "markdown",
  1397. "metadata": {},
  1398. "source": [
  1399. "### 5.2 切片索引"
  1400. ]
  1401. },
  1402. {
  1403. "cell_type": "markdown",
  1404. "metadata": {},
  1405. "source": [
  1406. "切片索引是语法 `M[lower:upper:step]` 的技术名称,用于提取数组的一部分:"
  1407. ]
  1408. },
  1409. {
  1410. "cell_type": "code",
  1411. "execution_count": 61,
  1412. "metadata": {},
  1413. "outputs": [
  1414. {
  1415. "data": {
  1416. "text/plain": [
  1417. "array([1, 2, 3, 4, 5])"
  1418. ]
  1419. },
  1420. "execution_count": 61,
  1421. "metadata": {},
  1422. "output_type": "execute_result"
  1423. }
  1424. ],
  1425. "source": [
  1426. "A = np.array([1,2,3,4,5])\n",
  1427. "A"
  1428. ]
  1429. },
  1430. {
  1431. "cell_type": "code",
  1432. "execution_count": 62,
  1433. "metadata": {},
  1434. "outputs": [
  1435. {
  1436. "data": {
  1437. "text/plain": [
  1438. "array([2, 3])"
  1439. ]
  1440. },
  1441. "execution_count": 62,
  1442. "metadata": {},
  1443. "output_type": "execute_result"
  1444. }
  1445. ],
  1446. "source": [
  1447. "A[1:3]"
  1448. ]
  1449. },
  1450. {
  1451. "cell_type": "markdown",
  1452. "metadata": {},
  1453. "source": [
  1454. "切片索引到的数据是 *可变的* : 如果它们被分配了一个新值,那么从其中提取切片的原始数组将被修改:"
  1455. ]
  1456. },
  1457. {
  1458. "cell_type": "code",
  1459. "execution_count": 63,
  1460. "metadata": {},
  1461. "outputs": [
  1462. {
  1463. "data": {
  1464. "text/plain": [
  1465. "array([ 1, -2, -3, 4, 5])"
  1466. ]
  1467. },
  1468. "execution_count": 63,
  1469. "metadata": {},
  1470. "output_type": "execute_result"
  1471. }
  1472. ],
  1473. "source": [
  1474. "A[1:3] = [-2,-3] # auto convert type\n",
  1475. "A[1:3] = np.array([-2, -3]) \n",
  1476. "\n",
  1477. "A"
  1478. ]
  1479. },
  1480. {
  1481. "cell_type": "markdown",
  1482. "metadata": {},
  1483. "source": [
  1484. "可以省略 `M[lower:upper:step]` 中任意的三个值"
  1485. ]
  1486. },
  1487. {
  1488. "cell_type": "code",
  1489. "execution_count": 56,
  1490. "metadata": {},
  1491. "outputs": [
  1492. {
  1493. "data": {
  1494. "text/plain": [
  1495. "array([ 1, -2, -3, 4, 5])"
  1496. ]
  1497. },
  1498. "execution_count": 56,
  1499. "metadata": {},
  1500. "output_type": "execute_result"
  1501. }
  1502. ],
  1503. "source": [
  1504. "A[::] # lower, upper, step 都取默认值"
  1505. ]
  1506. },
  1507. {
  1508. "cell_type": "code",
  1509. "execution_count": 57,
  1510. "metadata": {},
  1511. "outputs": [
  1512. {
  1513. "data": {
  1514. "text/plain": [
  1515. "array([ 1, -2, -3, 4, 5])"
  1516. ]
  1517. },
  1518. "execution_count": 57,
  1519. "metadata": {},
  1520. "output_type": "execute_result"
  1521. }
  1522. ],
  1523. "source": [
  1524. "A[:]"
  1525. ]
  1526. },
  1527. {
  1528. "cell_type": "code",
  1529. "execution_count": 58,
  1530. "metadata": {},
  1531. "outputs": [
  1532. {
  1533. "data": {
  1534. "text/plain": [
  1535. "array([ 1, -3, 5])"
  1536. ]
  1537. },
  1538. "execution_count": 58,
  1539. "metadata": {},
  1540. "output_type": "execute_result"
  1541. }
  1542. ],
  1543. "source": [
  1544. "A[::2] # step is 2, lower and upper 代表数组的开始和结束"
  1545. ]
  1546. },
  1547. {
  1548. "cell_type": "code",
  1549. "execution_count": 59,
  1550. "metadata": {},
  1551. "outputs": [
  1552. {
  1553. "data": {
  1554. "text/plain": [
  1555. "array([ 1, -2, -3])"
  1556. ]
  1557. },
  1558. "execution_count": 59,
  1559. "metadata": {},
  1560. "output_type": "execute_result"
  1561. }
  1562. ],
  1563. "source": [
  1564. "A[:3] # 前3个元素"
  1565. ]
  1566. },
  1567. {
  1568. "cell_type": "code",
  1569. "execution_count": 60,
  1570. "metadata": {},
  1571. "outputs": [
  1572. {
  1573. "data": {
  1574. "text/plain": [
  1575. "array([4, 5])"
  1576. ]
  1577. },
  1578. "execution_count": 60,
  1579. "metadata": {},
  1580. "output_type": "execute_result"
  1581. }
  1582. ],
  1583. "source": [
  1584. "A[3:] # 从索引3开始的元素"
  1585. ]
  1586. },
  1587. {
  1588. "cell_type": "markdown",
  1589. "metadata": {},
  1590. "source": [
  1591. "负索引计数从数组的结束(正索引从开始):"
  1592. ]
  1593. },
  1594. {
  1595. "cell_type": "code",
  1596. "execution_count": 61,
  1597. "metadata": {
  1598. "collapsed": true
  1599. },
  1600. "outputs": [],
  1601. "source": [
  1602. "A = np.array([1,2,3,4,5])"
  1603. ]
  1604. },
  1605. {
  1606. "cell_type": "code",
  1607. "execution_count": 62,
  1608. "metadata": {},
  1609. "outputs": [
  1610. {
  1611. "data": {
  1612. "text/plain": [
  1613. "5"
  1614. ]
  1615. },
  1616. "execution_count": 62,
  1617. "metadata": {},
  1618. "output_type": "execute_result"
  1619. }
  1620. ],
  1621. "source": [
  1622. "A[-1] # 数组中最后一个元素"
  1623. ]
  1624. },
  1625. {
  1626. "cell_type": "code",
  1627. "execution_count": 63,
  1628. "metadata": {},
  1629. "outputs": [
  1630. {
  1631. "data": {
  1632. "text/plain": [
  1633. "array([3, 4, 5])"
  1634. ]
  1635. },
  1636. "execution_count": 63,
  1637. "metadata": {},
  1638. "output_type": "execute_result"
  1639. }
  1640. ],
  1641. "source": [
  1642. "A[-3:] # 最后三个元素"
  1643. ]
  1644. },
  1645. {
  1646. "cell_type": "markdown",
  1647. "metadata": {},
  1648. "source": [
  1649. "索引切片的工作方式与多维数组完全相同:"
  1650. ]
  1651. },
  1652. {
  1653. "cell_type": "code",
  1654. "execution_count": 64,
  1655. "metadata": {},
  1656. "outputs": [
  1657. {
  1658. "data": {
  1659. "text/plain": [
  1660. "array([[ 0, 1, 2, 3, 4],\n",
  1661. " [10, 11, 12, 13, 14],\n",
  1662. " [20, 21, 22, 23, 24],\n",
  1663. " [30, 31, 32, 33, 34],\n",
  1664. " [40, 41, 42, 43, 44]])"
  1665. ]
  1666. },
  1667. "execution_count": 64,
  1668. "metadata": {},
  1669. "output_type": "execute_result"
  1670. }
  1671. ],
  1672. "source": [
  1673. "A = np.array([[n+m*10 for n in range(5)] for m in range(5)])\n",
  1674. "\n",
  1675. "A"
  1676. ]
  1677. },
  1678. {
  1679. "cell_type": "code",
  1680. "execution_count": 65,
  1681. "metadata": {},
  1682. "outputs": [
  1683. {
  1684. "data": {
  1685. "text/plain": [
  1686. "array([[11, 12, 13],\n",
  1687. " [21, 22, 23],\n",
  1688. " [31, 32, 33]])"
  1689. ]
  1690. },
  1691. "execution_count": 65,
  1692. "metadata": {},
  1693. "output_type": "execute_result"
  1694. }
  1695. ],
  1696. "source": [
  1697. "# 原始数组中的一个块\n",
  1698. "A[1:4, 1:4]"
  1699. ]
  1700. },
  1701. {
  1702. "cell_type": "code",
  1703. "execution_count": 66,
  1704. "metadata": {},
  1705. "outputs": [
  1706. {
  1707. "data": {
  1708. "text/plain": [
  1709. "array([[ 0, 2, 4],\n",
  1710. " [20, 22, 24],\n",
  1711. " [40, 42, 44]])"
  1712. ]
  1713. },
  1714. "execution_count": 66,
  1715. "metadata": {},
  1716. "output_type": "execute_result"
  1717. }
  1718. ],
  1719. "source": [
  1720. "# 步长\n",
  1721. "A[::2, ::2]"
  1722. ]
  1723. },
  1724. {
  1725. "cell_type": "markdown",
  1726. "metadata": {},
  1727. "source": [
  1728. "### 5.3 花式索引"
  1729. ]
  1730. },
  1731. {
  1732. "cell_type": "markdown",
  1733. "metadata": {},
  1734. "source": [
  1735. "Fancy索引是一个名称时,一个数组或列表被使用在一个索引:"
  1736. ]
  1737. },
  1738. {
  1739. "cell_type": "code",
  1740. "execution_count": 67,
  1741. "metadata": {},
  1742. "outputs": [
  1743. {
  1744. "name": "stdout",
  1745. "output_type": "stream",
  1746. "text": [
  1747. "[[10 11 12 13 14]\n",
  1748. " [30 31 32 33 34]\n",
  1749. " [20 21 22 23 24]]\n",
  1750. "[[ 0 1 2 3 4]\n",
  1751. " [10 11 12 13 14]\n",
  1752. " [20 21 22 23 24]\n",
  1753. " [30 31 32 33 34]\n",
  1754. " [40 41 42 43 44]]\n"
  1755. ]
  1756. }
  1757. ],
  1758. "source": [
  1759. "A = np.array([[n+m*10 for n in range(5)] for m in range(5)])\n",
  1760. "\n",
  1761. "row_indices = [1, 3, 2]\n",
  1762. "print(A[row_indices])\n",
  1763. "print(A)"
  1764. ]
  1765. },
  1766. {
  1767. "cell_type": "code",
  1768. "execution_count": 69,
  1769. "metadata": {},
  1770. "outputs": [
  1771. {
  1772. "data": {
  1773. "text/plain": [
  1774. "array([11, 31, 24])"
  1775. ]
  1776. },
  1777. "execution_count": 69,
  1778. "metadata": {},
  1779. "output_type": "execute_result"
  1780. }
  1781. ],
  1782. "source": [
  1783. "col_indices = [1, 1, -1] # 索引-1 代表最后一个元素\n",
  1784. "A[row_indices, col_indices]"
  1785. ]
  1786. },
  1787. {
  1788. "cell_type": "markdown",
  1789. "metadata": {},
  1790. "source": [
  1791. "我们也可以使用索引掩码:如果索引掩码是一个数据类型`bool`的Numpy数组,那么一个元素被选择(True)或不(False)取决于索引掩码在每个元素位置的值:"
  1792. ]
  1793. },
  1794. {
  1795. "cell_type": "code",
  1796. "execution_count": 71,
  1797. "metadata": {},
  1798. "outputs": [
  1799. {
  1800. "data": {
  1801. "text/plain": [
  1802. "array([0, 1, 2, 3, 4])"
  1803. ]
  1804. },
  1805. "execution_count": 71,
  1806. "metadata": {},
  1807. "output_type": "execute_result"
  1808. }
  1809. ],
  1810. "source": [
  1811. "B = np.array([n for n in range(5)])\n",
  1812. "B"
  1813. ]
  1814. },
  1815. {
  1816. "cell_type": "code",
  1817. "execution_count": 73,
  1818. "metadata": {},
  1819. "outputs": [
  1820. {
  1821. "data": {
  1822. "text/plain": [
  1823. "array([0, 2])"
  1824. ]
  1825. },
  1826. "execution_count": 73,
  1827. "metadata": {},
  1828. "output_type": "execute_result"
  1829. }
  1830. ],
  1831. "source": [
  1832. "row_mask = np.array([True, False, True, False, False])\n",
  1833. "B[row_mask]"
  1834. ]
  1835. },
  1836. {
  1837. "cell_type": "code",
  1838. "execution_count": 74,
  1839. "metadata": {},
  1840. "outputs": [
  1841. {
  1842. "data": {
  1843. "text/plain": [
  1844. "array([0, 2])"
  1845. ]
  1846. },
  1847. "execution_count": 74,
  1848. "metadata": {},
  1849. "output_type": "execute_result"
  1850. }
  1851. ],
  1852. "source": [
  1853. "# 相同的事情\n",
  1854. "row_mask = np.array([1,0,1,0,0], dtype=bool)\n",
  1855. "B[row_mask]"
  1856. ]
  1857. },
  1858. {
  1859. "cell_type": "markdown",
  1860. "metadata": {},
  1861. "source": [
  1862. "这个特性对于有条件地从数组中选择元素非常有用,例如使用比较运算符:"
  1863. ]
  1864. },
  1865. {
  1866. "cell_type": "code",
  1867. "execution_count": 75,
  1868. "metadata": {},
  1869. "outputs": [
  1870. {
  1871. "data": {
  1872. "text/plain": [
  1873. "array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. ,\n",
  1874. " 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5])"
  1875. ]
  1876. },
  1877. "execution_count": 75,
  1878. "metadata": {},
  1879. "output_type": "execute_result"
  1880. }
  1881. ],
  1882. "source": [
  1883. "x = np.arange(0, 10, 0.5)\n",
  1884. "x"
  1885. ]
  1886. },
  1887. {
  1888. "cell_type": "code",
  1889. "execution_count": 76,
  1890. "metadata": {},
  1891. "outputs": [
  1892. {
  1893. "data": {
  1894. "text/plain": [
  1895. "array([False, False, False, False, False, False, False, False, False,\n",
  1896. " False, False, True, True, True, True, False, False, False,\n",
  1897. " False, False])"
  1898. ]
  1899. },
  1900. "execution_count": 76,
  1901. "metadata": {},
  1902. "output_type": "execute_result"
  1903. }
  1904. ],
  1905. "source": [
  1906. "mask = (5 < x) * (x < 7.5)\n",
  1907. "\n",
  1908. "mask"
  1909. ]
  1910. },
  1911. {
  1912. "cell_type": "code",
  1913. "execution_count": 77,
  1914. "metadata": {},
  1915. "outputs": [
  1916. {
  1917. "data": {
  1918. "text/plain": [
  1919. "array([5.5, 6. , 6.5, 7. ])"
  1920. ]
  1921. },
  1922. "execution_count": 77,
  1923. "metadata": {},
  1924. "output_type": "execute_result"
  1925. }
  1926. ],
  1927. "source": [
  1928. "x[mask]"
  1929. ]
  1930. },
  1931. {
  1932. "cell_type": "code",
  1933. "execution_count": 78,
  1934. "metadata": {},
  1935. "outputs": [
  1936. {
  1937. "data": {
  1938. "text/plain": [
  1939. "array([3.5, 4. , 4.5, 5. , 5.5])"
  1940. ]
  1941. },
  1942. "execution_count": 78,
  1943. "metadata": {},
  1944. "output_type": "execute_result"
  1945. }
  1946. ],
  1947. "source": [
  1948. "x[(3<x) * (x<6)]"
  1949. ]
  1950. },
  1951. {
  1952. "cell_type": "markdown",
  1953. "metadata": {},
  1954. "source": [
  1955. "## 6. 用于从数组中提取数据和创建数组的函数"
  1956. ]
  1957. },
  1958. {
  1959. "cell_type": "markdown",
  1960. "metadata": {},
  1961. "source": [
  1962. "### 6.1 where"
  1963. ]
  1964. },
  1965. {
  1966. "cell_type": "markdown",
  1967. "metadata": {},
  1968. "source": [
  1969. "索引掩码可以使用`where`函数转换为位置索引"
  1970. ]
  1971. },
  1972. {
  1973. "cell_type": "code",
  1974. "execution_count": 80,
  1975. "metadata": {},
  1976. "outputs": [
  1977. {
  1978. "data": {
  1979. "text/plain": [
  1980. "(array([11, 12, 13, 14]),)"
  1981. ]
  1982. },
  1983. "execution_count": 80,
  1984. "metadata": {},
  1985. "output_type": "execute_result"
  1986. }
  1987. ],
  1988. "source": [
  1989. "x = np.arange(0, 10, 0.5)\n",
  1990. "mask = (5 < x) * (x < 7.5)\n",
  1991. "\n",
  1992. "indices = np.where(mask)\n",
  1993. "\n",
  1994. "indices"
  1995. ]
  1996. },
  1997. {
  1998. "cell_type": "code",
  1999. "execution_count": 81,
  2000. "metadata": {},
  2001. "outputs": [
  2002. {
  2003. "data": {
  2004. "text/plain": [
  2005. "array([5.5, 6. , 6.5, 7. ])"
  2006. ]
  2007. },
  2008. "execution_count": 81,
  2009. "metadata": {},
  2010. "output_type": "execute_result"
  2011. }
  2012. ],
  2013. "source": [
  2014. "x[indices] # 这个索引等同于花式索引x[mask]"
  2015. ]
  2016. },
  2017. {
  2018. "cell_type": "markdown",
  2019. "metadata": {},
  2020. "source": [
  2021. "### 6.2 diag"
  2022. ]
  2023. },
  2024. {
  2025. "cell_type": "markdown",
  2026. "metadata": {},
  2027. "source": [
  2028. "使用diag函数,我们还可以提取一个数组的对角线和亚对角线:"
  2029. ]
  2030. },
  2031. {
  2032. "cell_type": "code",
  2033. "execution_count": 84,
  2034. "metadata": {},
  2035. "outputs": [
  2036. {
  2037. "name": "stdout",
  2038. "output_type": "stream",
  2039. "text": [
  2040. "[[ 0 1 2 3 4]\n",
  2041. " [10 11 12 13 14]\n",
  2042. " [20 21 22 23 24]\n",
  2043. " [30 31 32 33 34]\n",
  2044. " [40 41 42 43 44]]\n"
  2045. ]
  2046. },
  2047. {
  2048. "data": {
  2049. "text/plain": [
  2050. "array([ 0, 11, 22, 33, 44])"
  2051. ]
  2052. },
  2053. "execution_count": 84,
  2054. "metadata": {},
  2055. "output_type": "execute_result"
  2056. }
  2057. ],
  2058. "source": [
  2059. "print(A)\n",
  2060. "np.diag(A)"
  2061. ]
  2062. },
  2063. {
  2064. "cell_type": "code",
  2065. "execution_count": 83,
  2066. "metadata": {},
  2067. "outputs": [
  2068. {
  2069. "data": {
  2070. "text/plain": [
  2071. "array([10, 21, 32, 43])"
  2072. ]
  2073. },
  2074. "execution_count": 83,
  2075. "metadata": {},
  2076. "output_type": "execute_result"
  2077. }
  2078. ],
  2079. "source": [
  2080. "np.diag(A, -1)"
  2081. ]
  2082. },
  2083. {
  2084. "cell_type": "markdown",
  2085. "metadata": {},
  2086. "source": [
  2087. "## 7. 线性代数"
  2088. ]
  2089. },
  2090. {
  2091. "cell_type": "markdown",
  2092. "metadata": {},
  2093. "source": [
  2094. "向量化代码是使用Python/Numpy编写高效数值计算的关键。这意味着尽可能多的程序应该用矩阵和向量运算来表示,比如矩阵-矩阵乘法。"
  2095. ]
  2096. },
  2097. {
  2098. "cell_type": "markdown",
  2099. "metadata": {},
  2100. "source": [
  2101. "### 7.1 Scalar-array 操作"
  2102. ]
  2103. },
  2104. {
  2105. "cell_type": "markdown",
  2106. "metadata": {},
  2107. "source": [
  2108. "我们可以使用常用的算术运算符来对标量数组进行乘、加、减和除运算。"
  2109. ]
  2110. },
  2111. {
  2112. "cell_type": "code",
  2113. "execution_count": 85,
  2114. "metadata": {
  2115. "collapsed": true
  2116. },
  2117. "outputs": [],
  2118. "source": [
  2119. "import numpy as np\n",
  2120. "\n",
  2121. "v1 = np.arange(0, 5)"
  2122. ]
  2123. },
  2124. {
  2125. "cell_type": "code",
  2126. "execution_count": 86,
  2127. "metadata": {},
  2128. "outputs": [
  2129. {
  2130. "data": {
  2131. "text/plain": [
  2132. "array([0, 2, 4, 6, 8])"
  2133. ]
  2134. },
  2135. "execution_count": 86,
  2136. "metadata": {},
  2137. "output_type": "execute_result"
  2138. }
  2139. ],
  2140. "source": [
  2141. "v1 * 2"
  2142. ]
  2143. },
  2144. {
  2145. "cell_type": "code",
  2146. "execution_count": 87,
  2147. "metadata": {},
  2148. "outputs": [
  2149. {
  2150. "data": {
  2151. "text/plain": [
  2152. "array([2, 3, 4, 5, 6])"
  2153. ]
  2154. },
  2155. "execution_count": 87,
  2156. "metadata": {},
  2157. "output_type": "execute_result"
  2158. }
  2159. ],
  2160. "source": [
  2161. "v1 + 2"
  2162. ]
  2163. },
  2164. {
  2165. "cell_type": "code",
  2166. "execution_count": 88,
  2167. "metadata": {},
  2168. "outputs": [
  2169. {
  2170. "name": "stdout",
  2171. "output_type": "stream",
  2172. "text": [
  2173. "[[ 0 2 4 6 8]\n",
  2174. " [20 22 24 26 28]\n",
  2175. " [40 42 44 46 48]\n",
  2176. " [60 62 64 66 68]\n",
  2177. " [80 82 84 86 88]]\n",
  2178. "[[ 2 3 4 5 6]\n",
  2179. " [12 13 14 15 16]\n",
  2180. " [22 23 24 25 26]\n",
  2181. " [32 33 34 35 36]\n",
  2182. " [42 43 44 45 46]]\n"
  2183. ]
  2184. }
  2185. ],
  2186. "source": [
  2187. "A = np.array([[n+m*10 for n in range(5)] for m in range(5)])\n",
  2188. "\n",
  2189. "print(A * 2)\n",
  2190. "\n",
  2191. "print(A + 2)"
  2192. ]
  2193. },
  2194. {
  2195. "cell_type": "markdown",
  2196. "metadata": {},
  2197. "source": [
  2198. "### 7.2 数组间的元素操作"
  2199. ]
  2200. },
  2201. {
  2202. "cell_type": "markdown",
  2203. "metadata": {},
  2204. "source": [
  2205. "当我们对数组进行加法、减法、乘法和除法时,默认的行为是**element-wise**操作:"
  2206. ]
  2207. },
  2208. {
  2209. "cell_type": "code",
  2210. "execution_count": 89,
  2211. "metadata": {},
  2212. "outputs": [
  2213. {
  2214. "data": {
  2215. "text/plain": [
  2216. "array([[0.04644473, 0.04194416, 0.47883722],\n",
  2217. " [0.54588546, 0.01731503, 0.6762046 ]])"
  2218. ]
  2219. },
  2220. "execution_count": 89,
  2221. "metadata": {},
  2222. "output_type": "execute_result"
  2223. }
  2224. ],
  2225. "source": [
  2226. "A = np.random.rand(2, 3)\n",
  2227. "\n",
  2228. "A * A # element-wise 乘法"
  2229. ]
  2230. },
  2231. {
  2232. "cell_type": "code",
  2233. "execution_count": 90,
  2234. "metadata": {},
  2235. "outputs": [
  2236. {
  2237. "data": {
  2238. "text/plain": [
  2239. "array([1., 4.])"
  2240. ]
  2241. },
  2242. "execution_count": 90,
  2243. "metadata": {},
  2244. "output_type": "execute_result"
  2245. }
  2246. ],
  2247. "source": [
  2248. "v1 = np.array([1.0, 2.0])\n",
  2249. "v1 * v1"
  2250. ]
  2251. },
  2252. {
  2253. "cell_type": "markdown",
  2254. "metadata": {},
  2255. "source": [
  2256. "如果我们用兼容的形状进行数组的乘法,我们会得到每一行的对位相乘结果:"
  2257. ]
  2258. },
  2259. {
  2260. "cell_type": "code",
  2261. "execution_count": 95,
  2262. "metadata": {},
  2263. "outputs": [
  2264. {
  2265. "name": "stdout",
  2266. "output_type": "stream",
  2267. "text": [
  2268. "[[0.2155104 0.20480274 0.69198065]\n",
  2269. " [0.73884062 0.1315866 0.82231661]]\n",
  2270. "[1. 2.]\n"
  2271. ]
  2272. }
  2273. ],
  2274. "source": [
  2275. "A.shape, v1.shape\n",
  2276. "print(A)\n",
  2277. "print(v1)"
  2278. ]
  2279. },
  2280. {
  2281. "cell_type": "code",
  2282. "execution_count": 99,
  2283. "metadata": {},
  2284. "outputs": [
  2285. {
  2286. "ename": "ValueError",
  2287. "evalue": "operands could not be broadcast together with shapes (2,3) (2,) ",
  2288. "output_type": "error",
  2289. "traceback": [
  2290. "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
  2291. "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
  2292. "\u001b[0;32m<ipython-input-99-1b4232de65b6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
  2293. "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (2,3) (2,) "
  2294. ]
  2295. }
  2296. ],
  2297. "source": [
  2298. "A*v1"
  2299. ]
  2300. },
  2301. {
  2302. "cell_type": "code",
  2303. "execution_count": 98,
  2304. "metadata": {},
  2305. "outputs": [
  2306. {
  2307. "data": {
  2308. "text/plain": [
  2309. "array([[0.2155104 , 1.47768123],\n",
  2310. " [0.20480274, 0.2631732 ],\n",
  2311. " [0.69198065, 1.64463321]])"
  2312. ]
  2313. },
  2314. "execution_count": 98,
  2315. "metadata": {},
  2316. "output_type": "execute_result"
  2317. }
  2318. ],
  2319. "source": [
  2320. "A.T * v1"
  2321. ]
  2322. },
  2323. {
  2324. "cell_type": "markdown",
  2325. "metadata": {},
  2326. "source": [
  2327. "### 7.4 矩阵代数"
  2328. ]
  2329. },
  2330. {
  2331. "cell_type": "markdown",
  2332. "metadata": {},
  2333. "source": [
  2334. "矩阵的乘法有两种方法,第一种方法是点乘函数,它对两个参数应用矩阵-矩阵、矩阵-向量或内向量乘法"
  2335. ]
  2336. },
  2337. {
  2338. "cell_type": "code",
  2339. "execution_count": 101,
  2340. "metadata": {},
  2341. "outputs": [
  2342. {
  2343. "data": {
  2344. "text/plain": [
  2345. "array([[1.12309 , 2.2085345 , 1.7819952 , 1.65833535, 1.28453148],\n",
  2346. " [0.33434263, 2.28904424, 1.42540142, 1.66026458, 1.29312083],\n",
  2347. " [0.33457282, 1.44496209, 1.7598308 , 1.29000407, 0.62386269],\n",
  2348. " [0.25751315, 1.78002052, 1.39686586, 1.5606918 , 0.83024555],\n",
  2349. " [0.36376464, 1.73034161, 1.06421057, 1.11477265, 1.15680181]])"
  2350. ]
  2351. },
  2352. "execution_count": 101,
  2353. "metadata": {},
  2354. "output_type": "execute_result"
  2355. }
  2356. ],
  2357. "source": [
  2358. "A = np.random.rand(5, 5)\n",
  2359. "v1 = np.random.rand(5, 1)\n",
  2360. "\n",
  2361. "np.dot(A, A)"
  2362. ]
  2363. },
  2364. {
  2365. "cell_type": "code",
  2366. "execution_count": 102,
  2367. "metadata": {},
  2368. "outputs": [
  2369. {
  2370. "data": {
  2371. "text/plain": [
  2372. "array([[1.98507978],\n",
  2373. " [1.24839224],\n",
  2374. " [0.93544866],\n",
  2375. " [0.71593381],\n",
  2376. " [1.29545275]])"
  2377. ]
  2378. },
  2379. "execution_count": 102,
  2380. "metadata": {},
  2381. "output_type": "execute_result"
  2382. }
  2383. ],
  2384. "source": [
  2385. "np.dot(A, v1)\n"
  2386. ]
  2387. },
  2388. {
  2389. "cell_type": "code",
  2390. "execution_count": 103,
  2391. "metadata": {},
  2392. "outputs": [
  2393. {
  2394. "data": {
  2395. "text/plain": [
  2396. "array([[2.25685841]])"
  2397. ]
  2398. },
  2399. "execution_count": 103,
  2400. "metadata": {},
  2401. "output_type": "execute_result"
  2402. }
  2403. ],
  2404. "source": [
  2405. "np.dot(v1.T, v1)"
  2406. ]
  2407. },
  2408. {
  2409. "cell_type": "markdown",
  2410. "metadata": {},
  2411. "source": [
  2412. "另外,我们可以将数组对象投到`matrix`类型上。这将改变标准算术运算符`+, -, *` 的行为,以使用矩阵代数。"
  2413. ]
  2414. },
  2415. {
  2416. "cell_type": "code",
  2417. "execution_count": 105,
  2418. "metadata": {
  2419. "collapsed": true
  2420. },
  2421. "outputs": [],
  2422. "source": [
  2423. "M = np.matrix(A)\n",
  2424. "v = np.matrix(v1).T # make it a column vector"
  2425. ]
  2426. },
  2427. {
  2428. "cell_type": "code",
  2429. "execution_count": 106,
  2430. "metadata": {},
  2431. "outputs": [
  2432. {
  2433. "data": {
  2434. "text/plain": [
  2435. "matrix([[0.93788751, 0.13927003, 0.978233 , 0.04281574, 0.63170904]])"
  2436. ]
  2437. },
  2438. "execution_count": 106,
  2439. "metadata": {},
  2440. "output_type": "execute_result"
  2441. }
  2442. ],
  2443. "source": [
  2444. "v"
  2445. ]
  2446. },
  2447. {
  2448. "cell_type": "code",
  2449. "execution_count": 107,
  2450. "metadata": {},
  2451. "outputs": [
  2452. {
  2453. "data": {
  2454. "text/plain": [
  2455. "matrix([[1.12309 , 2.2085345 , 1.7819952 , 1.65833535, 1.28453148],\n",
  2456. " [0.33434263, 2.28904424, 1.42540142, 1.66026458, 1.29312083],\n",
  2457. " [0.33457282, 1.44496209, 1.7598308 , 1.29000407, 0.62386269],\n",
  2458. " [0.25751315, 1.78002052, 1.39686586, 1.5606918 , 0.83024555],\n",
  2459. " [0.36376464, 1.73034161, 1.06421057, 1.11477265, 1.15680181]])"
  2460. ]
  2461. },
  2462. "execution_count": 107,
  2463. "metadata": {},
  2464. "output_type": "execute_result"
  2465. }
  2466. ],
  2467. "source": [
  2468. "M * M"
  2469. ]
  2470. },
  2471. {
  2472. "cell_type": "code",
  2473. "execution_count": 108,
  2474. "metadata": {},
  2475. "outputs": [
  2476. {
  2477. "data": {
  2478. "text/plain": [
  2479. "matrix([[1.98507978],\n",
  2480. " [1.24839224],\n",
  2481. " [0.93544866],\n",
  2482. " [0.71593381],\n",
  2483. " [1.29545275]])"
  2484. ]
  2485. },
  2486. "execution_count": 108,
  2487. "metadata": {},
  2488. "output_type": "execute_result"
  2489. }
  2490. ],
  2491. "source": [
  2492. "M * v.T"
  2493. ]
  2494. },
  2495. {
  2496. "cell_type": "code",
  2497. "execution_count": 109,
  2498. "metadata": {},
  2499. "outputs": [
  2500. {
  2501. "data": {
  2502. "text/plain": [
  2503. "matrix([[2.25685841]])"
  2504. ]
  2505. },
  2506. "execution_count": 109,
  2507. "metadata": {},
  2508. "output_type": "execute_result"
  2509. }
  2510. ],
  2511. "source": [
  2512. "# 內积\n",
  2513. "v * v.T"
  2514. ]
  2515. },
  2516. {
  2517. "cell_type": "markdown",
  2518. "metadata": {},
  2519. "source": [
  2520. "如果我们尝试用不相配的矩阵形状加,减或者乘我们会得到错误:"
  2521. ]
  2522. },
  2523. {
  2524. "cell_type": "code",
  2525. "execution_count": 113,
  2526. "metadata": {
  2527. "collapsed": true
  2528. },
  2529. "outputs": [],
  2530. "source": [
  2531. "v = np.matrix([1,2,3,4,5]).T"
  2532. ]
  2533. },
  2534. {
  2535. "cell_type": "code",
  2536. "execution_count": 114,
  2537. "metadata": {},
  2538. "outputs": [
  2539. {
  2540. "data": {
  2541. "text/plain": [
  2542. "((5, 5), (5, 1))"
  2543. ]
  2544. },
  2545. "execution_count": 114,
  2546. "metadata": {},
  2547. "output_type": "execute_result"
  2548. }
  2549. ],
  2550. "source": [
  2551. "np.shape(M), np.shape(v)"
  2552. ]
  2553. },
  2554. {
  2555. "cell_type": "code",
  2556. "execution_count": 115,
  2557. "metadata": {},
  2558. "outputs": [
  2559. {
  2560. "data": {
  2561. "text/plain": [
  2562. "matrix([[7.92376781],\n",
  2563. " [9.47121037],\n",
  2564. " [6.98226306],\n",
  2565. " [7.1825789 ],\n",
  2566. " [6.67757715]])"
  2567. ]
  2568. },
  2569. "execution_count": 115,
  2570. "metadata": {},
  2571. "output_type": "execute_result"
  2572. }
  2573. ],
  2574. "source": [
  2575. "M * v"
  2576. ]
  2577. },
  2578. {
  2579. "cell_type": "markdown",
  2580. "metadata": {},
  2581. "source": [
  2582. "### 7.5 矩阵计算与数据处理"
  2583. ]
  2584. },
  2585. {
  2586. "cell_type": "markdown",
  2587. "metadata": {},
  2588. "source": [
  2589. "#### 求逆"
  2590. ]
  2591. },
  2592. {
  2593. "cell_type": "code",
  2594. "execution_count": 116,
  2595. "metadata": {},
  2596. "outputs": [
  2597. {
  2598. "data": {
  2599. "text/plain": [
  2600. "array([[-2. , 1. ],\n",
  2601. " [ 1.5, -0.5]])"
  2602. ]
  2603. },
  2604. "execution_count": 116,
  2605. "metadata": {},
  2606. "output_type": "execute_result"
  2607. }
  2608. ],
  2609. "source": [
  2610. "C = np.array([[1, 2], [3, 4]])\n",
  2611. "np.linalg.inv(C) # equivalent to C.I "
  2612. ]
  2613. },
  2614. {
  2615. "cell_type": "markdown",
  2616. "metadata": {},
  2617. "source": [
  2618. "#### 行列式"
  2619. ]
  2620. },
  2621. {
  2622. "cell_type": "code",
  2623. "execution_count": 117,
  2624. "metadata": {},
  2625. "outputs": [
  2626. {
  2627. "data": {
  2628. "text/plain": [
  2629. "-2.0000000000000004"
  2630. ]
  2631. },
  2632. "execution_count": 117,
  2633. "metadata": {},
  2634. "output_type": "execute_result"
  2635. }
  2636. ],
  2637. "source": [
  2638. "np.linalg.det(C)"
  2639. ]
  2640. },
  2641. {
  2642. "cell_type": "markdown",
  2643. "metadata": {},
  2644. "source": [
  2645. "#### 数据统计\n",
  2646. "通常将数据集存储在Numpy数组中是非常有用的。Numpy提供了许多函数用于计算数组中数据集的统计。\n",
  2647. "\n",
  2648. "例如,让我们从上面使用的斯德哥尔摩温度数据集计算一些属性。"
  2649. ]
  2650. },
  2651. {
  2652. "cell_type": "code",
  2653. "execution_count": 118,
  2654. "metadata": {},
  2655. "outputs": [
  2656. {
  2657. "data": {
  2658. "text/plain": [
  2659. "(77431, 7)"
  2660. ]
  2661. },
  2662. "execution_count": 118,
  2663. "metadata": {},
  2664. "output_type": "execute_result"
  2665. }
  2666. ],
  2667. "source": [
  2668. "import numpy as np\n",
  2669. "data = np.genfromtxt('stockholm_td_adj.dat')\n",
  2670. "\n",
  2671. "# 提醒一下,温度数据集存储在数据变量中:\n",
  2672. "np.shape(data)"
  2673. ]
  2674. },
  2675. {
  2676. "cell_type": "markdown",
  2677. "metadata": {},
  2678. "source": [
  2679. "#### mean"
  2680. ]
  2681. },
  2682. {
  2683. "cell_type": "code",
  2684. "execution_count": 120,
  2685. "metadata": {},
  2686. "outputs": [
  2687. {
  2688. "name": "stdout",
  2689. "output_type": "stream",
  2690. "text": [
  2691. "(77431, 7)\n"
  2692. ]
  2693. },
  2694. {
  2695. "data": {
  2696. "text/plain": [
  2697. "6.197109684751585"
  2698. ]
  2699. },
  2700. "execution_count": 120,
  2701. "metadata": {},
  2702. "output_type": "execute_result"
  2703. }
  2704. ],
  2705. "source": [
  2706. "# 温度数据在第三列中\n",
  2707. "print(data.shape)\n",
  2708. "np.mean(data[:,3])"
  2709. ]
  2710. },
  2711. {
  2712. "cell_type": "code",
  2713. "execution_count": 121,
  2714. "metadata": {},
  2715. "outputs": [
  2716. {
  2717. "data": {
  2718. "text/plain": [
  2719. "0.6298323446656802"
  2720. ]
  2721. },
  2722. "execution_count": 121,
  2723. "metadata": {},
  2724. "output_type": "execute_result"
  2725. }
  2726. ],
  2727. "source": [
  2728. "A = np.random.rand(4, 3)\n",
  2729. "np.mean(A)"
  2730. ]
  2731. },
  2732. {
  2733. "cell_type": "markdown",
  2734. "metadata": {},
  2735. "source": [
  2736. "在过去的200年里,斯德哥尔摩每天的平均气温大约是6.2 C。"
  2737. ]
  2738. },
  2739. {
  2740. "cell_type": "markdown",
  2741. "metadata": {},
  2742. "source": [
  2743. "#### 标准差和方差"
  2744. ]
  2745. },
  2746. {
  2747. "cell_type": "code",
  2748. "execution_count": 123,
  2749. "metadata": {},
  2750. "outputs": [
  2751. {
  2752. "data": {
  2753. "text/plain": [
  2754. "(8.282271621340573, 68.59602320966341)"
  2755. ]
  2756. },
  2757. "execution_count": 123,
  2758. "metadata": {},
  2759. "output_type": "execute_result"
  2760. }
  2761. ],
  2762. "source": [
  2763. "np.std(data[:,3]), np.var(data[:,3])"
  2764. ]
  2765. },
  2766. {
  2767. "cell_type": "markdown",
  2768. "metadata": {},
  2769. "source": [
  2770. "#### 最小值和最大值"
  2771. ]
  2772. },
  2773. {
  2774. "cell_type": "code",
  2775. "execution_count": 124,
  2776. "metadata": {},
  2777. "outputs": [
  2778. {
  2779. "data": {
  2780. "text/plain": [
  2781. "-25.8"
  2782. ]
  2783. },
  2784. "execution_count": 124,
  2785. "metadata": {},
  2786. "output_type": "execute_result"
  2787. }
  2788. ],
  2789. "source": [
  2790. "# 最低日平均温度\n",
  2791. "data[:,3].min()"
  2792. ]
  2793. },
  2794. {
  2795. "cell_type": "code",
  2796. "execution_count": 125,
  2797. "metadata": {},
  2798. "outputs": [
  2799. {
  2800. "data": {
  2801. "text/plain": [
  2802. "28.3"
  2803. ]
  2804. },
  2805. "execution_count": 125,
  2806. "metadata": {},
  2807. "output_type": "execute_result"
  2808. }
  2809. ],
  2810. "source": [
  2811. "# 最高日平均温度\n",
  2812. "data[:,3].max()"
  2813. ]
  2814. },
  2815. {
  2816. "cell_type": "markdown",
  2817. "metadata": {},
  2818. "source": [
  2819. "#### sum, prod, and trace"
  2820. ]
  2821. },
  2822. {
  2823. "cell_type": "code",
  2824. "execution_count": 126,
  2825. "metadata": {},
  2826. "outputs": [
  2827. {
  2828. "data": {
  2829. "text/plain": [
  2830. "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
  2831. ]
  2832. },
  2833. "execution_count": 126,
  2834. "metadata": {},
  2835. "output_type": "execute_result"
  2836. }
  2837. ],
  2838. "source": [
  2839. "d = np.arange(0, 10)\n",
  2840. "d"
  2841. ]
  2842. },
  2843. {
  2844. "cell_type": "code",
  2845. "execution_count": 127,
  2846. "metadata": {},
  2847. "outputs": [
  2848. {
  2849. "data": {
  2850. "text/plain": [
  2851. "45"
  2852. ]
  2853. },
  2854. "execution_count": 127,
  2855. "metadata": {},
  2856. "output_type": "execute_result"
  2857. }
  2858. ],
  2859. "source": [
  2860. "# 将所有的元素相加\n",
  2861. "np.sum(d)"
  2862. ]
  2863. },
  2864. {
  2865. "cell_type": "code",
  2866. "execution_count": 128,
  2867. "metadata": {},
  2868. "outputs": [
  2869. {
  2870. "data": {
  2871. "text/plain": [
  2872. "3628800"
  2873. ]
  2874. },
  2875. "execution_count": 128,
  2876. "metadata": {},
  2877. "output_type": "execute_result"
  2878. }
  2879. ],
  2880. "source": [
  2881. "# 全元素积分\n",
  2882. "np.prod(d+1)"
  2883. ]
  2884. },
  2885. {
  2886. "cell_type": "code",
  2887. "execution_count": 129,
  2888. "metadata": {},
  2889. "outputs": [
  2890. {
  2891. "data": {
  2892. "text/plain": [
  2893. "array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45])"
  2894. ]
  2895. },
  2896. "execution_count": 129,
  2897. "metadata": {},
  2898. "output_type": "execute_result"
  2899. }
  2900. ],
  2901. "source": [
  2902. "# 累计求和\n",
  2903. "np.cumsum(d)"
  2904. ]
  2905. },
  2906. {
  2907. "cell_type": "code",
  2908. "execution_count": 130,
  2909. "metadata": {},
  2910. "outputs": [
  2911. {
  2912. "data": {
  2913. "text/plain": [
  2914. "array([ 1, 2, 6, 24, 120, 720, 5040,\n",
  2915. " 40320, 362880, 3628800])"
  2916. ]
  2917. },
  2918. "execution_count": 130,
  2919. "metadata": {},
  2920. "output_type": "execute_result"
  2921. }
  2922. ],
  2923. "source": [
  2924. "# 累计乘积\n",
  2925. "np.cumprod(d+1)"
  2926. ]
  2927. },
  2928. {
  2929. "cell_type": "code",
  2930. "execution_count": 131,
  2931. "metadata": {},
  2932. "outputs": [
  2933. {
  2934. "data": {
  2935. "text/plain": [
  2936. "2.3246646567243014"
  2937. ]
  2938. },
  2939. "execution_count": 131,
  2940. "metadata": {},
  2941. "output_type": "execute_result"
  2942. }
  2943. ],
  2944. "source": [
  2945. "# 计算对角线元素的和,和diag(A).sum()一样\n",
  2946. "np.trace(A)"
  2947. ]
  2948. },
  2949. {
  2950. "cell_type": "markdown",
  2951. "metadata": {},
  2952. "source": [
  2953. "### 7.6 数组子集的计算"
  2954. ]
  2955. },
  2956. {
  2957. "cell_type": "markdown",
  2958. "metadata": {},
  2959. "source": [
  2960. "我们可以使用索引、花式索引和从数组中提取数据的其他方法(如上所述)来计算数组中的数据子集。\n",
  2961. "\n",
  2962. "例如,让我们回到温度数据集:"
  2963. ]
  2964. },
  2965. {
  2966. "cell_type": "code",
  2967. "execution_count": 132,
  2968. "metadata": {},
  2969. "outputs": [
  2970. {
  2971. "name": "stdout",
  2972. "output_type": "stream",
  2973. "text": [
  2974. "1800 1 1 -6.1 -6.1 -6.1 1\r\n",
  2975. "1800 1 2 -15.4 -15.4 -15.4 1\r\n",
  2976. "1800 1 3 -15.0 -15.0 -15.0 1\r\n"
  2977. ]
  2978. }
  2979. ],
  2980. "source": [
  2981. "!head -n 3 stockholm_td_adj.dat"
  2982. ]
  2983. },
  2984. {
  2985. "cell_type": "markdown",
  2986. "metadata": {},
  2987. "source": [
  2988. "数据集的格式是:年,月,日,日平均气温,低,高,位置。\n",
  2989. "\n",
  2990. "如果我们对某个特定月份的平均温度感兴趣,比如二月,然后我们可以创建一个索引掩码,使用它来选择当月的数据:"
  2991. ]
  2992. },
  2993. {
  2994. "cell_type": "code",
  2995. "execution_count": 133,
  2996. "metadata": {},
  2997. "outputs": [
  2998. {
  2999. "data": {
  3000. "text/plain": [
  3001. "array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.])"
  3002. ]
  3003. },
  3004. "execution_count": 133,
  3005. "metadata": {},
  3006. "output_type": "execute_result"
  3007. }
  3008. ],
  3009. "source": [
  3010. "np.unique(data[:,1]) # 列的值从1到12"
  3011. ]
  3012. },
  3013. {
  3014. "cell_type": "code",
  3015. "execution_count": 134,
  3016. "metadata": {},
  3017. "outputs": [
  3018. {
  3019. "name": "stdout",
  3020. "output_type": "stream",
  3021. "text": [
  3022. "[False False False ... False False False]\n"
  3023. ]
  3024. }
  3025. ],
  3026. "source": [
  3027. "mask_feb = data[:,1] == 2\n",
  3028. "print(mask_feb)"
  3029. ]
  3030. },
  3031. {
  3032. "cell_type": "code",
  3033. "execution_count": 135,
  3034. "metadata": {},
  3035. "outputs": [
  3036. {
  3037. "name": "stdout",
  3038. "output_type": "stream",
  3039. "text": [
  3040. "-3.212109570736596\n",
  3041. "5.090390768766271\n"
  3042. ]
  3043. }
  3044. ],
  3045. "source": [
  3046. "# 温度数据实在第三行\n",
  3047. "print(np.mean(data[mask_feb,3]))\n",
  3048. "print(np.std(data[mask_feb,3]))"
  3049. ]
  3050. },
  3051. {
  3052. "cell_type": "markdown",
  3053. "metadata": {},
  3054. "source": [
  3055. "有了这些工具,我们就有了非常强大的数据处理能力。例如,提取每年每个月的平均气温只需要几行代码:"
  3056. ]
  3057. },
  3058. {
  3059. "cell_type": "code",
  3060. "execution_count": 136,
  3061. "metadata": {},
  3062. "outputs": [
  3063. {
  3064. "data": {
  3065. "image/png": "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\n",
  3066. "text/plain": [
  3067. "<matplotlib.figure.Figure at 0x7ff5664d2128>"
  3068. ]
  3069. },
  3070. "metadata": {},
  3071. "output_type": "display_data"
  3072. }
  3073. ],
  3074. "source": [
  3075. "%matplotlib inline\n",
  3076. "import matplotlib.pyplot as plt\n",
  3077. "\n",
  3078. "months = np.unique(data[:,1])\n",
  3079. "monthly_mean = [np.mean(data[data[:,1] == month, 3]) for month in months]\n",
  3080. "\n",
  3081. "fig, ax = plt.subplots()\n",
  3082. "ax.bar(months, monthly_mean)\n",
  3083. "ax.set_xlabel(\"Month\")\n",
  3084. "ax.set_ylabel(\"Monthly avg. temp.\");"
  3085. ]
  3086. },
  3087. {
  3088. "cell_type": "markdown",
  3089. "metadata": {},
  3090. "source": [
  3091. "### 7.7 高维数据的计算"
  3092. ]
  3093. },
  3094. {
  3095. "cell_type": "markdown",
  3096. "metadata": {},
  3097. "source": [
  3098. "当例如`min`, `max`等函数应用在高维数组上时,有时将计算应用于整个数组是有用的,而且很多时候有时只基于行或列。用`axis`参数我们可以决定这个函数应该怎样表现:"
  3099. ]
  3100. },
  3101. {
  3102. "cell_type": "code",
  3103. "execution_count": 137,
  3104. "metadata": {},
  3105. "outputs": [
  3106. {
  3107. "data": {
  3108. "text/plain": [
  3109. "array([[0.65430115, 0.12431018, 0.49599019],\n",
  3110. " [0.59918196, 0.72089552, 0.34269067],\n",
  3111. " [0.74769538, 0.69686536, 0.35621994],\n",
  3112. " [0.61852787, 0.70536225, 0.06504484]])"
  3113. ]
  3114. },
  3115. "execution_count": 137,
  3116. "metadata": {},
  3117. "output_type": "execute_result"
  3118. }
  3119. ],
  3120. "source": [
  3121. "import numpy as np\n",
  3122. "\n",
  3123. "m = np.random.rand(4,3)\n",
  3124. "m"
  3125. ]
  3126. },
  3127. {
  3128. "cell_type": "code",
  3129. "execution_count": 138,
  3130. "metadata": {},
  3131. "outputs": [
  3132. {
  3133. "data": {
  3134. "text/plain": [
  3135. "0.7476953810023619"
  3136. ]
  3137. },
  3138. "execution_count": 138,
  3139. "metadata": {},
  3140. "output_type": "execute_result"
  3141. }
  3142. ],
  3143. "source": [
  3144. "# global max\n",
  3145. "m.max()"
  3146. ]
  3147. },
  3148. {
  3149. "cell_type": "code",
  3150. "execution_count": 139,
  3151. "metadata": {},
  3152. "outputs": [
  3153. {
  3154. "data": {
  3155. "text/plain": [
  3156. "array([0.74769538, 0.72089552, 0.49599019])"
  3157. ]
  3158. },
  3159. "execution_count": 139,
  3160. "metadata": {},
  3161. "output_type": "execute_result"
  3162. }
  3163. ],
  3164. "source": [
  3165. "# max in each column\n",
  3166. "m.max(axis=0)"
  3167. ]
  3168. },
  3169. {
  3170. "cell_type": "code",
  3171. "execution_count": 140,
  3172. "metadata": {},
  3173. "outputs": [
  3174. {
  3175. "data": {
  3176. "text/plain": [
  3177. "array([0.65430115, 0.72089552, 0.74769538, 0.70536225])"
  3178. ]
  3179. },
  3180. "execution_count": 140,
  3181. "metadata": {},
  3182. "output_type": "execute_result"
  3183. }
  3184. ],
  3185. "source": [
  3186. "# max in each row\n",
  3187. "m.max(axis=1)"
  3188. ]
  3189. },
  3190. {
  3191. "cell_type": "markdown",
  3192. "metadata": {},
  3193. "source": [
  3194. "许多其他的在`array` 和`matrix`类中的函数和方法接受同样(可选的)的关键字参数`axis`"
  3195. ]
  3196. },
  3197. {
  3198. "cell_type": "markdown",
  3199. "metadata": {},
  3200. "source": [
  3201. "## 8. 阵列的重塑、调整大小和堆叠"
  3202. ]
  3203. },
  3204. {
  3205. "cell_type": "markdown",
  3206. "metadata": {},
  3207. "source": [
  3208. "Numpy数组的形状可以被确定而无需复制底层数据,这使得即使对于大型数组也能有较快的操作。"
  3209. ]
  3210. },
  3211. {
  3212. "cell_type": "code",
  3213. "execution_count": 141,
  3214. "metadata": {},
  3215. "outputs": [
  3216. {
  3217. "name": "stdout",
  3218. "output_type": "stream",
  3219. "text": [
  3220. "[[0.78519728 0.15775634 0.03890868]\n",
  3221. " [0.48267243 0.05821189 0.96613776]\n",
  3222. " [0.76181876 0.79747884 0.85199696]\n",
  3223. " [0.61926823 0.27633702 0.76651623]]\n"
  3224. ]
  3225. }
  3226. ],
  3227. "source": [
  3228. "import numpy as np\n",
  3229. "\n",
  3230. "A = np.random.rand(4, 3)\n",
  3231. "print(A)"
  3232. ]
  3233. },
  3234. {
  3235. "cell_type": "code",
  3236. "execution_count": 142,
  3237. "metadata": {},
  3238. "outputs": [
  3239. {
  3240. "name": "stdout",
  3241. "output_type": "stream",
  3242. "text": [
  3243. "4 3\n"
  3244. ]
  3245. }
  3246. ],
  3247. "source": [
  3248. "n, m = A.shape\n",
  3249. "print(n, m)"
  3250. ]
  3251. },
  3252. {
  3253. "cell_type": "code",
  3254. "execution_count": 144,
  3255. "metadata": {},
  3256. "outputs": [
  3257. {
  3258. "data": {
  3259. "text/plain": [
  3260. "array([[0.78519728, 0.15775634, 0.03890868, 0.48267243, 0.05821189,\n",
  3261. " 0.96613776, 0.76181876, 0.79747884, 0.85199696, 0.61926823,\n",
  3262. " 0.27633702, 0.76651623]])"
  3263. ]
  3264. },
  3265. "execution_count": 144,
  3266. "metadata": {},
  3267. "output_type": "execute_result"
  3268. }
  3269. ],
  3270. "source": [
  3271. "B = A.reshape((1,n*m))\n",
  3272. "B"
  3273. ]
  3274. },
  3275. {
  3276. "cell_type": "code",
  3277. "execution_count": 145,
  3278. "metadata": {},
  3279. "outputs": [
  3280. {
  3281. "name": "stdout",
  3282. "output_type": "stream",
  3283. "text": [
  3284. "[[0.78519728]\n",
  3285. " [0.15775634]\n",
  3286. " [0.03890868]\n",
  3287. " [0.48267243]\n",
  3288. " [0.05821189]\n",
  3289. " [0.96613776]\n",
  3290. " [0.76181876]\n",
  3291. " [0.79747884]\n",
  3292. " [0.85199696]\n",
  3293. " [0.61926823]\n",
  3294. " [0.27633702]\n",
  3295. " [0.76651623]]\n",
  3296. "(12, 1)\n"
  3297. ]
  3298. }
  3299. ],
  3300. "source": [
  3301. "B2 = A.reshape((n*m, 1))\n",
  3302. "print(B2)\n",
  3303. "print(B2.shape)"
  3304. ]
  3305. },
  3306. {
  3307. "cell_type": "code",
  3308. "execution_count": 146,
  3309. "metadata": {},
  3310. "outputs": [
  3311. {
  3312. "data": {
  3313. "text/plain": [
  3314. "array([[5. , 5. , 5. , 5. , 5. ,\n",
  3315. " 0.96613776, 0.76181876, 0.79747884, 0.85199696, 0.61926823,\n",
  3316. " 0.27633702, 0.76651623]])"
  3317. ]
  3318. },
  3319. "execution_count": 146,
  3320. "metadata": {},
  3321. "output_type": "execute_result"
  3322. }
  3323. ],
  3324. "source": [
  3325. "B[0,0:5] = 5 # modify the array\n",
  3326. "\n",
  3327. "B"
  3328. ]
  3329. },
  3330. {
  3331. "cell_type": "code",
  3332. "execution_count": 147,
  3333. "metadata": {},
  3334. "outputs": [
  3335. {
  3336. "data": {
  3337. "text/plain": [
  3338. "array([[5. , 5. , 5. ],\n",
  3339. " [5. , 5. , 0.96613776],\n",
  3340. " [0.76181876, 0.79747884, 0.85199696],\n",
  3341. " [0.61926823, 0.27633702, 0.76651623]])"
  3342. ]
  3343. },
  3344. "execution_count": 147,
  3345. "metadata": {},
  3346. "output_type": "execute_result"
  3347. }
  3348. ],
  3349. "source": [
  3350. "A # and the original variable is also changed. B is only a different view of the same data"
  3351. ]
  3352. },
  3353. {
  3354. "cell_type": "markdown",
  3355. "metadata": {},
  3356. "source": [
  3357. "We can also use the function `flatten` to make a higher-dimensional array into a vector. But this function create a copy of the data."
  3358. ]
  3359. },
  3360. {
  3361. "cell_type": "code",
  3362. "execution_count": 148,
  3363. "metadata": {},
  3364. "outputs": [
  3365. {
  3366. "data": {
  3367. "text/plain": [
  3368. "array([5. , 5. , 5. , 5. , 5. ,\n",
  3369. " 0.96613776, 0.76181876, 0.79747884, 0.85199696, 0.61926823,\n",
  3370. " 0.27633702, 0.76651623])"
  3371. ]
  3372. },
  3373. "execution_count": 148,
  3374. "metadata": {},
  3375. "output_type": "execute_result"
  3376. }
  3377. ],
  3378. "source": [
  3379. "B = A.flatten()\n",
  3380. "\n",
  3381. "B"
  3382. ]
  3383. },
  3384. {
  3385. "cell_type": "code",
  3386. "execution_count": 149,
  3387. "metadata": {},
  3388. "outputs": [
  3389. {
  3390. "name": "stdout",
  3391. "output_type": "stream",
  3392. "text": [
  3393. "(12,)\n"
  3394. ]
  3395. }
  3396. ],
  3397. "source": [
  3398. "print(B.shape)"
  3399. ]
  3400. },
  3401. {
  3402. "cell_type": "code",
  3403. "execution_count": 150,
  3404. "metadata": {},
  3405. "outputs": [
  3406. {
  3407. "name": "stdout",
  3408. "output_type": "stream",
  3409. "text": [
  3410. "[0.51110357 0.36543148 0.36939715 0.14022005 0.6268352 0.00636831\n",
  3411. " 0.82890719 0.51145062 0.16072218 0.99073929 0.96970778 0.85973022\n",
  3412. " 0.27339743 0.93029089 0.08330827 0.95720719 0.14573418 0.77709524\n",
  3413. " 0.97026939 0.51474888 0.82234327 0.46406383 0.05258201 0.90861813\n",
  3414. " 0.06359622 0.22060077 0.44463362 0.88191886 0.32267272 0.5203602\n",
  3415. " 0.39421885 0.73865461 0.75810546 0.94533578 0.70099854 0.35188207\n",
  3416. " 0.73767664 0.8464147 0.78947462 0.49024445 0.17088021 0.9221971\n",
  3417. " 0.26637317 0.42399527 0.67094074 0.38923384 0.7553479 0.24364291\n",
  3418. " 0.47827327 0.60831433 0.01124522 0.59944347 0.46013596 0.18677825\n",
  3419. " 0.87114672 0.21210642 0.2111575 0.01062604 0.41290141 0.29851044]\n"
  3420. ]
  3421. }
  3422. ],
  3423. "source": [
  3424. "T = np.random.rand(3, 4, 5)\n",
  3425. "T2 = T.flatten()\n",
  3426. "print(T2)"
  3427. ]
  3428. },
  3429. {
  3430. "cell_type": "code",
  3431. "execution_count": 151,
  3432. "metadata": {},
  3433. "outputs": [
  3434. {
  3435. "data": {
  3436. "text/plain": [
  3437. "array([10. , 10. , 10. , 10. , 10. ,\n",
  3438. " 0.96613776, 0.76181876, 0.79747884, 0.85199696, 0.61926823,\n",
  3439. " 0.27633702, 0.76651623])"
  3440. ]
  3441. },
  3442. "execution_count": 151,
  3443. "metadata": {},
  3444. "output_type": "execute_result"
  3445. }
  3446. ],
  3447. "source": [
  3448. "B[0:5] = 10\n",
  3449. "\n",
  3450. "B"
  3451. ]
  3452. },
  3453. {
  3454. "cell_type": "code",
  3455. "execution_count": 152,
  3456. "metadata": {},
  3457. "outputs": [
  3458. {
  3459. "data": {
  3460. "text/plain": [
  3461. "array([[5. , 5. , 5. ],\n",
  3462. " [5. , 5. , 0.96613776],\n",
  3463. " [0.76181876, 0.79747884, 0.85199696],\n",
  3464. " [0.61926823, 0.27633702, 0.76651623]])"
  3465. ]
  3466. },
  3467. "execution_count": 152,
  3468. "metadata": {},
  3469. "output_type": "execute_result"
  3470. }
  3471. ],
  3472. "source": [
  3473. "A # 现在A并没有改变,因为B的数值是A的复制,并不指向同样的值。"
  3474. ]
  3475. },
  3476. {
  3477. "cell_type": "markdown",
  3478. "metadata": {},
  3479. "source": [
  3480. "## 9. 添加、删除维度:newaxis、squeeze"
  3481. ]
  3482. },
  3483. {
  3484. "cell_type": "markdown",
  3485. "metadata": {},
  3486. "source": [
  3487. "当矩阵乘法的时候,需要两个矩阵的对应的纬度保持一致才可以正确执行,有了`newaxis`,我们可以在数组中插入新的维度,例如将一个向量转换为列或行矩阵:"
  3488. ]
  3489. },
  3490. {
  3491. "cell_type": "code",
  3492. "execution_count": 153,
  3493. "metadata": {
  3494. "collapsed": true
  3495. },
  3496. "outputs": [],
  3497. "source": [
  3498. "v = np.array([1,2,3])"
  3499. ]
  3500. },
  3501. {
  3502. "cell_type": "code",
  3503. "execution_count": 154,
  3504. "metadata": {},
  3505. "outputs": [
  3506. {
  3507. "name": "stdout",
  3508. "output_type": "stream",
  3509. "text": [
  3510. "(3,)\n",
  3511. "[1 2 3]\n"
  3512. ]
  3513. }
  3514. ],
  3515. "source": [
  3516. "print(np.shape(v))\n",
  3517. "print(v)"
  3518. ]
  3519. },
  3520. {
  3521. "cell_type": "code",
  3522. "execution_count": 155,
  3523. "metadata": {},
  3524. "outputs": [
  3525. {
  3526. "name": "stdout",
  3527. "output_type": "stream",
  3528. "text": [
  3529. "(3, 1)\n",
  3530. "[[1]\n",
  3531. " [2]\n",
  3532. " [3]]\n"
  3533. ]
  3534. }
  3535. ],
  3536. "source": [
  3537. "v2 = v.reshape(3, 1)\n",
  3538. "print(v2.shape)\n",
  3539. "print(v2)"
  3540. ]
  3541. },
  3542. {
  3543. "cell_type": "code",
  3544. "execution_count": 156,
  3545. "metadata": {},
  3546. "outputs": [
  3547. {
  3548. "name": "stdout",
  3549. "output_type": "stream",
  3550. "text": [
  3551. "(3,)\n",
  3552. "(3, 1)\n",
  3553. "[[1]\n",
  3554. " [2]\n",
  3555. " [3]]\n"
  3556. ]
  3557. }
  3558. ],
  3559. "source": [
  3560. "# 做一个向量v的列矩阵\n",
  3561. "v2 = v[:, np.newaxis]\n",
  3562. "print(v.shape)\n",
  3563. "print(v2.shape)\n",
  3564. "print(v2)\n"
  3565. ]
  3566. },
  3567. {
  3568. "cell_type": "code",
  3569. "execution_count": 157,
  3570. "metadata": {},
  3571. "outputs": [
  3572. {
  3573. "data": {
  3574. "text/plain": [
  3575. "(3, 1)"
  3576. ]
  3577. },
  3578. "execution_count": 157,
  3579. "metadata": {},
  3580. "output_type": "execute_result"
  3581. }
  3582. ],
  3583. "source": [
  3584. "# 列矩阵\n",
  3585. "v[:,np.newaxis].shape"
  3586. ]
  3587. },
  3588. {
  3589. "cell_type": "code",
  3590. "execution_count": 158,
  3591. "metadata": {},
  3592. "outputs": [
  3593. {
  3594. "data": {
  3595. "text/plain": [
  3596. "(1, 3)"
  3597. ]
  3598. },
  3599. "execution_count": 158,
  3600. "metadata": {},
  3601. "output_type": "execute_result"
  3602. }
  3603. ],
  3604. "source": [
  3605. "# 行矩阵\n",
  3606. "v[np.newaxis,:].shape"
  3607. ]
  3608. },
  3609. {
  3610. "cell_type": "markdown",
  3611. "metadata": {},
  3612. "source": [
  3613. "也可以通过 `np.expand_dims` 来实现类似的操作"
  3614. ]
  3615. },
  3616. {
  3617. "cell_type": "code",
  3618. "execution_count": 159,
  3619. "metadata": {},
  3620. "outputs": [
  3621. {
  3622. "name": "stdout",
  3623. "output_type": "stream",
  3624. "text": [
  3625. "(3, 1)\n",
  3626. "[[1]\n",
  3627. " [2]\n",
  3628. " [3]]\n"
  3629. ]
  3630. }
  3631. ],
  3632. "source": [
  3633. "v = np.array([1,2,3])\n",
  3634. "v3 = np.expand_dims(v, 1)\n",
  3635. "print(v3.shape)\n",
  3636. "print(v3)"
  3637. ]
  3638. },
  3639. {
  3640. "cell_type": "markdown",
  3641. "metadata": {},
  3642. "source": [
  3643. "在某些情况,需要将纬度为1的那个纬度删除掉,可以使用`np.squeeze`实现"
  3644. ]
  3645. },
  3646. {
  3647. "cell_type": "code",
  3648. "execution_count": 161,
  3649. "metadata": {},
  3650. "outputs": [
  3651. {
  3652. "name": "stdout",
  3653. "output_type": "stream",
  3654. "text": [
  3655. "(1, 2, 3)\n",
  3656. "[[[1 2 3]\n",
  3657. " [2 3 4]]]\n"
  3658. ]
  3659. }
  3660. ],
  3661. "source": [
  3662. "arr = np.array([[[1, 2, 3], [2, 3, 4]]])\n",
  3663. "print(arr.shape)\n",
  3664. "print(arr)"
  3665. ]
  3666. },
  3667. {
  3668. "cell_type": "code",
  3669. "execution_count": 162,
  3670. "metadata": {},
  3671. "outputs": [
  3672. {
  3673. "name": "stdout",
  3674. "output_type": "stream",
  3675. "text": [
  3676. "(2, 3)\n",
  3677. "[[1 2 3]\n",
  3678. " [2 3 4]]\n"
  3679. ]
  3680. }
  3681. ],
  3682. "source": [
  3683. "# 实际上第一个纬度为`1`,我们不需要\n",
  3684. "arr2 = np.squeeze(arr, 0)\n",
  3685. "print(arr2.shape)\n",
  3686. "print(arr2)"
  3687. ]
  3688. },
  3689. {
  3690. "cell_type": "markdown",
  3691. "metadata": {},
  3692. "source": [
  3693. "需要注意:只有数组长度在该纬度上为1,那么该纬度才可以被删除;否则会报错。"
  3694. ]
  3695. },
  3696. {
  3697. "cell_type": "markdown",
  3698. "metadata": {},
  3699. "source": [
  3700. "## 10. 叠加和重复数组"
  3701. ]
  3702. },
  3703. {
  3704. "cell_type": "markdown",
  3705. "metadata": {},
  3706. "source": [
  3707. "利用函数`repeat`, `tile`, `vstack`, `hstack`, 和`concatenate` 可以用较小的向量和矩阵来创建更大的向量和矩阵。"
  3708. ]
  3709. },
  3710. {
  3711. "cell_type": "markdown",
  3712. "metadata": {},
  3713. "source": [
  3714. "### 10.1 tile and repeat"
  3715. ]
  3716. },
  3717. {
  3718. "cell_type": "code",
  3719. "execution_count": 163,
  3720. "metadata": {},
  3721. "outputs": [
  3722. {
  3723. "name": "stdout",
  3724. "output_type": "stream",
  3725. "text": [
  3726. "[[1 2]\n",
  3727. " [3 4]]\n"
  3728. ]
  3729. }
  3730. ],
  3731. "source": [
  3732. "a = np.array([[1, 2], [3, 4]])\n",
  3733. "print(a)"
  3734. ]
  3735. },
  3736. {
  3737. "cell_type": "code",
  3738. "execution_count": 164,
  3739. "metadata": {},
  3740. "outputs": [
  3741. {
  3742. "data": {
  3743. "text/plain": [
  3744. "array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])"
  3745. ]
  3746. },
  3747. "execution_count": 164,
  3748. "metadata": {},
  3749. "output_type": "execute_result"
  3750. }
  3751. ],
  3752. "source": [
  3753. "# 重复每一个元素三次\n",
  3754. "np.repeat(a, 3)"
  3755. ]
  3756. },
  3757. {
  3758. "cell_type": "code",
  3759. "execution_count": 165,
  3760. "metadata": {},
  3761. "outputs": [
  3762. {
  3763. "data": {
  3764. "text/plain": [
  3765. "array([[1, 2, 1, 2, 1, 2],\n",
  3766. " [3, 4, 3, 4, 3, 4]])"
  3767. ]
  3768. },
  3769. "execution_count": 165,
  3770. "metadata": {},
  3771. "output_type": "execute_result"
  3772. }
  3773. ],
  3774. "source": [
  3775. "# tile the matrix 3 times \n",
  3776. "np.tile(a, 3)"
  3777. ]
  3778. },
  3779. {
  3780. "cell_type": "code",
  3781. "execution_count": 166,
  3782. "metadata": {},
  3783. "outputs": [
  3784. {
  3785. "data": {
  3786. "text/plain": [
  3787. "array([[1, 2, 1, 2, 1, 2],\n",
  3788. " [3, 4, 3, 4, 3, 4]])"
  3789. ]
  3790. },
  3791. "execution_count": 166,
  3792. "metadata": {},
  3793. "output_type": "execute_result"
  3794. }
  3795. ],
  3796. "source": [
  3797. "# 更好的方案\n",
  3798. "np.tile(a, (1, 3))"
  3799. ]
  3800. },
  3801. {
  3802. "cell_type": "code",
  3803. "execution_count": 148,
  3804. "metadata": {},
  3805. "outputs": [
  3806. {
  3807. "data": {
  3808. "text/plain": [
  3809. "array([[1, 2],\n",
  3810. " [3, 4],\n",
  3811. " [1, 2],\n",
  3812. " [3, 4],\n",
  3813. " [1, 2],\n",
  3814. " [3, 4]])"
  3815. ]
  3816. },
  3817. "execution_count": 148,
  3818. "metadata": {},
  3819. "output_type": "execute_result"
  3820. }
  3821. ],
  3822. "source": [
  3823. "np.tile(a, (3, 1))"
  3824. ]
  3825. },
  3826. {
  3827. "cell_type": "markdown",
  3828. "metadata": {},
  3829. "source": [
  3830. "### 10.2 concatenate"
  3831. ]
  3832. },
  3833. {
  3834. "cell_type": "code",
  3835. "execution_count": 167,
  3836. "metadata": {
  3837. "collapsed": true
  3838. },
  3839. "outputs": [],
  3840. "source": [
  3841. "b = np.array([[5, 6]])"
  3842. ]
  3843. },
  3844. {
  3845. "cell_type": "code",
  3846. "execution_count": 168,
  3847. "metadata": {},
  3848. "outputs": [
  3849. {
  3850. "data": {
  3851. "text/plain": [
  3852. "array([[1, 2],\n",
  3853. " [3, 4],\n",
  3854. " [5, 6]])"
  3855. ]
  3856. },
  3857. "execution_count": 168,
  3858. "metadata": {},
  3859. "output_type": "execute_result"
  3860. }
  3861. ],
  3862. "source": [
  3863. "np.concatenate((a, b), axis=0)"
  3864. ]
  3865. },
  3866. {
  3867. "cell_type": "code",
  3868. "execution_count": 169,
  3869. "metadata": {},
  3870. "outputs": [
  3871. {
  3872. "data": {
  3873. "text/plain": [
  3874. "array([[1, 2, 5],\n",
  3875. " [3, 4, 6]])"
  3876. ]
  3877. },
  3878. "execution_count": 169,
  3879. "metadata": {},
  3880. "output_type": "execute_result"
  3881. }
  3882. ],
  3883. "source": [
  3884. "np.concatenate((a, b.T), axis=1)"
  3885. ]
  3886. },
  3887. {
  3888. "cell_type": "markdown",
  3889. "metadata": {},
  3890. "source": [
  3891. "### 10.3 hstack and vstack"
  3892. ]
  3893. },
  3894. {
  3895. "cell_type": "code",
  3896. "execution_count": 170,
  3897. "metadata": {},
  3898. "outputs": [
  3899. {
  3900. "data": {
  3901. "text/plain": [
  3902. "array([[1, 2],\n",
  3903. " [3, 4],\n",
  3904. " [5, 6]])"
  3905. ]
  3906. },
  3907. "execution_count": 170,
  3908. "metadata": {},
  3909. "output_type": "execute_result"
  3910. }
  3911. ],
  3912. "source": [
  3913. "np.vstack((a,b))"
  3914. ]
  3915. },
  3916. {
  3917. "cell_type": "code",
  3918. "execution_count": 171,
  3919. "metadata": {},
  3920. "outputs": [
  3921. {
  3922. "data": {
  3923. "text/plain": [
  3924. "array([[1, 2, 5],\n",
  3925. " [3, 4, 6]])"
  3926. ]
  3927. },
  3928. "execution_count": 171,
  3929. "metadata": {},
  3930. "output_type": "execute_result"
  3931. }
  3932. ],
  3933. "source": [
  3934. "np.hstack((a,b.T))"
  3935. ]
  3936. },
  3937. {
  3938. "cell_type": "markdown",
  3939. "metadata": {},
  3940. "source": [
  3941. "## 11. 复制和“深度复制”"
  3942. ]
  3943. },
  3944. {
  3945. "cell_type": "markdown",
  3946. "metadata": {},
  3947. "source": [
  3948. "为了获得高性能,Python中的赋值通常不复制底层对象。例如,在函数之间传递对象时,通过引用传递从而避免不必要的大量内存复制。"
  3949. ]
  3950. },
  3951. {
  3952. "cell_type": "code",
  3953. "execution_count": 172,
  3954. "metadata": {},
  3955. "outputs": [
  3956. {
  3957. "data": {
  3958. "text/plain": [
  3959. "array([[1, 2],\n",
  3960. " [3, 4]])"
  3961. ]
  3962. },
  3963. "execution_count": 172,
  3964. "metadata": {},
  3965. "output_type": "execute_result"
  3966. }
  3967. ],
  3968. "source": [
  3969. "A = np.array([[1, 2], [3, 4]])\n",
  3970. "\n",
  3971. "A"
  3972. ]
  3973. },
  3974. {
  3975. "cell_type": "code",
  3976. "execution_count": 173,
  3977. "metadata": {
  3978. "collapsed": true
  3979. },
  3980. "outputs": [],
  3981. "source": [
  3982. "# 现在B和A指的是同一个数组数据\n",
  3983. "B = A "
  3984. ]
  3985. },
  3986. {
  3987. "cell_type": "code",
  3988. "execution_count": 174,
  3989. "metadata": {},
  3990. "outputs": [
  3991. {
  3992. "data": {
  3993. "text/plain": [
  3994. "array([[10, 2],\n",
  3995. " [ 3, 4]])"
  3996. ]
  3997. },
  3998. "execution_count": 174,
  3999. "metadata": {},
  4000. "output_type": "execute_result"
  4001. }
  4002. ],
  4003. "source": [
  4004. "# 改变B影响A\n",
  4005. "B[0,0] = 10\n",
  4006. "\n",
  4007. "B"
  4008. ]
  4009. },
  4010. {
  4011. "cell_type": "code",
  4012. "execution_count": 175,
  4013. "metadata": {},
  4014. "outputs": [
  4015. {
  4016. "data": {
  4017. "text/plain": [
  4018. "array([[10, 2],\n",
  4019. " [ 3, 4]])"
  4020. ]
  4021. },
  4022. "execution_count": 175,
  4023. "metadata": {},
  4024. "output_type": "execute_result"
  4025. }
  4026. ],
  4027. "source": [
  4028. "A"
  4029. ]
  4030. },
  4031. {
  4032. "cell_type": "markdown",
  4033. "metadata": {},
  4034. "source": [
  4035. "如果我们想避免这种引用赋值的行为,那么当我们从 `A` 复制一个新的完全独立的对象 `B` 时,我们需要使用函数 `copy` 来做一个所谓的“深度复制”:"
  4036. ]
  4037. },
  4038. {
  4039. "cell_type": "code",
  4040. "execution_count": 176,
  4041. "metadata": {
  4042. "collapsed": true
  4043. },
  4044. "outputs": [],
  4045. "source": [
  4046. "B = np.copy(A)"
  4047. ]
  4048. },
  4049. {
  4050. "cell_type": "code",
  4051. "execution_count": 177,
  4052. "metadata": {},
  4053. "outputs": [
  4054. {
  4055. "data": {
  4056. "text/plain": [
  4057. "array([[-5, 2],\n",
  4058. " [ 3, 4]])"
  4059. ]
  4060. },
  4061. "execution_count": 177,
  4062. "metadata": {},
  4063. "output_type": "execute_result"
  4064. }
  4065. ],
  4066. "source": [
  4067. "# 现在如果我们改变B,A不受影响\n",
  4068. "B[0,0] = -5\n",
  4069. "\n",
  4070. "B"
  4071. ]
  4072. },
  4073. {
  4074. "cell_type": "code",
  4075. "execution_count": 178,
  4076. "metadata": {},
  4077. "outputs": [
  4078. {
  4079. "data": {
  4080. "text/plain": [
  4081. "array([[10, 2],\n",
  4082. " [ 3, 4]])"
  4083. ]
  4084. },
  4085. "execution_count": 178,
  4086. "metadata": {},
  4087. "output_type": "execute_result"
  4088. }
  4089. ],
  4090. "source": [
  4091. "A"
  4092. ]
  4093. },
  4094. {
  4095. "cell_type": "markdown",
  4096. "metadata": {},
  4097. "source": [
  4098. "## 12. 遍历数组元素"
  4099. ]
  4100. },
  4101. {
  4102. "cell_type": "markdown",
  4103. "metadata": {},
  4104. "source": [
  4105. "通常,我们希望尽可能避免遍历数组元素(不惜一切代价)。原因是在像Python(或MATLAB)这样的解释语言中,迭代与向量化操作相比真的很慢。\n",
  4106. "\n",
  4107. "然而,有时迭代是不可避免的。对于这种情况,Python的For循环是最方便的遍历数组的方法:"
  4108. ]
  4109. },
  4110. {
  4111. "cell_type": "code",
  4112. "execution_count": 179,
  4113. "metadata": {},
  4114. "outputs": [
  4115. {
  4116. "name": "stdout",
  4117. "output_type": "stream",
  4118. "text": [
  4119. "1\n",
  4120. "2\n",
  4121. "3\n",
  4122. "4\n"
  4123. ]
  4124. }
  4125. ],
  4126. "source": [
  4127. "v = np.array([1,2,3,4])\n",
  4128. "\n",
  4129. "for element in v:\n",
  4130. " print(element)"
  4131. ]
  4132. },
  4133. {
  4134. "cell_type": "code",
  4135. "execution_count": 180,
  4136. "metadata": {},
  4137. "outputs": [
  4138. {
  4139. "name": "stdout",
  4140. "output_type": "stream",
  4141. "text": [
  4142. "row [1 2]\n",
  4143. "1\n",
  4144. "2\n",
  4145. "row [3 4]\n",
  4146. "3\n",
  4147. "4\n"
  4148. ]
  4149. }
  4150. ],
  4151. "source": [
  4152. "M = np.array([[1,2], [3,4]])\n",
  4153. "\n",
  4154. "for row in M:\n",
  4155. " print(\"row\", row)\n",
  4156. " \n",
  4157. " for element in row:\n",
  4158. " print(element)"
  4159. ]
  4160. },
  4161. {
  4162. "cell_type": "markdown",
  4163. "metadata": {},
  4164. "source": [
  4165. "当我们需要去\n",
  4166. "当我们需要遍历一个数组的每个元素并修改它的元素时,使用`enumerate`函数可以方便地在`for`循环中获得元素及其索引:"
  4167. ]
  4168. },
  4169. {
  4170. "cell_type": "code",
  4171. "execution_count": 181,
  4172. "metadata": {},
  4173. "outputs": [
  4174. {
  4175. "name": "stdout",
  4176. "output_type": "stream",
  4177. "text": [
  4178. "row_idx 0 row [1 2]\n",
  4179. "col_idx 0 element 1\n",
  4180. "col_idx 1 element 2\n",
  4181. "row_idx 1 row [3 4]\n",
  4182. "col_idx 0 element 3\n",
  4183. "col_idx 1 element 4\n"
  4184. ]
  4185. }
  4186. ],
  4187. "source": [
  4188. "for row_idx, row in enumerate(M):\n",
  4189. " print(\"row_idx\", row_idx, \"row\", row)\n",
  4190. " \n",
  4191. " for col_idx, element in enumerate(row):\n",
  4192. " print(\"col_idx\", col_idx, \"element\", element)\n",
  4193. " \n",
  4194. " # 更新矩阵:对每个元素求平方\n",
  4195. " M[row_idx, col_idx] = element ** 2"
  4196. ]
  4197. },
  4198. {
  4199. "cell_type": "code",
  4200. "execution_count": 164,
  4201. "metadata": {},
  4202. "outputs": [
  4203. {
  4204. "data": {
  4205. "text/plain": [
  4206. "array([[ 1, 4],\n",
  4207. " [ 9, 16]])"
  4208. ]
  4209. },
  4210. "execution_count": 164,
  4211. "metadata": {},
  4212. "output_type": "execute_result"
  4213. }
  4214. ],
  4215. "source": [
  4216. "# 现在矩阵里的每一个元素都已经求得平方\n",
  4217. "M"
  4218. ]
  4219. },
  4220. {
  4221. "cell_type": "markdown",
  4222. "metadata": {},
  4223. "source": [
  4224. "## 13. 向量化功能"
  4225. ]
  4226. },
  4227. {
  4228. "cell_type": "markdown",
  4229. "metadata": {},
  4230. "source": [
  4231. "正如前面多次提到的,为了获得良好的性能,我们应该尽量避免对向量和矩阵中的元素进行循环,而应该使用向量化算法。将标量算法转换为向量化算法的第一步是确保我们编写的函数使用向量输入。"
  4232. ]
  4233. },
  4234. {
  4235. "cell_type": "code",
  4236. "execution_count": 182,
  4237. "metadata": {
  4238. "collapsed": true
  4239. },
  4240. "outputs": [],
  4241. "source": [
  4242. "def Theta(x):\n",
  4243. " \"\"\"\n",
  4244. " 阶跃函数的普遍版本\n",
  4245. " \"\"\"\n",
  4246. " if x >= 0:\n",
  4247. " return 1\n",
  4248. " else:\n",
  4249. " return 0"
  4250. ]
  4251. },
  4252. {
  4253. "cell_type": "code",
  4254. "execution_count": 183,
  4255. "metadata": {
  4256. "scrolled": true
  4257. },
  4258. "outputs": [
  4259. {
  4260. "ename": "ValueError",
  4261. "evalue": "The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()",
  4262. "output_type": "error",
  4263. "traceback": [
  4264. "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
  4265. "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
  4266. "\u001b[0;32m<ipython-input-183-d55419725688>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mTheta\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
  4267. "\u001b[0;32m<ipython-input-182-5d4353a11383>\u001b[0m in \u001b[0;36mTheta\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0m阶跃函数的普遍版本\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \"\"\"\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
  4268. "\u001b[0;31mValueError\u001b[0m: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()"
  4269. ]
  4270. }
  4271. ],
  4272. "source": [
  4273. "Theta(np.array([-3,-2,-1,0,1,2,3]))"
  4274. ]
  4275. },
  4276. {
  4277. "cell_type": "markdown",
  4278. "metadata": {},
  4279. "source": [
  4280. "这个操作并不可行,因为所实现的 `Theta` 函数不能接收向量输入。\n",
  4281. "\n",
  4282. "为了得到向量化的版本,我们可以使用Numpy函数 `vectorize` 。在许多情况下,它可以自动向量化一个函数:"
  4283. ]
  4284. },
  4285. {
  4286. "cell_type": "code",
  4287. "execution_count": 184,
  4288. "metadata": {
  4289. "collapsed": true
  4290. },
  4291. "outputs": [],
  4292. "source": [
  4293. "Theta_vec = np.vectorize(Theta)"
  4294. ]
  4295. },
  4296. {
  4297. "cell_type": "code",
  4298. "execution_count": 185,
  4299. "metadata": {},
  4300. "outputs": [
  4301. {
  4302. "data": {
  4303. "text/plain": [
  4304. "array([0, 0, 0, 1, 1, 1, 1])"
  4305. ]
  4306. },
  4307. "execution_count": 185,
  4308. "metadata": {},
  4309. "output_type": "execute_result"
  4310. }
  4311. ],
  4312. "source": [
  4313. "Theta_vec(np.array([-3,-2,-1,0,1,2,3]))"
  4314. ]
  4315. },
  4316. {
  4317. "cell_type": "markdown",
  4318. "metadata": {},
  4319. "source": [
  4320. "我们也可以实现从一开始就接受矢量输入的函数(需要更多的计算,但可能会有更好的性能):"
  4321. ]
  4322. },
  4323. {
  4324. "cell_type": "code",
  4325. "execution_count": 187,
  4326. "metadata": {
  4327. "collapsed": true
  4328. },
  4329. "outputs": [],
  4330. "source": [
  4331. "def Theta(x):\n",
  4332. " \"\"\"\n",
  4333. " Heaviside阶跃函数的矢量感知实现。\n",
  4334. " \"\"\"\n",
  4335. " return 1 * (x >= 0)"
  4336. ]
  4337. },
  4338. {
  4339. "cell_type": "code",
  4340. "execution_count": 188,
  4341. "metadata": {},
  4342. "outputs": [
  4343. {
  4344. "data": {
  4345. "text/plain": [
  4346. "array([0, 0, 0, 1, 1, 1, 1])"
  4347. ]
  4348. },
  4349. "execution_count": 188,
  4350. "metadata": {},
  4351. "output_type": "execute_result"
  4352. }
  4353. ],
  4354. "source": [
  4355. "Theta(np.array([-3,-2,-1,0,1,2,3]))"
  4356. ]
  4357. },
  4358. {
  4359. "cell_type": "code",
  4360. "execution_count": 189,
  4361. "metadata": {},
  4362. "outputs": [
  4363. {
  4364. "name": "stdout",
  4365. "output_type": "stream",
  4366. "text": [
  4367. "[False False False True True True True]\n"
  4368. ]
  4369. },
  4370. {
  4371. "data": {
  4372. "text/plain": [
  4373. "array([0, 0, 0, 1, 1, 1, 1])"
  4374. ]
  4375. },
  4376. "execution_count": 189,
  4377. "metadata": {},
  4378. "output_type": "execute_result"
  4379. }
  4380. ],
  4381. "source": [
  4382. "a = np.array([-3,-2,-1,0,1,2,3])\n",
  4383. "b = a>=0\n",
  4384. "print(b)\n",
  4385. "b*1"
  4386. ]
  4387. },
  4388. {
  4389. "cell_type": "code",
  4390. "execution_count": 190,
  4391. "metadata": {},
  4392. "outputs": [
  4393. {
  4394. "data": {
  4395. "text/plain": [
  4396. "(0, 1)"
  4397. ]
  4398. },
  4399. "execution_count": 190,
  4400. "metadata": {},
  4401. "output_type": "execute_result"
  4402. }
  4403. ],
  4404. "source": [
  4405. "# 同样适用于标量\n",
  4406. "Theta(-1.2), Theta(2.6)"
  4407. ]
  4408. },
  4409. {
  4410. "cell_type": "markdown",
  4411. "metadata": {},
  4412. "source": [
  4413. "## 14. 在条件中使用数组"
  4414. ]
  4415. },
  4416. {
  4417. "cell_type": "markdown",
  4418. "metadata": {},
  4419. "source": [
  4420. "当在条件中使用数组时,例如`if`语句和其他布尔表达,一个需要用`any`或者`all`,这让数组任何或者所有元素都等于`True`。"
  4421. ]
  4422. },
  4423. {
  4424. "cell_type": "code",
  4425. "execution_count": 191,
  4426. "metadata": {},
  4427. "outputs": [
  4428. {
  4429. "data": {
  4430. "text/plain": [
  4431. "array([[1, 2],\n",
  4432. " [3, 4]])"
  4433. ]
  4434. },
  4435. "execution_count": 191,
  4436. "metadata": {},
  4437. "output_type": "execute_result"
  4438. }
  4439. ],
  4440. "source": [
  4441. "M = np.array([[1, 2], [3, 4]])\n",
  4442. "M"
  4443. ]
  4444. },
  4445. {
  4446. "cell_type": "code",
  4447. "execution_count": 192,
  4448. "metadata": {},
  4449. "outputs": [
  4450. {
  4451. "data": {
  4452. "text/plain": [
  4453. "True"
  4454. ]
  4455. },
  4456. "execution_count": 192,
  4457. "metadata": {},
  4458. "output_type": "execute_result"
  4459. }
  4460. ],
  4461. "source": [
  4462. "(M > 2).any()"
  4463. ]
  4464. },
  4465. {
  4466. "cell_type": "code",
  4467. "execution_count": 193,
  4468. "metadata": {},
  4469. "outputs": [
  4470. {
  4471. "name": "stdout",
  4472. "output_type": "stream",
  4473. "text": [
  4474. "at least one element in M is larger than 2\n"
  4475. ]
  4476. }
  4477. ],
  4478. "source": [
  4479. "if (M > 2).any():\n",
  4480. " print(\"at least one element in M is larger than 2\")\n",
  4481. "else:\n",
  4482. " print(\"no element in M is larger than 2\")"
  4483. ]
  4484. },
  4485. {
  4486. "cell_type": "code",
  4487. "execution_count": 194,
  4488. "metadata": {},
  4489. "outputs": [
  4490. {
  4491. "name": "stdout",
  4492. "output_type": "stream",
  4493. "text": [
  4494. "all elements in M are not larger than 5\n"
  4495. ]
  4496. }
  4497. ],
  4498. "source": [
  4499. "if (M > 5).all():\n",
  4500. " print(\"all elements in M are larger than 5\")\n",
  4501. "else:\n",
  4502. " print(\"all elements in M are not larger than 5\")"
  4503. ]
  4504. },
  4505. {
  4506. "cell_type": "markdown",
  4507. "metadata": {},
  4508. "source": [
  4509. "## 15. 类型转换"
  4510. ]
  4511. },
  4512. {
  4513. "cell_type": "markdown",
  4514. "metadata": {},
  4515. "source": [
  4516. "因为Numpy数组是*静态类型*,数组的类型一旦创建就不会改变。但是我们可以用`astype`函数(参见类似的“asarray”函数)显式地转换一个数组的类型到其他的类型,这总是创建一个新类型的新数组。"
  4517. ]
  4518. },
  4519. {
  4520. "cell_type": "code",
  4521. "execution_count": 195,
  4522. "metadata": {},
  4523. "outputs": [
  4524. {
  4525. "data": {
  4526. "text/plain": [
  4527. "dtype('int64')"
  4528. ]
  4529. },
  4530. "execution_count": 195,
  4531. "metadata": {},
  4532. "output_type": "execute_result"
  4533. }
  4534. ],
  4535. "source": [
  4536. "M.dtype\n"
  4537. ]
  4538. },
  4539. {
  4540. "cell_type": "code",
  4541. "execution_count": 197,
  4542. "metadata": {},
  4543. "outputs": [
  4544. {
  4545. "data": {
  4546. "text/plain": [
  4547. "array([[1., 2.],\n",
  4548. " [3., 4.]])"
  4549. ]
  4550. },
  4551. "execution_count": 197,
  4552. "metadata": {},
  4553. "output_type": "execute_result"
  4554. }
  4555. ],
  4556. "source": [
  4557. "M2 = M.astype(float)\n",
  4558. "\n",
  4559. "M2"
  4560. ]
  4561. },
  4562. {
  4563. "cell_type": "code",
  4564. "execution_count": 198,
  4565. "metadata": {},
  4566. "outputs": [
  4567. {
  4568. "data": {
  4569. "text/plain": [
  4570. "dtype('float64')"
  4571. ]
  4572. },
  4573. "execution_count": 198,
  4574. "metadata": {},
  4575. "output_type": "execute_result"
  4576. }
  4577. ],
  4578. "source": [
  4579. "M2.dtype"
  4580. ]
  4581. },
  4582. {
  4583. "cell_type": "code",
  4584. "execution_count": 199,
  4585. "metadata": {},
  4586. "outputs": [
  4587. {
  4588. "data": {
  4589. "text/plain": [
  4590. "array([[ True, True],\n",
  4591. " [ True, True]])"
  4592. ]
  4593. },
  4594. "execution_count": 199,
  4595. "metadata": {},
  4596. "output_type": "execute_result"
  4597. }
  4598. ],
  4599. "source": [
  4600. "M3 = M.astype(bool)\n",
  4601. "\n",
  4602. "M3"
  4603. ]
  4604. },
  4605. {
  4606. "cell_type": "markdown",
  4607. "metadata": {},
  4608. "source": [
  4609. "## 16. 进一步学习"
  4610. ]
  4611. },
  4612. {
  4613. "cell_type": "markdown",
  4614. "metadata": {},
  4615. "source": [
  4616. "* [NumPy 简易教程](https://www.runoob.com/numpy/numpy-tutorial.html)\n",
  4617. "* [NumPy 官方用户指南](https://www.numpy.org.cn/user/)\n",
  4618. "* [NumPy 官方参考手册](https://www.numpy.org.cn/reference/)\n",
  4619. "* [一个针对MATLAB使用者的Numpy教程](https://numpy.org/doc/stable/user/numpy-for-matlab-users.html)"
  4620. ]
  4621. }
  4622. ],
  4623. "metadata": {
  4624. "kernelspec": {
  4625. "display_name": "Python 3",
  4626. "language": "python",
  4627. "name": "python3"
  4628. },
  4629. "language_info": {
  4630. "codemirror_mode": {
  4631. "name": "ipython",
  4632. "version": 3
  4633. },
  4634. "file_extension": ".py",
  4635. "mimetype": "text/x-python",
  4636. "name": "python",
  4637. "nbconvert_exporter": "python",
  4638. "pygments_lexer": "ipython3",
  4639. "version": "3.5.4"
  4640. }
  4641. },
  4642. "nbformat": 4,
  4643. "nbformat_minor": 1
  4644. }

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。