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

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