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

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