|
A NumSharp nagyszerű új tömbszelet-szeletelési képességeinek köszönhetően a .NET közösség egy lépéssel közelebb került ahhoz, hogy egy erőteljes nyílt forráskódú gépi tanulási platformot hozzon létre. A Python részben gépi tanulási nyelv, mert nagyszerű könyvtárai vannak, mint a NumPy és a TensorFlow. Ugyanakkor a C# fejlesztőknek nagy szükségük van erős, nyílt forráskódú könyvtárakra a gépi tanuláshoz és adattudományhoz. A NumSharp, a SciSharp STACK szervezet NumPy C# portja, nemrégiben nagy lépést tett előre azzal, hogy teljes mértékben bevezette a szeletelési képességeket, lehetővé téve az N-dimenziós tömbök tetszőleges részhalmazainak létrehozását hatékony nyers adatnézetekként. Ez hasznos eszközsé teszi a C# gépi tanuláshoz a TensorFlow.NET-vel együtt.
Mi a nagy ügy?
Ha még nem használtad a NumPy-t, valószínűleg nem tudod, milyen jó a szeletelés. A Python tömbök lehetővé teszik, hogy egy tömbszelet visszaadjanak egy elemsorozat indexelésével, a következők szerint: a[start:stop:step]. De csak a NumPy összetett tömbmegvalósításával válik a szeletolás igazán hatékony adatmanipulációs technikává, amely nélkül a gépi tanulás vagy adattudomány elképzelhetetlen lenne. Szerencsére azoknak, akik nem tudnak vagy nem akarnak Pythonra váltani gépi tanuláshoz (amit én is készítettem), a NumSharp ezt a képességet a .NET világába viszi. A NumSharp egyik fejlesztőjeként bemutattam néhány fontos szeletelési felhasználási esetet, például C# nyelvű mintakódrészletekkel. Fontos megjegyezni, hogy az indexelés nem végezhető C#-ban ugyanúgy, mint Pythonban, a nyelvi szintaxisban különbségek miatt. Azonban úgy döntöttünk, hogy megtartjuk a Python szintaxisát a szeletdefiníciókhoz, ezért stringeket használtunk a szeletek indexeléséhez C#-ban. Nézd meg ezt a példát, hogy mennyire közel van a NumSharp a NumPy-hoz.
Vágd ki az oszlopot a mátrixból Python/NumPy-benC#-ban NumSharp-szal írva a kód szinte teljesen azonos. Fontos megjegyezni, hogy a szeleteket kissé másképp indexelnek, mivel az indexelő paraméterei szerint stringeket használnak.
Vágj ki oszlopokat egy mátrixból C#/NumSharp nyelvenAhogy láthatod, a NumSharp csapata sok energiát fektetett abba, hogy a kód a lehető leghasonlóbb legyen a Pythonhoz. Ez nagyon fontos, mert így a NumPy-ra épülő meglévő Python kód könnyen átültethető C#-ra.
Felhasználási eset: Több nézet ugyanazon adatból
Az, hogy csak helyi adatokat (azaz kis nagy képdarabokat) tudjunk be- és kijuttatni a függvények be- és kijárataiba másolás nélkül, kulcsfontosságú a futásidejű teljesítmény szempontjából, különösen nagy adathalmazok esetén. A szeleteket helyi koordináták alapján indexeljük, így az algoritmusodnak nem kell ismernie az adatok globális szerkezetét, ami hatékonyan egyszerűsíti az életedet és biztosítja a maximális teljesítményt, mert elkerülik a felesleges duplikálást.
Felhasználási esetek: Ritka nézetek és rekurzív szeletolás
Egy tömb ritka nézete úgy hozható létre, hogy a szelettartomány elején és végén lévő lépéseket megadunk. Tudomásom szerint még a C# 8.0 sem tudja ezt megoldani az új tömbszelő szintaxissal. Ez a funkció nagyon fontossá válik az interleaved adatokkal való kapcsolat során. Megtervezheted az algoritmusodat úgy, hogy folyamatos adatokat kezeljen, és ritka szeleteket adj neki, amelyek a folyamatos adatforrásokat utánozzák, minimalizálva az algoritmus bonyolultságát.
A szeletelés tovább szeletelhető, ami nagyon fontos funkció, ha nagy dimenziós adatokkal foglalkozunk. Ez segít csökkenteni az algoritmus összetettségét is, mivel az adatok dimenzióját rekurzív szeleteléssel csökkentheted.
Felhasználási eset: Hatékonyan feldolgozzák a nagy dimenziójú adatokat
Ha egy adattömböt kötetként kell elképzelni, és a részekkel dolgoznod anélkül, hogy hihetetlen koordináta-transzformációs számításokat kellene végezned, akkor a .reshape() a barátod. Minden tömb, amelyet a szeletelési műveletek vagy a szeletelési műveletek hoznak, .reshape() csak az eredeti adatok egy nézete. Amikor iterálsz, olvasol vagy írsz elemeket egy nézethez, hozzáférsz a nyers adattömbhöz. A NumSharp átlátszóan végzi a megfelelő indextranszformációkat helyetted, így relatív koordinátákkal indexelheted a szeleteket.
Felhasználási eset: Az elemek sorrendjének megfordítása további költség nélkül
A negatív lépésekkel történő szeletek valójában megfordítják a szeletek sorrendjét. Az előnye, hogy ehhez nem kell adatokat másolni vagy felsorolni, akárcsak az IEnumerable.Reverse(). A különbség az, hogy a nézet (az a["::-1"]-művelet eredménye) fordított sorrendben jeleníti meg az adatokat, és indexelheted ezt a megfordított sorozatot anélkül, hogy felsorolnád.
Felhasználási eset: A komplexitás csökkentése dimenziók csökkentésével
Magas dimenziós adatokkal való munkavégzés során az algoritmusok is nagyon összetettek lehetnek. Használat közben bármilyen nagy dimenziós térfogat kimenetel. Amikor a ToString() NumSharp módszerét NDArray használta, észrevettem, milyen egyszerűvé és gyönyörűvé vált az algoritmus azzal, hogy rendszerszinten és rekurzívan vágja az ND térfogatokat (N-1)D térfogatokra stb. Ez a megosztás és győzd meg megközelítés alacsony dimenziós alvolumeneket eredményez azáltal, hogy a tartományszimbólumokat a NumSharp indexszimbólumaival szeleteljük. Távolságszimbólum vs. indexszimbólumA tartományszimbólum ["start:stop:step"] lehetővé teszi, hogy hozzáférj egy adott térfogat altartományához, amelynek mérete ugyanazzal a mérettel. Tehát még ha csak egy oszlopot vágsz ki a 2D mátrixból, akkor is kapsz egy 2D mátrixot egyetlen oszloppal. Íme egy rövid C# kóddarab, amely ezt jól mutatja:
Vágd az oszlopot a tartomány szimbólummal
Az indexszimbólum egy (N-1) dimenziós szeletet ad az N-dimenziós szülői térfogat megadott helyén. Tehát egy oszlopot kivágva egy 2D mátrixból indexszimbólumokkal egy 1D vektort kapunk:
Szeletoszlopok indexszimbólumokkal
Ha még nem láttad a különbséget első pillantással, itt van a fenti két szelet definíció egymás mellett: ange[":,2:3"] vs index[":,2"], amelyek nagy hatással vannak az eredményekre. Az új szeletszimbólumra teljes hivatkozás megtalálható a NumSharp wikin.
Megjegyzés: <T>ArraySlice
Az N-dimenziós nézetek szeletelésének megvalósítása során arra a következtetésre jutottam, hogy ez sok más terület számára is érdekes lehet a .NET-ben, ezért saját önálló könyvtáramba, a SliceAndDice-ba bontottam. Könnyű csomagolásként szolgál bármilyen C# adatszerkezet (például ArraySlice) <T>indexeléséhez, és lehetővé teszi, hogy ugyanazokat a átalakítási, szeletelési és megtekintési mechanizmusokat használd anélkül, hogy a többi nehéz numerikus számítást igényelnénk. Csak néhány száz sor kód kell ahhoz, hogy kiváló szeletelési képességeket érj el! T[]IList<T>
Wraparound
A NumSharp nemrégiben ugyanezt a szeletelési és megtekintési mechanizmust kapta meg, ami kétségtelenül a NumPy-t a Python gépi tanulási ökoszisztéma egyik legfontosabb könyvtárává teszi. A SciSharp STACK egy nyílt forráskódú szervezet, amely néhány tapasztalt fejlesztőből áll, akik keményen dolgoztak azon, hogy ugyanazt a funkciót hozzák a .NET világába. A NumSharp legújabb fejlesztései fontos alapkövei ennek elérésének. Eredeti:A hiperlink bejelentkezés látható.
|