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

翻译初稿(英文水平有限,请多包涵):

由于Numsharp新推出了数组切片这个牛逼的功能,所以.NET社区距离拥有强大的开源机器学习平台又近了一步。

Python之所以是机器学习的首选语言,部分原因就是因为它拥有一些牛逼的库,例如NumPy和Tensorflow。与此同时,C#开发人员也迫切需要用于机器学习和数据科学的强大开源库。而NumSharp,这个由 SciSharp STACK这个开源组织全力推动的,要把NumPy移植到C#的这个项目,由于其最近全面实现了切片技术,从而向该目标迈进了一大步。该技术允许对n维数组随意的创建子集,并将其作为对原始数据的高效视图。因为这些,使得它与TensorFlow.net一起成为了C#中机器学习的有用工具。

牛逼在哪?

如果你没用过NumPy,你可能不知道切片技术有多好用, Python数组允许通过对一定范围对元素进行索引来返回数组的一个切片,其索引操作是这样的:a[start:end:step]。但是,只有使用NumPy复杂巧妙的数组实现,切片才成为一种真正强大的数据操作技术,若没有这种技术,机器学习或数据科学就无法想象了。

而使用NumSharp写出的C#代码也是差不多一样的。但请注意,这里有一个细微的差别是,这里的切片使用的是字符串作为索引器的参数进行的索引。

正如您所看到的,NumSharp团队花了很多的精力来保证代码尽可能的与Python相似。 这非常重要,因为这样的话,现有的依赖于NumPy的代码就可以很轻松的移植到C#上去了。

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

对于运行时性能,尤其是对于大规模的数据集而言,能够在不进行复制的情况下仅对函数传入和传出底层数据的本地部分(即大镜像像的一小块)是至关重要的。切片使用局部坐标进行索引的,因此您的算法无需了解数据的全局结构,这样就有效地简化了您的工作,并确保尽可能高的性能,因为避免了不必要的复制。

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

除了对切片的范围指定start和end之外,再通过指定它的step(步幅),就可以创建数组的稀疏视图了。这是一个连C# 8.0新的数组切片语法都做不到的事情(据我所知)。在使用交错数据时,此功能变得非常重要。您可以通过设计算法来让它们处理连的续数据并为它们提供模拟连续数据源的稀疏切片,从而尽可能降低算法的复杂性。

切片可以进一步切片,如果您使用高维数据的话,这也将是一个非常重要的功能。同时这也有助于减少算法的复杂性,因为通过递归切片减少了数据的维数。

用例:高效地处理高维数据

如果您需要将数据数组视为一个卷,并在不需要进行令人烦躁的坐标转换计算的情况下使用其中的某些部分,那么.reshape()方法就是您的朋友。

所有由.reshape()或切片操作创建的数组都只是原始数据的视图。当您对视图的元素进行迭代、读取或写入时,其实您访问的是原始的数据数组。很显然,NumSharp为您做了相应的索引变换,所以您可以使用相对的坐标对切片进行索引。

用例:在无任何额外成本的情况下颠倒元素的顺序

使用值为负数的step(步幅)可以高效的反转切片的顺序。它的优点是不需要复制或列举数据就可以完成此操作,就像IEnumerable.Reverse() 一样。区别在于,视图(就是指a["::-1"]的操作结果)以相反的顺序显示数据,此外您无需对其进行列举就可以索引到该反转序列。

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

当处理高维数据时,该数据的算法也会变得非常复杂。在处理NumSharp的NDArray的.ToString() 方法时(这个方法可以打印出任意高维卷)我注意到该算法通过系统地和递归地将(N-1)D卷切出ND-卷等诸如此类的方式简单而优雅的取得了结果。

通过在可返回低维子卷的范围符号上使用NumSharp的索引符号进行切片,才使这种分而治之的方法变得可行。

范围符号 vs 索引符号

范围符号[“start:stop:step”]允许您访问具有相同维度给定卷的子范围。所以即使只划出二维矩阵的一列,仍然可以得到只有一列的二维矩阵。下面这一小段C#代码就展示了这一点:

索引符号为您提供了一个在N维父卷指定位置切出来的(N-1)维切片。因此,用索引符号从二维矩阵中分割出一个列,可以得到一个一维向量:

如果您一眼也没有发现差异,那么下面这两个切片定义, ange [":,2:3"] vs index [":,2"],它们的结果是大不相同的。NumSharp wiki提供了新切片表示法的完整参考。

附注:ArraySlice <T>

在实现N维视图的切片时,我得出这样一个结论,对于.NET中的许多其他领域来说它可能很有趣,因此我将它分解出一个自己的独立库SliceAndDice。它里面有个东西叫做ArraySlice <T>,它是对所有索引的C#数据结构(如T[]或IList<T>)的一个轻量级包装,此外它还允许您使用相同的塑形,切片和视图机制,并且无需进行任何其他的重度数值计算。它只使用了几百行代码就漂亮简洁的完成了切片的壮举。

综上

NumSharp最近被赋予了同切片和视图机制,同样就是这些机制让NumPy成为Python机器学习生态最重要的库之一。SciSharp Stack作为一个开源组织,目前只有少数技术娴熟的开发人员,但他们却非常努力地要为.NET世界带来同样的魔力。NumSharp最近的这次改进就是实现这一目标的重要基石。


[翻译] NumSharp的数组切片功能 [:]相关推荐

  1. scala切片_Scala切片功能

    scala切片 Today we will look into Scala slice function. 今天,我们将研究Scala slice功能. 斯卡拉切片 (Scala slice) Sca ...

  2. A01_[NumPy中文网]数组基础(创建数组,多维数组切片,数组属性)、使用数组(基本操作符,数组特殊运算符)、索引(花式索引,布尔索引,缺省索引)

    NumPy简单入门教程 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在 ...

  3. python数组切片教程_手把手numpy教程【二】——数组与切片

    今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算. 上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会是我们自己写循环来计算的上百倍甚至更多.并且Numpy的AP ...

  4. Go程序:演示数组切片用法

    在Go语言中,数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数据结构无法完全满足开发者的真实需求,但是Go语言提供了数组切片(slice)这个非常酷的功能来弥补数组 ...

  5. numpy数组切片:一维/二维/数组

    文章目录 numpy数组切片操作 一维数组(冒号:) 1.一个参数:a[i] 2.两个参数:b=a[i:j] 3.三个参数:格式b = a[i:j:s] 4.例子 二维数组(逗号,) 取元素 X[n0 ...

  6. golang 判断 数组 切片 是否为空

    实例: package mainfunc main() {// 数组arr := [0]int{}if len(arr) == 0 {println(`这是个空数组`)}// 切片slice := m ...

  7. php 数组与数组之间去重,PHP开发中一维数组与二维数组去重功能实现教程

    本篇文章讲述了PHP实现一维数组与二维数组去重功能示例.希望对在php学习和开发的同学有所帮助! 数组中重复项的去除 一维数组的重复项: 使用array_unique函数即可,使用实例如下: ? $a ...

  8. 递归二分法php,PHP基于二分法实现数组查找功能示例【循环与递归算法】

    本文实例讲述了PHP基于二分法实现数组查找功能.分享给大家供大家参考,具体如下: 二分法.分别使用while循环的方法和递归调用的方法. // 二分法的使用数组必须是有序的,或升序,或降序 $arr ...

  9. php 二维数组中去重,PHP实现二维数组去重功能示例

    PHP实现二维数组去重功能示例 发布于 2017-08-07 21:05:17 | 68 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Prep ...

最新文章

  1. 【古法炮制】最原始的解决JAVA接口跨域的问题
  2. android混淆和反编译
  3. opencv计算两数组的乘积_leetcode1464_go_数组中两元素的最大乘积
  4. jieba如何空文本记录
  5. ubuntu下面安装Keil uvision4与入门实例
  6. .net core 微服务下的手工签名实现,以及消除中文乱码
  7. CF827F-Dirty Arkady‘s Kitchen【堆】
  8. 修改 MrBayes 3.2 源码解决不能恢复断点的问题
  9. Black Hat | PE Tree:BlackBerry 发布PE文件开源逆向工具
  10. 我是 LinkedIn 的 SRE ,我把 LinkedIn 搞挂了
  11. 试试Navicat和Axere RP Pro吧
  12. ios崩溃日志分析,无dSYM文件
  13. 通信标准2之PUSCH非动态传输 Configured Grant Type 1 和 Type 2
  14. 威联通NAS配置阿里云域名和SSL证书
  15. 安装黑苹果目前最详细教程
  16. Apache源码安装和虚拟主机配置
  17. Linux系统安装docker教程
  18. SSM配置redis
  19. access 表合并
  20. 将百分制成绩转化为5分制成绩。

热门文章

  1. WWDC 2013 Session笔记 - Xcode5和ObjC新特性
  2. WPF/MVVM 快速开发
  3. RPC调用框架比较分析
  4. 如何判断一个程序是 32bit 还是 64bit ?
  5. 一条nginx命令引发的对于容器的思考
  6. 巧用ActionFilter的AOP特性,为返回的数据增加返回码和消息
  7. 一切为了孩子——一位IT麻麻的新西兰移民记录
  8. C# 10 新特性 —— 补充篇
  9. WPF轮播图实现方式(二)
  10. UOS LoongArch 上成功安装.NET Core 3.1