|
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/NumPyGdy 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#/NumSharpJak 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 indeksuSymbol 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.
|