|
Datorită noilor capabilități excelente de slicing a array-urilor ale NumSharp, comunitatea .NET este cu un pas mai aproape de a avea o platformă puternică de învățare automată open-source. Python este un limbaj de învățare automată parțial pentru că are biblioteci excelente precum NumPy și TensorFlow. Totuși, dezvoltatorii C# au, de asemenea, o mare nevoie de biblioteci open-source puternice pentru învățare automată și știința datelor. NumSharp, portarea NumPy C# a organizației SciSharp STACK, a făcut recent un pas important înainte prin implementarea completă a capabilităților de tăiere, permițând crearea unor subseturi arbitrare de tablouri N-dimensionale ca vederi eficiente ale datelor brute. Acest lucru îl face un instrument util pentru utilizarea C# în învățare automată împreună cu TensorFlow.NET.
Care e problema?
Dacă nu ai folosit NumPy, probabil nu știi cât de grozavă este tăierea. Array-urile Python permit returnarea unei felii dintr-un tablou prin indexarea unei serii de elemente, după cum urmează: a[start:stop:step]. Dar doar cu implementarea complexă a matricelor NumPy slicing devine o tehnică cu adevărat puternică de manipulare a datelor, fără de care învățarea automată sau știința datelor ar fi de neimaginat. Din fericire, pentru cei care nu pot sau nu vor să treacă la Python pentru învățare automată (pe care l-am făcut și eu), NumSharp aduce această capacitate în lumea .NET. Ca unul dintre dezvoltatorii de la NumSharp, v-am prezentat câteva cazuri importante de utilizare în slicing cu fragmente de cod exemplu în C#. Rețineți că indexarea nu poate fi făcută în C# la fel ca în Python din cauza diferențelor de sintaxă a limbajului. Totuși, am decis să păstrăm sintaxa Python pentru definițiile slice-urilor, așa că am folosit șiruri pentru a indexa slice-urile în C#. Uită-te la acest exemplu ca să vezi cât de apropiat este NumSharp de NumPy.
Taie coloana din matrice în Python/NumPyCând este scris în C# cu NumSharp, codul este aproape identic. Rețineți că slice-urile sunt indexate ușor diferit, folosind șiruri ca parametri pentru indexator.
Decupează coloane dintr-o matrice în C#/NumSharpDupă cum vezi, echipa NumSharp a depus mult efort pentru a face codul cât mai asemănător cu Python. Acest lucru este foarte important deoarece astfel, codul Python existent care se bazează pe NumPy poate fi acum portat ușor în C#.
Caz de utilizare: Folosirea mai multor vizualizări ale aceleiași date
Capacitatea de a transmite doar părți locale ale datelor subiacente (adică bucăți mici de imagini mari) în și din funcții fără a le copia este esențială pentru performanța la rulare, în special pentru seturi mari de date. Slice-urile sunt indexate folosind coordonate locale, astfel încât algoritmul tău nu trebuie să cunoască structura globală a datelor, simplificând astfel viața ta și asigurând performanță maximă, evitând duplicarea inutilă.
Cazuri de utilizare: Vizualizări rare și tăiere recursivă
O vizualizare rară a unui tablou poate fi creată prin specificarea pașilor dincolo de începutul și sfârșitul intervalului de slice. Din câte știu, nici măcar C# 8.0 cu noua sintaxă a slice-ului din array nu poate face asta. Această caracteristică devine foarte importantă atunci când se lucrează cu date intercalate. Poți proiecta algoritmul să gestioneze date continue și să-i oferi secțiuni rare care imită surse de date continue, minimizând complexitatea algoritmului.
Tăierea poate fi tăiată mai departe, ceea ce este o caracteristică foarte importantă dacă lucrezi cu date de înaltă dimensiune. Acest lucru ajută, de asemenea, la reducerea complexității algoritmului, deoarece poți reduce dimensionalitatea datelor prin tăiere recursivă.
Caz de utilizare: Procesarea eficientă a datelor de înaltă dimensiune
Dacă trebuie să gândești un array de date ca la un volum și să lucrezi cu părțile sale fără să faci calcule incredibile de transformare a coordonatelor, atunci .reshape() este prietenul tău. Toate tablourile create prin operații de tăiere sunt .reshape() doar o vizualizare a datelor originale. Când iterezi, citești sau scrii elemente într-o vizualizare, accesezi array-ul de date brute. NumSharp execută transparent transformările de indice corespunzătoare pentru tine, astfel încât poți indexa slice-urile cu coordonate relative.
Caz de utilizare: Inversează ordinea elementelor fără costuri suplimentare
Feliile care folosesc pași negativi inversează de fapt ordinea feliilor. Avantajul este că nu trebuie să copieze sau să enumere date pentru a face asta, la fel ca IEnumerable.Reverse(). Diferența este că vizualizarea (rezultatul operației a["::-1"]) afișează datele în ordine inversă, iar tu poți indexa acea secvență inversată fără a o enumera.
Caz de utilizare: Reducerea complexității prin reducerea dimensiunilor
Când lucrezi cu date de înaltă dimensiune, algoritmii pentru acele date pot deveni de asemenea foarte complecși. În utilizare, orice volum de dimensiune mare poate fi ieșit. Când metoda NumSharp NDArray a ToString(), am observat cât de simplu și frumos a devenit algoritmul prin tăierea sistematică și recursivă a volumelor ND în volume (N-1)D, etc. Această abordare de tip divide & conquer returnează subvolumele de dimensiune joasă prin tăierea simbolurilor de interval folosind simbolurile index ale lui NumSharp. Simbol de interval vs. simbol indexSimbolul de interval ["start:stop:step"] îți permite să accesezi un subinterval al unui anumit volum cu aceeași dimensiune. Deci, chiar dacă tai doar o coloană din matrice 2D, vei obține totuși o matrice 2D cu o singură coloană. Iată o scurtă bucată de cod C# care demonstrează acest lucru:
Taie coloana folosind simbolul intervalului
Simbolul index îți oferă o felie de dimensiune (N-1) la locația specificată a volumului părinte N-dimensional. Deci, decupând o coloană dintr-o matrice 2D folosind simboluri de index, obții un vector 1D:
Coloane de tăiere folosind simboluri de index
Dacă nu ai observat diferența dintr-o privire, iată cele două definiții ale feliilor de mai sus, una lângă alta, ange[:,2:3"] vs index[":,2"], care au un impact major asupra rezultatelor. O referință completă la noul simbol slice poate fi găsită pe wiki-ul NumSharp.
Notă: <T>ArraySlice
În implementarea tăierii vederilor N-dimensionale, am concluzionat că ar putea fi interesantă pentru multe alte domenii din .NET, așa că am descompus-o în propria mea bibliotecă independentă numită SliceAndDice. Acesta este un wrapper ușor pentru indexarea oricărei structuri de date C# (cum ar fi sau ArraySlice<T>) și îți permite să folosești aceleași mecanisme de remodelare, tăiere și vizualizare fără toate celelalte calcule numerice grele. Sunt necesare doar câteva sute de linii de cod pentru a obține capacități excelente de tăiere! T[]IList<T>
Wraparound
NumSharp a primit recent același mecanism de tăiere și vizualizare, ceea ce face fără îndoială NumPy una dintre cele mai importante biblioteci din ecosistemul de învățare automată Python. SciSharp STACK este o organizație open source formată dintr-un număr mic de dezvoltatori pricepuți care au muncit foarte mult pentru a aduce aceeași funcționalitate în lumea .NET. Cele mai recente îmbunătățiri ale NumSharp reprezintă o piatră de temelie importantă în realizarea acestui lucru. Original:Autentificarea cu hyperlink este vizibilă.
|