Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 1906|Отговор: 1

[Бакшиши] [превод]. NumSharp функция за рязане на масиви в NET/C#

[Копирай линк]
Публикувано на 2025-1-10 12:17:13 | | | |

Благодарение на страхотните нови възможности на NumSharp за рязане на масиви, .NET общността е една стъпка по-близо до създаването на мощна платформа с отворен код за машинно обучение.

Python е език за машинно обучение, отчасти защото има отлични библиотеки като NumPy и TensorFlow. Въпреки това, разработчиците на C# също имат голяма нужда от мощни отворени библиотеки за машинно обучение и наука за данни. NumSharp, NumPy C# портът на организацията SciSharp STACK, наскоро направи голяма крачка напред, като напълно реализира възможности за слайсване, позволявайки създаването на произволни подмножества N-измерни масиви като ефективни изгледи на сурови данни. Това го прави полезен инструмент за използване на C# за машинно обучение в съчетание с TensorFlow.NET.


Какъв е проблемът?

Ако не сте използвали NumPy, вероятно не знаете колко страхотно е рязането. Python масивите позволяват връщане на слайс от масив чрез индексиране на серия от елементи, както следва: a[start:stop:step]. Но само с комплексната реализация на масива на NumPy слайсването се превръща в наистина мощна техника за манипулация на данни, без която машинното обучение или науката за данни биха били немислими.

За щастие, за тези, които не могат или не искат да преминат към Python за машинно обучение (което и аз направих), NumSharp пренася тази възможност в .NET света. Като един от разработчиците в NumSharp, запознах ви с някои важни случаи на използване при рязане с примерни кодови откъси на C#. Имайте предвид, че индексирането не може да се извършва в C# по същия начин, както в Python, поради разлики в езиковия синтаксис. Въпреки това, решихме да запазим синтаксиса на Python за дефинициите на срезове, затова използвахме низове за индексиране на срезове в C#. Вижте този пример, за да видите колко близо е NumSharp до NumPy.




Изрежете колоната от матрицата в Python/NumPy

Когато се пише на C# с NumSharp, кодът е почти идентичен. Обърнете внимание, че срезовете се индексират леко по-различно, като се използват низове като параметри за индексера.




Изрязване на колони от матрица в C#/NumSharp

Както виждате, екипът на NumSharp е вложил много усилия, за да направи кода възможно най-близък до Python. Това е много важно, защото по този начин съществуващият Python код, който разчита на NumPy, вече може лесно да бъде прехвърлен на C#.


Случай на употреба: Използване на няколко изгледа на едни и същи данни



Възможността да се предават само локални части от основните данни (т.е. малки парчета големи изображения) в и извън функциите без копиране е критична за производителността по време на изпълнение, особено при големи набори от данни. Срезовете се индексират чрез локални координати, така че алгоритъмът ви не е необходимо да знае глобалната структура на вашите данни, което ефективно опростява живота ви и осигурява максимална производителност, тъй като се избягва ненужно дублиране.


Случаи на употреба: Разредени изгледи и рекурсивно рязане



Разреден изглед на масив може да се създаде чрез задаване на стъпки отвъд началото и края на слайс диапазона. Доколкото знам, дори C# 8.0 с новия синтаксис на array slice не може да направи това. Тази функция става много важна при работа с преплетени данни. Можете да проектирате алгоритъма си да обработва непрекъснати данни и да му предоставите оскъдни срезове, които имитират непрекъснати източници на данни, минимизирайки сложността на алгоритъма.


Рязането може да се разреже по-нататък, което е много важна функция, ако работите с данни с големи размери. Това също помага да се намали сложността на алгоритъма, тъй като може да се намали размерността на данните чрез рекурсивно рязане.


Случай на употреба: Ефективна обработка на данни с големи размери



Ако трябва да мислиш за масив от данни като за обем и да работиш с неговите части без да правиш невероятни изчисления за трансформация на координати, тогава .reshape() е твой приятел.
Всички масиви, създадени чрез операции по рязане или рязане, са .reshape(), просто изглед на оригиналните данни. Когато итерацията, четете или записвате елементи в изглед, достъпвате суровия масив от данни. NumSharp прозрачно извършва съответните индексни трансформации за вас, така че можете да индексирате срезове с относителни координати.


Случай на употреба: Обърнете реда на елементите без допълнителни разходи

Срезовете с отрицателни стъпки всъщност обръщат реда на срезовете. Предимството е, че не е необходимо да копира или изброява данни, точно както при IEnumerable.Reverse(). Разликата е, че изгледът (резултатът от операцията a["::-1"]) показва данните в обратен ред и можеш да индексираш тази обърната последователност без да я изброяваш.


Случай на употреба: Намаляване на сложността чрез намаляване на размерите

При работа с високоизмерни данни, алгоритмите за тези данни също могат да станат много сложни. При употреба може да се извежда всеки обем с големи размери. Когато методът NumSharp на ToString() използва NDArray, забелязах колко прост и красив е станал алгоритъмът, като систематично и рекурсивно разделя ND обемите на (N-1)D обеми и т.н.

Този подход "разделяй и владей" връща нискоразмерни подтомове чрез нарязване на символите на диапазона с индексните символи на NumSharp.

Символ на обхват срещу индексен символ

Символът на обхвата ["start:stop:step"] ви позволява достъп до поддиапазон на даден обем със същата размерност. Така че дори ако изрежете само една колона от 2D матрицата, пак ще получите 2D матрица с само една колона. Ето един кратък C# код, който демонстрира това:



Разрежете колоната с помощта на символа на диапазона

Индексният символ ви дава (N-1) размерен срез на зададеното място на N-измерния родителски обем. Така че изрязването на колона от двумерна матрица с индексни символи ви дава едноизмерен вектор:


Разрязване на колони с индексни символи

Ако не сте забелязали разликата на пръв поглед, ето двете дефиниции на slice по-горе – ange[":,2:3"] срещу index[":,2"], които имат голямо влияние върху резултатите. Пълна препратка към новия символ на разрез може да се намери в уикито на NumSharp.


Забележка: <T>ArraySlice

При внедряването на нарязване на N-измерни изгледи заключих, че може да е интересно за много други области в .NET, затова го разделих в собствена самостоятелна библиотека, наречена SliceAndDice. Тя се отличава като лек обвивка за индексиране на всяка C# структура от данни (като или) <T>ArraySlice и позволява да използвате същите механизми за премоделиране, рязане и преглед без всички други тежки числови изчисления. Само няколкостотин реда код са достатъчни, за да се постигнат отлични възможности за рязане! T[]IList<T>


Обгръщане

NumSharp наскоро получи същия механизъм за нарязване и визуализация, което несъмнено прави NumPy една от най-важните библиотеки в екосистемата на машинното обучение на Python. SciSharp STACK е организация с отворен код от малък брой квалифицирани разработчици, които са работили много усърдно, за да внесат същата функционалност в .NET света. Последните подобрения на NumSharp са важен стълб за постигане на това.


Оригинален:Входът към хиперлинк е видим.




Предишен:Git lfs контрол за версиониране на големи файлове
Следващ:Rocky Linux 9 wake на LAN
 Хазяин| Публикувано на 2025-1-10 12:18:43 |
NumSharp е подходящ за различни ситуации, включително образователни изследвания, финансов анализ, обработка на изображения, дълбоко обучение и други.

NumSharp, като част от SciSharp.org, е интегриран в широк спектър от NET Научна изчислителна екосистема. Ето някои свързани и силно допълващи се неща, които ви препоръчват да проучите по-нататък:

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

В заключение, NumSharp не е просто самостоятелна мощна библиотека, а връзка. Ключов възел в общността на научните изчисления .NET.

Адрес на проекта NumSharp:https://github.com/SciSharp/NumSharp
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com