Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 1906|Odpověď: 1

[Tipy] [Překlad]. Funkce pro řezání pole v NumSharp v NET/C#

[Kopírovat odkaz]
Zveřejněno 10. 1. 2025 12:17:13 | | | |

Díky skvělým novým schopnostem NumSharp pro slicing polí je .NET komunita o krok blíže k tomu, aby měla silnou open-source platformu pro strojové učení.

Python je jazyk strojového učení i proto, že má skvělé knihovny jako NumPy a TensorFlow. Nicméně vývojáři v C# mají také velkou potřebu výkonných open-source knihoven pro strojové učení a datovou vědu. NumSharp, port NumPy C# organizace SciSharp STACK, nedávno udělal velký krok vpřed tím, že plně implementoval možnosti řezání, což umožňuje vytvářet libovolné podmnožiny N-dimenzionálních polí jako efektivní pohledy na surová data. To z něj činí užitečný nástroj pro použití C# pro strojové učení ve spojení s TensorFlow.NET.


Co je na tom tak zvláštního?

Pokud jste NumPy nepoužili, pravděpodobně nevíte, jak skvělé je slicing. Python pole umožňují vrátit řez pole indexováním řady prvků, následovně: a[start:stop:step]. Ale teprve s komplexní implementací pole v NumPy se slicing stává skutečně silnou technikou manipulace s daty, bez které by strojové učení nebo datová věda byly nepředstavitelné.

Naštěstí pro ty, kteří nemohou nebo nechtějí přejít na Python pro strojové učení (což jsem také vytvořil), NumSharp přináší tuto možnost do .NET světa. Jako jeden z vývojářů v NumSharp jsem vám představil několik důležitých případů použití slicingu pomocí ukázkových útržků kódu v C#. Všimněte si, že indexování nelze v C# provádět stejným způsobem jako v Pythonu kvůli rozdílům v jazykové syntaxi. Rozhodli jsme se však ponechat syntaxi Pythonu pro definice řezů, takže jsme použili řetězce pro indexování řezů v C#. Podívej se na tento příklad, jak blízko je NumSharp k NumPy.




Vyřízněte sloupec z matice v Pythonu/NumPy

Když je kód napsán v C# pomocí NumSharp, je téměř identický. Všimněte si, že řezy jsou indexovány mírně odlišně pomocí řetězců jako parametrů pro indexer.




Vyřízněte sloupce z matice v C#/NumSharp

Jak vidíte, tým NumSharp věnoval hodně úsilí tomu, aby byl kód co nejpodobnější Pythonu. To je velmi důležité, protože tímto způsobem lze existující Python kód založený na NumPy snadno přenést do C#.


Případ použití: Použijte více zobrazení stejných dat



Možnost předávat pouze lokální části základních dat (tj. malé části velkých obrázků) do funkcí bez kopírování je klíčová pro výkon v běhu, zejména u velkých datových sad. Řezy jsou indexovány pomocí lokálních souřadnic, takže váš algoritmus nemusí znát globální strukturu dat, což vám efektivně zjednodušuje život a zajišťuje maximální výkon, protože se předchází zbytečnému duplikování.


Případy použití: Řídké pohledy a rekurzivní řezání



Řídký pohled na pole lze vytvořit specifikací kroků za začátkem a koncem rozsahu řezu. Pokud vím, ani C# 8.0 s novou syntaxí array slice to neumí. Tato funkce je velmi důležitá při práci s prokládanými daty. Můžete navrhnout svůj algoritmus tak, aby zpracovával spojitá data a poskytoval mu řídké řezy, které napodobují spojité datové zdroje, čímž minimalizujete složitost algoritmu.


Řezání lze dále rozdělit, což je velmi důležitá vlastnost, pokud pracujete s vysokorozměrnými daty. To také pomáhá snížit složitost algoritmu, protože můžete snížit dimenzionalitu dat rekurzivním řezem.


Případ použití: Efektivní zpracování vysoce dimenzionálních dat



Pokud potřebujete vnímat pole dat jako objem a pracovat s jeho částmi bez nutnosti dělat neuvěřitelné výpočty transformace souřadnic, pak je .reshape() váš přítel.
Všechna pole vytvořená nebo slicing operacemi jsou .reshape(), pouze zobrazení původních dat. Když iterujete, čtete nebo zapisujete prvky do pohledu, přistupujete k surovému datovému poli. NumSharp transparentně provede příslušné indexové transformace za vás, takže můžete indexovat řezy s relativními souřadnicemi.


Případ použití: Obrátit pořadí prvků bez dalších nákladů

Řezy používající záporné kroky ve skutečnosti obracejí pořadí řezů. Výhodou je, že k tomu nemusí kopírovat ani enumerovat data, stejně jako IEnumerable.Reverse(). Rozdíl je v tom, že pohled (výsledek operace a["::-1"]) zobrazuje data v opačném pořadí a můžete indexovat do této inverzní posloupnosti bez jejího vyjmenování.


Případ použití: Snížit složitost zmenšením rozměrů

Při práci s vysokorozměrnými daty mohou být algoritmy pro tato data také velmi složité. Při použití lze výstupem vytvořit jakýkoli vysokorozměrný objem. Když metoda ToString() NumSharp NDArray vytvořila, všiml jsem si, jak jednoduchý a krásný se algoritmus stal systematickým a rekurzivním rozřezáváním ND svazků na (N-1)D objemy atd.

Tento přístup rozděl a panuj vrací nízkorozměrné subobjemy tím, že se symboly rozsahu rozdělí pomocí indexových symbolů NumSharpu.

Symbol rozsahu vs. symbol indexu

Symbol rozsahu ["start:stop:step"] vám umožňuje přistupovat k podrozsahu daného objemu se stejnou dimenzí. Takže i když vyříznete pouze jeden sloupec 2D matice, stále dostanete 2D matici s pouze jedním sloupcem. Tady je krátký kousek kódu v C#, který to demonstruje:



Rozřízněte sloupec pomocí symbolu rozsahu

Indexový symbol vám dává (N-1) rozměrný řez na určeném místě N-rozměrného rodičovského objemu. Takže vyříznutím sloupce z 2D matice pomocí indexových symbolů dostanete 1D vektor:


Sloupce s řezy pomocí indexových symbolů

Pokud jste rozdíl neviděli na první pohled, zde jsou dvě výše uvedené definice řezů vedle sebe, ange[":,2:3"] vs index[":,2"], které mají velký vliv na výsledky. Úplný odkaz na nový symbol řezu lze najít na wiki NumSharp.


Poznámka: <T>ArraySlice

Při implementaci slicingu N-dimenzionálních pohledů jsem dospěl k závěru, že by to mohlo být zajímavé i pro mnoho dalších oblastí .NET, a tak jsem to rozdělil do vlastní samostatné knihovny nazvané SliceAndDice. Funguje jako lehký obal pro indexaci jakékoli C# datové struktury (například or) ArraySlice <T>a umožňuje používat stejné mechanismy přemodelování, řezání a prohlížení bez nutnosti složitých číselných výpočtů. Stačí jen pár stovek řádků kódu a dosáhlo se skvělých schopností řezání! T[]IList<T>


ovinovací

NumSharp nedávno dostal stejný mechanismus pro řezání a prohlížení, což nepochybně činí z NumPy jednu z nejdůležitějších knihoven v ekosystému strojového učení Pythonu. SciSharp STACK je open source organizace malého počtu zkušených vývojářů, kteří tvrdě pracovali na tom, aby stejnou funkcionalitu přinesli i do .NET světa. Nejnovější vylepšení NumSharp jsou důležitým pilířem tohoto cíle.


Původní:Přihlášení k hypertextovému odkazu je viditelné.




Předchozí:Git lfs řízení verzování velkých souborů
Další:Rocky Linux 9 wake on LAN
 Pronajímatel| Zveřejněno 10. 1. 2025 12:18:43 |
NumSharp je vhodný pro různé scénáře, včetně vzdělávacího výzkumu, finanční analýzy, zpracování obrazu, hlubokého učení a dalších.

NumSharp byl jako součást SciSharp.org integrován do široké škály NET Scientific Computing Ecosystem. Zde je několik souvisejících a velmi doplňujících položek, které byste měli dále prozkoumat:

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

Závěrem lze říci, že NumSharp není jen samostatná výkonná knihovna, ale propojení. Klíčový uzel v komunitě vědeckých výpočetních technologií .NET.

Adresa projektu NumSharp:https://github.com/SciSharp/NumSharp
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com