Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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 с новым синтаксисом срезов массивов этого не делает. Эта особенность становится очень важной при работе с интерливированными данными. Вы можете спроектировать алгоритм для работы с непрерывными данными и предоставить ему разреженные срезы, имитирующие непрерывные источники данных, минимизируя сложность алгоритма.


Слайсинг можно разрезать дальше, что очень важно, если вы имеете дело с данными с большими размерами. Это также помогает снизить сложность алгоритма, так как можно уменьшить размерность данных с помощью рекурсивного слайсирования.


Сценарий использования: эффективная обработка данных с большими размерами



Если вам нужно рассматривать массив данных как объём и работать с его частями без необходимости делать невероятные вычисления преобразования координат, тогда .reshape() — ваш друг.
Все массивы, созданные операциями слайсинга или слайсинга, являются .reshape(), просто видом исходных данных. Когда вы итерируете, читаете или записываете элементы в представление, вы получаете доступ к исходному массиву данных. NumSharp прозрачно выполняет соответствующие индексные преобразования для вас, чтобы вы могли индексировать срезы с относительными координатами.


Сценарий использования: Перевернуть порядок элементов без дополнительных затрат

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


Сценарий применения: Снизить сложность за счёт уменьшения размеров

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

Этот подход «разделяй и властвуй» возвращает низкоразмерные субтомы, разрезав символы диапазона с помощью индексных символов NumSharp.

Символ диапазона против индексного символа

Символ диапазона ["start:stop:step"] позволяет получить доступ к поддиапазону заданного объёма с одинаковой размерностью. Так что даже если вырезать только один столбец 2D-матрицы, получится 2D-матрица с одним столбцом. Вот короткий фрагмент кода на C#, который это демонстрирует:



Разрезайте столбец с помощью символа диапазона

Индексный символ даёт (N-1) размерный срез в указанном месте N-мерного родительского объёма. Таким образом, вырезание столбца из двумерной матрицы с помощью индексных символов даёт одномерный вектор:


Срез столбцов с индексными символами

Если вы не заметили разницы с первого взгляда, вот два определения срезов рядом с ними — ange[":,2:3"] против index[":,2"], которые сильно влияют на результаты. Полное упоминание нового символа среза можно найти на вики NumSharp.


Примечание: <T>ArraySlice

Реализуя срез N-мерных видов, я пришёл к выводу, что это может быть интересно для многих других областей .NET, поэтому разбил её на собственную автономную библиотеку под названием SliceAndDice. Он является лёгкой обёрткой для индексации любой структуры данных C# (например, ArraySlice или<T>) и позволяет использовать те же механизмы ремоделирования, слайзинга и просмотра без всех остальных сложных числовых вычислений. Достаточно всего нескольких сотен строк кода, чтобы добиться отличных возможностей слайсинга! T[]IList<T>


циклический переход

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


Исходный текст:Вход по гиперссылке виден.




Предыдущий:Управление версионированием большого файла Git LS
Следующий:Rocky Linux 9 пробуждение на локальной сети
 Хозяин| Опубликовано 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