|
Dėl puikių naujų "NumSharp" masyvo pjaustymo galimybių .NET bendruomenė yra vienu žingsniu arčiau galingos atvirojo kodo mašininio mokymosi platformos. Python yra mašininio mokymosi kalba iš dalies todėl, kad joje yra puikių bibliotekų, tokių kaip NumPy ir TensorFlow. Tačiau C# kūrėjams taip pat labai reikia galingų atvirojo kodo bibliotekų, skirtų mašininiam mokymuisi ir duomenų mokslui. "NumSharp", "SciSharp STACK" organizacijos "NumPy C#" prievadas, neseniai žengė didelį žingsnį į priekį, visiškai įdiegdamas pjaustymo galimybes, leidžiančias sukurti savavališkus N matmenų masyvų pogrupius kaip efektyvius neapdorotų duomenų rodinius. Dėl to tai yra naudingas įrankis naudojant C# mašininiam mokymuisi kartu su TensorFlow.NET.
Kas čia per didelis?
Jei nenaudojote "NumPy", tikriausiai nežinote, koks puikus pjaustymas. Python masyvai leidžia grąžinti masyvo gabalėlį indeksuojant elementų seriją taip: a[start:stop:step]. Tačiau tik įdiegus sudėtingą "NumPy" masyvą, pjaustymas tampa tikrai galinga duomenų manipuliavimo technika, be kurios neįsivaizduojamas mašininis mokymasis ar duomenų mokslas. Laimei, tiems, kurie negali ar nenori pereiti prie Python mašininiam mokymuisi (kurį aš taip pat sukūriau), "NumSharp" suteikia šią galimybę .NET pasauliui. Kaip vienas iš "NumSharp" kūrėjų, supažindinau jus su kai kuriais svarbiais pjaustymo naudojimo atvejais su kodo fragmentų pavyzdžiais C#. Atminkite, kad indeksavimas negali būti atliekamas C# taip pat, kaip Python dėl kalbos sintaksės skirtumų. Tačiau nusprendėme išlaikyti Python sintaksę pjūvių apibrėžimams, todėl naudojome eilutes, kad indeksuotume pjūvius C#. Peržiūrėkite šį pavyzdį, kad sužinotumėte, kiek "NumSharp" yra arti "NumPy".
Iškirpkite stulpelį iš matricos Python/NumPyKai parašyta C# su NumSharp, kodas yra beveik identiškas. Atkreipkite dėmesį, kad segmentai indeksuojami šiek tiek kitaip, naudojant eilutes kaip indeksavimo priemonės parametrus.
Iškirpkite stulpelius iš matricos C#/NumSharpKaip matote, "NumSharp" komanda įdėjo daug pastangų, kad kodas būtų kuo panašesnis į Python. Tai labai svarbu, nes tokiu būdu esamą Python kodą, kuris remiasi NumPy, dabar galima lengvai perkelti į C#.
Naudojimo atvejis: naudokite kelis tų pačių duomenų rodinius
Galimybė perduoti tik vietines pagrindinių duomenų dalis (t. y. mažas didelių vaizdų dalis) į funkcijas ir iš jų nekopijuojant yra labai svarbi vykdymo laiko našumui, ypač dideliems duomenų rinkiniams. Pjūviai indeksuojami naudojant vietines koordinates, todėl jūsų algoritmui nereikia žinoti pasaulinės duomenų struktūros, todėl efektyviai supaprastinamas jūsų gyvenimas ir užtikrinamas maksimalus našumas, nes išvengiama nereikalingo dubliavimo.
Naudojimo atvejai: reti rodiniai ir rekursyvus pjaustymas
Retą masyvo vaizdą galima sukurti nurodant veiksmus, esančius už pjūvio diapazono pradžios ir pabaigos. Kiek žinau, net C # 8.0 su nauja masyvo slice sintaksė negali to padaryti. Ši funkcija tampa labai svarbi dirbant su persipynusiais duomenimis. Galite sukurti savo algoritmą taip, kad jis apdorotų nuolatinius duomenis ir pateikti jam retas dalis, imituojančias nuolatinius duomenų šaltinius, sumažindami algoritmo sudėtingumą.
Pjaustymą galima pjaustyti toliau, o tai yra labai svarbi funkcija, jei dirbate su didelių matmenų duomenimis. Tai taip pat padeda sumažinti algoritmo sudėtingumą, nes rekursyviai pjaustydami galite sumažinti duomenų matmenis.
Naudojimo atvejis: efektyviai apdorokite didelių matmenų duomenis
Jei jums reikia galvoti apie duomenų masyvą kaip apie tūrį ir dirbti su jo dalimis neatliekant neįtikėtinų koordinačių transformacijos skaičiavimų, tada .reshape() yra jūsų draugas. Visi masyvai, sukurti arba pjaustymo operacijų yra .reshape() tik pradinių duomenų rodinys. Kai kartojate, skaitote arba rašote elementus rodinyje, pasiekiate neapdorotų duomenų masyvą. "NumSharp" skaidriai atlieka atitinkamas indekso transformacijas, todėl galite indeksuoti skilteles su santykinėmis koordinatėmis.
Naudojimo atvejis: pakeiskite elementų tvarką be papildomų išlaidų
Pjūviai, naudojantys neigiamus žingsnius, iš tikrųjų pakeičia pjūvių tvarką. Jo privalumas yra tas, kad tam nereikia kopijuoti ar išvardyti duomenų, kaip ir IEnumerable.Reverse(). Skirtumas tas, kad rodinyje (operacijos rezultatas a["::-1"]) duomenys rodomi atvirkštine tvarka, ir jūs galite indeksuoti tą apverstą seką jų neišvardindami.
Naudojimo atvejis: sumažinkite sudėtingumą sumažindami matmenis
Dirbant su didelių matmenų duomenimis, tų duomenų algoritmai taip pat gali tapti labai sudėtingi. Naudojant galima išvesti bet kokį didelių matmenų tūrį. Kai ToString() NumSharp metodas NDArray, pastebėjau, koks paprastas ir gražus algoritmas tapo sistemingai ir rekursyviai pjaustant ND tomus į (N-1)D tomus ir t.t. Šis "skaldyk ir valdyk" metodas grąžina mažų matmenų subtomus, supjaustydamas diapazono simbolius naudojant "NumSharp" indekso simbolius. Diapazono simbolis ir rodyklės simbolisDiapazono simbolis ["start:stop:step"] leidžia pasiekti tam tikro tomo subdiapazoną su tuo pačiu matmeniu. Taigi, net jei iškirpsite tik vieną 2D matricos stulpelį, vis tiek gausite 2D matricą tik su vienu stulpeliu. Štai trumpas C# kodo gabalas, kuris tai parodo:
Supjaustykite stulpelį naudodami diapazono simbolį
Rodyklės simbolis suteikia (N-1) matmenų pjūvį nurodytoje N matmenų pirminio tūrio vietoje. Taigi iškirpus stulpelį iš 2D matricos naudojant indekso simbolius, gaunamas 1D vektorius:
Stulpelių skaidymas naudojant rodyklės simbolius
Jei nematėte skirtumo iš pirmo žvilgsnio, čia yra du aukščiau esantys apibrėžimai, ange[":,2:3"] vs index[":,2"], kurie turi didelę įtaką rezultatams. Visą nuorodą į naują pjūvio simbolį galima rasti NumSharp wiki.
Pastaba: <T>ArraySlice
Įgyvendindamas N-dimensijų rodinių pjaustymą, padariau išvadą, kad jis gali būti įdomus daugeliui kitų .NET sričių, todėl suskaidžiau jį į savo atskirą biblioteką, vadinamą SliceAndDice. Jis pasižymi lengvu įvyniojimu, skirtu indeksuoti bet kokią C# duomenų struktūrą (pvz., arba) ArraySlice<T>, ir leidžia naudoti tuos pačius pertvarkymo, pjaustymo ir peržiūros mechanizmus be visų kitų sunkių skaitinių skaičiavimų. Norint pasiekti puikias pjaustymo galimybes, reikia tik kelių šimtų kodo eilučių! T[]IList<T>
Apvyniojimas
"NumSharp" neseniai buvo suteiktas tas pats pjaustymo ir peržiūros mechanizmas, todėl "NumPy" neabejotinai yra viena iš svarbiausių bibliotekų Python mašininio mokymosi ekosistemoje. "SciSharp STACK" yra atvirojo kodo organizacija, kurią sudaro nedidelis skaičius kvalifikuotų kūrėjų, kurie labai sunkiai dirbo, kad tas pačias funkcijas įdiegtų .NET pasaulyje. Naujausi "NumSharp" patobulinimai yra svarbus kertinis akmuo siekiant šio tikslo. Originalus:Hipersaito prisijungimas matomas.
|