Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 1906|Antwoord: 1

[Tips] [Vertaling]. NumSharp array slicingfunctie in NET/C#

[Link kopiëren]
Geplaatst op 10-1-2025 12:17:13 | | | |

Dankzij de geweldige nieuwe array slicing-mogelijkheden van NumSharp is de .NET-gemeenschap een stap dichter bij het hebben van een krachtig open-source machine learning-platform.

Python is een machine learning-taal deels omdat het geweldige bibliotheken heeft zoals NumPy en TensorFlow. C#-ontwikkelaars hebben echter ook een grote behoefte aan krachtige open-source bibliotheken voor machine learning en data science. NumSharp, de NumPy C#-port van de SciSharp STACK-organisatie, heeft onlangs een grote stap vooruit gezet door volledig slicingmogelijkheden te implementeren, waardoor willekeurige deelverzamelingen van N-dimensionale arrays kunnen worden gemaakt als efficiënte weergaven van ruwe data. Dit maakt het een nuttig hulpmiddel om C# te gebruiken voor machine learning in combinatie met TensorFlow.NET.


Wat is het grote probleem?

Als je NumPy nog niet hebt gebruikt, weet je waarschijnlijk niet hoe goed slicen is. Python-arrays maken het mogelijk een slice van een array terug te geven door een reeks elementen te indexeren, als volgt: a[start:stop:step]. Maar alleen met de complexe array-implementatie van NumPy wordt slicing een echt krachtige datamanipulatietechniek, zonder welke machine learning of data science ondenkbaar zouden zijn.

Gelukkig, voor degenen die niet kunnen of willen overstappen op Python voor machine learning (wat ik ook heb gemaakt), brengt NumSharp deze mogelijkheid naar de .NET-wereld. Als een van de ontwikkelaars bij NumSharp heb ik je geïntroduceerd in enkele belangrijke slicing-gebruikssituaties met voorbeeldcodefragmenten in C#. Let op dat indexeren niet op dezelfde manier in C# kan worden gedaan als in Python vanwege verschillen in taalsyntaxis. We besloten echter de Python-syntaxis te behouden voor slice-definities, dus gebruikten we strings om slices in C# te indexeren. Bekijk dit voorbeeld om te zien hoe dicht NumSharp bij NumPy ligt.




Knip de kolom uit de matrix in Python/NumPy

Wanneer het in C# met NumSharp wordt geschreven, is de code vrijwel identiek. Let op dat slices iets anders worden geïndexeerd door strings als parameters voor de indexer te gebruiken.




Knip kolommen uit een matrix in C#/NumSharp

Zoals je ziet, heeft het NumSharp-team veel moeite gedaan om de code zo veel mogelijk op Python te maken. Dit is erg belangrijk omdat bestaande Python-code die afhankelijk is van NumPy nu eenvoudig naar C# kan worden overgezet.


Gebruiksscenario: Gebruik meerdere weergaven van dezelfde data



Het kunnen doorgeven van alleen lokale delen van de onderliggende data (dus kleine stukken grote afbeeldingen) in en uit functies zonder kopiëren is cruciaal voor runtime-prestaties, vooral voor grote datasets. Slices worden geïndexeerd met lokale coördinaten, zodat je algoritme de globale structuur van je data niet hoeft te kennen, wat je leven effectief vereenvoudigt en maximale prestaties garandeert omdat onnodige duplicatie wordt vermeden.


Gebruiksscenario's: Sparse views en recursief slicen



Een sobere weergave van een array kan worden gemaakt door stappen te specificeren voorbij het begin en einde van het slice-bereik. Voor zover ik weet kan zelfs C# 8.0 met de nieuwe array slice-syntax dit niet. Deze functie wordt erg belangrijk bij het omgaan met verwevende data. Je kunt je algoritme ontwerpen om continue data te verwerken en het voorzien van spaarzame slices die continue databronnen nabootsen, waardoor de complexiteit van je algoritme wordt geminimaliseerd.


Slicing kan verder worden gesneden, wat een zeer belangrijke functie is als je met hoogdimensionale data werkt. Dit helpt ook om de complexiteit van het algoritme te verminderen, omdat je de dimensionaliteit van de data kunt verkleinen door recursief te slicen.


Gebruikssituatie: Efficiënt hoog-dimensionale data verwerken



Als je een array data als een volume moet zien en met de onderdelen wilt werken zonder ongelooflijke coördinatentransformatieberekeningen te hoeven doen, dan is .reshape() je vriend.
Alle arrays die worden gemaakt door of slicingbewerkingen zijn .reshape(), slechts een weergave van de originele data. Wanneer je elementen iterert, leest of schrijft naar een view, krijg je toegang tot de ruwe data-array. NumSharp voert transparant de juiste indextransformaties voor je uit, zodat je snitten met relatieve coördinaten kunt indexeren.


Gebruiksscenario: Draai de volgorde van elementen om zonder extra kosten

Sneden met negatieve stappen keren eigenlijk de volgorde van de sneden om. Het voordeel is dat het hiervoor geen data hoeft te kopiëren of opsommen, net als IEnumerable.Reverse(). Het verschil is dat de weergave (het resultaat van de bewerking a["::-1"]) de gegevens in omgekeerde volgorde weergeeft, en je kunt indexeren naar die omgekeerde reeks zonder deze op te sommen.


Gebruikssituatie: Verminder de complexiteit door de afmetingen te verkleinen

Bij het werken met hoogdimensionale data kunnen de algoritmen voor die data ook erg complex worden. In gebruik kan elk hoogdimensionaal volume worden uitgevoerd. Toen ik de NumSharp-methode van ToString()'s NDArray gebruikte, merkte ik hoe eenvoudig en mooi het algoritme is geworden door systematisch en recursief ND-volumes in (N-1)D-volumes te knippen, enzovoort.

Deze deel-en-heers-benadering levert laag-dimensionale deelvolumes op door de bereiksymbolen te snijden met behulp van de indexsymbolen van NumSharp.

Bereiksymbool vs. indexsymbool

Het bereiksymbool ["start:stop:step"] stelt je in staat om een subbereik van een bepaald volume met dezelfde dimensie te bereiken. Dus zelfs als je slechts één kolom van de 2D-matrix uitsnijdt, krijg je nog steeds een 2D-matrix met slechts één kolom. Hier is een kort stukje C#-code dat dit demonstreert:



Snijd de kolom met het bereiksymbool

Het indexsymbool geeft je een (N-1) dimensionale snede op de gespecificeerde locatie van het N-dimensionale oudervolume. Dus als je een kolom uit een 2D-matrix snijdt met indexsymbolen, krijg je een 1D-vector:


Slice kolommen met behulp van indexsymbolen

Als je het verschil nog niet in één oogopslag hebt gezien, hier zijn de twee bovenstaande definities naast elkaar, ange versus index[":,2"], die een grote invloed hebben op de resultaten. Een volledige verwijzing naar het nieuwe slice-symbool is te vinden op de NumSharp-wiki.


Opmerking: <T>ArraySlice

Bij het implementeren van slicing van N-dimensionale weergaven concludeerde ik dat het interessant zou kunnen zijn voor veel andere gebieden in .NET, dus heb ik het opgesplitst in mijn eigen zelfstandige bibliotheek genaamd SliceAndDice. Het is een lichtgewicht wrapper voor het indexeren van elke C#-datastructuur (zoals of) ArraySlice<T>, en stelt je in staat dezelfde remodel-, slicing- en weergavemechanismen te gebruiken zonder alle andere zware numerieke berekeningen. Het kost maar een paar honderd regels code om uitstekende slicing-mogelijkheden te bereiken! T[]IList<T>


Wraparound

NumSharp heeft recentelijk hetzelfde slicing- en weergavemechanisme gekregen, wat NumPy ongetwijfeld tot een van de belangrijkste bibliotheken in het Python machine learning-ecosysteem maakt. SciSharp STACK is een open source-organisatie van een klein aantal bekwame ontwikkelaars die hard hebben gewerkt om dezelfde functionaliteit naar de .NET-wereld te brengen. De nieuwste verbeteringen van NumSharp zijn een belangrijke hoeksteen om dit te bereiken.


Origineel:De hyperlink-login is zichtbaar.




Vorig:Git LFS versiebeheer voor grote bestanden
Volgend:Rocky Linux 9 wake op LAN
 Huisbaas| Geplaatst op 10-1-2025 12:18:43 |
NumSharp is geschikt voor diverse scenario's, waaronder onderwijsonderzoek, financiële analyse, beeldverwerking, deep learning en meer.

NumSharp is als onderdeel van de SciSharp.org geïntegreerd in een breed scala van NET Wetenschappelijk Rekenecosysteem. Hier zijn enkele gerelateerde en zeer complementaire items die je wordt aanbevolen om verder te verkennen:

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

Samenvattend is NumSharp niet zomaar een op zichzelf staande krachtige bibliotheek, maar een verbinding. Een belangrijk knooppunt in de .NET wetenschappelijke computinggemeenschap.

Adres van het NumSharp Project:https://github.com/SciSharp/NumSharp
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com