由于 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 有多接近。
在 Python/NumPy 中从矩阵中切出列使用 NumSharp 用 C# 编写时,代码几乎相同。请注意,切片使用字符串作为索引器的参数进行索引时略有不同。
在 C#/NumSharp 中从矩阵中切出列如您所见,NumSharp 团队付出了很多努力,使代码尽可能与 Python 相似。这非常重要,因为这样,依赖 NumPy 的现有 Python 代码现在可以轻松移植到 C#。
用例:使用同一数据的多个视图
能够仅将底层数据的局部部分(即大图像的小块)传入和传出函数而无需复制对于运行时性能至关重要,尤其是对于大数据集。切片使用本地坐标进行索引,因此您的算法不需要了解数据的全局结构,从而有效地简化您的生活并确保最高的性能,因为避免了不必要的复制。
用例:稀疏视图和递归切片
通过指定切片范围的开始和结束之外的步骤,可以创建数组的稀疏视图。据我所知,即使是具有新数组切片语法的 C# 8.0 也无法做到这一点。当处理交错数据时,此功能变得非常重要。您可以将算法设计为处理连续数据,并向其提供模拟连续数据源的稀疏切片,从而尽可能降低算法的复杂性。
切片可以进一步切片,如果你处理高维数据,这是一个非常重要的功能。这也有助于降低算法的复杂性,因为你可以通过递归切片来减少数据的维度。
用例:高效处理高维数据
如果您需要将数据数组视为一个卷,并处理其中的各个部分,而无需进行令人难以置信的坐标变换计算,那么它.reshape()就是您的朋友。
所有由或切片操作创建的数组都.reshape()只是原始数据的视图。当您迭代、读取或写入视图的元素时,您将访问原始数据数组。NumSharp 透明地为您执行适当的索引转换,因此您可以使用相对坐标对切片进行索引。
用例:无需额外成本即可反转元素的顺序
使用负数步长的切片实际上是反转切片的顺序。它的优点在于,它不需要复制或枚举数据即可完成此操作,就像 一样IEnumerable.Reverse()。不同之处在于,视图(操作 的结果a["::-1"])以相反的顺序显示数据,并且您可以索引到该反转序列,而无需枚举它。
用例:通过减少维度来降低复杂性
当处理高维数据时,该数据的算法也会变得非常复杂。在使用可以输出任意高维体积.ToString()的 NumSharp 方法时NDArray,我注意到该算法通过系统地、递归地将 ND 体积切成 (N-1)D 体积等变得多么简单和优美。 这种分而治之的方法是通过使用 NumSharp 的索引符号对范围符号进行切片来返回低维子体积的。 范围符号与索引符号范围符号 [“start:stop:step”] 允许您访问具有相同维度的给定体积的子范围。因此,即使只切出 2D 矩阵的一列,您仍然会得到只有一列的 2D 矩阵。以下是演示此操作的一小段 C# 代码:
使用范围符号对列进行切片
索引符号会为您提供 N 维父体积的指定位置处的 (N-1) 维切片。因此,使用索引符号从 2D 矩阵中切出一列会为您提供 1D 向量:
使用索引符号对列进行切片
如果你还没有一眼看出区别,下面是上面并排的两个切片定义,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
|