Hmmm, dit lyk hierdie quoteasy te funksioneer implementquot is eintlik redelik maklik om te kry verkeerd en het 'n goeie gesprek oor geheue doeltreffendheid bevorder. I39m gelukkig om opblaas het as dit beteken dat die wete dat something39s is reg gedoen. â € Richard September 20 14 by 19:23 NumPys gebrek aan 'n spesifieke domein-spesifieke funksie is dalk te danke aan die Core Spanne dissipline en getrouheid aan NumPys eerste aanwysing: bied 'n N-dimensionele skikking tipe. asook funksies vir die skep, en kruip die skikkings. Soos baie fundamentele doelwitte, hierdie een is nie klein en Numpy doen dit briljant. Die (baie) groter Scipy bevat 'n veel groter versameling van domein-spesifieke biblioteke (genoem subpakette insluit deur Scipy devs) - byvoorbeeld, numeriese optimalisering (optimaliseer), sein Verwerk (sein), en integraalrekening (integreer). My raaiskoot is dat die funksie wat jy soek is in ten minste een van die Scipy subpakette insluit (scipy. signal miskien) Maar ek sal eers kyk in die versameling van Scipy scikits. identifiseer die relevante scikit (s) en kyk vir die funksie van belang daar. Scikits is (bv scikits-beeld. Scikits-leer. Ens) onafhanklik van mekaar ontwikkel pakkette wat gebaseer is op Numpy / Scipy en gerig word aan 'n bepaalde tegniese dissipline Verskeie van hulle was (in die besonder, die ontsagwekkende OpenOpt vir numeriese optimalisering) is hoog aangeskryf, volwasse projekte lank voor die keuse onder die relatief nuwe scikits rubriek te woon. Die Scikits tuisblad graag bogenoemde lyste ongeveer 30 sulke scikits. al ten minste 'n paar van diegene nie meer onder aktiewe ontwikkeling. Na aanleiding van hierdie raad sal jy egter lei tot scikits-tijdreeksen, wat pakket is nie meer onder aktiewe ontwikkeling In effek, het Pandas geword, AFAIK, die de facto Numpy - gebaseerde tydreekse biblioteek. Pandas het verskeie funksies wat gebruik kan word om 'n bewegende gemiddelde die eenvoudigste van hierdie is waarskynlik rollingmean bereken. wat jy gebruik soos so: Nou, net noem die funksie rollingmean verby in die reeks voorwerp en 'n venster grootte. wat in my voorbeeld hieronder is 10 dae. bevestig dat dit gewerk het - Bv. in vergelyking waardes 10 - 15 in die oorspronklike reeks teenoor die nuwe reeks reëlmatige met rollende beteken Die funksie rollingmean, saam met ongeveer 'n dosyn of so ander funksie is informeel gegroepeer in die dokumentasie Pandas onder die rubriek beweeg venster funksies 'n tweede, wat verband hou groep funksies in Pandas word na verwys as eksponensieel-gelaaide funksies (bv ewma. wat eksponensieel bereken beweeg geweegde gemiddelde). Die feit dat hierdie tweede groep is nie ingesluit in die eerste (bewegende venster funksies) is miskien omdat die eksponensieel-geweeg transforms hoef staatmaak op 'n vaste-lengte windowOur eerste stap is om 'n grafiek wat die gemiddeldes van twee skikkings plot. Let8217s skep twee skikkings x en y en plot hulle. x sal 1 deur middel van 10. en y sal daardie selfde elemente in 'n ewekansige volgorde insluit. Dit sal ons help om te bevestig dat inderdaad ons gemiddelde korrek is. Let8217s dit enige aan die orde van ons elemente in y weer en plot weer: Met betrekking tot y let8217s sien hoe die bewegende gemiddelde Behandel hom: In die volgende tutoriaal sal ons die bewegende gemiddeldes plot. Deel hierdie: Soos hierdie: Verwante Post navigasie Laat 'n antwoord Kanselleer antwoord d bloggers soos hierdie: Ons het vroeër bekend hoe om bewegende gemiddeldes met Python skep. Hierdie handleiding sal 'n voortsetting van hierdie onderwerp wees. 'N bewegende gemiddelde in die konteks van statistieke, ook bekend as 'n rollende / hardloop gemiddelde, is 'n tipe van eindige impulsrespons. Let8217s plot x teen die bewegende gemiddelde van y dat ons yma sal roep:: In ons vorige tutoriaal het ons die waardes van die skikkings x en y geplot Eerstens let8217s gelyk die lengte van beide skikkings: En om dit in konteks te wys: Die gevolglike grafiek: Om te help verstaan dit, let8217s plot twee verskillende verhoudings: x vs y en x vs mag: die bewegende gemiddelde hier is die groen plot wat begin by 3: Deel hierdie: Soos hierdie: Verwante Post navigasie Laat 'n antwoord Kanselleer antwoord Baie nuttig Ek wil graag die laaste deel lees op groot datastelle Hoop dit sal soon8230 d bloggers soos hierdie kom: In my laaste sin Ek het probeer om aan te dui waarom dit help swaai punt fout. As twee waardes is min of meer dieselfde orde van grootte, dan voeg hulle minder presisie verloor as wanneer jy 'n baie groot aantal by 'n baie klein een. Die kode kombineer quotadjacentquot waardes op 'n wyse dat selfs intermediêre somme altyd redelik naby in grootte moet wees, om die drywende punt fout te minimaliseer. Niks is fool proof maar hierdie metode het 'n paar baie swak geïmplementeer projekte in produksie gered. â € Mayur Patel 15 Desember 14 by 17:22 Alleo: In plaas van doen 'n toevoeging per waarde, you39ll doen twee. Die bewys is dieselfde as die bietjie daarby probleem. Maar die punt van hierdie antwoord is nie noodwendig prestasie, maar presisie. Geheue gebruik vir gemiddeld 64-bit waardes sou nie meer as 64 elemente in die kas, so it39s vriendelike in geheue gebruik sowel. â € Mayur Patel 29 Desember 14 by 17:04 UPD: meer doeltreffende oplossings is deur Alleo en jasaarim voorgestel. Jy kan np. convolve gebruik vir die volgende: Die modus argument spesifiseer hoe om die rande te hanteer. Ek het die geld af hier, want ek dink dis hoe die meeste mense verwag hardloop gemiddelde om te werk, maar jy kan ander prioriteite het. Hier is 'n plot wat die verskil tussen die modes illustreer: Jy kan 'n lopende bereken bedoel met: Gelukkig Numpy sluit 'n oprollen funksie wat ons kan gebruik om dinge te bespoedig. Die lopende gemiddelde is gelykstaande aan convolving x met 'n vektor wat N lang, met alle lede gelyk aan 1 / N. Die Numpy implementering van oprollen sluit die begin verbygaande, sodat jy die eerste N-1 punte te verwyder: Op my rekenaar, die vinnige weergawe is 20-30 keer vinniger, afhangende van die lengte van die insette vektor en grootte van die gemiddelde venster . Let daarop dat oprollen insluit 'n dieselfde modus wat lyk asof dit die begin verbygaande kwessie moet aanspreek, maar dit split dit tussen die begin en einde. Dit verwyder die verbygaande van die einde, en die begin doesn39t een het. Wel, ek dink it39s 'n kwessie van prioriteite, ek don39t dieselfde aantal resultate moet op die koste om 'n helling na nul dat isn39t daar in die data. BTW, hier is 'n opdrag aan die verskil tussen die modes vertoon: modes (39full39, 39same39, 39valid39) plot (oprollen (kinders ((200,)), kinders ((50,)) 4750, modem)) vir m in modes as (-10, 251, -.1, 1.1) legende (modes, loc39lower center39) (met pyplot en Numpy ingevoer). â € lapis 24 Maart 14 by 13:56 I39m altyd vererg deur seinverwerking funksie wat uitset seine van verskillende vorm terug te keer as die insetseine wanneer beide insette en uitsette is van dieselfde aard (bv beide temporale seine). Dit breek die korrespondensie met verwante onafhanklike veranderlike (bv tyd, frekwensie) maak plot of vergelyking nie 'n direkte saak. In elk geval, as jy die gevoel te deel, kan jy die laaste reëls van die voorgestelde funksie as ynp. convolve (w / w. sum (), S, mode39same39) terugkeer ywindowlen-1 :-( windowlen-1) uitvoering maak Christelike verander O39Reilly 25 Augustus 15 by 19:56 lapis Ja, maar kan sê dat jy cumsum metode gebruik op die eerste blok en stoor jou rollende gemiddelde skikking vir die volgende blok. elke tik daarna moet jy net die nuutste bewegende gemiddelde waarde voeg tot jou rollende verskeidenheid in die stoor. Die gebruik van hierdie metode you39re nie herbereken dinge you39ve reeds bereken: Op die eerste regmerkie cumsum jy daarna jou net voeg die quotmean van die laaste tydperk elementsquot wat vinniger vir alle daaropvolgende bosluise is 2x. â € litepresence 10 Junie by 12: 29Suggestion: gly venster Function 7753 Die gebruik van np. lib. stridetricks. asstride kan 'n mens 'n gly venster wat segmente 'n skikking as 'n preprocessing stap vir vectorized aansoeke baie doeltreffend te skep. Byvoorbeeld 'n bewegende gemiddelde van 'n venster lengte 3. stepsize 1: Dit is baie performante maar baie moeilik om te doen, as die parameters vorm en vordering is baie moeilik om te verstaan. Ek stel voor die implementering van 'n eenvoudige slidingwindow funksie wat die werk van die uitzoeken die twee parameters vir jou doen. beide wat dit baie meer leesbare. Aangesien dit is 'n algemene usecase in vectorized rekenaar Ek stel voor ons 'n soortgelyke funksie in Numpy self. Met betrekking tot waaraan uitvoering te volg, hulle is albei aanvaar verskillende dinge, maar kan jy dieselfde ding uiteindelik doen: skyfies oor een as net laat opstel windowsize en stepsize opbrengste verskeidenheid met dimensie N1 gly oor 'n paar byle vereis twee oproepe (wat kom gratis want daar is geen geheue bijgesteld) het 'n onnodige kopie parameter wat verwyder kan word en vervang word deur die aanbring van. copy () na die oproep skyfies oor die hele byle gelyktydig, is venster lengtes gegee as tuple parameter neem 'n stepsize een in alle rigtings terug skikking met dimensie N2 stepsize nie gelyk aan een vereis sny van uitset data (onseker of dit impliseer kopiëring data) Versper gly oor axisn vereis dat jy n argument stel wshapen 1 of wshapen a. shapen dit beteken vir buigsame stepsize die volgende is ekwivalent (met 'n paar klein fout in slidingwindow daar), want gly oor een as die volgende is ekwivalent (met 'n paar transponering en smaller): en vir gly oor twee as die volgende is ekwivalent: Hierdie kwessie is oor vonkend gesprek oor het ons so 'n funksie Watter eienskappe word vereis Watter nodig koppelvlak moet ons te streef na bespreking Ek is bereid om op te stel 'n trek versoek met 'n uitvoering wat ons ooreengekom op. Terwyl jy 'n gly venster met stride truuks is baie cool, implementering byna enige funksie deur Vectorizing bo-op dit is ondoeltreffend. Ek is nie seker of dit 'n goeie idee om 'n funksie wat mense aanmoedig om daardie roete gaan voorsien, wanneer daar 'funksie in pandas, bottelnek en scipy. ndimage dat hoe meer tipiese gebruik gevalle doeltreffend implemente. Jaime Op Vrydag, 17 Junie 2016 by 13:29, Nils Werner. gt geskryf: Gebruik np. lib. stridetricks. asstride kan 'n mens 'n gly venster baie doeltreffend te skep wat segmente 'n skikking as 'n preprocessing stap vir vectorized aansoeke. Byvoorbeeld 'n bewegende gemiddelde van 'n venster lengte 3, stepsize 1: 'n numpy. arange (10) astrided numpy. lib. stridetricks. asstrided (a, vorm (8, 3), vordering (8, 8)) Print numpy. mean (astrided, axis1) Dit is baie performante maar baie moeilik om te doen, as die parameters vorm en vordering is baie moeilik om te verstaan. Ek stel voor die implementering van 'n eenvoudige slidingwindow funksie wat die werk van die uitzoeken die twee parameters vir jou doen. Die implementering ek het al met behulp vir jare ltgist. github / Nils-Werner / 9d321441006b112a4b116a8387c2280c GT laat die hoër te vervang deur 'n numpy. arange (10) astrided slidingwindow (a, size3, stepsize1) Print numpy. mean (astrided, axis1) teoliphant ltgithub / teoliphant GT het ook 'n uitvoering ltgist. github / teoliphant / 96eb779a16bd038e374f2703da62f06d GT dat bogenoemde sal verander na 'n numpy. arange (10) astrided arrayforslidingwindow (a, 3) Druk numpy. mean (astrided, axis1) beide die maak dit baie meer leesbare. Aangesien dit is 'n algemene usecase in vectorized rekenaar Ek stel voor ons 'n soortgelyke funksie in Numpy self. Met betrekking tot waaraan uitvoering te volg, hulle is albei aanvaar verskillende dinge, maar kan jy dieselfde ding uiteindelik doen: slidingwindow - skyfies oor een as net - laat opstel windowsize en stepsize - gly oor 'n paar byle twee oproepe (wat kom gratis as vereis daar is geen nagedagtenis bijgesteld) - het 'n onnodige kopie parameter wat verwyder kan word en vervang word deur die aanbring van. copy () na die oproep arrayforslidingwindow - skyfies oor die hele byle gelyktydig, is venster lengtes gegee as tuple parameter - neem 'n stepsize een in alle rigtings - stepsize nie gelyk aan een vereis sny van uitset data (onseker of dit impliseer kopiëring data) - Versper gly oor axisn vereis dat jy ingestel argument wshapen a. shapen dit beteken vir buigsame stepsize die volgende is ekwivalent (met 'n paar klein fout in slidingwindow daar) : 'n numpy. arange (10) Druk slidingwindow (a, size3, stepsize2) 'n numpy. arange (10) Druk arrayforslidingwindow (a, 3) :: 2. Stepsize 2 deur die val van elke 2de ry vir gly oor een as die volgende is ekwivalent (met 'n paar transponering): 'n numpy. arange (25).reshape (5, 5) Druk slidingwindow (a, size3, axis1) 'n numpy. arange ( 25).reshape (5, 5) Druk arrayforslidingwindow (a, (5, 3)) en vir gly oor twee as die volgende is ekwivalent: 'n numpy. arange (25).reshape (5, 5) Druk slidingwindow (slidingwindow ( 'n, size3, axis0), size2, axis1) 'n numpy. arange (25).reshape (5, 5) Druk arrayforslidingwindow (a, (3, 2)) Hierdie kwessie is oor vonkend gesprek oor - het ons so 'n funksie moet - Watter eienskappe word benodig - Watter koppelvlak moet ons te streef na bespreking Ek is bereid om op te stel 'n trek versoek met 'n uitvoering wat ons ooreengekom op. Jy ontvang hierdie omdat jy ingeskryf is op hierdie draad. Antwoord op hierdie e-pos direk, sien dit op GitHub lt7753 GT, of stom die draad ltgithub / kennisgewings / unsubscribe / ADMGdnU4Geecqxo3EP7gTFhkKQF8ovzeks5qMoU1gaJpZM4I4RX9 GT. - (/) (O. o) (GT lt) Este es CONEJO. Copia n CONEJO af tu firma y aydale af sus vliegtuie de dominacin Mundial. Die voorbeeld is natuurlik net gekies om die voorbeeld so klein as moontlik te hou. Ek is nie seker ek verstaan waarom byna elke funksie op die top van wat sou dit ondoeltreffend wees. Nog 'n voorbeeld, die berekening van die spektrogram van 'n sein, waar die gly venster is gt2x vinniger as 'n for-lus (plus die gly venster implementering word makliker om te lees en ontfout): Dit is nie dieselfde as 'n voorbeeld, maar sê jy het 'n skikking met n items en jy wil FFT's van grootte m uit te voer op 'n gly venster daaroor. Die kompleksiteit van jou bedrywighede gaan O (n m log m). Maar, sodra jy die eerste FFT bereken, jy hoef nie al die berekeninge te doen. Sê x is jou oorspronklike skikking, en y die FFT vir 'n sekere gly venster, en Z vir die gly venster 'n stap van grootte een verdere. Afgesien van die veelvuldige af deur een foute ek waarskynlik maak, jy kan iets soos te doen: yk som (xi exp (-2 pi 1J ki / m vir i in die reeks (0, m)) ZK som (xi exp (-2 pi 1J k (i - 1) / m vir i in die reeks (1, m1)) ZK (yk - x0 xm exp (-2 pi 1J k)) exp (2 pi 1J k / m) en al van 'n skielike jy is die berekening van elke nuwe FFT betyds O (m) in plaas van O (m log m), wat beteken dat die algehele kompleksiteit van jou berekening is nou O (m (n teken m)), wat gaan 'n faktor log m vinniger as die naïef oplossing. jou helfte oorvleuel FFT's is eintlik die laaste stap van die FFT algoritme, was FFT's van grootte n bestaan uit 2 FFT's van grootte n / 2, sodat 'n doeltreffende algoritme vir jou probleem sal wees. vir baie probleme op 'n gly venster is daar soortgelyke slim benaderings wat die berekeninge baie aansienlik vinniger maak. En die vrees is dat, deur die bevordering van die gebruik van 'n gly venster benadering, sal ons lei gebruikers op die pad van 'n maklike 2x speedup, eerder as om die wees gespesialiseerde 10x of 100x speedup. Jaime Op Dinsdag, 21 Junie 2016 by 13:15, Nils Werner. gt geskryf: Die voorbeeld is natuurlik net gekies om die voorbeeld so klein as moontlik te hou. Ek is nie seker ek verstaan waarom byna elke funksie op die top van wat sou dit ondoeltreffend wees. Nog 'n voorbeeld, die berekening van die spektrogram van 'n sein, waar die gly venster is gt2x vinniger as 'n for-lus: invoer tyd invoer Numpy invoer scipy. signal invoer matplotlib. pyplot as PLT Winlen 256 stepsize Winlen // 2 siglen 44100 10 Die gebruik van gly venster begin time. clock () n numpy. sin (numpy. arange (siglen) 2 numpy. pi 16000 / 44.100,0) 'n slidingwindow (a, sizewinlen, stepsizestepsize) B numpy. fft. fft (a scipy. signal. windows. hamming (Winlen ), axis1) Print time. clock () - begin 0,037622 op my rekenaar gebruik van vir lus begin time. clock () n numpy. sin (numpy. arange (siglen) 2 numpy. pi 16000 / 44.100,0) idxlist reeks (0, Len (a) - winlen, stepsize) C numpy. zeros ((Len (idxlist), Winlen), dtypecomplex) vir o, ek in opsom (idxlist): Co numpy. fft. fft (ai: iwinlen scipy. signal. windows. hamming (Winlen)) Print time. clock () - begin 0,080116 op my rekenaar druk numpy. allclose (B, C) Ware plt. imshow (numpy. abs (B)) plt. figure () plt. imshow (Numpy. ABS (C)) plt. show () jy is die ontvangs, want jy kommentaar. Antwoord op hierdie e-pos direk, sien dit op GitHub lt7753 (kommentaar) GT, of stom die draad ltgithub / kennisgewings / unsubscribe / ADMGdr2DYofUpnyTLuOf-jQ9lpsU3Ldks5qN8fqgaJpZM4I4RX9 GT. - (/) (O. o) (GT lt) Este es CONEJO. Copia n CONEJO af tu firma y aydale af sus vliegtuie de dominacin Mundial. Ja, mag jy in staat wees om 'n oorvleueling FFT optimaliseer die manier. Weereens, ek praat nie van 'n spesifieke usecase hier. Dit pyn my om dit te sê, maar ek is op soek na dinge uit die snelle prototipe wetenskaplike kode kant van die saak. Ek het nog oor wetenskaplike kode wat eintlik nie so 'optimalisaties en nie die geval is net gaan af in die maklike deel en Vectorize pad te kom. Wanneer ek probeer 'n paar random idee ek moes ek stel nie belang in voortydig optimalisering my gelek bedrywighede, ek wil net dit redelik vinnig en onderhou vir so min koste as moontlik wees. A vir lus is vir my nie: Die kode is moeilik om te lees en dit sal stadig wees. Jou oplossing is vir my net een: Dit kan vinnig skree, maar is naby onmoontlik om vinnig Itereer op of in stand te hou deur nie-CS-ingenieurs of laat staan studente. 'N gly venster implementering verwyder die meeste van die vir lusse en off-vir-een foute en terselfdertyd kan 'n redelike speedup voorsien. Wanneer dit gaan om die werklike produksie kode met meer onderhouers en toetse en 'n paar innerlike sirkelroetes gedoen in C jou implementering natuurlik maak meer sin. Ag geneem word dat beide Scipy en hul spektrogram verwante funksies matplotlib implementeer met behulp van presies hierdie benadering eerder as 'n meer doeltreffende benadering, dit lyk asof ons reeds op hierdie pad gegaan. Ek dink daar is twee probleme met die gebruik van meer doeltreffende benaderings. In die eerste plek is dit vereis verskillende benaderings vir enige berekening wat jy dalk wil om dit te doen. Tweedens, dit verg iemand om al hierdie spesiale gevalle eintlik implementeer. Ag geneem word dat selfs in die sogenaamde ooglopende geval met FFT niemand het optrek om dit te doen, nie die geval is dit blyk dat dit gebeur. Ek dink die eenvoudigste benadering sou nie soseer wees om spesiale funksies te skep vir elke berekening kan jy dalk nie, maar eerder 'n enkele funksie wat die lengte venster oorvleuel, 'n moontlike venster, en 'n funksie neem skep. Dit sou dan gebruik vordering na die korrekte vorm te skep, dan aansoek doen by die venster (indien enige), dan is die funksie toe te pas. matplotlib en Scipy is reeds besig met die eerste twee stappe, sodat dit maklik is om hul kode vertaal in 'n algemene funksie wat kan werk met 'n funksie wat 'n vektor neem sou wees. Om heeltemal oop wees, ek geïmplementeer die strided benadering in matplotlib, maar voordat dit weer met behulp van dieselfde algoritme geïmplementeer met behulp van 'n lus, so dit was 'n verbetering op wat voor bestaan. Hierdie funksie is ook herhaal scikit-beeld (viewaswindows) en in scikit-leer (extractpatches). Ook, as 'n nuwe gerief funksie onder numpy. lib. stridetricks sou leef dit nie Ek dink gebruikers meer aangemoedig om 'n so 'n benadering as wat hulle reeds is gebruik.
Comments
Post a Comment