|
Grazie alle ottime nuove capacità di array slicing di NumSharp, la community .NET è un passo più vicina ad avere una potente piattaforma di machine learning open-source. Python è un linguaggio di machine learning in parte perché ha ottime librerie come NumPy e TensorFlow. Tuttavia, gli sviluppatori di C# hanno anche un grande bisogno di potenti librerie open-source per il machine learning e la data science. NumSharp, il porting NumPy C# dell'organizzazione SciSharp STACK, ha recentemente compiuto un grande passo avanti implementando pienamente capacità di slicing, permettendo la creazione di sottoinsiemi arbitrari di array N-dimensionali come viste efficienti dei dati grezzi. Questo lo rende uno strumento utile per l'uso del C# per il machine learning insieme al TensorFlow.NET.
Qual è il problema?
Se non hai mai usato NumPy, probabilmente non sai quanto sia fantastico lo slice. Gli array Python permettono di restituire una fetta di un array indicizzando una serie di elementi, come segue: a[start:stop:step]. Ma solo con la complessa implementazione di array di NumPy lo slicing diventa una tecnica di manipolazione dei dati davvero potente, senza la quale il machine learning o la data science sarebbero inimmaginabili. Fortunatamente, per chi non può o non vuole passare a Python per il machine learning (che ho fatto anch'io), NumSharp porta questa capacità nel mondo .NET. Come uno degli sviluppatori di NumSharp, vi ho presentato alcuni importanti casi d'uso dello slicing con snippets di codice di esempio in C#. Si noti che l'indicizzazione non può essere fatta in C# allo stesso modo di Python a causa delle differenze nella sintassi del linguaggio. Tuttavia, abbiamo deciso di mantenere la sintassi Python per le definizioni di slice, quindi abbiamo usato stringhe per indicizzare le slice in C#. Dai un'occhiata a questo esempio per vedere quanto NumSharp è vicino a NumPy.
Taglia la colonna dalla matrice in Python/NumPyQuando è scritto in C# con NumSharp, il codice è quasi identico. Si noti che le fette sono indicizzate in modo leggermente diverso usando stringhe come parametri per l'indicizzatore.
Taglia colonne da una matrice in C#/NumSharpCome potete vedere, il team di NumSharp ha messo molto impegno per rendere il codice il più simile possibile a Python. Questo è molto importante perché in questo modo il codice Python esistente che si basa su NumPy può ora essere facilmente portato in C#.
Caso d'uso: Utilizzare più viste degli stessi dati
Poter far passare solo parti locali dei dati sottostanti (cioè piccoli blocchi di immagini grandi) dentro e fuori dalle funzioni senza copiare è fondamentale per le prestazioni in tempo reale, specialmente per grandi set di dati. Le fette sono indicizzate usando coordinate locali, quindi il tuo algoritmo non deve conoscere la struttura globale dei dati, semplificando efficacemente la tua vita e garantendo la massima prestazione evitando duplicazioni inutili.
Casi d'uso: vista scarsa e slicing ricorsivo
Una vista sparsa di un array può essere creata specificando i passaggi oltre l'inizio e la fine dell'intervallo di slice. Per quanto ne so, nemmeno C# 8.0 con la nuova sintassi array slice può farlo. Questa caratteristica diventa molto importante quando si lavora con dati intercalati. Puoi progettare il tuo algoritmo per gestire dati continui e fornirgli slice sparse che imitano fonti di dati continue, minimizzando la complessità del tuo algoritmo.
Lo slicing può essere ulteriormente slicato, che è una caratteristica molto importante se si lavora con dati ad alta dimensione. Questo aiuta anche a ridurre la complessità dell'algoritmo, poiché si può ridurre la dimensionalità dei dati tramite il taglio ricorsivo.
Caso d'uso: Elaborare in modo efficiente dati ad alta dimensione
Se devi pensare a un array di dati come a un volume e lavorare con le sue parti senza dover fare calcoli incredibili di trasformazione delle coordinate, allora .reshape() è il tuo alleato. Tutti gli array creati da operazioni di slicing sono .reshape() solo una vista dei dati originali. Quando iteri, leggi o scrivi elementi in una vista, accedi all'array di dati grezzi. NumSharp esegue trasparentmente le trasformazioni di indice appropriate per te, così puoi indicizzare le fette con coordinate relative.
Caso d'uso: invertire l'ordine degli elementi senza costi aggiuntivi
Le fette che usano step negativi in realtà invertono l'ordine delle slice. Il vantaggio è che non è necessario copiare o enumerare dati per farlo, proprio come IEnumerable.Reverse(). La differenza è che la visuale (il risultato dell'operazione a["::-1"]) mostra i dati in ordine inverso, e puoi indicizzare quella sequenza invertita senza elencarla.
Caso d'uso: Ridurre la complessità riducendo le dimensioni
Quando si lavora con dati ad alta dimensione, gli algoritmi per quei dati possono diventare molto complessi. In uso, può essere prodotto qualsiasi volume ad alta dimensione. Quando ToString() ha usato il metodo NumSharp NDArray, ho notato quanto l'algoritmo sia diventato semplice e bello tagliando sistematicamente e ricorsivamente i volumi ND in volumi (N-1)D, ecc. Questo approccio divide e impera restituisce sottovolumi a bassa dimensione tagliando i simboli dell'intervallo usando i simboli indice di NumSharp. Simbolo di intervallo vs. simbolo indiceIl simbolo dell'intervallo ["start:stop:step"] permette di accedere a un sottointervallo di un dato volume con la stessa dimensione. Quindi anche se rimuovi solo una colonna della matrice 2D, otterrai comunque una matrice 2D con una sola colonna. Ecco un breve pezzo di codice C# che lo dimostra:
Taglia la colonna usando il simbolo di intervallo
Il simbolo indice ti dà una fetta di dimensione (N-1) nella posizione specificata del volume genitore N-dimensionale. Quindi tagliando una colonna da una matrice 2D usando simboli indice ottieni un vettore 1D:
Colonne di taglio usando simboli indice
Se non hai notato la differenza a colpo d'occhio, ecco le due definizioni di slice qui sopra affiancate, ange[:,2:3"] vs index[":,2"], che hanno un grande impatto sui risultati. Un riferimento completo al nuovo simbolo della fetta si trova sulla wiki di NumSharp.
Nota: <T>ArraySlice
Implementando lo slicing delle viste N-dimensionali, ho concluso che potesse essere interessante per molte altre aree di .NET, così l'ho suddiviso nella mia libreria standalone chiamata SliceAndDice. È un wrapper leggero per indicizzare qualsiasi struttura dati C# (come o) <T>ArraySlice, e permette di utilizzare gli stessi meccanismi di rimodellamento, slicing e visualizzazione senza tutti gli altri pesanti calcoli numerici. Bastano poche centinaia di righe di codice per ottenere eccellenti capacità di slice! T[]IList<T>
Avvolgente
Recentemente NumSharp ha ricevuto lo stesso meccanismo di slicing e visualizzazione, il che rende senza dubbio NumPy una delle librerie più importanti nell'ecosistema del machine learning Python. SciSharp STACK è un'organizzazione open source composta da un piccolo numero di sviluppatori esperti che hanno lavorato duramente per portare la stessa funzionalità nel mondo .NET. Gli ultimi miglioramenti di NumSharp sono una pietra angolare importante per raggiungere questo obiettivo. Originale:Il login del link ipertestuale è visibile.
|