Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 1906|Risposta: 1

[Consigli] [Traduzione]. Funzione di taglio degli array NumSharp in NET/C#

[Copiato link]
Pubblicato il 10-01-2025 12:17:13 | | | |

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/NumPy

Quando è 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#/NumSharp

Come 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 indice

Il 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.




Precedente:Controllo versioning di file grandi git lfs
Prossimo:Rocky Linux 9 wake su LAN
 Padrone di casa| Pubblicato il 10-1-2025 12:18:43 |
NumSharp è adatto a vari scenari, tra cui ricerca educativa, analisi finanziaria, elaborazione delle immagini, deep learning e altro ancora.

NumSharp, come parte del SciSharp.org, è stato integrato in un'ampia gamma di NET Ecosistema di Calcolo Scientifico. Ecco alcuni articoli correlati e altamente complementari che ti consiglio di approfondire:

ML.NET: Microsoft推出的开源机器学习框架, 用于训练和部署自定义的机器学习模型。
SciSharp.TensorFlow.Redist: 为.NET环境提供了TensorFlow的封装, 使开发者能够在.NET应用程序中使用TensorFlow执行深度学习任务。
MathNet.Numerics: 提供了一系列数学方法和统计计算工具, 与NumSharp相辅相成。

In conclusione, NumSharp non è solo una potente libreria autonoma, ma una connessione. Un nodo chiave nella comunità scientifica di calcolo di .NET.

Indirizzo del progetto NumSharp:https://github.com/SciSharp/NumSharp
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com