Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 1906|Antwort: 1

[Tipps] [Übersetzung]. NumSharp-Array-Slicing-Funktion in NET/C#

[Link kopieren]
Veröffentlicht am 10.01.2025, 12:17:13 | | | |

Dank der großartigen neuen Array-Slicing-Fähigkeiten von NumSharp ist die .NET-Community einen Schritt näher daran, eine leistungsstarke Open-Source-Plattform für maschinelles Lernen zu haben.

Python ist eine Programmiersprache zum Beispiel, weil es großartige Bibliotheken wie NumPy und TensorFlow hat. Allerdings haben C#-Entwickler auch einen großen Bedarf an leistungsstarken Open-Source-Bibliotheken für maschinelles Lernen und Data Science. NumSharp, der NumPy C#-Port der SciSharp STACK-Organisation, hat kürzlich einen großen Schritt nach vorne gemacht, indem es Slicing-Fähigkeiten vollständig implementiert hat, was die Erstellung beliebiger Teilmengen von N-dimensionalen Arrays als effiziente Ansichten von Rohdaten ermöglicht. Das macht es zu einem nützlichen Werkzeug, um C# im maschinellen Lernen zusammen mit TensorFlow.NET zu verwenden.


Was ist daran so schlimm?

Wenn du NumPy noch nicht benutzt hast, weißt du wahrscheinlich nicht, wie großartig das Slicen ist. Python-Arrays erlauben es, einen Schnitt eines Arrays zurückzugeben, indem eine Reihe von Elementen indexiert wird, wie folgt: a[start:stop:step]. Doch nur mit der komplexen Array-Implementierung von NumPy wird Slicing zu einer wirklich mächtigen Datenmanipulationstechnik, ohne die maschinelles Lernen oder Data Science undenkbar wären.

Glücklicherweise bringt NumSharp für diejenigen, die nicht auf Python für maschinelles Lernen umsteigen können oder nicht wollen (was ich ebenfalls entwickelt habe), diese Möglichkeit in die .NET-Welt. Als einer der Entwickler bei NumSharp habe ich Ihnen einige wichtige Anwendungsfälle für Slicing mit Beispielcode-Schnipsel in C# vorgestellt. Beachten Sie, dass das Indexieren in C# nicht auf die gleiche Weise wie in Python durchgeführt werden kann, aufgrund von Unterschieden in der Sprachsyntax. Wir entschieden uns jedoch, die Python-Syntax für Slice-Definitionen beizubehalten, also haben wir Strings verwendet, um Slices in C# zu indexieren. Schau dir dieses Beispiel an, um zu sehen, wie nah NumSharp an NumPy liegt.




Schneide die Spalte aus der Matrix in Python/NumPy aus

Wenn er in C# mit NumSharp geschrieben wird, ist der Code nahezu identisch. Beachten Sie, dass Schnitte leicht unterschiedlich indiziert werden, wobei Strings als Parameter für den Indexer verwendet werden.




Spalten aus einer Matrix in C#/NumSharp ausschneiden

Wie du siehst, hat das NumSharp-Team viel Mühe darauf verwendet, den Code so ähnlich wie möglich an Python zu machen. Das ist sehr wichtig, denn so kann bestehender Python-Code, der auf NumPy basiert, nun einfach auf C# portiert werden.


Anwendungsfall: Verwenden Sie mehrere Ansichten derselben Daten



Die Möglichkeit, nur lokale Teile der zugrundeliegenden Daten (also kleine Teile großer Bilder) ohne Kopieren in Funktionen ein- und auszuleiten, ist für die Laufzeitleistung besonders bei großen Datensätzen entscheidend. Slices werden mit lokalen Koordinaten indexiert, sodass Ihr Algorithmus die globale Struktur Ihrer Daten nicht kennen muss, was Ihr Leben effektiv vereinfacht und maximale Leistung gewährleistet, da unnötige Duplikationen vermieden werden.


Anwendungsfälle: Sparse Views und rekursives Slicing



Eine sparsame Ansicht eines Arrays kann erzeugt werden, indem Schritte jenseits des Anfang und Endes des Schnittbereichs angegeben werden. Soweit ich weiß, kann das nicht einmal C# 8.0 mit der neuen Array-Slice-Syntax. Diese Funktion wird beim Umgang mit ineinandergelagerten Daten sehr wichtig. Du kannst deinen Algorithmus so entwerfen, dass er kontinuierliche Daten verarbeitet und ihm sparsame Slices bereitstellen, die kontinuierliche Datenquellen nachahmen und so die Komplexität deines Algorithmus minimieren.


Slicing kann weiter geschnitten werden, was ein sehr wichtiges Merkmal ist, wenn man mit hochdimensionalen Daten arbeitet. Das hilft auch, die Komplexität des Algorithmus zu verringern, da man die Dimensionalität der Daten durch rekursives Slicing reduzieren kann.


Anwendungsfall: Effiziente Verarbeitung hochdimensionaler Daten



Wenn du ein Datenarray als Volumen betrachten und mit seinen Teilen arbeiten musst, ohne unglaubliche Koordinatentransformationsberechnungen durchführen zu müssen, dann ist .reshape() dein Freund.
Alle durch oder durch Slicing-Operationen erstellten Arrays sind .reshape(), nur eine Ansicht der Originaldaten. Wenn Sie Elemente iterieren, lesen oder in eine Ansicht schreiben, greifen Sie auf das Rohdatenarray zu. NumSharp führt die entsprechenden Indextransformationen transparent für Sie durch, sodass Sie Schnitte mit relativen Koordinaten indexieren können.


Anwendungsfall: Kehren Sie die Reihenfolge der Elemente ohne zusätzliche Kosten um

Schnitte mit negativen Schritten kehren tatsächlich die Reihenfolge der Schnitte um. Der Vorteil ist, dass sie dafür keine Daten kopieren oder aufzählen muss, genau wie IEnumerable.Reverse(). Der Unterschied besteht darin, dass die Ansicht (das Ergebnis der Operation a["::-1"]) die Daten in umgekehrter Reihenfolge anzeigt, und man kann diese invertierte Sequenz indexieren, ohne sie aufzuzählen.


Anwendungsfall: Reduziere die Komplexität durch Reduzierung der Dimensionen

Bei der Arbeit mit hochdimensionalen Daten können die Algorithmen für diese Daten ebenfalls sehr komplex werden. Im Gebrauch kann jedes hochdimensionale Volumen ausgegeben werden. Als ToString()s NumSharp-Methode NDArray verwendet wurde, ist mir aufgefallen, wie einfach und schön der Algorithmus geworden ist, indem er ND-Volumina systematisch und rekursiv in (N-1)D-Bände usw. aufteilt.

Dieser Divide-and-Conquer-Ansatz liefert niedrigdimensionale Untervolumen, indem die Bereichssymbole mit den Indexsymbolen von NumSharp geschnitten werden.

Bereichssymbol vs. Indexsymbol

Das Reichweitensymbol ["start:stop:step"] ermöglicht es dir, auf einen Teilbereich eines gegebenen Volumens mit derselben Dimension zuzugreifen. Selbst wenn du also nur eine Spalte der 2D-Matrix ausschneidest, bekommst du immer noch eine 2D-Matrix mit nur einer Spalte. Hier ist ein kurzer C#-Code, der dies demonstriert:



Schneiden Sie die Spalte mit dem Bereichssymbol

Das Indexsymbol gibt einen (N-1) dimensionalen Schnitt an der angegebenen Stelle des n-dimensionalen Elternvolumens an. Wenn man also eine Spalte aus einer 2D-Matrix mit Indexsymbolen ausschneidet, erhält man einen 1D-Vektor:


Spaltspalten mit Indexsymbolen aufschneiden

Falls Sie den Unterschied auf den ersten Blick nicht gesehen haben, hier sind die beiden oben genannten Definitionen nebeneinander, ange[":,2:3"] vs index[":,2"], die einen großen Einfluss auf die Ergebnisse haben. Eine vollständige Referenz zum neuen Slice-Symbol findet sich im NumSharp-Wiki.


Hinweis: <T>ArraySlice

Bei der Implementierung von Slicing von n-dimensionalen Ansichten kam ich zu dem Schluss, dass es für viele andere Bereiche in .NET interessant sein könnte, also habe ich es in meine eigene eigenständige Bibliothek namens SliceAndDice aufgeteilt. Es verfügt über einen leichtgewichtigen Wrapper zur Indexierung jeder C#-Datenstruktur (wie ArraySlice<T>) und ermöglicht es, dieselben Remodeling-, Slicing- und Viewing-Mechanismen zu verwenden, ohne all die anderen umfangreichen numerischen Berechnungen. Es braucht nur ein paar hundert Codezeilen, um exzellente Slicing-Fähigkeiten zu erreichen! T[]IList<T>


Bildumlauf

NumSharp hat kürzlich denselben Slicing- und Viewing-Mechanismus erhalten, was NumPy zweifellos zu einer der wichtigsten Bibliotheken im Python-Maschinellen Lernsystem macht. SciSharp STACK ist eine Open-Source-Organisation mit einer kleinen Anzahl qualifizierter Entwickler, die sehr hart daran gearbeitet haben, dieselbe Funktionalität in die .NET-Welt zu bringen. Die neuesten Verbesserungen von NumSharp sind ein wichtiger Eckpfeiler dafür.


Original:Der Hyperlink-Login ist sichtbar.




Vorhergehend:Git LFS Versionskontrolle für große Dateien
Nächster:Rocky Linux 9 Wake auf LAN
 Vermieter| Veröffentlicht am 10.01.2025, 12:18:43 |
NumSharp eignet sich für verschiedene Szenarien, darunter Bildungsforschung, Finanzanalyse, Bildverarbeitung, Deep Learning und mehr.

NumSharp wurde als Teil der SciSharp.org in eine Vielzahl von NET Wissenschaftliches Computing-Ökosystem. Hier sind einige verwandte und sehr ergänzende Produkte, die Sie weiter erkunden möchten:

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

Abschließend lässt sich sagen, dass NumSharp nicht nur eine eigenständige, kraftvolle Bibliothek ist, sondern eine Verbindung. Ein wichtiger Knoten in der .NET Scientific Computing Community.

Adresse des NumSharp-Projekts:https://github.com/SciSharp/NumSharp
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com