|
Завдяки чудовим новим можливостям 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-вимірного батьківського об'єму. Отже, вирізаючи стовпець із 2D-матриці за допомогою індексних символів, ви отримуєте одномірний вектор:
Слайс-стовпці за допомогою індексних символів
Якщо ви не помітили різниці з першого погляду, ось два визначення слайсів, наведені вище поруч — ange[":,2:3"] проти index[":,2"], які суттєво впливають на результати. Повне посилання на новий символ зрізу можна знайти на вікі NumSharp.
Примітка: <T>ArraySlice
Впроваджуючи слайсінг N-вимірних видів, я дійшов висновку, що це може бути цікаво для багатьох інших сфер .NET, тому розбив її на власну окрему бібліотеку під назвою SliceAndDice. Він є легким обгорткою для індексації будь-якої структури даних C# (наприклад, ArraySlice) <T>і дозволяє використовувати ті ж механізми ремоделювання, слайсингу та перегляду без усіх інших важких чисельних обчислень. Достатньо кількох сотень рядків коду, щоб досягти відмінних можливостей слайсингу! T[]IList<T>
обхід
NumSharp нещодавно отримав такий самий механізм слайсингу та перегляду, що, без сумніву, робить NumPy однією з найважливіших бібліотек в екосистемі машинного навчання на Python. SciSharp STACK — це відкрита організація з невеликої кількості кваліфікованих розробників, які дуже доклали зусиль, щоб впровадити ту ж функціональність у світі .NET. Останні покращення NumSharp є важливим наріжним каменем для досягнення цієї мети. Оригінальний:Вхід за гіперпосиланням видно.
|