|
Tänu NumSharpi suurepärastele uutele massiivi lõikamise võimalustele on .NET kogukond sammu võrra lähemal võimsale avatud lähtekoodiga masinõppe platvormile. Python on masinõppe keel osaliselt seetõttu, et seal on suurepärased teegid nagu NumPy ja TensorFlow. Kuid C# arendajatel on suur vajadus võimsate avatud lähtekoodiga teekide järele masinõppe ja andmeteaduse jaoks. NumSharp, SciSharp STACK organisatsiooni NumPy C# port, on hiljuti astunud suure sammu edasi, rakendades täielikult lõikamisvõimalusi, võimaldades luua suvalisi alamhulki N-mõõtmelistest massiividest kui tõhusaid toorandmete vaateid. See teeb sellest kasuliku tööriista C# kasutamiseks masinõppes koos TensorFlow.NET-ga.
Mis selles siis nii erilist on?
Kui sa pole NumPy-d kasutanud, siis sa ilmselt ei tea, kui hea lõikamine on. Python massiivid võimaldavad tagastada massiivi viilu, indekseerides hulga elemente järgmiselt: a[start:stop:step]. Kuid ainult NumPy keeruka massiivi rakendusega muutub lõikamine tõeliselt võimsaks andmetöötluse tehnikaks, ilma milleta masinõpe või andmeteadus oleks mõeldamatu. Õnneks neile, kes ei saa või ei taha masinõppe jaoks Pythonile üle minna (mida mina samuti tegin), toob NumSharp selle võimaluse .NET maailma. NumSharpi arendajana tutvustasin teile olulisi lõikamise kasutusjuhtumeid, kasutades näidiskoodilõike C#-is. Pane tähele, et indekseerimist ei saa teha C#-s samamoodi nagu Pythonis, kuna keelesüntaksis on erinevusi. Kuid otsustasime jätta Python'i süntaksi lõikude definitsioonide jaoks, nii et kasutasime stringe viilude indekseerimiseks C#-s. Vaata seda näidet, et näha, kui lähedal on NumSharp NumPy-le.
Lõika veergu maatriksist välja Python/NumPyKui kirjutada C#-s koos NumSharpiga, on kood peaaegu identne. Pane tähele, et viile indekseeritakse veidi erinevalt, kasutades indekseerija parameetritena stringe.
Lõika veerud välja maatriksist C#/NumSharpisNagu näha, on NumSharpi meeskond panustanud palju selle loomisele, et muuta kood võimalikult sarnaseks Pythonile. See on väga oluline, sest nii saab olemasolevat Python'i koodi, mis tugineb NumPy-le, nüüd hõlpsasti C#-le portida.
Kasutusjuhtum: Kasuta sama andme mitut vaadet
Võimalus edastada ainult kohalikke andmeid (st väikesed suured pilditükid) funktsioonidesse ja välja ilma kopeerimiseta on käitusaegse jõudluse seisukohalt kriitiline, eriti suurte andmekogumite puhul. Lõigud indekseeritakse kohalike koordinaatide abil, nii et algoritm ei pea teadma andmete globaalset struktuuri, mis lihtsustab teie elu ja tagab maksimaalse jõudluse, sest välditakse tarbetut dubleerimist.
Kasutusjuhtumid: Hõredad vaated ja rekursiivne lõikamine
Massiivi hõreda vaate saab luua, määrates sammud viiluvahemiku algusest ja lõpust kaugemale. Nii palju kui mina tean, ei suuda isegi C# 8.0 uue massiivi viilusüntaksiga seda teha. See omadus muutub väga oluliseks vahelduvate andmete puhul. Saad oma algoritmi kujundada pidevate andmete töötlemiseks ja pakkuda sellele hõredaid viilu, mis jäljendavad pidevaid andmeallikaid, minimeerides algoritmi keerukust.
Lõikamist saab veelgi kaugemale lõigata, mis on väga oluline omadus, kui tegemist on kõrge dimensiooniga andmetega. See aitab ka algoritmi keerukust vähendada, kuna andmete dimensioonilisust saab vähendada rekursiivse lõikamisega.
Kasutusjuhtum: Tõhus töötle kõrgdimensionaalseid andmeid
Kui pead mõtlema andmemassiivi kui mahtu ja töötama selle osadega ilma uskumatuid koordinaatide teisenduse arvutusi, siis .reshape() on sinu sõber. Kõik massiivid, mis on loodud või lõikavad operatsioonid, on .reshape() lihtsalt algandmete vaade. Kui sa iteratsioonid, loed või kirjutad elemente vaatesse, pääsed ligi toorandmete massiivile. NumSharp teeb läbipaistvalt sobivad indeksi teisendused, nii et saad indekseerida lõike suhteliste koordinaatidega.
Kasutusjuhtum: Elementide järjekorra pööramine ilma lisakuludeta
Negatiivsete sammudega viilud pööravad tegelikult viilude järjekorda vastupidiseks. Selle eeliseks on see, et selleks ei pea andmeid kopeerima ega loendama, nagu IEnumerable.Reverse(). Erinevus seisneb selles, et vaade (operatsiooni a["::-1"]) tulemus kuvab andmed vastupidises järjekorras ja saad indekseerida selle ümberpööratud jada ilma seda loetlemata.
Kasutusjuhtum: Keerukuse vähendamine mõõtmete vähendamisega
Töötades kõrge dimensiooniga andmetega, võivad algoritmid muutuda väga keeruliseks. Kasutuses võib väljundiks olla mistahes kõrge mõõtmelise mahtu. Kui ToString() kasutas NumSharp meetodit NDArray, märkasin, kui lihtne ja kaunis algoritm on muutunud, lõigates ND-ruumalad süsteemselt ja rekursiivselt (N-1)D ruumaladeks jne. See jaga-ja-valitse lähenemine tagastab madala dimensiooniga alammahtu, lõigates vahemikusümboleid NumSharpi indeksisümbolite abil. Vahemikusümbol vs. indeksisümbolVahemiku sümbol ["start:stop:step"] võimaldab sul pääseda ligipääsu sama mahu alamvahemikule. Nii et isegi kui lõikad välja ainult ühe veeru 2D maatriksist, saad ikkagi 2D maatriksi ainult ühe veeruga. Siin on lühike C# koodi, mis seda demonstreerib:
Lõika veerg vahemikussümboliga
Indeksisümbol annab (N-1) mõõtmelise lõigu määratud N-mõõtmelise vanemruumala asukohas. Nii et veeru lõikamine 2D maatriksist indeksisümbolite abil annab sulle 1D vektori:
Veergude lõikamine indekssümbolite abil
Kui sa pole vahet esmapilgul näinud, siis siin on kaks ülaltoodud viilu definitsiooni kõrvuti, ange[":,2:3"] vs indeks[":,2"], mis mõjutavad tulemusi tugevalt. Täieliku viite uuele viilusümbolile on leitav NumSharpi vikist.
Märkus: <T>ArraySlice
N-mõõtmeliste vaadete lõikamise rakendamisel jõudsin järeldusele, et see võiks olla huvitav paljude teiste .NET valdkondade jaoks, seega jagasin selle omaenda iseseisvaks teegiks nimega SliceAndDice. See võimaldab olla kerge ümbris, mis võimaldab indekseerida mis tahes C# andmestruktuuri (näiteks ArraySlice<T>) ning võimaldab kasutada samu ümberkujundamise, lõikamise ja vaatamise mehhanisme ilma kõigi teiste raskete numbriliste arvutusteta. Piisab vaid mõnesaja koodirea võrra, et saavutada suurepärased lõikamisvõimalused! T[]IList<T>
ümbritsev ümbrus
NumSharpile on hiljuti antud sama lõikamis- ja vaatamismehhanism, mis teeb NumPyst kahtlemata ühe olulisema teegi Python'i masinõppe ökosüsteemis. SciSharp STACK on avatud lähtekoodiga organisatsioon, kuhu kuulub väike hulk oskuslikke arendajaid, kes on väga palju vaeva näinud, et tuua sama funktsionaalsus .NET maailma. NumSharpi viimased täiustused on selle saavutamisel oluline nurgakivi. Originaal:Hüperlingi sisselogimine on nähtav.
|