Numpy.NET与SciSharp生态:Keras.NET和Torch.NET的基础支持库终极指南
Numpy.NET与SciSharp生态Keras.NET和Torch.NET的基础支持库终极指南【免费下载链接】Numpy.NETC#/F# bindings for NumPy - a fundamental library for scientific computing, machine learning and AI项目地址: https://gitcode.com/gh_mirrors/num/Numpy.NET在当今的机器学习和人工智能领域Python的NumPy库已成为科学计算和数值运算的事实标准。然而对于C#/.NET开发者来说现在有了一个强大的解决方案Numpy.NET。这个完整的.NET绑定库不仅为C#开发者提供了NumPy的强大功能更是整个SciSharp生态系统的基石支撑着Keras.NET和Torch.NET等高级机器学习框架。什么是Numpy.NET为什么它如此重要Numpy.NET是NumPy库最完整的.NET绑定为C#和F#开发者提供了Python NumPy库的核心功能。作为科学计算、机器学习和人工智能的基础库Numpy.NET通过兼容的强类型API为.NET开发者赋能包括多维数组和矩阵、线性代数、快速傅里叶变换等丰富功能。Numpy.NET的核心优势在于它是整个SciSharp生态系统的基石。多个其他SciSharp项目如Keras.NET和Torch.NET都依赖于Numpy.NET。这意味着掌握了Numpy.NET你就掌握了进入.NET机器学习世界的关键。Numpy.NET的安装与配置两种灵活选择简单安装Numpy.dll方式如果你只想快速开始使用Numpy.NET最简单的方法是引用Numpy.dll NuGet包然后将构建配置设置为x64即可。得益于Python.Included技术它不需要本地Python安装也不会与现有安装冲突。高级配置Numpy.Bare.dll方式在某些使用场景下你可能不希望使用打包的Python和NumPy包。这时可以引用Numpy.Bare.dll NuGet包。根据Numpy.Bare的版本你需要安装Python 3.5、3.6或3.7以及NumPy 1.16。Numpy.Bare版本的前两位数字表示所需的Python版本例如Numpy.Bare v3.6.1.1需要Python 3.6。Numpy.NET的工作原理智能集成Numpy.NET使用Python for .NET来调用Python模块numpy。但这并不意味着它依赖于本地Python安装Numpy.NET.dll使用Python.Included它打包了嵌入式Python 3.7并在首次执行时自动部署到用户的主目录中。在后续运行中它会发现Python已经部署因此不再重新安装。Numpy.NET还打包了NumPy wheel并在尚未安装时将其安装到嵌入式Python安装中。简而言之作为.NET开发者你完全不需要担心Python。你只需引用Numpy.NET使用它它就能正常工作无论你是否有本地Python安装。多线程编程注意事项警告不遵循这些步骤可能导致死锁或访问冲突异常Python/NumPy没有真正的多线程支持。在多个线程上同时执行numpy函数没有优势因为pythonnet要求你使用全局解释器锁GIL来锁定对Python引擎的访问一次只能有一个线程独占访问。如果你必须从主线程以外的线程调用Python首先必须通过调用PythonEngine.BeginAllowThreads()来释放主线程的互斥锁否则会出现死锁var a np.arange(1000); var b np.arange(1000); // https://github.com/pythonnet/pythonnet/issues/109 PythonEngine.BeginAllowThreads(); Task.Run(() { // 在不同线程上运行时必须加锁 using (Py.GIL()) { np.matmul(a, b); } }).Wait();性能考量高效的数据传输你可能会问调用Python会影响性能吗这取决于你的使用方式。不要忘记numpy的数字处理算法是用C编写的因此顶层的pythonnet和Python层在处理大量数据时不会有显著影响。根据经验从C#调用numpy比直接在Python中调用大约慢4倍而调用操作本身的执行时间当然是相等的。所以如果你的算法需要在嵌套循环中调用numpyNumpy.NET可能不适合你因为调用开销较大。所有numpy都围绕ndarray类展开它允许你将大量数据传递给C例程让它们高效地执行各种元素操作而无需循环遍历数据。所以如果你要操作包含数千或数十万个元素的数组或矩阵调用开销将可以忽略不计。性能最敏感的方面是从C#数组创建NDarray因为数据必须从CLR移动到Python解释器。虽然pythonnet没有优化从C#到Python传递大数组的方式但我们仍然找到了非常高效的方法。Numpy.NET与NumSharp的比较SciSharp团队还在开发一个纯C#的NumPy端口称为NumSharp它虽然不完整但相当受欢迎。市场上还有其他几个NumPy端口它们只提供了原始库的子集。唯一在完整性方面与Numpy.NET匹配的是IronPython包numpy但它已经过时了。SciSharp团队致力于保持Numpy.NET与原始库同步并尽可能多地提供原始功能。代码生成高效的开发方式Numpy.NET的大部分代码是使用CodeMinion通过解析docs.scipy.org/doc/numpy/上的文档生成的。这使我们能够在短短两周内包装大部分numpy-API。其余的API可以在几周内完成特别是如果有广泛需求的话。完成状态以下API类别已经生成已勾选表示完成数组创建例程数组操作例程二进制操作字符串操作日期时间支持函数数据类型例程可选的Scipy加速例程numpy.dual浮点错误处理离散傅里叶变换numpy.fft金融函数函数式编程索引例程输入和输出线性代数numpy.linalg逻辑函数掩码数组操作数学函数矩阵库numpy.matlib杂项例程数组填充多项式随机抽样numpy.random集合例程排序、搜索和计数统计窗口函数在总共1800个函数中已经生成了超过500个函数大多数缺失的函数是Matrix、Chararray、Record等的重复项。实际应用示例从C#数组创建Numpy数组及反向操作要在Numpy中处理C#数据必须使用np.array(...)将其复制到Python引擎中。你会得到一个可用于进一步数据处理的NDarray。这里我们计算平方根// 从C#数组创建NDarray var a np.array(new[] { 2, 4, 9, 25 }); Console.WriteLine(a: a.repr); // a: array([ 2, 4, 9, 25]) // 对每个元素应用平方根 var roots np.sqrt(a); Console.WriteLine(roots.repr); // array([1.41421356, 2. , 3. , 5. ])处理数据后你可以使用a.GetDataint()将其复制回C#数组但要注意NDarray的数据类型以获取正确的值// 从NDarray复制到C#数组数据类型不正确 Console.WriteLine(string.Join(, , roots.GetDataint())); // 1719614413, 1073127582, 0, 1073741824 Console.WriteLine(roots.dtype: roots.dtype); // roots.dtype: float64 Console.WriteLine(string.Join(, , roots.GetDatadouble())); // 1.4142135623731, 2, 3, 5从C#数组创建多维NDarray从数据创建NDarray很容易。只需将C#数组传递给np.array(...)。你可以传递1D、2D和3D的C#数组。// 创建2D NDarray var m np.array(new int[,] {{1, 2}, {3, 4}}); // NDarray表示一个2x2矩阵另一种更高效的方法节省一次数组复制操作是将数据作为一维数组传递然后只重塑NDarray。// 创建2D NDarray var m np.array(new int[] {1, 2, 3, 4}).reshape(2,2); // 重塑后的NDarray表示一个2x2矩阵Numpy.NET与NumPy的区别正如你所看到的除了语言语法和习惯用法外Numpy.NET的使用几乎与Python相同。然而由于C#缺乏语言支持有一些区别你应该注意。数组切片语法你可以使用数组切片访问NDarray的部分。C#不支持索引器中的冒号语法即a[:, 1]。然而通过允许传递字符串我们绕过了这个限制即a[:, 1]。只有...运算符尚未实现因为它不太重要。可变参数列表一些NumPy函数如reshape允许在参数列表开头使用可变参数列表。这在C#中当然是不允许的它只支持作为最后一个参数的可变参数列表。对于reshape解决方案是用一个Shape对象替换指定重塑数组维度的可变参数列表该对象在其构造函数中接受可变维数列表var anp.arange(24); var bnp.reshape(a, new Shape(2, 3, 4)); // 或 a.reshape(2, 3, 4)在其他情况下通过在可变参数列表之后提供没有可选命名参数的重载来解决这个问题。原位修改在NumPy中你可以写a*2这将使数组a的每个元素翻倍。C#没有*运算符因此不可能以Python方式重载它。这个限制通过暴露所有以i开头的原位运算符函数来克服。所以在C#中复制数组a的所有元素是这样写的a.imul(2);。版本兼容性目前Numpy.dll针对.NET Standard在Windows上并打包了以下二进制文件Python 3.7python-3.7.3-embed-amd64.zipNumPy 1.16numpy-1.16.3-cp37-cp37m-win_amd64.whlNumpy.Bare.dll适用于Windows、Linux和MacOS上的Python版本2.7、3.5、3.6和3.7。常见错误与解决方案如果在构建配置中勾选Prefer 32-bit或使用x86而不是Any CPU构建Numpy.NET将因BadFormatException而崩溃如果在AppData中文件夹权限不足Numpy.NET可能会崩溃。你可以通过设置Installer.INSTALL_PATH install path;来指定不同的安装路径如果遇到死锁程序无限期挂起你应该阅读上面的多线程部分如果遇到AccessViolationExceptions你应该阅读上面的多线程部分总结为什么选择Numpy.NETNumpy.NET不仅是.NET开发者进入科学计算和机器学习世界的桥梁更是整个SciSharp生态系统的基石。通过提供完整的NumPy功能绑定它让C#开发者能够无缝集成无需安装Python即可使用NumPy的强大功能高性能计算利用NumPy底层C实现的性能优势生态兼容作为Keras.NET和Torch.NET的基础支持库开发友好提供完整的Intellisense支持和强类型API跨平台支持Windows、Linux和MacOS无论你是正在寻找Python替代方案的.NET开发者还是希望在现有.NET应用中集成机器学习功能的团队Numpy.NET都提供了一个强大而可靠的解决方案。通过简单的NuGet安装和直观的API设计你可以立即开始在你的.NET项目中使用NumPy的强大功能。开始你的Numpy.NET之旅吧探索.NET科学计算和机器学习的无限可能【免费下载链接】Numpy.NETC#/F# bindings for NumPy - a fundamental library for scientific computing, machine learning and AI项目地址: https://gitcode.com/gh_mirrors/num/Numpy.NET创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考