Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 1906|Odpowiedź: 1

[Napiwki] [Tłumaczenie]. Funkcja cięcia tablicy NumSharp w NET/C#

[Skopiuj link]
Opublikowano 2025-1-10 12:17:13 | | | |

Dzięki świetnym nowym możliwościom cięcia tablic w NumSharp, społeczność .NET jest o krok bliżej do posiadania potężnej otwartoźródłowej platformy uczenia maszynowego.

Python jest językiem uczenia maszynowego częściowo dlatego, że ma świetne biblioteki, takie jak NumPy i TensorFlow. Jednak programiści C# mają również ogromne zapotrzebowanie na potężne biblioteki open source do uczenia maszynowego i nauki o danych. NumSharp, port NumPy C# organizacji SciSharp STACK, niedawno zrobił duży krok naprzód, w pełni implementując możliwości cięcia, umożliwiając tworzenie dowolnych podzbiorów N-wymiarowych tablic jako efektywnych widoków surowych danych. To czyni go użytecznym narzędziem do używania C# w zakresie uczenia maszynowego razem z TensorFlow.NET.


Co w tym takiego wielkiego?

Jeśli nie używałeś NumPy, prawdopodobnie nie wiesz, jak świetne jest krojenie. Tablice Pythona pozwalają na zwrócenie fragmentu tablicy poprzez indeksowanie serii elementów, w następujący sposób: a[start:stop:step]. Ale dopiero dzięki złożonej implementacji macierzy w NumPy slicing staje się naprawdę potężną techniką manipulacji danymi, bez której uczenie maszynowe czy data science byłyby nie do pomyślenia.

Na szczęście dla tych, którzy nie mogą lub nie chcą przejść na Pythona do uczenia maszynowego (co sam stworzyłem), NumSharp wprowadza tę funkcjonalność do świata .NET. Jako jeden z deweloperów w NumSharp, przedstawiłem Ci kilka ważnych przypadków użycia slicingu za pomocą przykładowych fragmentów kodu w C#. Należy zauważyć, że indeksowanie nie może być wykonywane w C# w taki sam sposób jak w Pythonie ze względu na różnice w składni języka. Jednak zdecydowaliśmy się zachować składnię Pythona dla definicji slice, więc użyliśmy stringów do indeksowania fragmentów w C#. Sprawdź ten przykład, żeby zobaczyć, jak blisko NumSharp jest do NumPy.




Wytnij kolumnę z macierzy w Pythonie/NumPy

Gdy jest napisany w C# za pomocą NumSharp, kod jest niemal identyczny (NI). Należy zauważyć, że fragmenty są indeksowane nieco inaczej, używając stringów jako parametrów dla indeksera.




Wycinanie kolumn z macierzy w C#/NumSharp

Jak widać, zespół NumSharp włożył dużo wysiłku, aby kod był jak najbardziej podobny do Pythona. To bardzo ważne, ponieważ w ten sposób istniejący kod Pythona opierający się na NumPy może być łatwy do przenoszenia do C#.


Przykład użycia: Używaj wielu widoków tych samych danych



Możliwość przekazywania tylko lokalnych części danych bazowych (czyli małych fragmentów dużych obrazów) do i z funkcji bez kopiowania jest kluczowa dla wydajności w czasie rzeczywistym, zwłaszcza w dużych zbiorach danych. Fragmenty są indeksowane za pomocą lokalnych współrzędnych, więc algorytm nie musi znać globalnej struktury danych, co skutecznie upraszcza życie i zapewnia maksymalną wydajność, ponieważ unika się niepotrzebnego duplikowania.


Przypadki użycia: rzadkie widoki i rekurencyjne cięcie



Widok rzadki tablicy można utworzyć, określając kroki wykraczające poza początek i koniec zakresu wycinka. Z tego co wiem, nawet C# 8.0 z nową składnią array slice nie potrafi tego zrobić. Ta funkcja staje się bardzo ważna przy pracy z danymi przeplatanymi. Możesz zaprojektować algorytm tak, aby obsługiwał dane ciągłe i dostarczał mu rzadkie fragmenty naśladujące ciągłe źródła danych, minimalizując złożoność algorytmu.


Cięcie można przeciąć dalej, co jest bardzo ważne, jeśli pracujesz z danymi wysokowymiarowymi. Pomaga to również zmniejszyć złożoność algorytmu, ponieważ można zmniejszyć wymiarowość danych poprzez rekurencyjne cięcie.


Zastosowanie użycia: Efektywne przetwarzanie danych o wysokich wymiarach



Jeśli musisz myśleć o tablicy danych jako o woluminie i pracować z jej częściami bez konieczności wykonywania niesamowitych obliczeń transformacji współrzędnych, to .reshape() jest Twoim sprzymierzeńcem.
Wszystkie tablice utworzone przez operacje slicing to .reshape(), po prostu widok oryginalnych danych. Gdy iterujesz, czytasz lub zapisujesz elementy w widoku, masz dostęp do surowej tablicy danych. NumSharp transparentnie wykonuje odpowiednie transformacje indeksów za ciebie, dzięki czemu możesz indeksować fragmenty współrzędnymi względnymi.


Zastosowanie użycia: Odwrócenie kolejności elementów bez dodatkowych kosztów

Cięcia stosujące negatywne kroki faktycznie odwracają kolejność tych fragmentów. Zaletą jest to, że nie musi kopiować ani wyliczać danych, aby to zrobić, podobnie jak IEnumerable.Reverse(). Różnica polega na tym, że widok (wynik operacji a["::-1"]) wyświetla dane w odwrotnej kolejności i można indeksować do tej odwróconej sekwencji bez jej wyliczania.


Zastosowanie użycia: Zmniejszenie złożoności poprzez zmniejszenie wymiarów

Podczas pracy z danymi o wysokich wymiarach algorytmy dotyczące tych danych również mogą stać się bardzo złożone. W użyciu można wyprowadzić dowolną objętość o wysokim wymiarze. Kiedy metoda NumSharp w ToString() robiła NDArray, zauważyłem, jak prosty i piękny stał się algorytm dzięki systematycznemu i rekurencyjnemu dzieleniu woluminów ND na (N-1)D woluminy itd.

To podejście "dziel i rządź" zwraca niskowymiarowe podobjętości poprzez cięcie symboli zakresu za pomocą symboli indeksowych NumSharp.

Symbol zakresu vs. symbol indeksu

Symbol zakresu ["start:stop:step"] pozwala uzyskać dostęp do podzakresu danej objętości o tym samym wymiarze. Więc nawet jeśli wycinasz tylko jedną kolumnę macierzy 2D, nadal otrzymasz macierz 2D z tylko jedną kolumną. Oto krótki fragment kodu C#, który to pokazuje:



Przetnij kolumnę za pomocą symbolu zakresu

Symbol indeksu daje (N-1) przecięcie wymiarowe w określonej lokalizacji N-wymiarowego woluminu nadrzędnego. Wycięcie kolumny z macierzy 2D za pomocą symboli indeksowych daje wektor 1D:


Kolumny wycinkowe z użyciem symboli indeksowych

Jeśli nie zauważyłeś różnicy od razu, oto dwie powyższe definicje slice, ange[":,2:3"] vs index[":,2"], które mają duży wpływ na wyniki. Pełne odniesienie do nowego symbolu slice można znaleźć na wiki NumSharp.


Uwaga: <T>ArraySlice

Implementując cięcie widoków N-wymiarowych, doszedłem do wniosku, że może to być interesujące dla wielu innych obszarów .NET, więc rozbiłem to na własną, samodzielną bibliotekę o nazwie SliceAndDice. Jest lekkim wrapperem do indeksowania dowolnej struktury danych C# (takiej jak or) ArraySlice <T>i pozwala korzystać z tych samych mechanizmów remodelowania, cięcia i przeglądania bez konieczności stosowania wszystkich innych ciężkich obliczeń numerycznych. Wystarczy kilkaset linii kodu, aby osiągnąć doskonałe możliwości cięcia! T[]IList<T>


Kopertowa

NumSharp niedawno otrzymał ten sam mechanizm cięcia i przeglądania, co bez wątpienia czyni NumPy jedną z najważniejszych bibliotek w ekosystemie uczenia maszynowego Pythona. SciSharp STACK to organizacja open source złożona z niewielkiej liczby wykwalifikowanych programistów, którzy ciężko pracowali nad wprowadzeniem tej samej funkcjonalności do świata .NET. Najnowsze ulepszenia NumSharp są ważnym fundamentem w realizacji tego celu.


Oryginał:Logowanie do linku jest widoczne.




Poprzedni:Git lfs kontrola wersji dużych plików
Następny:Rocky Linux 9 wake on LAN
 Ziemianin| Opublikowano 2025-1-10 o 12:18:43 |
NumSharp nadaje się do różnych sytuacji, w tym badań edukacyjnych, analizy finansowej, przetwarzania obrazów, uczenia głębokiego i innych.

NumSharp, jako część SciSharp.org, został zintegrowany z szerokim zakresem Ekosystem Komputerów Naukowych NET. Oto kilka powiązanych i bardzo uzupełniających się produktów, które polecam do dalszego zgłębienia:

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

Podsumowując, NumSharp to nie tylko samodzielna, potężna biblioteka, ale także połączenie. Kluczowy węzeł w społeczności komputerów naukowych .NET.

Adres projektu NumSharp:https://github.com/SciSharp/NumSharp
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com