架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 178|回复: 1

[技巧] 【译】.NET/C# 中 NumSharp 数组切片功能

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

由于 NumSharp 出色的新数组切片功能,.NET 社区距离拥有强大的开源机器学习平台又近了一步。

Python 之所以成为机器学习语言,部分原因在于它拥有NumPy和TensorFlow等出色的库。然而,C# 开发人员也非常需要强大的机器学习和数据科学开源库。NumSharp是SciSharp STACK组织尽心尽力开发的 NumPy C# 端口,最近它又迈出了一大步,完全实现了切片功能,允许创建N 维数组的任意子集作为原始数据的高效视图。这使其成为与TensorFlow.NET结合使用 C# 进行机器学习的有用工具。


这有什么大不了的?

如果你没有用过 NumPy,你可能不知道切片有多棒。Python 数组允许通过索引一系列元素来返回数组的切片,如下所示:a[start:stop:step]。但只有使用 NumPy 复杂的数组实现,切片才会成为一种真正强大的数据操作技术,没有它,机器学习或数据科学就无法想象了。

幸运的是,对于那些不能或不想切换到 Python 进行机器学习的人(我也犯了这种错误),NumSharp 将这种能力带入了 .NET 世界。作为 NumSharp 的开发人员之一,我向您介绍了一些重要的切片用例,并附上了 C# 中的示例代码片段。请注意,由于语言语法的差异,在 C# 中无法以与 Python 相同的方式进行索引。然而,我们决定保留 Python 语法来进行切片定义,因此我们使用字符串来索引 C# 中的切片。查看此示例,看看 NumSharp 与 NumPy 有多接近。



QQ截图20250110112858.jpg
在 Python/NumPy 中从矩阵中切出列

使用 NumSharp 用 C# 编写时,代码几乎相同。请注意,切片使用字符串作为索引器的参数进行索引时略有不同。


QQ截图20250110112907.jpg

在 C#/NumSharp 中从矩阵中切出列

如您所见,NumSharp 团队付出了很多努力,使代码尽可能与 Python 相似。这非常重要,因为这样,依赖 NumPy 的现有 Python 代码现在可以轻松移植到 C#。


用例:使用同一数据的多个视图

QQ截图20250110112914.jpg

能够仅将底层数据的局部部分(即大图像的小块)传入和传出函数而无需复制对于运行时性能至关重要,尤其是对于大数据集。切片使用本地坐标进行索引,因此您的算法不需要了解数据的全局结构,从而有效地简化您的生活并确保最高的性能,因为避免了不必要的复制。


用例:稀疏视图和递归切片



通过指定切片范围的开始和结束之外的步骤,可以创建数组的稀疏视图。据我所知,即使是具有新数组切片语法的 C# 8.0 也无法做到这一点。当处理交错数据时,此功能变得非常重要。您可以将算法设计为处理连续数据,并向其提供模拟连续数据源的稀疏切片,从而尽可能降低算法的复杂性。

QQ截图20250110112920.jpg

切片可以进一步切片,如果你处理高维数据,这是一个非常重要的功能。这也有助于降低算法的复杂性,因为你可以通过递归切片来减少数据的维度。


用例:高效处理高维数据

QQ截图20250110112929.jpg

如果您需要将数据数组视为一个卷,并处理其中的各个部分,而无需进行令人难以置信的坐标变换计算,那么它.reshape()就是您的朋友。
所有由或切片操作创建的数组都.reshape()只是原始数据的视图。当您迭代、读取或写入视图的元素时,您将访问原始数据数组。NumSharp 透明地为您执行适当的索引转换,因此您可以使用相对坐标对切片进行索引。


用例:无需额外成本即可反转元素的顺序

使用负数步长的切片实际上是反转切片的顺序。它的优点在于,它不需要复制或枚举数据即可完成此操作,就像 一样IEnumerable.Reverse()。不同之处在于,视图(操作 的结果a["::-1"])以相反的顺序显示数据,并且您可以索引到该反转序列,而无需枚举它。


用例:通过减少维度来降低复杂性

当处理高维数据时,该数据的算法也会变得非常复杂。在使用可以输出任意高维体积.ToString()的 NumSharp 方法时NDArray,我注意到该算法通过系统地、递归地将 ND 体积切成 (N-1)D 体积等变得多么简单和优美。

这种分而治之的方法是通过使用 NumSharp 的索引符号对范围符号进行切片来返回低维子体积的。

范围符号与索引符号

范围符号 [“start:stop:step”] 允许您访问具有相同维度的给定体积的子范围。因此,即使只切出 2D 矩阵的一列,您仍然会得到只有一列的 2D 矩阵。以下是演示此操作的一小段 C# 代码:


QQ截图20250110112939.jpg
使用范围符号对列进行切片

索引符号会为您提供 N 维父体积的指定位置处的 (N-1) 维切片。因此,使用索引符号从 2D 矩阵中切出一列会为您提供 1D 向量:

QQ截图20250110112951.jpg
使用索引符号对列进行切片

如果你还没有一眼看出区别,下面是上面并排的两个切片定义,ange [":,2:3"]vs index [":,2"],它们对结果有很大的影响。新切片符号的完整参考可在NumSharp wiki中找到。


附注:ArraySlice<T>

在实现 N 维视图的切片时,我得出结论,它可能对 .NET 中的许多其他领域都很有趣,所以我将其分解到自己的独立库中,称为SliceAndDice。它的特点是它是任何索引 C# 数据结构(如或)ArraySlice<T>的轻量级包装器,并允许您使用相同的重塑、切片和视图机制,而无需所有其他繁重的数值计算。它只用了几百行代码就实现了出色的切片功能!T[]IList<T>


概括

NumSharp最近被赋予了相同的切片和视图机制,这无疑使 NumPy 成为 Python 机器学习生态系统中最重要的库之一。SciSharp STACK是一个由少数熟练开发人员组成的开源组织,它非常努力地将同样的功能带入 .NET 世界。NumSharp 的最新改进是实现这一目标的重要基石。


原文:https://medium.com/scisharp/slicing-in-numsharp-e56c46826630




上一篇:Git lfs 大文件版本管理控制
下一篇:Rocky Linux 9 开启局域网唤醒(wake on lan)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 7 天前 | 显示全部楼层
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
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-1-17 03:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表